Merge "Import translations. DO NOT MERGE" into oc-mr1-dev
am: aaded1bd47  -s ours

Change-Id: Ic66cfcb1baa579548d30877c4000c597b11e2d73
diff --git a/.idea/copyright/AndroidCopyright.xml b/.idea/copyright/AndroidCopyright.xml
index b8334d4..7d2d80c 100644
--- a/.idea/copyright/AndroidCopyright.xml
+++ b/.idea/copyright/AndroidCopyright.xml
@@ -1,6 +1,6 @@
 <component name="CopyrightManager">
   <copyright>
     <option name="myName" value="AndroidCopyright" />
-    <option name="notice" value="Copyright (C) &amp;#36;today.year The Android Open Source Project&#10;&#10;Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);&#10;you may not use this file except in compliance with the License.&#10;You may obtain a copy of the License at&#10;&#10;     http://www.apache.org/licenses/LICENSE-2.0&#10;&#10;Unless required by applicable law or agreed to in writing, software&#10;distributed under the License is distributed on an &quot;AS IS&quot; BASIS,&#10;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&#10;See the License for the specific language governing permissions and&#10;limitations under the License." />
+    <option name="notice" value="Copyright &amp;#36;today.year The Android Open Source Project&#10;&#10;Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);&#10;you may not use this file except in compliance with the License.&#10;You may obtain a copy of the License at&#10;&#10;     http://www.apache.org/licenses/LICENSE-2.0&#10;&#10;Unless required by applicable law or agreed to in writing, software&#10;distributed under the License is distributed on an &quot;AS IS&quot; BASIS,&#10;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&#10;See the License for the specific language governing permissions and&#10;limitations under the License." />
   </copyright>
-</component>
\ No newline at end of file
+</component>
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..049932f
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,10 @@
+adamp@google.com
+alanv@google.com
+aurimas@google.com
+ccraik@google.com
+clarabayarri@google.com
+ilake@google.com
+kirillg@google.com
+mount@google.com
+sergeyv@google.com
+yboyar@google.com
\ No newline at end of file
diff --git a/annotations/Android.mk b/annotations/Android.mk
index 78a29df..41abfaa 100644
--- a/annotations/Android.mk
+++ b/annotations/Android.mk
@@ -18,7 +18,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-annotations
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under,src)
+LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
diff --git a/annotations/OWNERS b/annotations/OWNERS
new file mode 100644
index 0000000..e980177
--- /dev/null
+++ b/annotations/OWNERS
@@ -0,0 +1 @@
+tnorbye@google.com
\ No newline at end of file
diff --git a/annotations/api/current.txt b/annotations/api/current.txt
deleted file mode 100644
index c52f7e1..0000000
--- a/annotations/api/current.txt
+++ /dev/null
@@ -1,171 +0,0 @@
-package android.support.annotation {
-
-  public abstract class AnimRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class AnimatorRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class AnyRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class AnyThread implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class ArrayRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class AttrRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class BinderThread implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class BoolRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class CallSuper implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class CheckResult implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class ColorInt implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class ColorLong implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class ColorRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class DimenRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class Dimension implements java.lang.annotation.Annotation {
-    field public static final int DP = 0; // 0x0
-    field public static final int PX = 1; // 0x1
-    field public static final int SP = 2; // 0x2
-  }
-
-  public abstract class DrawableRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class FloatRange implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class FontRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class FractionRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class GuardedBy implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class HalfFloat implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class IdRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class IntDef implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class IntRange implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class IntegerRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class InterpolatorRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class Keep implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class LayoutRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class MainThread implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class MenuRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class NonNull implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class Nullable implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class PluralsRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class Px implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class RawRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class RequiresApi implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class RequiresPermission implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract class RequiresPermission.Read implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract class RequiresPermission.Write implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class RestrictTo implements java.lang.annotation.Annotation {
-  }
-
-  public static final class RestrictTo.Scope extends java.lang.Enum {
-    method public static android.support.annotation.RestrictTo.Scope valueOf(java.lang.String);
-    method public static final android.support.annotation.RestrictTo.Scope[] values();
-    enum_constant public static final deprecated android.support.annotation.RestrictTo.Scope GROUP_ID;
-    enum_constant public static final android.support.annotation.RestrictTo.Scope LIBRARY;
-    enum_constant public static final android.support.annotation.RestrictTo.Scope LIBRARY_GROUP;
-    enum_constant public static final android.support.annotation.RestrictTo.Scope SUBCLASSES;
-    enum_constant public static final android.support.annotation.RestrictTo.Scope TESTS;
-  }
-
-  public abstract class Size implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class StringDef implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class StringRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class StyleRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class StyleableRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class TransitionRes implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class UiThread implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class VisibleForTesting implements java.lang.annotation.Annotation {
-    field public static final int NONE = 5; // 0x5
-    field public static final int PACKAGE_PRIVATE = 3; // 0x3
-    field public static final int PRIVATE = 2; // 0x2
-    field public static final int PROTECTED = 4; // 0x4
-  }
-
-  public abstract class WorkerThread implements java.lang.annotation.Annotation {
-  }
-
-  public abstract class XmlRes implements java.lang.annotation.Annotation {
-  }
-
-}
-
diff --git a/annotations/build.gradle b/annotations/build.gradle
index 4bedc3f..af4174d 100644
--- a/annotations/build.gradle
+++ b/annotations/build.gradle
@@ -1,9 +1,5 @@
 apply plugin: android.support.SupportJavaLibraryPlugin
 
-sourceSets {
-    main.java.srcDir 'src'
-}
-
 jar {
     from sourceSets.main.output
     // Strip out typedef classes. For Android libraries, this is done
diff --git a/annotations/src/android/support/annotation/AnimRes.java b/annotations/src/main/java/android/support/annotation/AnimRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/AnimRes.java
rename to annotations/src/main/java/android/support/annotation/AnimRes.java
diff --git a/annotations/src/android/support/annotation/AnimatorRes.java b/annotations/src/main/java/android/support/annotation/AnimatorRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/AnimatorRes.java
rename to annotations/src/main/java/android/support/annotation/AnimatorRes.java
diff --git a/annotations/src/android/support/annotation/AnyRes.java b/annotations/src/main/java/android/support/annotation/AnyRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/AnyRes.java
rename to annotations/src/main/java/android/support/annotation/AnyRes.java
diff --git a/annotations/src/android/support/annotation/AnyThread.java b/annotations/src/main/java/android/support/annotation/AnyThread.java
similarity index 100%
rename from annotations/src/android/support/annotation/AnyThread.java
rename to annotations/src/main/java/android/support/annotation/AnyThread.java
diff --git a/annotations/src/android/support/annotation/ArrayRes.java b/annotations/src/main/java/android/support/annotation/ArrayRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/ArrayRes.java
rename to annotations/src/main/java/android/support/annotation/ArrayRes.java
diff --git a/annotations/src/android/support/annotation/AttrRes.java b/annotations/src/main/java/android/support/annotation/AttrRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/AttrRes.java
rename to annotations/src/main/java/android/support/annotation/AttrRes.java
diff --git a/annotations/src/android/support/annotation/BinderThread.java b/annotations/src/main/java/android/support/annotation/BinderThread.java
similarity index 100%
rename from annotations/src/android/support/annotation/BinderThread.java
rename to annotations/src/main/java/android/support/annotation/BinderThread.java
diff --git a/annotations/src/android/support/annotation/BoolRes.java b/annotations/src/main/java/android/support/annotation/BoolRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/BoolRes.java
rename to annotations/src/main/java/android/support/annotation/BoolRes.java
diff --git a/annotations/src/android/support/annotation/CallSuper.java b/annotations/src/main/java/android/support/annotation/CallSuper.java
similarity index 100%
rename from annotations/src/android/support/annotation/CallSuper.java
rename to annotations/src/main/java/android/support/annotation/CallSuper.java
diff --git a/annotations/src/android/support/annotation/CheckResult.java b/annotations/src/main/java/android/support/annotation/CheckResult.java
similarity index 100%
rename from annotations/src/android/support/annotation/CheckResult.java
rename to annotations/src/main/java/android/support/annotation/CheckResult.java
diff --git a/annotations/src/android/support/annotation/ColorInt.java b/annotations/src/main/java/android/support/annotation/ColorInt.java
similarity index 100%
rename from annotations/src/android/support/annotation/ColorInt.java
rename to annotations/src/main/java/android/support/annotation/ColorInt.java
diff --git a/annotations/src/android/support/annotation/ColorLong.java b/annotations/src/main/java/android/support/annotation/ColorLong.java
similarity index 100%
rename from annotations/src/android/support/annotation/ColorLong.java
rename to annotations/src/main/java/android/support/annotation/ColorLong.java
diff --git a/annotations/src/android/support/annotation/ColorRes.java b/annotations/src/main/java/android/support/annotation/ColorRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/ColorRes.java
rename to annotations/src/main/java/android/support/annotation/ColorRes.java
diff --git a/annotations/src/android/support/annotation/DimenRes.java b/annotations/src/main/java/android/support/annotation/DimenRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/DimenRes.java
rename to annotations/src/main/java/android/support/annotation/DimenRes.java
diff --git a/annotations/src/android/support/annotation/Dimension.java b/annotations/src/main/java/android/support/annotation/Dimension.java
similarity index 100%
rename from annotations/src/android/support/annotation/Dimension.java
rename to annotations/src/main/java/android/support/annotation/Dimension.java
diff --git a/annotations/src/android/support/annotation/DimensionUnit.java b/annotations/src/main/java/android/support/annotation/DimensionUnit.java
similarity index 100%
rename from annotations/src/android/support/annotation/DimensionUnit.java
rename to annotations/src/main/java/android/support/annotation/DimensionUnit.java
diff --git a/annotations/src/android/support/annotation/DrawableRes.java b/annotations/src/main/java/android/support/annotation/DrawableRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/DrawableRes.java
rename to annotations/src/main/java/android/support/annotation/DrawableRes.java
diff --git a/annotations/src/android/support/annotation/FloatRange.java b/annotations/src/main/java/android/support/annotation/FloatRange.java
similarity index 100%
rename from annotations/src/android/support/annotation/FloatRange.java
rename to annotations/src/main/java/android/support/annotation/FloatRange.java
diff --git a/annotations/src/android/support/annotation/FontRes.java b/annotations/src/main/java/android/support/annotation/FontRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/FontRes.java
rename to annotations/src/main/java/android/support/annotation/FontRes.java
diff --git a/annotations/src/android/support/annotation/FractionRes.java b/annotations/src/main/java/android/support/annotation/FractionRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/FractionRes.java
rename to annotations/src/main/java/android/support/annotation/FractionRes.java
diff --git a/annotations/src/android/support/annotation/GuardedBy.java b/annotations/src/main/java/android/support/annotation/GuardedBy.java
similarity index 100%
rename from annotations/src/android/support/annotation/GuardedBy.java
rename to annotations/src/main/java/android/support/annotation/GuardedBy.java
diff --git a/annotations/src/android/support/annotation/HalfFloat.java b/annotations/src/main/java/android/support/annotation/HalfFloat.java
similarity index 100%
rename from annotations/src/android/support/annotation/HalfFloat.java
rename to annotations/src/main/java/android/support/annotation/HalfFloat.java
diff --git a/annotations/src/android/support/annotation/IdRes.java b/annotations/src/main/java/android/support/annotation/IdRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/IdRes.java
rename to annotations/src/main/java/android/support/annotation/IdRes.java
diff --git a/annotations/src/android/support/annotation/IntDef.java b/annotations/src/main/java/android/support/annotation/IntDef.java
similarity index 100%
rename from annotations/src/android/support/annotation/IntDef.java
rename to annotations/src/main/java/android/support/annotation/IntDef.java
diff --git a/annotations/src/android/support/annotation/IntRange.java b/annotations/src/main/java/android/support/annotation/IntRange.java
similarity index 100%
rename from annotations/src/android/support/annotation/IntRange.java
rename to annotations/src/main/java/android/support/annotation/IntRange.java
diff --git a/annotations/src/android/support/annotation/IntegerRes.java b/annotations/src/main/java/android/support/annotation/IntegerRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/IntegerRes.java
rename to annotations/src/main/java/android/support/annotation/IntegerRes.java
diff --git a/annotations/src/android/support/annotation/InterpolatorRes.java b/annotations/src/main/java/android/support/annotation/InterpolatorRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/InterpolatorRes.java
rename to annotations/src/main/java/android/support/annotation/InterpolatorRes.java
diff --git a/annotations/src/android/support/annotation/Keep.java b/annotations/src/main/java/android/support/annotation/Keep.java
similarity index 100%
rename from annotations/src/android/support/annotation/Keep.java
rename to annotations/src/main/java/android/support/annotation/Keep.java
diff --git a/annotations/src/android/support/annotation/LayoutRes.java b/annotations/src/main/java/android/support/annotation/LayoutRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/LayoutRes.java
rename to annotations/src/main/java/android/support/annotation/LayoutRes.java
diff --git a/annotations/src/android/support/annotation/MainThread.java b/annotations/src/main/java/android/support/annotation/MainThread.java
similarity index 100%
rename from annotations/src/android/support/annotation/MainThread.java
rename to annotations/src/main/java/android/support/annotation/MainThread.java
diff --git a/annotations/src/android/support/annotation/MenuRes.java b/annotations/src/main/java/android/support/annotation/MenuRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/MenuRes.java
rename to annotations/src/main/java/android/support/annotation/MenuRes.java
diff --git a/annotations/src/main/java/android/support/annotation/NavigationRes.java b/annotations/src/main/java/android/support/annotation/NavigationRes.java
new file mode 100644
index 0000000..a051026
--- /dev/null
+++ b/annotations/src/main/java/android/support/annotation/NavigationRes.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.support.annotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.CLASS;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * Denotes that an integer parameter, field or method return value is expected
+ * to be a navigation resource reference (e.g. {@code R.navigation.flow}).
+ */
+@Documented
+@Retention(CLASS)
+@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE})
+public @interface NavigationRes {
+}
diff --git a/annotations/src/android/support/annotation/NonNull.java b/annotations/src/main/java/android/support/annotation/NonNull.java
similarity index 100%
rename from annotations/src/android/support/annotation/NonNull.java
rename to annotations/src/main/java/android/support/annotation/NonNull.java
diff --git a/annotations/src/android/support/annotation/Nullable.java b/annotations/src/main/java/android/support/annotation/Nullable.java
similarity index 100%
rename from annotations/src/android/support/annotation/Nullable.java
rename to annotations/src/main/java/android/support/annotation/Nullable.java
diff --git a/annotations/src/android/support/annotation/PluralsRes.java b/annotations/src/main/java/android/support/annotation/PluralsRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/PluralsRes.java
rename to annotations/src/main/java/android/support/annotation/PluralsRes.java
diff --git a/annotations/src/android/support/annotation/ProductionVisibility.java b/annotations/src/main/java/android/support/annotation/ProductionVisibility.java
similarity index 100%
rename from annotations/src/android/support/annotation/ProductionVisibility.java
rename to annotations/src/main/java/android/support/annotation/ProductionVisibility.java
diff --git a/annotations/src/android/support/annotation/Px.java b/annotations/src/main/java/android/support/annotation/Px.java
similarity index 100%
rename from annotations/src/android/support/annotation/Px.java
rename to annotations/src/main/java/android/support/annotation/Px.java
diff --git a/annotations/src/android/support/annotation/RawRes.java b/annotations/src/main/java/android/support/annotation/RawRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/RawRes.java
rename to annotations/src/main/java/android/support/annotation/RawRes.java
diff --git a/annotations/src/android/support/annotation/RequiresApi.java b/annotations/src/main/java/android/support/annotation/RequiresApi.java
similarity index 100%
rename from annotations/src/android/support/annotation/RequiresApi.java
rename to annotations/src/main/java/android/support/annotation/RequiresApi.java
diff --git a/annotations/src/android/support/annotation/RequiresPermission.java b/annotations/src/main/java/android/support/annotation/RequiresPermission.java
similarity index 100%
rename from annotations/src/android/support/annotation/RequiresPermission.java
rename to annotations/src/main/java/android/support/annotation/RequiresPermission.java
diff --git a/annotations/src/android/support/annotation/RestrictTo.java b/annotations/src/main/java/android/support/annotation/RestrictTo.java
similarity index 100%
rename from annotations/src/android/support/annotation/RestrictTo.java
rename to annotations/src/main/java/android/support/annotation/RestrictTo.java
diff --git a/annotations/src/android/support/annotation/Size.java b/annotations/src/main/java/android/support/annotation/Size.java
similarity index 100%
rename from annotations/src/android/support/annotation/Size.java
rename to annotations/src/main/java/android/support/annotation/Size.java
diff --git a/annotations/src/android/support/annotation/StringDef.java b/annotations/src/main/java/android/support/annotation/StringDef.java
similarity index 100%
rename from annotations/src/android/support/annotation/StringDef.java
rename to annotations/src/main/java/android/support/annotation/StringDef.java
diff --git a/annotations/src/android/support/annotation/StringRes.java b/annotations/src/main/java/android/support/annotation/StringRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/StringRes.java
rename to annotations/src/main/java/android/support/annotation/StringRes.java
diff --git a/annotations/src/android/support/annotation/StyleRes.java b/annotations/src/main/java/android/support/annotation/StyleRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/StyleRes.java
rename to annotations/src/main/java/android/support/annotation/StyleRes.java
diff --git a/annotations/src/android/support/annotation/StyleableRes.java b/annotations/src/main/java/android/support/annotation/StyleableRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/StyleableRes.java
rename to annotations/src/main/java/android/support/annotation/StyleableRes.java
diff --git a/annotations/src/android/support/annotation/TransitionRes.java b/annotations/src/main/java/android/support/annotation/TransitionRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/TransitionRes.java
rename to annotations/src/main/java/android/support/annotation/TransitionRes.java
diff --git a/annotations/src/android/support/annotation/UiThread.java b/annotations/src/main/java/android/support/annotation/UiThread.java
similarity index 100%
rename from annotations/src/android/support/annotation/UiThread.java
rename to annotations/src/main/java/android/support/annotation/UiThread.java
diff --git a/annotations/src/android/support/annotation/VisibleForTesting.java b/annotations/src/main/java/android/support/annotation/VisibleForTesting.java
similarity index 100%
rename from annotations/src/android/support/annotation/VisibleForTesting.java
rename to annotations/src/main/java/android/support/annotation/VisibleForTesting.java
diff --git a/annotations/src/android/support/annotation/WorkerThread.java b/annotations/src/main/java/android/support/annotation/WorkerThread.java
similarity index 100%
rename from annotations/src/android/support/annotation/WorkerThread.java
rename to annotations/src/main/java/android/support/annotation/WorkerThread.java
diff --git a/annotations/src/android/support/annotation/XmlRes.java b/annotations/src/main/java/android/support/annotation/XmlRes.java
similarity index 100%
rename from annotations/src/android/support/annotation/XmlRes.java
rename to annotations/src/main/java/android/support/annotation/XmlRes.java
diff --git a/api/26.1.0.ignore b/api/26.1.0.ignore
new file mode 100644
index 0000000..8fa74fe
--- /dev/null
+++ b/api/26.1.0.ignore
@@ -0,0 +1,6 @@
+036d6d4
+07abbac
+83a055e
+0af04fb
+7529650
+f41c100
diff --git a/app-toolkit/OWNERS b/app-toolkit/OWNERS
new file mode 100644
index 0000000..fc51372
--- /dev/null
+++ b/app-toolkit/OWNERS
@@ -0,0 +1,2 @@
+sergeyv@google.com
+yboyar@google.com
\ No newline at end of file
diff --git a/app-toolkit/core-testing/src/androidTest/java/android/arch/core/executor/testing/CountingTaskExecutorRuleTest.java b/app-toolkit/core-testing/src/androidTest/java/android/arch/core/executor/testing/CountingTaskExecutorRuleTest.java
index ad36b9b..a6a5b2e 100644
--- a/app-toolkit/core-testing/src/androidTest/java/android/arch/core/executor/testing/CountingTaskExecutorRuleTest.java
+++ b/app-toolkit/core-testing/src/androidTest/java/android/arch/core/executor/testing/CountingTaskExecutorRuleTest.java
@@ -19,7 +19,7 @@
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.support.test.filters.MediumTest;
 import android.support.test.runner.AndroidJUnit4;
 
@@ -115,13 +115,13 @@
 
     private LatchRunnable runOnIO() {
         LatchRunnable latchRunnable = new LatchRunnable();
-        AppToolkitTaskExecutor.getInstance().executeOnDiskIO(latchRunnable);
+        ArchTaskExecutor.getInstance().executeOnDiskIO(latchRunnable);
         return latchRunnable;
     }
 
     private LatchRunnable runOnMain() {
         LatchRunnable latchRunnable = new LatchRunnable();
-        AppToolkitTaskExecutor.getInstance().executeOnMainThread(latchRunnable);
+        ArchTaskExecutor.getInstance().executeOnMainThread(latchRunnable);
         return latchRunnable;
     }
 
diff --git a/app-toolkit/core-testing/src/main/AndroidManifest.xml b/app-toolkit/core-testing/src/main/AndroidManifest.xml
index 2d55b39..d169e00 100644
--- a/app-toolkit/core-testing/src/main/AndroidManifest.xml
+++ b/app-toolkit/core-testing/src/main/AndroidManifest.xml
@@ -16,8 +16,4 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.core.testing">
-    <application>
-        <meta-data android:name="android.arch.core.testing.VERSION"
-                   android:value="${version}" />
-    </application>
 </manifest>
diff --git a/app-toolkit/core-testing/src/main/java/android/arch/core/executor/JunitTaskExecutorRule.java b/app-toolkit/core-testing/src/main/java/android/arch/core/executor/JunitTaskExecutorRule.java
index cd4f8f5..c3366f3 100644
--- a/app-toolkit/core-testing/src/main/java/android/arch/core/executor/JunitTaskExecutorRule.java
+++ b/app-toolkit/core-testing/src/main/java/android/arch/core/executor/JunitTaskExecutorRule.java
@@ -46,11 +46,11 @@
     }
 
     private void beforeStart() {
-        AppToolkitTaskExecutor.getInstance().setDelegate(mTaskExecutor);
+        ArchTaskExecutor.getInstance().setDelegate(mTaskExecutor);
     }
 
     private void afterFinished() {
-        AppToolkitTaskExecutor.getInstance().setDelegate(null);
+        ArchTaskExecutor.getInstance().setDelegate(null);
     }
 
     public TaskExecutor getTaskExecutor() {
diff --git a/app-toolkit/core-testing/src/main/java/android/arch/core/executor/testing/CountingTaskExecutorRule.java b/app-toolkit/core-testing/src/main/java/android/arch/core/executor/testing/CountingTaskExecutorRule.java
index ad930aa..77133d5 100644
--- a/app-toolkit/core-testing/src/main/java/android/arch/core/executor/testing/CountingTaskExecutorRule.java
+++ b/app-toolkit/core-testing/src/main/java/android/arch/core/executor/testing/CountingTaskExecutorRule.java
@@ -16,7 +16,7 @@
 
 package android.arch.core.executor.testing;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.core.executor.DefaultTaskExecutor;
 import android.os.SystemClock;
 
@@ -39,7 +39,7 @@
     @Override
     protected void starting(Description description) {
         super.starting(description);
-        AppToolkitTaskExecutor.getInstance().setDelegate(new DefaultTaskExecutor() {
+        ArchTaskExecutor.getInstance().setDelegate(new DefaultTaskExecutor() {
             @Override
             public void executeOnDiskIO(Runnable runnable) {
                 super.executeOnDiskIO(new CountingRunnable(runnable));
@@ -55,7 +55,7 @@
     @Override
     protected void finished(Description description) {
         super.finished(description);
-        AppToolkitTaskExecutor.getInstance().setDelegate(null);
+        ArchTaskExecutor.getInstance().setDelegate(null);
     }
 
     private void increment() {
diff --git a/app-toolkit/core-testing/src/main/java/android/arch/core/executor/testing/InstantTaskExecutorRule.java b/app-toolkit/core-testing/src/main/java/android/arch/core/executor/testing/InstantTaskExecutorRule.java
index 07dcf1f..f88a3e3 100644
--- a/app-toolkit/core-testing/src/main/java/android/arch/core/executor/testing/InstantTaskExecutorRule.java
+++ b/app-toolkit/core-testing/src/main/java/android/arch/core/executor/testing/InstantTaskExecutorRule.java
@@ -16,7 +16,7 @@
 
 package android.arch.core.executor.testing;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.core.executor.TaskExecutor;
 
 import org.junit.rules.TestWatcher;
@@ -32,7 +32,7 @@
     @Override
     protected void starting(Description description) {
         super.starting(description);
-        AppToolkitTaskExecutor.getInstance().setDelegate(new TaskExecutor() {
+        ArchTaskExecutor.getInstance().setDelegate(new TaskExecutor() {
             @Override
             public void executeOnDiskIO(Runnable runnable) {
                 runnable.run();
@@ -53,6 +53,6 @@
     @Override
     protected void finished(Description description) {
         super.finished(description);
-        AppToolkitTaskExecutor.getInstance().setDelegate(null);
+        ArchTaskExecutor.getInstance().setDelegate(null);
     }
 }
diff --git a/app-toolkit/core-testing/src/test/java/android/arch/core/executor/testing/InstantTaskExecutorRuleTest.java b/app-toolkit/core-testing/src/test/java/android/arch/core/executor/testing/InstantTaskExecutorRuleTest.java
index 4345fd1..0fdcbfb 100644
--- a/app-toolkit/core-testing/src/test/java/android/arch/core/executor/testing/InstantTaskExecutorRuleTest.java
+++ b/app-toolkit/core-testing/src/test/java/android/arch/core/executor/testing/InstantTaskExecutorRuleTest.java
@@ -18,7 +18,7 @@
 
 import static org.junit.Assert.assertTrue;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 
 import org.junit.Rule;
 import org.junit.Test;
@@ -46,7 +46,7 @@
                 return null;
             }
         });
-        AppToolkitTaskExecutor.getInstance().executeOnMainThread(check);
+        ArchTaskExecutor.getInstance().executeOnMainThread(check);
         check.get(1, TimeUnit.SECONDS);
     }
 
@@ -60,7 +60,7 @@
                 return null;
             }
         });
-        AppToolkitTaskExecutor.getInstance().executeOnDiskIO(check);
+        ArchTaskExecutor.getInstance().executeOnDiskIO(check);
         check.get(1, TimeUnit.SECONDS);
     }
 }
diff --git a/app-toolkit/dependencies.gradle b/app-toolkit/dependencies.gradle
index 083325b..cb68089 100644
--- a/app-toolkit/dependencies.gradle
+++ b/app-toolkit/dependencies.gradle
@@ -32,7 +32,8 @@
 ffVersions.reactivestreams = "1.0.0"
 // this Xerial version is newer than we want but we need it to fix
 // https://github.com/xerial/sqlite-jdbc/issues/97
-ffVersions.xerial = "3.16.1"
+// https://github.com/xerial/sqlite-jdbc/issues/267
+ffVersions.xerial = "3.20.1"
 ffVersions.antlr = "4.5.3"
 ffVersions.commons_codec = "1.10"
 ffVersions.gson = "2.8.0"
diff --git a/app-toolkit/runtime/src/main/AndroidManifest.xml b/app-toolkit/runtime/src/main/AndroidManifest.xml
index a5660ce..3f40068 100644
--- a/app-toolkit/runtime/src/main/AndroidManifest.xml
+++ b/app-toolkit/runtime/src/main/AndroidManifest.xml
@@ -16,8 +16,4 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.core">
-    <application>
-        <meta-data android:name="android.arch.core.VERSION"
-                   android:value="${version}" />
-    </application>
 </manifest>
diff --git a/app-toolkit/runtime/src/main/java/android/arch/core/executor/AppToolkitTaskExecutor.java b/app-toolkit/runtime/src/main/java/android/arch/core/executor/ArchTaskExecutor.java
similarity index 88%
rename from app-toolkit/runtime/src/main/java/android/arch/core/executor/AppToolkitTaskExecutor.java
rename to app-toolkit/runtime/src/main/java/android/arch/core/executor/ArchTaskExecutor.java
index 7337f74..2401a73 100644
--- a/app-toolkit/runtime/src/main/java/android/arch/core/executor/AppToolkitTaskExecutor.java
+++ b/app-toolkit/runtime/src/main/java/android/arch/core/executor/ArchTaskExecutor.java
@@ -29,8 +29,8 @@
  * @hide This API is not final.
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class AppToolkitTaskExecutor extends TaskExecutor {
-    private static volatile AppToolkitTaskExecutor sInstance;
+public class ArchTaskExecutor extends TaskExecutor {
+    private static volatile ArchTaskExecutor sInstance;
 
     @NonNull
     private TaskExecutor mDelegate;
@@ -54,7 +54,7 @@
         }
     };
 
-    private AppToolkitTaskExecutor() {
+    private ArchTaskExecutor() {
         mDefaultTaskExecutor = new DefaultTaskExecutor();
         mDelegate = mDefaultTaskExecutor;
     }
@@ -62,15 +62,15 @@
     /**
      * Returns an instance of the task executor.
      *
-     * @return The singleton AppToolkitTaskExecutor.
+     * @return The singleton ArchTaskExecutor.
      */
-    public static AppToolkitTaskExecutor getInstance() {
+    public static ArchTaskExecutor getInstance() {
         if (sInstance != null) {
             return sInstance;
         }
-        synchronized (AppToolkitTaskExecutor.class) {
+        synchronized (ArchTaskExecutor.class) {
             if (sInstance == null) {
-                sInstance = new AppToolkitTaskExecutor();
+                sInstance = new ArchTaskExecutor();
             }
         }
         return sInstance;
diff --git a/buildSrc/dependencies.gradle b/buildSrc/dependencies.gradle
index 43576e2..ebeaa7e 100644
--- a/buildSrc/dependencies.gradle
+++ b/buildSrc/dependencies.gradle
@@ -32,11 +32,11 @@
     libs.gradle = 'com.android.tools.build:gradle:' + androidPluginVersionOverride
 } else {
     // Keep gradle plugin version in sync with ub_supportlib-master manifest.
-    libs.gradle = 'com.android.tools.build:gradle:3.0.0-beta6'
+    libs.gradle = 'com.android.tools.build:gradle:3.0.0'
 }
 
 //arch components
-libs.arch_lifecycle_runtime = "android.arch.lifecycle:runtime:1.0.0"
+libs.arch_lifecycle_runtime = "android.arch.lifecycle:runtime:1.0.0@aar"
 
 // Other dependencies
 libs.xml_parser_apis = 'xerces:xmlParserAPIs:2.6.2'
diff --git a/buildSrc/diff_and_docs.gradle b/buildSrc/diff_and_docs.gradle
index 6da0b57..876d1f3 100644
--- a/buildSrc/diff_and_docs.gradle
+++ b/buildSrc/diff_and_docs.gradle
@@ -14,15 +14,16 @@
  * limitations under the License.
  */
 
-import android.support.LibraryVersions
 import android.support.Version
 import android.support.checkapi.ApiXmlConversionTask
 import android.support.checkapi.CheckApiTask
 import android.support.checkapi.UpdateApiTask
 import android.support.doclava.DoclavaTask
 import android.support.jdiff.JDiffTask
+import com.android.build.gradle.api.LibraryVariant
 import groovy.io.FileType
 import groovy.transform.Field
+import org.gradle.api.tasks.compile.JavaCompile
 
 // Set up platform API files for federation.
 if (project.androidApiTxt != null) {
@@ -65,19 +66,21 @@
 }
 
 // configuration file for setting up api diffs and api docs
-void registerAndroidProjectForDocsTask(Task task, releaseVariant) {
+void registerAndroidProjectForDocsTask(Task task, LibraryVariant releaseVariant) {
     task.dependsOn releaseVariant.javaCompile
     task.source {
-        return releaseVariant.javaCompile.source +
-                fileTree(releaseVariant.aidlCompile.sourceOutputDir) +
-                fileTree(releaseVariant.outputs[0].processResources.sourceOutputDir)
+        // Exclude generated R.java files that don't belong to this project.
+        String packageDir = releaseVariant.getApplicationId().replace('.', '/')
+        return releaseVariant.javaCompile.source.filter { File file ->
+            return !file.name.equals('R.java') || file.parent.endsWith(packageDir)
+        }
     }
     task.classpath += releaseVariant.getCompileClasspath(null) +
             files(releaseVariant.javaCompile.destinationDir)
 }
 
 // configuration file for setting up api diffs and api docs
-void registerJavaProjectForDocsTask(Task task, javaCompileTask) {
+void registerJavaProjectForDocsTask(Task task, JavaCompile javaCompileTask) {
     task.dependsOn javaCompileTask
     task.source javaCompileTask.source
     task.classpath += files(javaCompileTask.classpath) +
@@ -117,10 +120,9 @@
     }
 
     options {
-        addStringOption "templatedir",
+        addStringOption 'templatedir',
                 "${supportRootFolder}/../../external/doclava/res/assets/templates-sdk"
-        addStringOption "stubpackages", "android.support.*"
-        addStringOption "samplesdir", "${supportRootFolder}/samples"
+        addStringOption 'samplesdir', "${supportRootFolder}/samples"
         addMultilineMultiValueOption("federate").setValue([
                 ['Android', 'https://developer.android.com']
         ])
@@ -384,6 +386,11 @@
         oldApiFile = getApiFile(project.projectDir, new Version(project.version))
         whitelistErrors = project.checkApiRelease.whitelistErrors
         whitelistErrorsFile = project.checkApiRelease.whitelistErrorsFile
+
+        doFirst {
+            // Replace the expected whitelist with the detected whitelist.
+            whitelistErrors = project.checkApiRelease.detectedWhitelistErrors
+        }
     }
 }
 
@@ -425,7 +432,7 @@
         } else if (project.hasProperty("toApi") && toApi.matches(~/(\d+\.){2}\d+/)) {
             // If toApi matches released API (X.Y.Z) format, use the most recently
             // released API file prior to toApi.
-            inputApiFile = getPreviousApiFile(rootFolder, toApi)
+            inputApiFile = getLastReleasedApiFile(rootFolder, toApi)
         } else {
             // Use the most recently released API file.
             inputApiFile = getApiFile(rootFolder, new Version(project.version))
@@ -507,22 +514,23 @@
 subprojects { subProject ->
     subProject.afterEvaluate { project ->
         if (project.hasProperty("noDocs") && project.noDocs) {
+            logger.warn("Project $project.name specified noDocs, ignoring API tasks.")
+            return
+        }
+        if (project.hasProperty("supportLibrary") && !project.supportLibrary.publish) {
+            logger.warn("Project $project.name is not published, ignoring API tasks.")
             return
         }
         if (project.hasProperty('android') && project.android.hasProperty('libraryVariants')) {
             project.android.libraryVariants.all { variant ->
                 if (variant.name == 'release') {
                     registerAndroidProjectForDocsTask(rootProject.generateDocs, variant)
-                    if (rootProject.tasks.findByPath("generateApi")) {
-                        registerAndroidProjectForDocsTask(rootProject.generateApi, variant)
-                        registerAndroidProjectForDocsTask(rootProject.generateDiffs, variant)
-                    }
                     if (!hasJavaSources(variant)) {
                         return
                     }
                     if (!hasApiFolder(project)) {
                         logger.warn("Project $project.name doesn't have an api folder, " +
-                                "ignoring API tasks")
+                                "ignoring API tasks.")
                         return
                     }
                     initializeApiChecksForProject(project)
@@ -534,7 +542,7 @@
             registerJavaProjectForDocsTask(rootProject.generateDocs, project.compileJava)
             if (!hasApiFolder(project)) {
                 logger.warn("Project $project.name doesn't have an api folder, " +
-                        "ignoring API tasks")
+                        "ignoring API tasks.")
                 return
             }
             initializeApiChecksForProject(project)
diff --git a/buildSrc/init.gradle b/buildSrc/init.gradle
index ec8685d..44116d6 100644
--- a/buildSrc/init.gradle
+++ b/buildSrc/init.gradle
@@ -64,7 +64,7 @@
 }
 
 def setSdkInLocalPropertiesFile() {
-    ext.buildToolsVersion = '26.0.0'
+    ext.buildToolsVersion = '27.0.0'
     final String fullSdkPath = getFullSdkPath();
     if (file(fullSdkPath).exists()) {
         gradle.ext.currentSdk = 26
@@ -127,7 +127,7 @@
 def configureBuildOnServer() {
     def buildOnServerTask = rootProject.tasks.create("buildOnServer")
     rootProject.tasks.whenTaskAdded { task ->
-        if ("createArchive".equals(task.name)) {
+        if ("createArchive".equals(task.name) || "distDocs".equals(task.name)) {
             buildOnServerTask.dependsOn task
         }
     }
@@ -255,7 +255,20 @@
                 task.doLast {
                     def source = testApk ? project.android.sourceSets.androidTest
                             : project.android.sourceSets.main
-                    if (task.hasProperty("outputDirectory") && !source.java.sourceFiles.isEmpty()) {
+                    def hasKotlinSources = false
+                    if (source.hasProperty('kotlin')) {
+                        if (!source.kotlin.files.isEmpty()) {
+                            hasKotlinSources = true
+                        } else {
+                            // kotlin files does not show in java sources due to the *.java filter
+                            // so we need to check them manually
+                            hasKotlinSources = source.java.sourceDirectoryTrees.any {
+                                !fileTree(dir: it.dir, include:'**/*.kt').files.isEmpty()
+                            }
+                        }
+                    }
+                    def hasSourceCode = !source.java.sourceFiles.isEmpty() || hasKotlinSources
+                    if (task.hasProperty("outputDirectory") && (hasSourceCode || !testApk)) {
                         copy {
                             from(task.outputDirectory)
                             include '*.apk'
diff --git a/buildSrc/release.gradle b/buildSrc/release.gradle
index 959ed44..d376039 100644
--- a/buildSrc/release.gradle
+++ b/buildSrc/release.gradle
@@ -65,6 +65,11 @@
         includeFilters.forEach {
             include it
         }
+        if (includeFilters.isEmpty()) {
+            // not providing any include would mean include everything so we provide a dummy
+            // include constraint.
+            include "do-not-include-anything"
+        }
     }
     from rootProject.ext.supportRepoOut
     destinationDir rootProject.ext.distDir
diff --git a/buildSrc/src/main/groovy/android/support/FlatfootAndroidLibraryPlugin.groovy b/buildSrc/src/main/groovy/android/support/FlatfootAndroidLibraryPlugin.groovy
index 5fe6d60..c6abac2 100644
--- a/buildSrc/src/main/groovy/android/support/FlatfootAndroidLibraryPlugin.groovy
+++ b/buildSrc/src/main/groovy/android/support/FlatfootAndroidLibraryPlugin.groovy
@@ -17,7 +17,6 @@
 package android.support
 
 import com.google.common.collect.ImmutableMap
-import org.gradle.api.JavaVersion
 import org.gradle.api.Plugin
 import org.gradle.api.Project
 
@@ -31,6 +30,7 @@
         SupportLibraryExtension supportLibraryExtension =
                 project.extensions.create("supportLibrary", SupportLibraryExtension, project);
         SupportLibraryMavenUploader.apply(project, supportLibraryExtension);
+        VersionFileWriterTask.setUpAndroidLibrary(project);
 
         project.apply(ImmutableMap.of("plugin", "com.android.library"));
     }
diff --git a/buildSrc/src/main/groovy/android/support/SupportAndroidLibraryPlugin.groovy b/buildSrc/src/main/groovy/android/support/SupportAndroidLibraryPlugin.groovy
index cd4d96c..2170a50 100644
--- a/buildSrc/src/main/groovy/android/support/SupportAndroidLibraryPlugin.groovy
+++ b/buildSrc/src/main/groovy/android/support/SupportAndroidLibraryPlugin.groovy
@@ -42,6 +42,30 @@
                 project.extensions.create("supportLibrary", SupportLibraryExtension, project);
         SupportLibraryMavenUploader.apply(project, supportLibraryExtension);
 
+        project.afterEvaluate {
+            LibraryExtension library = project.extensions.findByType(LibraryExtension.class);
+
+            // Java 8 is only fully supported on API 24+ and not all Java 8 features are binary
+            // compatible with API < 24, so use Java 7 for both source AND target.
+            final JavaVersion javaVersion;
+            if (supportLibraryExtension.java8Library) {
+                if (library.defaultConfig.minSdkVersion.apiLevel < 24) {
+                    throw new IllegalArgumentException("Libraries can only support Java 8 if "
+                            + "minSdkVersion is 24 or higher");
+                }
+                javaVersion = JavaVersion.VERSION_1_8
+            } else {
+                javaVersion = JavaVersion.VERSION_1_7
+            }
+
+            library.compileOptions {
+                sourceCompatibility javaVersion
+                targetCompatibility javaVersion
+            }
+        }
+
+        VersionFileWriterTask.setUpAndroidLibrary(project);
+
         project.apply(ImmutableMap.of("plugin", "com.android.library"));
         project.apply(ImmutableMap.of("plugin", ErrorProneBasePlugin.class));
 
@@ -51,8 +75,7 @@
 
         library.defaultConfig {
             // Update the version meta-data in each Manifest.
-            addManifestPlaceholders(["support-version": LibraryVersions.SUPPORT_LIBRARY.toString(),
-                                     "target-sdk-version": project.currentSdk])
+            addManifestPlaceholders(["target-sdk-version": project.currentSdk])
 
             // Set test related options.
             testInstrumentationRunner INSTRUMENTATION_RUNNER
@@ -112,13 +135,6 @@
             project.uploadArchives.dependsOn "lintRelease"
         }
 
-        // Java 8 is only fully supported on API 24+ and not all Java 8 features are binary
-        // compatible with API < 24, so use Java 7 for both source AND target.
-        library.compileOptions {
-            sourceCompatibility JavaVersion.VERSION_1_7
-            targetCompatibility JavaVersion.VERSION_1_7
-        }
-
         // Create sources jar for release builds
         library.getLibraryVariants().all(new Action<LibraryVariant>() {
             @Override
@@ -128,6 +144,7 @@
                 }
 
                 Jar sourceJar = project.getTasks().create("sourceJarRelease", Jar.class);
+                sourceJar.preserveFileTimestamps = false;
                 sourceJar.setClassifier("sources");
                 sourceJar.from(library.getSourceSets().findByName("main").getJava().getSrcDirs());
                 project.getArtifacts().add("archives", sourceJar);
diff --git a/buildSrc/src/main/groovy/android/support/SupportLibraryMavenUploader.groovy b/buildSrc/src/main/groovy/android/support/SupportLibraryMavenUploader.groovy
index 7f942e1..957cae8 100644
--- a/buildSrc/src/main/groovy/android/support/SupportLibraryMavenUploader.groovy
+++ b/buildSrc/src/main/groovy/android/support/SupportLibraryMavenUploader.groovy
@@ -16,9 +16,11 @@
 
 package android.support
 
+import com.android.build.gradle.LibraryPlugin
 import com.google.common.collect.ImmutableMap
 import org.gradle.api.Action
 import org.gradle.api.Project
+import org.gradle.api.artifacts.ProjectDependency
 import org.gradle.api.artifacts.maven.MavenDeployer
 import org.gradle.api.tasks.Upload
 
@@ -66,6 +68,21 @@
                                 }
                             }
                         }
+
+                        uploadTask.doFirst {
+                            Set<ProjectDependency> allDeps = new HashSet<>();
+                            collectDependenciesForConfiguration(allDeps, project, "api");
+                            collectDependenciesForConfiguration(allDeps, project, "implementation");
+                            collectDependenciesForConfiguration(allDeps, project, "compile");
+
+                            mavenDeployer.getPom().whenConfigured {
+                                it.dependencies.forEach { dep ->
+                                    if (isAndroidProject(dep.groupId, dep.artifactId, allDeps)) {
+                                        dep.type = "aar"
+                                    }
+                                }
+                            }
+                        }
                     }
                 });
             } else {
@@ -73,4 +90,23 @@
             }
         }
     }
+
+    private static void collectDependenciesForConfiguration(Set<ProjectDependency> dependencies,
+            Project project, String name) {
+        def config = project.configurations.findByName(name);
+        if (config != null) {
+            config.dependencies.withType(ProjectDependency.class).forEach {
+                dep -> dependencies.add(dep)
+            }
+        }
+    }
+
+    private static boolean isAndroidProject(String groupId, String artifactId, Set<ProjectDependency> deps) {
+        for (ProjectDependency dep : deps) {
+            if (dep.group == groupId && dep.name == artifactId) {
+                return dep.getDependencyProject().plugins.hasPlugin(LibraryPlugin.class)
+            }
+        }
+        return false;
+    }
 }
\ No newline at end of file
diff --git a/buildSrc/src/main/groovy/android/support/checkapi/CheckApiTask.groovy b/buildSrc/src/main/groovy/android/support/checkapi/CheckApiTask.groovy
index 05b4b1c..4f829f6 100644
--- a/buildSrc/src/main/groovy/android/support/checkapi/CheckApiTask.groovy
+++ b/buildSrc/src/main/groovy/android/support/checkapi/CheckApiTask.groovy
@@ -18,8 +18,6 @@
 
 import org.gradle.api.DefaultTask
 import org.gradle.api.GradleException
-import org.gradle.api.InvalidUserDataException
-import org.gradle.api.Nullable
 import org.gradle.api.tasks.Input
 import org.gradle.api.tasks.InputFile
 import org.gradle.api.tasks.InputFiles
@@ -110,6 +108,9 @@
     @Input
     Set whitelistErrors = []
 
+    // Errors that were both detected and whitelisted.
+    Set detectedWhitelistErrors = []
+
     @InputFiles
     Collection<File> doclavaClasspath
 
@@ -234,9 +235,9 @@
         }
 
         // Parse the error output.
-        def unparsedErrors = []
-        def ignoredErrors = []
-        def parsedErrors = []
+        Set unparsedErrors = []
+        Set detectedErrors = []
+        Set parsedErrors = []
         errStream.toString().split("\n").each {
             if (it) {
                 def matcher = it =~ ~/^(.+):(.+): (\w+) (\d+): (.+)$/
@@ -246,7 +247,8 @@
                     def hash = getShortHash(matcher[0][5]);
                     def error = matcher[0][1..-1] + [hash]
                     if (hash in whitelistErrors) {
-                        ignoredErrors += [error]
+                        detectedErrors += [error]
+                        detectedWhitelistErrors += error[5]
                     } else {
                         parsedErrors += [error]
                     }
@@ -256,7 +258,7 @@
 
         unparsedErrors.each { error -> logger.error "$ANSI_RED$error$ANSI_RESET" }
         parsedErrors.each { logger.error "$ANSI_RED${it[5]}$ANSI_RESET ${it[4]}"}
-        ignoredErrors.each { logger.warn "$ANSI_YELLOW${it[5]}$ANSI_RESET ${it[4]}"}
+        detectedErrors.each { logger.warn "$ANSI_YELLOW${it[5]}$ANSI_RESET ${it[4]}"}
 
         if (unparsedErrors || parsedErrors) {
             throw new GradleException(onFailMessage)
diff --git a/buildSrc/src/main/java/android/support/LibraryVersions.java b/buildSrc/src/main/java/android/support/LibraryVersions.java
index dbc9da6..19d5d6d 100644
--- a/buildSrc/src/main/java/android/support/LibraryVersions.java
+++ b/buildSrc/src/main/java/android/support/LibraryVersions.java
@@ -23,12 +23,12 @@
     /**
      * Version code of the support library components.
      */
-    public static final Version SUPPORT_LIBRARY = new Version("27.0.0-SNAPSHOT");
+    public static final Version SUPPORT_LIBRARY = new Version("27.0.0");
 
     /**
      * Version code for flatfoot 1.0 projects (room, lifecycles)
      */
-    private static final Version FLATFOOT_1_0_BATCH = new Version("1.0.0-beta1");
+    private static final Version FLATFOOT_1_0_BATCH = new Version("1.0.0-rc1");
 
     /**
      * Version code for Room
@@ -43,17 +43,19 @@
     /**
      * Version code for RecyclerView & Room paging
      */
-    public static final Version PAGING = new Version("1.0.0-alpha2");
+    public static final Version PAGING = new Version("1.0.0-alpha3");
+
+    private static final Version LIFECYCLES = new Version("1.0.3");
 
     /**
      * Version code for Lifecycle libs that are required by the support library
      */
-    public static final Version LIFECYCLES_CORE = new Version("1.0.1");
+    public static final Version LIFECYCLES_CORE = LIFECYCLES;
 
     /**
      * Version code for Lifecycle runtime libs that are required by the support library
      */
-    public static final Version LIFECYCLES_RUNTIME = new Version("1.0.0");
+    public static final Version LIFECYCLES_RUNTIME = LIFECYCLES;
 
     /**
      * Version code for shared code of flatfoot
diff --git a/buildSrc/src/main/java/android/support/VersionFileWriterTask.java b/buildSrc/src/main/java/android/support/VersionFileWriterTask.java
new file mode 100644
index 0000000..aafa023
--- /dev/null
+++ b/buildSrc/src/main/java/android/support/VersionFileWriterTask.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support;
+
+import com.android.build.gradle.LibraryExtension;
+
+import org.gradle.api.Action;
+import org.gradle.api.DefaultTask;
+import org.gradle.api.Project;
+import org.gradle.api.tasks.Input;
+import org.gradle.api.tasks.OutputFile;
+import org.gradle.api.tasks.TaskAction;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * Task that allows to write a version to a given output file.
+ */
+public class VersionFileWriterTask extends DefaultTask {
+    public static final String RESOURCE_DIRECTORY = "generatedResources";
+    public static final String VERSION_FILE_PATH =
+            RESOURCE_DIRECTORY + "/META-INF/%s_%s.version";
+
+    private String mVersion;
+    private File mOutputFile;
+
+    /**
+     * Sets up Android Library project to have a task that generates a version file.
+     *
+     * @param project an Android Library project.
+     */
+    public static void setUpAndroidLibrary(Project project) {
+        project.afterEvaluate(new Action<Project>() {
+            @Override
+            public void execute(Project project) {
+                LibraryExtension library =
+                        project.getExtensions().findByType(LibraryExtension.class);
+
+                String group = (String) project.getProperties().get("group");
+                String artifactId = (String) project.getProperties().get("name");
+                String version = (String) project.getProperties().get("version");
+
+                // Add a java resource file to the library jar for version tracking purposes.
+                File artifactName = new File(project.getBuildDir(),
+                        String.format(VersionFileWriterTask.VERSION_FILE_PATH,
+                                group, artifactId));
+
+                VersionFileWriterTask writeVersionFile =
+                        project.getTasks().create("writeVersionFile", VersionFileWriterTask.class);
+                writeVersionFile.setVersion(version);
+                writeVersionFile.setOutputFile(artifactName);
+
+                library.getLibraryVariants().all(
+                        libraryVariant -> libraryVariant.getProcessJavaResources().dependsOn(
+                                writeVersionFile));
+
+                library.getSourceSets().getByName("main").getResources().srcDir(
+                        new File(project.getBuildDir(), VersionFileWriterTask.RESOURCE_DIRECTORY)
+                );
+            }
+        });
+    }
+
+    @Input
+    public String getVersion() {
+        return mVersion;
+    }
+
+    public void setVersion(String version) {
+        mVersion = version;
+    }
+
+    @OutputFile
+    public File getOutputFile() {
+        return mOutputFile;
+    }
+
+    public void setOutputFile(File outputFile) {
+        mOutputFile = outputFile;
+    }
+
+    /**
+     * The main method for actually writing out the file.
+     *
+     * @throws IOException
+     */
+    @TaskAction
+    public void run() throws IOException {
+        PrintWriter writer = new PrintWriter(mOutputFile);
+        writer.println(mVersion);
+        writer.close();
+    }
+}
diff --git a/compat/Android.mk b/compat/Android.mk
index cd62336..e16bba6 100644
--- a/compat/Android.mk
+++ b/compat/Android.mk
@@ -25,10 +25,10 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-compat
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/java
+LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/src/main/java
 LOCAL_SRC_FILES := \
-    $(call all-java-files-under,java) \
-    $(call all-Iaidl-files-under,java)
+    $(call all-java-files-under,src/main/java) \
+    $(call all-Iaidl-files-under,src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-annotations
diff --git a/compat/AndroidManifest.xml b/compat/AndroidManifest.xml
index cba2f24..5525c41 100644
--- a/compat/AndroidManifest.xml
+++ b/compat/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.compat">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.compat.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/compat/OWNERS b/compat/OWNERS
new file mode 100644
index 0000000..cf4df58
--- /dev/null
+++ b/compat/OWNERS
@@ -0,0 +1,4 @@
+aurimas@google.com
+cinek@google.com
+clarabayarri@google.com
+juliacr@google.com
\ No newline at end of file
diff --git a/compat/api/26.1.0.ignore b/compat/api/26.1.0.ignore
new file mode 100644
index 0000000..bad3ae6
--- /dev/null
+++ b/compat/api/26.1.0.ignore
@@ -0,0 +1,4 @@
+83a055e
+0af04fb
+7529650
+f41c100
diff --git a/compat/api/26.1.0.txt b/compat/api/26.1.0.txt
new file mode 100644
index 0000000..d6f02b4
--- /dev/null
+++ b/compat/api/26.1.0.txt
@@ -0,0 +1,2426 @@
+package android.support.v4.accessibilityservice {
+
+  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);
+    method public static deprecated boolean getCanRetrieveWindowContent(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static deprecated java.lang.String getDescription(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static deprecated java.lang.String getId(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static deprecated android.content.pm.ResolveInfo getResolveInfo(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static deprecated java.lang.String getSettingsActivityName(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static java.lang.String loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    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 deprecated 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 class ActivityCompat extends android.support.v4.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public static 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 startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    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 android.graphics.Rect getLaunchBounds();
+    method public static android.support.v4.app.ActivityOptionsCompat makeBasic();
+    method public static android.support.v4.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    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 makeTaskLaunchBehind();
+    method public static android.support.v4.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public android.support.v4.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect);
+    method public android.os.Bundle toBundle();
+    method public void update(android.support.v4.app.ActivityOptionsCompat);
+    field public static final java.lang.String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final java.lang.String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  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);
+    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
+  }
+
+  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);
+  }
+
+  public abstract class JobIntentService extends android.app.Service {
+    ctor public JobIntentService();
+    method public static void enqueueWork(android.content.Context, java.lang.Class, int, android.content.Intent);
+    method public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method public boolean isStopped();
+    method public android.os.IBinder onBind(android.content.Intent);
+    method protected abstract void onHandleWork(android.content.Intent);
+    method public boolean onStopCurrentWork();
+    method public void setInterruptIfStopped(boolean);
+  }
+
+  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 int getBadgeIconType(android.app.Notification);
+    method public static java.lang.String getCategory(android.app.Notification);
+    method public static java.lang.String getChannelId(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 int getGroupAlertBehavior(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static java.lang.String getShortcutId(android.app.Notification);
+    method public static java.lang.String getSortKey(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    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_REMINDER = "reminder";
+    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_AUDIO_CONTENTS_URI = "android.audioContents";
+    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_CONVERSATION_TITLE = "android.conversationTitle";
+    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_MESSAGES = "android.messages";
+    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_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final java.lang.String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    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 GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 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 boolean getAllowGeneratedReplies();
+    method public android.support.v4.app.RemoteInput[] getDataOnlyRemoteInputs();
+    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();
+    method public android.support.v4.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+  }
+
+  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 boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    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 setHintDisplayActionInline(boolean);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    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, java.lang.String);
+    ctor public deprecated 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 setBadgeIconType(int);
+    method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setChannelId(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setColor(int);
+    method public android.support.v4.app.NotificationCompat.Builder setColorized(boolean);
+    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 setCustomBigContentView(android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews);
+    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 setGroupAlertBehavior(int);
+    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 setRemoteInputHistory(java.lang.CharSequence[]);
+    method public android.support.v4.app.NotificationCompat.Builder setShortcutId(java.lang.String);
+    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 setTimeoutAfter(long);
+    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 class NotificationCompat.DecoratedCustomViewStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  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 class NotificationCompat.MessagingStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.MessagingStyle(java.lang.CharSequence);
+    method public void addCompatExtras(android.os.Bundle);
+    method public android.support.v4.app.NotificationCompat.MessagingStyle addMessage(java.lang.CharSequence, long, java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.MessagingStyle addMessage(android.support.v4.app.NotificationCompat.MessagingStyle.Message);
+    method public static android.support.v4.app.NotificationCompat.MessagingStyle extractMessagingStyleFromNotification(android.app.Notification);
+    method public java.lang.CharSequence getConversationTitle();
+    method public java.util.List<android.support.v4.app.NotificationCompat.MessagingStyle.Message> getMessages();
+    method public java.lang.CharSequence getUserDisplayName();
+    method public android.support.v4.app.NotificationCompat.MessagingStyle setConversationTitle(java.lang.CharSequence);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(java.lang.CharSequence, long, java.lang.CharSequence);
+    method public java.lang.String getDataMimeType();
+    method public android.net.Uri getDataUri();
+    method public android.os.Bundle getExtras();
+    method public java.lang.CharSequence getSender();
+    method public java.lang.CharSequence getText();
+    method public long getTimestamp();
+    method public android.support.v4.app.NotificationCompat.MessagingStyle.Message setData(java.lang.String, android.net.Uri);
+  }
+
+  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 java.lang.String getBridgeTag();
+    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 java.lang.String getDismissalId();
+    method public android.app.PendingIntent getDisplayIntent();
+    method public int getGravity();
+    method public boolean getHintAmbientBigPicture();
+    method public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    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 setBridgeTag(java.lang.String);
+    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 setDismissalId(java.lang.String);
+    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 setHintAmbientBigPicture(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(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 final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    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 int getImportance();
+    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";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public final class RemoteInput extends android.support.v4.app.RemoteInputCompatBase.RemoteInput {
+    method public static void addDataResultToIntent(android.support.v4.app.RemoteInput, android.content.Intent, java.util.Map<java.lang.String, android.net.Uri>);
+    method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String> getAllowedDataTypes();
+    method public java.lang.CharSequence[] getChoices();
+    method public static java.util.Map<java.lang.String, android.net.Uri> getDataResultsFromIntent(android.content.Intent, java.lang.String);
+    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);
+    method public boolean isDataOnly();
+    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 setAllowDataType(java.lang.String, boolean);
+    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);
+  }
+
+   deprecated class RemoteInputCompatBase {
+  }
+
+  public static abstract class RemoteInputCompatBase.RemoteInput {
+    ctor public RemoteInputCompatBase.RemoteInput();
+    method protected abstract boolean getAllowFreeFormInput();
+    method protected abstract java.util.Set<java.lang.String> getAllowedDataTypes();
+    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 final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  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);
+    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>);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String>, java.util.List<android.view.View>, android.support.v4.app.SharedElementCallback.OnSharedElementsReadyListener);
+  }
+
+  public static abstract interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public abstract void onSharedElementsReady();
+  }
+
+}
+
+package android.support.v4.content {
+
+  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 protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, java.lang.String);
+    method public static android.content.Context createDeviceProtectedStorageContext(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);
+    method public static java.io.File getDataDir(android.content.Context);
+    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 static final java.io.File getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File[] getObbDirs(android.content.Context);
+    method public static boolean isDeviceProtectedStorage(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);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public final class IntentCompat {
+    method public static deprecated android.content.Intent makeMainActivity(android.content.ComponentName);
+    method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
+    method public static deprecated android.content.Intent makeRestartActivityTask(android.content.ComponentName);
+    field public static final deprecated java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
+    field public static final deprecated java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
+    field public static final java.lang.String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final deprecated java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
+    field public static final deprecated 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 java.lang.String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+    field public static final deprecated int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
+    field public static final deprecated int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
+  }
+
+  public final deprecated class ParallelExecutorCompat {
+    method public static deprecated java.util.concurrent.Executor getParallelExecutor();
+  }
+
+  public final class SharedPreferencesCompat {
+  }
+
+  public static final class SharedPreferencesCompat.EditorCompat {
+    method public void apply(android.content.SharedPreferences.Editor);
+    method public static android.support.v4.content.SharedPreferencesCompat.EditorCompat getInstance();
+  }
+
+}
+
+package android.support.v4.content.pm {
+
+  public final class ActivityInfoCompat {
+    field public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName getActivity();
+    method public java.lang.CharSequence getDisabledMessage();
+    method public java.lang.String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent[] getIntents();
+    method public java.lang.CharSequence getLongLabel();
+    method public java.lang.CharSequence getShortLabel();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, java.lang.String);
+    method public android.support.v4.content.pm.ShortcutInfoCompat build();
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(java.lang.CharSequence);
+    method public deprecated android.support.v4.content.pm.ShortcutInfoCompat.Builder setIcon(android.graphics.Bitmap);
+    method public deprecated android.support.v4.content.pm.ShortcutInfoCompat.Builder setIcon(int);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIcon(android.support.v4.graphics.drawable.IconCompat);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent[]);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setLongLabel(java.lang.CharSequence);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setShortLabel(java.lang.CharSequence);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, android.support.v4.content.pm.ShortcutInfoCompat);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean requestPinShortcut(android.content.Context, android.support.v4.content.pm.ShortcutInfoCompat, android.content.IntentSender);
+  }
+
+}
+
+package android.support.v4.content.res {
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+    method public static deprecated int getScreenHeightDp(android.content.res.Resources);
+    method public static deprecated int getScreenWidthDp(android.content.res.Resources);
+    method public static deprecated int getSmallestScreenWidthDp(android.content.res.Resources);
+  }
+
+  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;
+    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;
+    method public static android.graphics.Typeface getFont(android.content.Context, int) throws android.content.res.Resources.NotFoundException;
+  }
+
+}
+
+package android.support.v4.database {
+
+  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);
+  }
+
+}
+
+package android.support.v4.graphics {
+
+  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 final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, java.lang.String);
+  }
+
+}
+
+package android.support.v4.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    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 boolean 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 extends android.graphics.drawable.Drawable> T unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
+  }
+
+  public class IconCompat {
+    method public static android.support.v4.graphics.drawable.IconCompat createWithAdaptiveBitmap(android.graphics.Bitmap);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithBitmap(android.graphics.Bitmap);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithContentUri(java.lang.String);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithContentUri(android.net.Uri);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithData(byte[], int, int);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithResource(android.content.Context, int);
+  }
+
+}
+
+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 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();
+    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.net {
+
+  public final class ConnectivityManagerCompat {
+    method public static android.net.NetworkInfo getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  public final class TrafficStatsCompat {
+    method public static deprecated void clearThreadStatsTag();
+    method public static deprecated int getThreadStatsTag();
+    method public static deprecated void incrementOperationCount(int);
+    method public static deprecated void incrementOperationCount(int, int);
+    method public static deprecated void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method public static deprecated void tagSocket(java.net.Socket) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method public static deprecated void untagSocket(java.net.Socket) throws java.net.SocketException;
+  }
+
+}
+
+package android.support.v4.os {
+
+  public final deprecated class AsyncTaskCompat {
+    method public static deprecated <Params, Progress, Result> android.os.AsyncTask<Params, Progress, Result> executeParallel(android.os.AsyncTask<Params, Progress, Result>, Params...);
+  }
+
+  public class BuildCompat {
+    method public static deprecated boolean isAtLeastN();
+    method public static deprecated boolean isAtLeastNMR1();
+    method public static deprecated boolean isAtLeastO();
+    method public static boolean isAtLeastOMR1();
+    method public static boolean isAtLeastP();
+  }
+
+  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 final class ConfigurationCompat {
+    method public static android.support.v4.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static java.lang.String getStorageState(java.io.File);
+    field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class LocaleListCompat {
+    method public static android.support.v4.os.LocaleListCompat create(java.util.Locale...);
+    method public static android.support.v4.os.LocaleListCompat forLanguageTags(java.lang.String);
+    method public java.util.Locale get(int);
+    method public static android.support.v4.os.LocaleListCompat getAdjustedDefault();
+    method public static android.support.v4.os.LocaleListCompat getDefault();
+    method public static android.support.v4.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale getFirstMatch(java.lang.String[]);
+    method public int indexOf(java.util.Locale);
+    method public boolean isEmpty();
+    method public int size();
+    method public java.lang.String toLanguageTags();
+    method public java.lang.Object unwrap();
+    method public static android.support.v4.os.LocaleListCompat wrap(java.lang.Object);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(java.lang.String);
+  }
+
+  public final deprecated class ParcelableCompat {
+    method public static deprecated <T> android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
+  }
+
+  public abstract deprecated interface ParcelableCompatCreatorCallbacks<T> {
+    method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
+    method public abstract T[] newArray(int);
+  }
+
+  public final class TraceCompat {
+    method public static void beginSection(java.lang.String);
+    method public static void endSection();
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package android.support.v4.provider {
+
+  public final class FontRequest {
+    ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, java.util.List<java.util.List<byte[]>>);
+    ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, int);
+    method public java.util.List<java.util.List<byte[]>> getCertificates();
+    method public int getCertificatesArrayResId();
+    method public java.lang.String getProviderAuthority();
+    method public java.lang.String getProviderPackage();
+    method public java.lang.String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface buildTypeface(android.content.Context, android.os.CancellationSignal, android.support.v4.provider.FontsContractCompat.FontInfo[]);
+    method public static android.support.v4.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal, android.support.v4.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void requestFont(android.content.Context, android.support.v4.provider.FontRequest, android.support.v4.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+  }
+
+  public static final class FontsContractCompat.Columns {
+    ctor public FontsContractCompat.Columns();
+    field public static final java.lang.String FILE_ID = "file_id";
+    field public static final java.lang.String ITALIC = "font_italic";
+    field public static final java.lang.String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final java.lang.String TTC_INDEX = "font_ttc_index";
+    field public static final java.lang.String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final java.lang.String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    method public android.support.v4.provider.FontsContractCompat.FontInfo[] getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    method public int getResultCode();
+    method public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+  }
+
+}
+
+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 isRtl(java.lang.CharSequence);
+    method public boolean isRtlContext();
+    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
+    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
+    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat);
+    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, android.support.v4.text.TextDirectionHeuristicCompat);
+    method public java.lang.String unicodeWrap(java.lang.String, boolean);
+    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, boolean);
+    method public java.lang.String unicodeWrap(java.lang.String);
+    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence);
+  }
+
+  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 final class 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 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;
+    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 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 deprecated java.util.Locale ROOT;
+  }
+
+}
+
+package android.support.v4.text.util {
+
+  public final class LinkifyCompat {
+    method public static final boolean addLinks(android.text.Spannable, int);
+    method public static final boolean addLinks(android.widget.TextView, int);
+    method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String);
+    method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+    method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+    method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String);
+    method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+    method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+  }
+
+}
+
+package android.support.v4.util {
+
+  public class ArrayMap<K, V> 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 final class ArraySet<E> implements java.util.Collection java.util.Set {
+    ctor public ArraySet();
+    ctor public ArraySet(int);
+    ctor public ArraySet(android.support.v4.util.ArraySet<E>);
+    method public boolean add(E);
+    method public void addAll(android.support.v4.util.ArraySet<? extends E>);
+    method public boolean addAll(java.util.Collection<? extends E>);
+    method public void clear();
+    method public boolean contains(java.lang.Object);
+    method public boolean containsAll(java.util.Collection<?>);
+    method public void ensureCapacity(int);
+    method public int indexOf(java.lang.Object);
+    method public boolean isEmpty();
+    method public java.util.Iterator<E> iterator();
+    method public boolean remove(java.lang.Object);
+    method public boolean removeAll(android.support.v4.util.ArraySet<? extends E>);
+    method public boolean removeAll(java.util.Collection<?>);
+    method public E removeAt(int);
+    method public boolean retainAll(java.util.Collection<?>);
+    method public int size();
+    method public java.lang.Object[] toArray();
+    method public <T> T[] toArray(T[]);
+    method public E valueAt(int);
+  }
+
+  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<E> {
+    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<E> {
+    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<K, V> {
+    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 ObjectsCompat {
+    method public static boolean equals(java.lang.Object, java.lang.Object);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F, S);
+    method public static <A, B> android.support.v4.util.Pair<A, B> create(A, B);
+    field public final F first;
+    field public final S second;
+  }
+
+  public final class PatternsCompat {
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static abstract interface Pools.Pool<T> {
+    method public abstract T acquire();
+    method public abstract boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> 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<T> extends android.support.v4.util.Pools.SimplePool {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public class SimpleArrayMap<K, V> {
+    ctor public SimpleArrayMap();
+    ctor public SimpleArrayMap(int);
+    ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap<K, V>);
+    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<E> {
+    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 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();
+    method public boolean onTouchEvent(android.view.MotionEvent);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
+  }
+
+  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);
+    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 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
+    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_ROTARY_ENCODER = 4194304; // 0x400000
+    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 final deprecated class KeyEventCompat {
+    method public static deprecated boolean dispatch(android.view.KeyEvent, android.view.KeyEvent.Callback, java.lang.Object, java.lang.Object);
+    method public static deprecated java.lang.Object getKeyDispatcherState(android.view.View);
+    method public static deprecated boolean hasModifiers(android.view.KeyEvent, int);
+    method public static deprecated boolean hasNoModifiers(android.view.KeyEvent);
+    method public static deprecated boolean isCtrlPressed(android.view.KeyEvent);
+    method public static deprecated boolean isTracking(android.view.KeyEvent);
+    method public static deprecated boolean metaStateHasModifiers(int, int);
+    method public static deprecated boolean metaStateHasNoModifiers(int);
+    method public static deprecated int normalizeMetaState(int);
+    method public static deprecated void startTracking(android.view.KeyEvent);
+  }
+
+  public final class LayoutInflaterCompat {
+    method public static deprecated android.support.v4.view.LayoutInflaterFactory getFactory(android.view.LayoutInflater);
+    method public static deprecated void setFactory(android.view.LayoutInflater, android.support.v4.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  public abstract deprecated interface LayoutInflaterFactory {
+    method public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
+  }
+
+  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);
+    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 final class MenuCompat {
+    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
+  }
+
+  public final class MenuItemCompat {
+    method public static deprecated boolean collapseActionView(android.view.MenuItem);
+    method public static deprecated boolean expandActionView(android.view.MenuItem);
+    method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
+    method public static deprecated android.view.View getActionView(android.view.MenuItem);
+    method public static int getAlphabeticModifiers(android.view.MenuItem);
+    method public static java.lang.CharSequence getContentDescription(android.view.MenuItem);
+    method public static android.content.res.ColorStateList getIconTintList(android.view.MenuItem);
+    method public static android.graphics.PorterDuff.Mode getIconTintMode(android.view.MenuItem);
+    method public static int getNumericModifiers(android.view.MenuItem);
+    method public static java.lang.CharSequence getTooltipText(android.view.MenuItem);
+    method public static deprecated boolean isActionViewExpanded(android.view.MenuItem);
+    method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
+    method public static deprecated android.view.MenuItem setActionView(android.view.MenuItem, android.view.View);
+    method public static deprecated android.view.MenuItem setActionView(android.view.MenuItem, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem, char, int);
+    method public static void setContentDescription(android.view.MenuItem, java.lang.CharSequence);
+    method public static void setIconTintList(android.view.MenuItem, android.content.res.ColorStateList);
+    method public static void setIconTintMode(android.view.MenuItem, android.graphics.PorterDuff.Mode);
+    method public static void setNumericShortcut(android.view.MenuItem, char, int);
+    method public static deprecated android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
+    method public static void setShortcut(android.view.MenuItem, char, char, int, int);
+    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
+    method public static void setTooltipText(android.view.MenuItem, java.lang.CharSequence);
+    field public static final deprecated int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field public static final deprecated int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field public static final deprecated int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field public static final deprecated int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field public static final deprecated int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  public static abstract deprecated interface MenuItemCompat.OnActionExpandListener {
+    method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
+    method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
+  }
+
+  public final class MotionEventCompat {
+    method public static deprecated int findPointerIndex(android.view.MotionEvent, int);
+    method public static deprecated int getActionIndex(android.view.MotionEvent);
+    method public static deprecated int getActionMasked(android.view.MotionEvent);
+    method public static deprecated float getAxisValue(android.view.MotionEvent, int);
+    method public static deprecated float getAxisValue(android.view.MotionEvent, int, int);
+    method public static deprecated int getButtonState(android.view.MotionEvent);
+    method public static deprecated int getPointerCount(android.view.MotionEvent);
+    method public static deprecated int getPointerId(android.view.MotionEvent, int);
+    method public static deprecated int getSource(android.view.MotionEvent);
+    method public static deprecated float getX(android.view.MotionEvent, int);
+    method public static deprecated float getY(android.view.MotionEvent, int);
+    method public static boolean isFromSource(android.view.MotionEvent, int);
+    field public static final deprecated int ACTION_HOVER_ENTER = 9; // 0x9
+    field public static final deprecated int ACTION_HOVER_EXIT = 10; // 0xa
+    field public static final deprecated int ACTION_HOVER_MOVE = 7; // 0x7
+    field public static final deprecated int ACTION_MASK = 255; // 0xff
+    field public static final deprecated int ACTION_POINTER_DOWN = 5; // 0x5
+    field public static final deprecated int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field public static final deprecated int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field public static final deprecated int ACTION_POINTER_UP = 6; // 0x6
+    field public static final deprecated int ACTION_SCROLL = 8; // 0x8
+    field public static final deprecated int AXIS_BRAKE = 23; // 0x17
+    field public static final deprecated int AXIS_DISTANCE = 24; // 0x18
+    field public static final deprecated int AXIS_GAS = 22; // 0x16
+    field public static final deprecated int AXIS_GENERIC_1 = 32; // 0x20
+    field public static final deprecated int AXIS_GENERIC_10 = 41; // 0x29
+    field public static final deprecated int AXIS_GENERIC_11 = 42; // 0x2a
+    field public static final deprecated int AXIS_GENERIC_12 = 43; // 0x2b
+    field public static final deprecated int AXIS_GENERIC_13 = 44; // 0x2c
+    field public static final deprecated int AXIS_GENERIC_14 = 45; // 0x2d
+    field public static final deprecated int AXIS_GENERIC_15 = 46; // 0x2e
+    field public static final deprecated int AXIS_GENERIC_16 = 47; // 0x2f
+    field public static final deprecated int AXIS_GENERIC_2 = 33; // 0x21
+    field public static final deprecated int AXIS_GENERIC_3 = 34; // 0x22
+    field public static final deprecated int AXIS_GENERIC_4 = 35; // 0x23
+    field public static final deprecated int AXIS_GENERIC_5 = 36; // 0x24
+    field public static final deprecated int AXIS_GENERIC_6 = 37; // 0x25
+    field public static final deprecated int AXIS_GENERIC_7 = 38; // 0x26
+    field public static final deprecated int AXIS_GENERIC_8 = 39; // 0x27
+    field public static final deprecated int AXIS_GENERIC_9 = 40; // 0x28
+    field public static final deprecated int AXIS_HAT_X = 15; // 0xf
+    field public static final deprecated int AXIS_HAT_Y = 16; // 0x10
+    field public static final deprecated int AXIS_HSCROLL = 10; // 0xa
+    field public static final deprecated int AXIS_LTRIGGER = 17; // 0x11
+    field public static final deprecated int AXIS_ORIENTATION = 8; // 0x8
+    field public static final deprecated int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field public static final deprecated int AXIS_RTRIGGER = 18; // 0x12
+    field public static final deprecated int AXIS_RUDDER = 20; // 0x14
+    field public static final deprecated int AXIS_RX = 12; // 0xc
+    field public static final deprecated int AXIS_RY = 13; // 0xd
+    field public static final deprecated int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field public static final deprecated int AXIS_SIZE = 3; // 0x3
+    field public static final deprecated int AXIS_THROTTLE = 19; // 0x13
+    field public static final deprecated int AXIS_TILT = 25; // 0x19
+    field public static final deprecated int AXIS_TOOL_MAJOR = 6; // 0x6
+    field public static final deprecated int AXIS_TOOL_MINOR = 7; // 0x7
+    field public static final deprecated int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field public static final deprecated int AXIS_TOUCH_MINOR = 5; // 0x5
+    field public static final deprecated int AXIS_VSCROLL = 9; // 0x9
+    field public static final deprecated int AXIS_WHEEL = 21; // 0x15
+    field public static final deprecated int AXIS_X = 0; // 0x0
+    field public static final deprecated int AXIS_Y = 1; // 0x1
+    field public static final deprecated int AXIS_Z = 11; // 0xb
+    field public static final deprecated int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  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 abstract interface NestedScrollingChild2 implements android.support.v4.view.NestedScrollingChild {
+    method public abstract boolean dispatchNestedPreScroll(int, int, int[], int[], int);
+    method public abstract boolean dispatchNestedScroll(int, int, int, int, int[], int);
+    method public abstract boolean hasNestedScrollingParent(int);
+    method public abstract boolean startNestedScroll(int, int);
+    method public abstract void stopNestedScroll(int);
+  }
+
+  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 abstract interface NestedScrollingParent2 implements android.support.v4.view.NestedScrollingParent {
+    method public abstract void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public abstract void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public abstract void onStopNestedScroll(android.view.View, int);
+  }
+
+  public abstract interface OnApplyWindowInsetsListener {
+    method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
+  }
+
+  public final class PointerIconCompat {
+    method public static android.support.v4.view.PointerIconCompat create(android.graphics.Bitmap, float, float);
+    method public static android.support.v4.view.PointerIconCompat getSystemIcon(android.content.Context, int);
+    method public static android.support.v4.view.PointerIconCompat load(android.content.res.Resources, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method public static deprecated boolean isQuickScaleEnabled(java.lang.Object);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector);
+    method public static deprecated void setQuickScaleEnabled(java.lang.Object, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector, 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 final deprecated class VelocityTrackerCompat {
+    method public static deprecated float getXVelocity(android.view.VelocityTracker, int);
+    method public static deprecated float getYVelocity(android.view.VelocityTracker, int);
+  }
+
+  public class ViewCompat {
+    ctor protected ViewCompat();
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View>, int);
+    method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method public static deprecated boolean canScrollHorizontally(android.view.View, int);
+    method public static deprecated boolean canScrollVertically(android.view.View, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method public static deprecated 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 dispatchNestedPreScroll(android.view.View, int, int, int[], int[], int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, 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 deprecated 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 android.view.Display getDisplay(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 deprecated int getLayerType(android.view.View);
+    method public static int getLayoutDirection(android.view.View);
+    method public static deprecated android.graphics.Matrix getMatrix(android.view.View);
+    method public static deprecated int getMeasuredHeightAndState(android.view.View);
+    method public static deprecated int getMeasuredState(android.view.View);
+    method public static deprecated 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 getNextClusterForwardId(android.view.View);
+    method public static deprecated 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 deprecated float getPivotX(android.view.View);
+    method public static deprecated float getPivotY(android.view.View);
+    method public static deprecated float getRotation(android.view.View);
+    method public static deprecated float getRotationX(android.view.View);
+    method public static deprecated float getRotationY(android.view.View);
+    method public static deprecated float getScaleX(android.view.View);
+    method public static deprecated 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 deprecated float getTranslationX(android.view.View);
+    method public static deprecated float getTranslationY(android.view.View);
+    method public static float getTranslationZ(android.view.View);
+    method public static int getWindowSystemUiVisibility(android.view.View);
+    method public static deprecated float getX(android.view.View);
+    method public static deprecated 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 hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, int);
+    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 isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method public static deprecated boolean isOpaque(android.view.View);
+    method public static boolean isPaddingRelative(android.view.View);
+    method public static deprecated void jumpDrawablesToCurrentState(android.view.View);
+    method public static android.view.View keyboardNavigationClusterSearch(android.view.View, android.view.View, int);
+    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 deprecated 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 deprecated 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 deprecated int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    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 deprecated void setActivated(android.view.View, boolean);
+    method public static deprecated void setAlpha(android.view.View, float);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable);
+    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 deprecated void setFitsSystemWindows(android.view.View, boolean);
+    method public static void setFocusedByDefault(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 setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint);
+    method public static deprecated 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 setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, android.support.v4.view.OnApplyWindowInsetsListener);
+    method public static deprecated void setOverScrollMode(android.view.View, int);
+    method public static void setPaddingRelative(android.view.View, int, int, int, int);
+    method public static deprecated void setPivotX(android.view.View, float);
+    method public static deprecated void setPivotY(android.view.View, float);
+    method public static void setPointerIcon(android.view.View, android.support.v4.view.PointerIconCompat);
+    method public static deprecated void setRotation(android.view.View, float);
+    method public static deprecated void setRotationX(android.view.View, float);
+    method public static deprecated void setRotationY(android.view.View, float);
+    method public static deprecated void setSaveFromParentEnabled(android.view.View, boolean);
+    method public static deprecated void setScaleX(android.view.View, float);
+    method public static deprecated 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 setTooltipText(android.view.View, java.lang.CharSequence);
+    method public static void setTransitionName(android.view.View, java.lang.String);
+    method public static deprecated void setTranslationX(android.view.View, float);
+    method public static deprecated void setTranslationY(android.view.View, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static deprecated void setX(android.view.View, float);
+    method public static deprecated void setY(android.view.View, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static boolean startNestedScroll(android.view.View, int, int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+    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 deprecated int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field public static final deprecated int LAYER_TYPE_NONE = 0; // 0x0
+    field public static final deprecated 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 deprecated int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field public static final deprecated int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field public static final deprecated int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field public static final deprecated int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field public static final deprecated int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field public static final deprecated int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field public static final deprecated 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
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  public final deprecated class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static deprecated int getScaledPagingTouchSlop(android.view.ViewConfiguration);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static deprecated boolean hasPermanentMenuKey(android.view.ViewConfiguration);
+  }
+
+  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);
+    method public static deprecated boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method public static deprecated 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 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);
+    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
+    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[], int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int, int);
+    method public static boolean onStartNestedScroll(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, int);
+    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
+    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View, int);
+    method public static deprecated boolean requestSendAccessibilityEvent(android.view.ViewParent, android.view.View, android.view.accessibility.AccessibilityEvent);
+  }
+
+  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();
+    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 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
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(android.support.v4.view.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 final class AccessibilityEventCompat {
+    method public static deprecated void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
+    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
+    method public int getAction(android.view.accessibility.AccessibilityEvent);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
+    method public int getMovementGranularity(android.view.accessibility.AccessibilityEvent);
+    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
+    method public static deprecated int getRecordCount(android.view.accessibility.AccessibilityEvent);
+    method public void setAction(android.view.accessibility.AccessibilityEvent, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
+    method public void setMovementGranularity(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_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    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 deprecated int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field public static final deprecated 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_CONTEXT_CLICKED = 8388608; // 0x800000
+    field public static final deprecated int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field public static final deprecated int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field public static final deprecated int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field public static final deprecated 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_WINDOWS_CHANGED = 4194304; // 0x400000
+    field public static final deprecated int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method public static deprecated boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
+    method public static deprecated java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
+    method public static deprecated java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
+    method public static deprecated boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
+    method public static deprecated boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
+  }
+
+  public static abstract deprecated interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method public abstract deprecated void onAccessibilityStateChanged(boolean);
+  }
+
+  public static abstract deprecated class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static abstract interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public abstract void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor public deprecated 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 int getDrawingOrder();
+    method public java.lang.CharSequence getError();
+    method public android.os.Bundle getExtras();
+    method public deprecated 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 getRoleDescription();
+    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 isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isImportantForAccessibility();
+    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 setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    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 setImportantForAccessibility(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 setRoleDescription(java.lang.CharSequence);
+    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);
+    method public android.view.accessibility.AccessibilityNodeInfo unwrap();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final java.lang.String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    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_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final java.lang.String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_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_CONTEXT_CLICK;
+    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_DOWN;
+    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_SCROLL_LEFT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_RIGHT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_TO_POSITION;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_UP;
+    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_PROGRESS;
+    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;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SHOW_ON_SCREEN;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean, int);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean);
+    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);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat obtain(int, float, float, float);
+    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);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor public deprecated AccessibilityRecordCompat(java.lang.Object);
+    method public deprecated boolean equals(java.lang.Object);
+    method public deprecated int getAddedCount();
+    method public deprecated java.lang.CharSequence getBeforeText();
+    method public deprecated java.lang.CharSequence getClassName();
+    method public deprecated java.lang.CharSequence getContentDescription();
+    method public deprecated int getCurrentItemIndex();
+    method public deprecated int getFromIndex();
+    method public deprecated java.lang.Object getImpl();
+    method public deprecated int getItemCount();
+    method public deprecated int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord);
+    method public deprecated int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord);
+    method public deprecated android.os.Parcelable getParcelableData();
+    method public deprecated int getRemovedCount();
+    method public deprecated int getScrollX();
+    method public deprecated int getScrollY();
+    method public deprecated android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getSource();
+    method public deprecated java.util.List<java.lang.CharSequence> getText();
+    method public deprecated int getToIndex();
+    method public deprecated int getWindowId();
+    method public deprecated int hashCode();
+    method public deprecated boolean isChecked();
+    method public deprecated boolean isEnabled();
+    method public deprecated boolean isFullScreen();
+    method public deprecated boolean isPassword();
+    method public deprecated boolean isScrollable();
+    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat obtain(android.support.v4.view.accessibility.AccessibilityRecordCompat);
+    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat obtain();
+    method public deprecated void recycle();
+    method public deprecated void setAddedCount(int);
+    method public deprecated void setBeforeText(java.lang.CharSequence);
+    method public deprecated void setChecked(boolean);
+    method public deprecated void setClassName(java.lang.CharSequence);
+    method public deprecated void setContentDescription(java.lang.CharSequence);
+    method public deprecated void setCurrentItemIndex(int);
+    method public deprecated void setEnabled(boolean);
+    method public deprecated void setFromIndex(int);
+    method public deprecated void setFullScreen(boolean);
+    method public deprecated void setItemCount(int);
+    method public deprecated void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord, int);
+    method public deprecated void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord, int);
+    method public deprecated void setParcelableData(android.os.Parcelable);
+    method public deprecated void setPassword(boolean);
+    method public deprecated void setRemovedCount(int);
+    method public deprecated void setScrollX(int);
+    method public deprecated void setScrollY(int);
+    method public deprecated void setScrollable(boolean);
+    method public deprecated void setSource(android.view.View);
+    method public deprecated void setSource(android.view.View, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View, int);
+    method public deprecated void setToIndex(int);
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getAnchor();
+    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 java.lang.CharSequence getTitle();
+    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_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package android.support.v4.view.animation {
+
+  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);
+  }
+
+}
+
+package android.support.v4.widget {
+
+  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 final class EdgeEffectCompat {
+    ctor public deprecated EdgeEffectCompat(android.content.Context);
+    method public deprecated boolean draw(android.graphics.Canvas);
+    method public deprecated void finish();
+    method public deprecated boolean isFinished();
+    method public deprecated boolean onAbsorb(int);
+    method public deprecated boolean onPull(float);
+    method public deprecated boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method public deprecated boolean onRelease();
+    method public deprecated void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode);
+  }
+
+  public final class ListPopupWindowCompat {
+    method public static deprecated android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
+    method public static android.view.View.OnTouchListener createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
+  }
+
+  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);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  public final deprecated class ScrollerCompat {
+    method public deprecated void abortAnimation();
+    method public deprecated boolean computeScrollOffset();
+    method public static deprecated android.support.v4.widget.ScrollerCompat create(android.content.Context);
+    method public static deprecated android.support.v4.widget.ScrollerCompat create(android.content.Context, android.view.animation.Interpolator);
+    method public deprecated void fling(int, int, int, int, int, int, int, int);
+    method public deprecated void fling(int, int, int, int, int, int, int, int, int, int);
+    method public deprecated float getCurrVelocity();
+    method public deprecated int getCurrX();
+    method public deprecated int getCurrY();
+    method public deprecated int getFinalX();
+    method public deprecated int getFinalY();
+    method public deprecated boolean isFinished();
+    method public deprecated boolean isOverScrolled();
+    method public deprecated void notifyHorizontalEdgeReached(int, int, int);
+    method public deprecated void notifyVerticalEdgeReached(int, int, int);
+    method public deprecated boolean springBack(int, int, int, int, int, int);
+    method public deprecated void startScroll(int, int, int, int);
+    method public deprecated void startScroll(int, int, int, int, int);
+  }
+
+  public final deprecated class SearchViewCompat {
+    method public static deprecated java.lang.CharSequence getQuery(android.view.View);
+    method public static deprecated boolean isIconified(android.view.View);
+    method public static deprecated boolean isQueryRefinementEnabled(android.view.View);
+    method public static deprecated boolean isSubmitButtonEnabled(android.view.View);
+    method public static deprecated android.view.View newSearchView(android.content.Context);
+    method public static deprecated void setIconified(android.view.View, boolean);
+    method public static deprecated void setImeOptions(android.view.View, int);
+    method public static deprecated void setInputType(android.view.View, int);
+    method public static deprecated void setMaxWidth(android.view.View, int);
+    method public static deprecated void setOnCloseListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnCloseListener);
+    method public static deprecated void setOnQueryTextListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnQueryTextListener);
+    method public static deprecated void setQuery(android.view.View, java.lang.CharSequence, boolean);
+    method public static deprecated void setQueryHint(android.view.View, java.lang.CharSequence);
+    method public static deprecated void setQueryRefinementEnabled(android.view.View, boolean);
+    method public static deprecated void setSearchableInfo(android.view.View, android.content.ComponentName);
+    method public static deprecated void setSubmitButtonEnabled(android.view.View, boolean);
+  }
+
+  public static abstract deprecated interface SearchViewCompat.OnCloseListener {
+    method public abstract boolean onClose();
+  }
+
+  public static abstract deprecated class SearchViewCompat.OnCloseListenerCompat implements android.support.v4.widget.SearchViewCompat.OnCloseListener {
+    ctor public SearchViewCompat.OnCloseListenerCompat();
+    method public boolean onClose();
+  }
+
+  public static abstract deprecated interface SearchViewCompat.OnQueryTextListener {
+    method public abstract boolean onQueryTextChange(java.lang.String);
+    method public abstract boolean onQueryTextSubmit(java.lang.String);
+  }
+
+  public static abstract deprecated class SearchViewCompat.OnQueryTextListenerCompat implements android.support.v4.widget.SearchViewCompat.OnQueryTextListener {
+    ctor public SearchViewCompat.OnQueryTextListenerCompat();
+    method public boolean onQueryTextChange(java.lang.String);
+    method public boolean onQueryTextSubmit(java.lang.String);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable[] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    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);
+    method public static void setTextAppearance(android.widget.TextView, int);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  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);
+  }
+
+}
+
diff --git a/compat/api/27.0.0.txt b/compat/api/27.0.0.txt
new file mode 100644
index 0000000..96a94cb
--- /dev/null
+++ b/compat/api/27.0.0.txt
@@ -0,0 +1,2366 @@
+package android.support.v4.accessibilityservice {
+
+  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);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static java.lang.String loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    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 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 class ActivityCompat extends android.support.v4.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public static android.net.Uri getReferrer(android.app.Activity);
+    method public static deprecated 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 void setPermissionCompatDelegate(android.support.v4.app.ActivityCompat.PermissionCompatDelegate);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, java.lang.String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    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 static abstract interface ActivityCompat.PermissionCompatDelegate {
+    method public abstract boolean onActivityResult(android.app.Activity, int, int, android.content.Intent);
+    method public abstract boolean requestPermissions(android.app.Activity, java.lang.String[], int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect getLaunchBounds();
+    method public static android.support.v4.app.ActivityOptionsCompat makeBasic();
+    method public static android.support.v4.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    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 makeTaskLaunchBehind();
+    method public static android.support.v4.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public android.support.v4.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect);
+    method public android.os.Bundle toBundle();
+    method public void update(android.support.v4.app.ActivityOptionsCompat);
+    field public static final java.lang.String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final java.lang.String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  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);
+    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
+  }
+
+  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);
+  }
+
+  public abstract class JobIntentService extends android.app.Service {
+    ctor public JobIntentService();
+    method public static void enqueueWork(android.content.Context, java.lang.Class, int, android.content.Intent);
+    method public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method public boolean isStopped();
+    method public android.os.IBinder onBind(android.content.Intent);
+    method protected abstract void onHandleWork(android.content.Intent);
+    method public boolean onStopCurrentWork();
+    method public void setInterruptIfStopped(boolean);
+  }
+
+  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 int getBadgeIconType(android.app.Notification);
+    method public static java.lang.String getCategory(android.app.Notification);
+    method public static java.lang.String getChannelId(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 int getGroupAlertBehavior(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static java.lang.String getShortcutId(android.app.Notification);
+    method public static java.lang.String getSortKey(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    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_REMINDER = "reminder";
+    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_AUDIO_CONTENTS_URI = "android.audioContents";
+    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_CONVERSATION_TITLE = "android.conversationTitle";
+    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_MESSAGES = "android.messages";
+    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_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final java.lang.String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    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 GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 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 boolean getAllowGeneratedReplies();
+    method public android.support.v4.app.RemoteInput[] getDataOnlyRemoteInputs();
+    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();
+    method public android.support.v4.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+  }
+
+  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 boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    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 setHintDisplayActionInline(boolean);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    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, java.lang.String);
+    ctor public deprecated 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 setBadgeIconType(int);
+    method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setChannelId(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setColor(int);
+    method public android.support.v4.app.NotificationCompat.Builder setColorized(boolean);
+    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 setCustomBigContentView(android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews);
+    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 setGroupAlertBehavior(int);
+    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 setRemoteInputHistory(java.lang.CharSequence[]);
+    method public android.support.v4.app.NotificationCompat.Builder setShortcutId(java.lang.String);
+    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 setTimeoutAfter(long);
+    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 deprecated 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 class NotificationCompat.DecoratedCustomViewStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  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 class NotificationCompat.MessagingStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.MessagingStyle(java.lang.CharSequence);
+    method public void addCompatExtras(android.os.Bundle);
+    method public android.support.v4.app.NotificationCompat.MessagingStyle addMessage(java.lang.CharSequence, long, java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.MessagingStyle addMessage(android.support.v4.app.NotificationCompat.MessagingStyle.Message);
+    method public static android.support.v4.app.NotificationCompat.MessagingStyle extractMessagingStyleFromNotification(android.app.Notification);
+    method public java.lang.CharSequence getConversationTitle();
+    method public java.util.List<android.support.v4.app.NotificationCompat.MessagingStyle.Message> getMessages();
+    method public java.lang.CharSequence getUserDisplayName();
+    method public android.support.v4.app.NotificationCompat.MessagingStyle setConversationTitle(java.lang.CharSequence);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(java.lang.CharSequence, long, java.lang.CharSequence);
+    method public java.lang.String getDataMimeType();
+    method public android.net.Uri getDataUri();
+    method public android.os.Bundle getExtras();
+    method public java.lang.CharSequence getSender();
+    method public java.lang.CharSequence getText();
+    method public long getTimestamp();
+    method public android.support.v4.app.NotificationCompat.MessagingStyle.Message setData(java.lang.String, android.net.Uri);
+  }
+
+  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 java.lang.String getBridgeTag();
+    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 java.lang.String getDismissalId();
+    method public android.app.PendingIntent getDisplayIntent();
+    method public int getGravity();
+    method public boolean getHintAmbientBigPicture();
+    method public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    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 setBridgeTag(java.lang.String);
+    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 setDismissalId(java.lang.String);
+    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 setHintAmbientBigPicture(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(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 final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    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 int getImportance();
+    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";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public final class RemoteInput extends android.support.v4.app.RemoteInputCompatBase.RemoteInput {
+    method public static void addDataResultToIntent(android.support.v4.app.RemoteInput, android.content.Intent, java.util.Map<java.lang.String, android.net.Uri>);
+    method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String> getAllowedDataTypes();
+    method public java.lang.CharSequence[] getChoices();
+    method public static java.util.Map<java.lang.String, android.net.Uri> getDataResultsFromIntent(android.content.Intent, java.lang.String);
+    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);
+    method public boolean isDataOnly();
+    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 setAllowDataType(java.lang.String, boolean);
+    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);
+  }
+
+   deprecated class RemoteInputCompatBase {
+  }
+
+  public static abstract deprecated class RemoteInputCompatBase.RemoteInput {
+    ctor public deprecated RemoteInputCompatBase.RemoteInput();
+    method protected abstract deprecated boolean getAllowFreeFormInput();
+    method protected abstract deprecated java.util.Set<java.lang.String> getAllowedDataTypes();
+    method protected abstract deprecated java.lang.CharSequence[] getChoices();
+    method protected abstract deprecated android.os.Bundle getExtras();
+    method protected abstract deprecated java.lang.CharSequence getLabel();
+    method protected abstract deprecated java.lang.String getResultKey();
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  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);
+    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>);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String>, java.util.List<android.view.View>, android.support.v4.app.SharedElementCallback.OnSharedElementsReadyListener);
+  }
+
+  public static abstract interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public abstract void onSharedElementsReady();
+  }
+
+}
+
+package android.support.v4.content {
+
+  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 protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, java.lang.String);
+    method public static android.content.Context createDeviceProtectedStorageContext(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);
+    method public static java.io.File getDataDir(android.content.Context);
+    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 static final java.io.File getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File[] getObbDirs(android.content.Context);
+    method public static boolean isDeviceProtectedStorage(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);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
+    field public static final java.lang.String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final java.lang.String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+  }
+
+  public final deprecated class SharedPreferencesCompat {
+  }
+
+  public static final deprecated class SharedPreferencesCompat.EditorCompat {
+    method public deprecated void apply(android.content.SharedPreferences.Editor);
+    method public static deprecated android.support.v4.content.SharedPreferencesCompat.EditorCompat getInstance();
+  }
+
+}
+
+package android.support.v4.content.pm {
+
+  public final deprecated class ActivityInfoCompat {
+    field public static final deprecated int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName getActivity();
+    method public java.lang.CharSequence getDisabledMessage();
+    method public java.lang.String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent[] getIntents();
+    method public java.lang.CharSequence getLongLabel();
+    method public java.lang.CharSequence getShortLabel();
+    method public android.content.pm.ShortcutInfo toShortcutInfo();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, java.lang.String);
+    method public android.support.v4.content.pm.ShortcutInfoCompat build();
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(java.lang.CharSequence);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIcon(android.support.v4.graphics.drawable.IconCompat);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent[]);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setLongLabel(java.lang.CharSequence);
+    method public android.support.v4.content.pm.ShortcutInfoCompat.Builder setShortLabel(java.lang.CharSequence);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, android.support.v4.content.pm.ShortcutInfoCompat);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean requestPinShortcut(android.content.Context, android.support.v4.content.pm.ShortcutInfoCompat, android.content.IntentSender);
+  }
+
+}
+
+package android.support.v4.content.res {
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  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;
+    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;
+    method public static android.graphics.Typeface getFont(android.content.Context, int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, int, android.support.v4.content.res.ResourcesCompat.FontCallback, android.os.Handler) throws android.content.res.Resources.NotFoundException;
+  }
+
+  public static abstract class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method public abstract void onFontRetrievalFailed(int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+}
+
+package android.support.v4.database {
+
+  public final deprecated class DatabaseUtilsCompat {
+    method public static deprecated java.lang.String[] appendSelectionArgs(java.lang.String[], java.lang.String[]);
+    method public static deprecated java.lang.String concatenateWhere(java.lang.String, java.lang.String);
+  }
+
+}
+
+package android.support.v4.graphics {
+
+  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 final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, java.lang.String);
+  }
+
+}
+
+package android.support.v4.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method public static deprecated 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 boolean 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 extends android.graphics.drawable.Drawable> T unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
+  }
+
+  public class IconCompat {
+    method public static android.support.v4.graphics.drawable.IconCompat createWithAdaptiveBitmap(android.graphics.Bitmap);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithBitmap(android.graphics.Bitmap);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithContentUri(java.lang.String);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithContentUri(android.net.Uri);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithData(byte[], int, int);
+    method public static android.support.v4.graphics.drawable.IconCompat createWithResource(android.content.Context, int);
+    method public android.graphics.drawable.Icon toIcon();
+  }
+
+}
+
+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 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();
+    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.net {
+
+  public final class ConnectivityManagerCompat {
+    method public static android.net.NetworkInfo getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  public final class TrafficStatsCompat {
+    method public static deprecated void clearThreadStatsTag();
+    method public static deprecated int getThreadStatsTag();
+    method public static deprecated void incrementOperationCount(int);
+    method public static deprecated void incrementOperationCount(int, int);
+    method public static deprecated void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method public static deprecated void tagSocket(java.net.Socket) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method public static deprecated void untagSocket(java.net.Socket) throws java.net.SocketException;
+  }
+
+}
+
+package android.support.v4.os {
+
+  public class BuildCompat {
+    method public static deprecated boolean isAtLeastN();
+    method public static deprecated boolean isAtLeastNMR1();
+    method public static deprecated boolean isAtLeastO();
+    method public static deprecated boolean isAtLeastOMR1();
+    method public static boolean isAtLeastP();
+  }
+
+  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 final class ConfigurationCompat {
+    method public static android.support.v4.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static java.lang.String getStorageState(java.io.File);
+    field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class LocaleListCompat {
+    method public static android.support.v4.os.LocaleListCompat create(java.util.Locale...);
+    method public static android.support.v4.os.LocaleListCompat forLanguageTags(java.lang.String);
+    method public java.util.Locale get(int);
+    method public static android.support.v4.os.LocaleListCompat getAdjustedDefault();
+    method public static android.support.v4.os.LocaleListCompat getDefault();
+    method public static android.support.v4.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale getFirstMatch(java.lang.String[]);
+    method public int indexOf(java.util.Locale);
+    method public boolean isEmpty();
+    method public int size();
+    method public java.lang.String toLanguageTags();
+    method public java.lang.Object unwrap();
+    method public static android.support.v4.os.LocaleListCompat wrap(java.lang.Object);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(java.lang.String);
+  }
+
+  public final deprecated class ParcelableCompat {
+    method public static deprecated <T> android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
+  }
+
+  public abstract deprecated interface ParcelableCompatCreatorCallbacks<T> {
+    method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
+    method public abstract T[] newArray(int);
+  }
+
+  public final class TraceCompat {
+    method public static void beginSection(java.lang.String);
+    method public static void endSection();
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package android.support.v4.provider {
+
+  public final class FontRequest {
+    ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, java.util.List<java.util.List<byte[]>>);
+    ctor public FontRequest(java.lang.String, java.lang.String, java.lang.String, int);
+    method public java.util.List<java.util.List<byte[]>> getCertificates();
+    method public int getCertificatesArrayResId();
+    method public java.lang.String getProviderAuthority();
+    method public java.lang.String getProviderPackage();
+    method public java.lang.String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface buildTypeface(android.content.Context, android.os.CancellationSignal, android.support.v4.provider.FontsContractCompat.FontInfo[]);
+    method public static android.support.v4.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal, android.support.v4.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void requestFont(android.content.Context, android.support.v4.provider.FontRequest, android.support.v4.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+  }
+
+  public static final class FontsContractCompat.Columns {
+    ctor public FontsContractCompat.Columns();
+    field public static final java.lang.String FILE_ID = "file_id";
+    field public static final java.lang.String ITALIC = "font_italic";
+    field public static final java.lang.String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final java.lang.String TTC_INDEX = "font_ttc_index";
+    field public static final java.lang.String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final java.lang.String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    method public android.support.v4.provider.FontsContractCompat.FontInfo[] getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    method public int getResultCode();
+    method public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+  }
+
+}
+
+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 isRtl(java.lang.CharSequence);
+    method public boolean isRtlContext();
+    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
+    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
+    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat);
+    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, android.support.v4.text.TextDirectionHeuristicCompat);
+    method public java.lang.String unicodeWrap(java.lang.String, boolean);
+    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence, boolean);
+    method public java.lang.String unicodeWrap(java.lang.String);
+    method public java.lang.CharSequence unicodeWrap(java.lang.CharSequence);
+  }
+
+  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 final class 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 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;
+    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 final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale);
+    method public static java.lang.String htmlEncode(java.lang.String);
+  }
+
+}
+
+package android.support.v4.text.util {
+
+  public final class LinkifyCompat {
+    method public static final boolean addLinks(android.text.Spannable, int);
+    method public static final boolean addLinks(android.widget.TextView, int);
+    method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String);
+    method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+    method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+    method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String);
+    method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+    method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+  }
+
+}
+
+package android.support.v4.util {
+
+  public class ArrayMap<K, V> 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 final class ArraySet<E> implements java.util.Collection java.util.Set {
+    ctor public ArraySet();
+    ctor public ArraySet(int);
+    ctor public ArraySet(android.support.v4.util.ArraySet<E>);
+    method public boolean add(E);
+    method public void addAll(android.support.v4.util.ArraySet<? extends E>);
+    method public boolean addAll(java.util.Collection<? extends E>);
+    method public void clear();
+    method public boolean contains(java.lang.Object);
+    method public boolean containsAll(java.util.Collection<?>);
+    method public void ensureCapacity(int);
+    method public int indexOf(java.lang.Object);
+    method public boolean isEmpty();
+    method public java.util.Iterator<E> iterator();
+    method public boolean remove(java.lang.Object);
+    method public boolean removeAll(android.support.v4.util.ArraySet<? extends E>);
+    method public boolean removeAll(java.util.Collection<?>);
+    method public E removeAt(int);
+    method public boolean retainAll(java.util.Collection<?>);
+    method public int size();
+    method public java.lang.Object[] toArray();
+    method public <T> T[] toArray(T[]);
+    method public E valueAt(int);
+  }
+
+  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<E> {
+    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<E> {
+    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<K, V> {
+    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 ObjectsCompat {
+    method public static boolean equals(java.lang.Object, java.lang.Object);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F, S);
+    method public static <A, B> android.support.v4.util.Pair<A, B> create(A, B);
+    field public final F first;
+    field public final S second;
+  }
+
+  public final class PatternsCompat {
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static abstract interface Pools.Pool<T> {
+    method public abstract T acquire();
+    method public abstract boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> 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<T> extends android.support.v4.util.Pools.SimplePool {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public class SimpleArrayMap<K, V> {
+    ctor public SimpleArrayMap();
+    ctor public SimpleArrayMap(int);
+    ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap<K, V>);
+    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<E> {
+    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 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();
+    method public boolean onTouchEvent(android.view.MotionEvent);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
+  }
+
+  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);
+    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 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
+    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_ROTARY_ENCODER = 4194304; // 0x400000
+    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 final class LayoutInflaterCompat {
+    method public static deprecated android.support.v4.view.LayoutInflaterFactory getFactory(android.view.LayoutInflater);
+    method public static deprecated void setFactory(android.view.LayoutInflater, android.support.v4.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  public abstract deprecated interface LayoutInflaterFactory {
+    method public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
+  }
+
+  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);
+    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 final class MenuCompat {
+    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
+  }
+
+  public final class MenuItemCompat {
+    method public static deprecated boolean collapseActionView(android.view.MenuItem);
+    method public static deprecated boolean expandActionView(android.view.MenuItem);
+    method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
+    method public static deprecated android.view.View getActionView(android.view.MenuItem);
+    method public static int getAlphabeticModifiers(android.view.MenuItem);
+    method public static java.lang.CharSequence getContentDescription(android.view.MenuItem);
+    method public static android.content.res.ColorStateList getIconTintList(android.view.MenuItem);
+    method public static android.graphics.PorterDuff.Mode getIconTintMode(android.view.MenuItem);
+    method public static int getNumericModifiers(android.view.MenuItem);
+    method public static java.lang.CharSequence getTooltipText(android.view.MenuItem);
+    method public static deprecated boolean isActionViewExpanded(android.view.MenuItem);
+    method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
+    method public static deprecated android.view.MenuItem setActionView(android.view.MenuItem, android.view.View);
+    method public static deprecated android.view.MenuItem setActionView(android.view.MenuItem, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem, char, int);
+    method public static void setContentDescription(android.view.MenuItem, java.lang.CharSequence);
+    method public static void setIconTintList(android.view.MenuItem, android.content.res.ColorStateList);
+    method public static void setIconTintMode(android.view.MenuItem, android.graphics.PorterDuff.Mode);
+    method public static void setNumericShortcut(android.view.MenuItem, char, int);
+    method public static deprecated android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
+    method public static void setShortcut(android.view.MenuItem, char, char, int, int);
+    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
+    method public static void setTooltipText(android.view.MenuItem, java.lang.CharSequence);
+    field public static final deprecated int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field public static final deprecated int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field public static final deprecated int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field public static final deprecated int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field public static final deprecated int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  public static abstract deprecated interface MenuItemCompat.OnActionExpandListener {
+    method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
+    method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
+  }
+
+  public final class MotionEventCompat {
+    method public static deprecated int findPointerIndex(android.view.MotionEvent, int);
+    method public static deprecated int getActionIndex(android.view.MotionEvent);
+    method public static deprecated int getActionMasked(android.view.MotionEvent);
+    method public static deprecated float getAxisValue(android.view.MotionEvent, int);
+    method public static deprecated float getAxisValue(android.view.MotionEvent, int, int);
+    method public static deprecated int getButtonState(android.view.MotionEvent);
+    method public static deprecated int getPointerCount(android.view.MotionEvent);
+    method public static deprecated int getPointerId(android.view.MotionEvent, int);
+    method public static deprecated int getSource(android.view.MotionEvent);
+    method public static deprecated float getX(android.view.MotionEvent, int);
+    method public static deprecated float getY(android.view.MotionEvent, int);
+    method public static boolean isFromSource(android.view.MotionEvent, int);
+    field public static final deprecated int ACTION_HOVER_ENTER = 9; // 0x9
+    field public static final deprecated int ACTION_HOVER_EXIT = 10; // 0xa
+    field public static final deprecated int ACTION_HOVER_MOVE = 7; // 0x7
+    field public static final deprecated int ACTION_MASK = 255; // 0xff
+    field public static final deprecated int ACTION_POINTER_DOWN = 5; // 0x5
+    field public static final deprecated int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field public static final deprecated int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field public static final deprecated int ACTION_POINTER_UP = 6; // 0x6
+    field public static final deprecated int ACTION_SCROLL = 8; // 0x8
+    field public static final deprecated int AXIS_BRAKE = 23; // 0x17
+    field public static final deprecated int AXIS_DISTANCE = 24; // 0x18
+    field public static final deprecated int AXIS_GAS = 22; // 0x16
+    field public static final deprecated int AXIS_GENERIC_1 = 32; // 0x20
+    field public static final deprecated int AXIS_GENERIC_10 = 41; // 0x29
+    field public static final deprecated int AXIS_GENERIC_11 = 42; // 0x2a
+    field public static final deprecated int AXIS_GENERIC_12 = 43; // 0x2b
+    field public static final deprecated int AXIS_GENERIC_13 = 44; // 0x2c
+    field public static final deprecated int AXIS_GENERIC_14 = 45; // 0x2d
+    field public static final deprecated int AXIS_GENERIC_15 = 46; // 0x2e
+    field public static final deprecated int AXIS_GENERIC_16 = 47; // 0x2f
+    field public static final deprecated int AXIS_GENERIC_2 = 33; // 0x21
+    field public static final deprecated int AXIS_GENERIC_3 = 34; // 0x22
+    field public static final deprecated int AXIS_GENERIC_4 = 35; // 0x23
+    field public static final deprecated int AXIS_GENERIC_5 = 36; // 0x24
+    field public static final deprecated int AXIS_GENERIC_6 = 37; // 0x25
+    field public static final deprecated int AXIS_GENERIC_7 = 38; // 0x26
+    field public static final deprecated int AXIS_GENERIC_8 = 39; // 0x27
+    field public static final deprecated int AXIS_GENERIC_9 = 40; // 0x28
+    field public static final deprecated int AXIS_HAT_X = 15; // 0xf
+    field public static final deprecated int AXIS_HAT_Y = 16; // 0x10
+    field public static final deprecated int AXIS_HSCROLL = 10; // 0xa
+    field public static final deprecated int AXIS_LTRIGGER = 17; // 0x11
+    field public static final deprecated int AXIS_ORIENTATION = 8; // 0x8
+    field public static final deprecated int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field public static final deprecated int AXIS_RTRIGGER = 18; // 0x12
+    field public static final deprecated int AXIS_RUDDER = 20; // 0x14
+    field public static final deprecated int AXIS_RX = 12; // 0xc
+    field public static final deprecated int AXIS_RY = 13; // 0xd
+    field public static final deprecated int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field public static final deprecated int AXIS_SIZE = 3; // 0x3
+    field public static final deprecated int AXIS_THROTTLE = 19; // 0x13
+    field public static final deprecated int AXIS_TILT = 25; // 0x19
+    field public static final deprecated int AXIS_TOOL_MAJOR = 6; // 0x6
+    field public static final deprecated int AXIS_TOOL_MINOR = 7; // 0x7
+    field public static final deprecated int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field public static final deprecated int AXIS_TOUCH_MINOR = 5; // 0x5
+    field public static final deprecated int AXIS_VSCROLL = 9; // 0x9
+    field public static final deprecated int AXIS_WHEEL = 21; // 0x15
+    field public static final deprecated int AXIS_X = 0; // 0x0
+    field public static final deprecated int AXIS_Y = 1; // 0x1
+    field public static final deprecated int AXIS_Z = 11; // 0xb
+    field public static final deprecated int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  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 abstract interface NestedScrollingChild2 implements android.support.v4.view.NestedScrollingChild {
+    method public abstract boolean dispatchNestedPreScroll(int, int, int[], int[], int);
+    method public abstract boolean dispatchNestedScroll(int, int, int, int, int[], int);
+    method public abstract boolean hasNestedScrollingParent(int);
+    method public abstract boolean startNestedScroll(int, int);
+    method public abstract void stopNestedScroll(int);
+  }
+
+  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 abstract interface NestedScrollingParent2 implements android.support.v4.view.NestedScrollingParent {
+    method public abstract void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public abstract void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public abstract void onStopNestedScroll(android.view.View, int);
+  }
+
+  public abstract interface OnApplyWindowInsetsListener {
+    method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
+  }
+
+  public final class PointerIconCompat {
+    method public static android.support.v4.view.PointerIconCompat create(android.graphics.Bitmap, float, float);
+    method public static android.support.v4.view.PointerIconCompat getSystemIcon(android.content.Context, int);
+    method public static android.support.v4.view.PointerIconCompat load(android.content.res.Resources, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method public static deprecated boolean isQuickScaleEnabled(java.lang.Object);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector);
+    method public static deprecated void setQuickScaleEnabled(java.lang.Object, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector, 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 final deprecated class VelocityTrackerCompat {
+    method public static deprecated float getXVelocity(android.view.VelocityTracker, int);
+    method public static deprecated float getYVelocity(android.view.VelocityTracker, int);
+  }
+
+  public class ViewCompat {
+    ctor protected ViewCompat();
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View>, int);
+    method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method public static deprecated boolean canScrollHorizontally(android.view.View, int);
+    method public static deprecated boolean canScrollVertically(android.view.View, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method public static deprecated 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 dispatchNestedPreScroll(android.view.View, int, int, int[], int[], int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, 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 deprecated 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 android.view.Display getDisplay(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 getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method public static deprecated int getLayerType(android.view.View);
+    method public static int getLayoutDirection(android.view.View);
+    method public static deprecated android.graphics.Matrix getMatrix(android.view.View);
+    method public static deprecated int getMeasuredHeightAndState(android.view.View);
+    method public static deprecated int getMeasuredState(android.view.View);
+    method public static deprecated 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 getNextClusterForwardId(android.view.View);
+    method public static deprecated 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 deprecated float getPivotX(android.view.View);
+    method public static deprecated float getPivotY(android.view.View);
+    method public static deprecated float getRotation(android.view.View);
+    method public static deprecated float getRotationX(android.view.View);
+    method public static deprecated float getRotationY(android.view.View);
+    method public static deprecated float getScaleX(android.view.View);
+    method public static deprecated 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 deprecated float getTranslationX(android.view.View);
+    method public static deprecated float getTranslationY(android.view.View);
+    method public static float getTranslationZ(android.view.View);
+    method public static int getWindowSystemUiVisibility(android.view.View);
+    method public static deprecated float getX(android.view.View);
+    method public static deprecated 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 hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, int);
+    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 isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method public static deprecated boolean isOpaque(android.view.View);
+    method public static boolean isPaddingRelative(android.view.View);
+    method public static deprecated void jumpDrawablesToCurrentState(android.view.View);
+    method public static android.view.View keyboardNavigationClusterSearch(android.view.View, android.view.View, int);
+    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 deprecated 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 deprecated 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 deprecated int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    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 deprecated void setActivated(android.view.View, boolean);
+    method public static deprecated void setAlpha(android.view.View, float);
+    method public static void setAutofillHints(android.view.View, java.lang.String...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable);
+    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 deprecated 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 deprecated void setFitsSystemWindows(android.view.View, boolean);
+    method public static void setFocusedByDefault(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 setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint);
+    method public static deprecated 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 setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, android.support.v4.view.OnApplyWindowInsetsListener);
+    method public static deprecated void setOverScrollMode(android.view.View, int);
+    method public static void setPaddingRelative(android.view.View, int, int, int, int);
+    method public static deprecated void setPivotX(android.view.View, float);
+    method public static deprecated void setPivotY(android.view.View, float);
+    method public static void setPointerIcon(android.view.View, android.support.v4.view.PointerIconCompat);
+    method public static deprecated void setRotation(android.view.View, float);
+    method public static deprecated void setRotationX(android.view.View, float);
+    method public static deprecated void setRotationY(android.view.View, float);
+    method public static deprecated void setSaveFromParentEnabled(android.view.View, boolean);
+    method public static deprecated void setScaleX(android.view.View, float);
+    method public static deprecated 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 setTooltipText(android.view.View, java.lang.CharSequence);
+    method public static void setTransitionName(android.view.View, java.lang.String);
+    method public static deprecated void setTranslationX(android.view.View, float);
+    method public static deprecated void setTranslationY(android.view.View, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static deprecated void setX(android.view.View, float);
+    method public static deprecated void setY(android.view.View, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static boolean startNestedScroll(android.view.View, int, int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+    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 deprecated int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field public static final deprecated int LAYER_TYPE_NONE = 0; // 0x0
+    field public static final deprecated 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 deprecated int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field public static final deprecated int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field public static final deprecated int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field public static final deprecated int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field public static final deprecated int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field public static final deprecated int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field public static final deprecated 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
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  public final deprecated class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static deprecated int getScaledPagingTouchSlop(android.view.ViewConfiguration);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static deprecated boolean hasPermanentMenuKey(android.view.ViewConfiguration);
+  }
+
+  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);
+    method public static deprecated boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method public static deprecated 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 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);
+    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
+    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[], int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int, int);
+    method public static boolean onStartNestedScroll(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, int);
+    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
+    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View, int);
+    method public static deprecated boolean requestSendAccessibilityEvent(android.view.ViewParent, android.view.View, android.view.accessibility.AccessibilityEvent);
+  }
+
+  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();
+    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 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
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(android.support.v4.view.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 final class AccessibilityEventCompat {
+    method public static deprecated void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
+    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent);
+    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
+    method public static deprecated int getRecordCount(android.view.accessibility.AccessibilityEvent);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
+    method public static void setMovementGranularity(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_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    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 deprecated int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field public static final deprecated 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_CONTEXT_CLICKED = 8388608; // 0x800000
+    field public static final deprecated int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field public static final deprecated int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field public static final deprecated int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field public static final deprecated 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_WINDOWS_CHANGED = 4194304; // 0x400000
+    field public static final deprecated int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method public static deprecated boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
+    method public static deprecated java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
+    method public static deprecated java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
+    method public static deprecated boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
+    method public static deprecated boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
+  }
+
+  public static abstract deprecated interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method public abstract deprecated void onAccessibilityStateChanged(boolean);
+  }
+
+  public static abstract deprecated class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static abstract interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public abstract void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor public deprecated 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 int getDrawingOrder();
+    method public java.lang.CharSequence getError();
+    method public android.os.Bundle getExtras();
+    method public deprecated 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 getRoleDescription();
+    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 isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isImportantForAccessibility();
+    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 setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    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 setImportantForAccessibility(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 setRoleDescription(java.lang.CharSequence);
+    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);
+    method public android.view.accessibility.AccessibilityNodeInfo unwrap();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final java.lang.String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    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_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final java.lang.String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_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_CONTEXT_CLICK;
+    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_DOWN;
+    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_SCROLL_LEFT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_RIGHT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_TO_POSITION;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_UP;
+    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_PROGRESS;
+    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;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SHOW_ON_SCREEN;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean, int);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean);
+    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);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat obtain(int, float, float, float);
+    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);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor public deprecated AccessibilityRecordCompat(java.lang.Object);
+    method public deprecated boolean equals(java.lang.Object);
+    method public deprecated int getAddedCount();
+    method public deprecated java.lang.CharSequence getBeforeText();
+    method public deprecated java.lang.CharSequence getClassName();
+    method public deprecated java.lang.CharSequence getContentDescription();
+    method public deprecated int getCurrentItemIndex();
+    method public deprecated int getFromIndex();
+    method public deprecated java.lang.Object getImpl();
+    method public deprecated int getItemCount();
+    method public deprecated int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord);
+    method public deprecated int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord);
+    method public deprecated android.os.Parcelable getParcelableData();
+    method public deprecated int getRemovedCount();
+    method public deprecated int getScrollX();
+    method public deprecated int getScrollY();
+    method public deprecated android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getSource();
+    method public deprecated java.util.List<java.lang.CharSequence> getText();
+    method public deprecated int getToIndex();
+    method public deprecated int getWindowId();
+    method public deprecated int hashCode();
+    method public deprecated boolean isChecked();
+    method public deprecated boolean isEnabled();
+    method public deprecated boolean isFullScreen();
+    method public deprecated boolean isPassword();
+    method public deprecated boolean isScrollable();
+    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat obtain(android.support.v4.view.accessibility.AccessibilityRecordCompat);
+    method public static deprecated android.support.v4.view.accessibility.AccessibilityRecordCompat obtain();
+    method public deprecated void recycle();
+    method public deprecated void setAddedCount(int);
+    method public deprecated void setBeforeText(java.lang.CharSequence);
+    method public deprecated void setChecked(boolean);
+    method public deprecated void setClassName(java.lang.CharSequence);
+    method public deprecated void setContentDescription(java.lang.CharSequence);
+    method public deprecated void setCurrentItemIndex(int);
+    method public deprecated void setEnabled(boolean);
+    method public deprecated void setFromIndex(int);
+    method public deprecated void setFullScreen(boolean);
+    method public deprecated void setItemCount(int);
+    method public deprecated void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord, int);
+    method public deprecated void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord, int);
+    method public deprecated void setParcelableData(android.os.Parcelable);
+    method public deprecated void setPassword(boolean);
+    method public deprecated void setRemovedCount(int);
+    method public deprecated void setScrollX(int);
+    method public deprecated void setScrollY(int);
+    method public deprecated void setScrollable(boolean);
+    method public deprecated void setSource(android.view.View);
+    method public deprecated void setSource(android.view.View, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View, int);
+    method public deprecated void setToIndex(int);
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getAnchor();
+    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 java.lang.CharSequence getTitle();
+    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_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package android.support.v4.view.animation {
+
+  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);
+  }
+
+}
+
+package android.support.v4.widget {
+
+  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 final class EdgeEffectCompat {
+    ctor public deprecated EdgeEffectCompat(android.content.Context);
+    method public deprecated boolean draw(android.graphics.Canvas);
+    method public deprecated void finish();
+    method public deprecated boolean isFinished();
+    method public deprecated boolean onAbsorb(int);
+    method public deprecated boolean onPull(float);
+    method public deprecated boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method public deprecated boolean onRelease();
+    method public deprecated void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode);
+  }
+
+  public final class ListPopupWindowCompat {
+    method public static deprecated android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
+    method public static android.view.View.OnTouchListener createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
+  }
+
+  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);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  public final deprecated class ScrollerCompat {
+    method public deprecated void abortAnimation();
+    method public deprecated boolean computeScrollOffset();
+    method public static deprecated android.support.v4.widget.ScrollerCompat create(android.content.Context);
+    method public static deprecated android.support.v4.widget.ScrollerCompat create(android.content.Context, android.view.animation.Interpolator);
+    method public deprecated void fling(int, int, int, int, int, int, int, int);
+    method public deprecated void fling(int, int, int, int, int, int, int, int, int, int);
+    method public deprecated float getCurrVelocity();
+    method public deprecated int getCurrX();
+    method public deprecated int getCurrY();
+    method public deprecated int getFinalX();
+    method public deprecated int getFinalY();
+    method public deprecated boolean isFinished();
+    method public deprecated boolean isOverScrolled();
+    method public deprecated void notifyHorizontalEdgeReached(int, int, int);
+    method public deprecated void notifyVerticalEdgeReached(int, int, int);
+    method public deprecated boolean springBack(int, int, int, int, int, int);
+    method public deprecated void startScroll(int, int, int, int);
+    method public deprecated void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable[] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    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);
+    method public static void setTextAppearance(android.widget.TextView, int);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  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);
+  }
+
+}
+
diff --git a/compat/api/current.txt b/compat/api/current.txt
index c4e7fd3..96a94cb 100644
--- a/compat/api/current.txt
+++ b/compat/api/current.txt
@@ -28,11 +28,12 @@
     method public static void finishAffinity(android.app.Activity);
     method public static void finishAfterTransition(android.app.Activity);
     method public static android.net.Uri getReferrer(android.app.Activity);
-    method public static boolean invalidateOptionsMenu(android.app.Activity);
+    method public static deprecated 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 void setPermissionCompatDelegate(android.support.v4.app.ActivityCompat.PermissionCompatDelegate);
     method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, java.lang.String);
     method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle);
     method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
@@ -43,6 +44,11 @@
     method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
   }
 
+  public static abstract interface ActivityCompat.PermissionCompatDelegate {
+    method public abstract boolean onActivityResult(android.app.Activity, int, int, android.content.Intent);
+    method public abstract boolean requestPermissions(android.app.Activity, java.lang.String[], int);
+  }
+
   public final class ActivityManagerCompat {
     method public static boolean isLowRamDevice(android.app.ActivityManager);
   }
@@ -641,12 +647,12 @@
     field public static final java.lang.String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
   }
 
-  public final class SharedPreferencesCompat {
+  public final deprecated class SharedPreferencesCompat {
   }
 
-  public static final class SharedPreferencesCompat.EditorCompat {
-    method public void apply(android.content.SharedPreferences.Editor);
-    method public static android.support.v4.content.SharedPreferencesCompat.EditorCompat getInstance();
+  public static final deprecated class SharedPreferencesCompat.EditorCompat {
+    method public deprecated void apply(android.content.SharedPreferences.Editor);
+    method public static deprecated android.support.v4.content.SharedPreferencesCompat.EditorCompat getInstance();
   }
 
 }
@@ -700,6 +706,13 @@
     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;
     method public static android.graphics.Typeface getFont(android.content.Context, int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, int, android.support.v4.content.res.ResourcesCompat.FontCallback, android.os.Handler) throws android.content.res.Resources.NotFoundException;
+  }
+
+  public static abstract class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method public abstract void onFontRetrievalFailed(int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
   }
 
 }
@@ -962,6 +975,7 @@
     field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
     field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
     field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
     field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
   }
 
diff --git a/compat/build.gradle b/compat/build.gradle
index 66ae6f3..1e5d847 100644
--- a/compat/build.gradle
+++ b/compat/build.gradle
@@ -4,6 +4,7 @@
     api project(':support-annotations')
     api (libs.arch_lifecycle_runtime)  {
         exclude module: 'support-annotations'
+        transitive = true
     }
 
     androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
@@ -19,8 +20,7 @@
     }
 
     sourceSets {
-        main.java.srcDirs = ['java']
-        main.aidl.srcDirs = ['java']
+        main.aidl.srcDirs = ['src/main/java']
         main.res.srcDirs 'res', 'res-public'
     }
 
diff --git a/compat/java/android/support/v4/content/res/ResourcesCompat.java b/compat/java/android/support/v4/content/res/ResourcesCompat.java
deleted file mode 100644
index 43d78d0..0000000
--- a/compat/java/android/support/v4/content/res/ResourcesCompat.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v4.content.res;
-
-import static android.os.Build.VERSION.SDK_INT;
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
-import android.content.res.Resources.Theme;
-import android.content.res.XmlResourceParser;
-import android.graphics.Typeface;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.ColorInt;
-import android.support.annotation.ColorRes;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.FontRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-import android.support.v4.content.res.FontResourcesParserCompat.FamilyResourceEntry;
-import android.support.v4.graphics.TypefaceCompat;
-import android.util.Log;
-import android.util.TypedValue;
-import android.widget.TextView;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-
-/**
- * Helper for accessing features in {@link android.content.res.Resources}.
- */
-public final class ResourcesCompat {
-    private static final String TAG = "ResourcesCompat";
-
-    /**
-     * Return a drawable object associated with a particular resource ID and
-     * styled for the specified theme. Various types of objects will be
-     * returned depending on the underlying resource -- for example, a solid
-     * color, PNG image, scalable image, etc.
-     * <p>
-     * Prior to API level 21, the theme will not be applied and this method
-     * simply calls through to {@link Resources#getDrawable(int)}.
-     *
-     * @param id The desired resource identifier, as generated by the aapt
-     *           tool. This integer encodes the package, type, and resource
-     *           entry. The value 0 is an invalid identifier.
-     * @param theme The theme used to style the drawable attributes, may be
-     *              {@code null}.
-     * @return Drawable An object that can be used to draw this resource.
-     * @throws NotFoundException Throws NotFoundException if the given ID does
-     *         not exist.
-     */
-    @Nullable
-    @SuppressWarnings("deprecation")
-    public static Drawable getDrawable(@NonNull Resources res, @DrawableRes int id,
-            @Nullable Theme theme) throws NotFoundException {
-        if (SDK_INT >= 21) {
-            return res.getDrawable(id, theme);
-        } else {
-            return res.getDrawable(id);
-        }
-    }
-
-
-    /**
-     * Return a drawable object associated with a particular resource ID for
-     * the given screen density in DPI and styled for the specified theme.
-     * <p>
-     * Prior to API level 15, the theme and density will not be applied and
-     * this method simply calls through to {@link Resources#getDrawable(int)}.
-     * <p>
-     * Prior to API level 21, the theme will not be applied and this method
-     * calls through to Resources#getDrawableForDensity(int, int).
-     *
-     * @param id The desired resource identifier, as generated by the aapt
-     *           tool. This integer encodes the package, type, and resource
-     *           entry. The value 0 is an invalid identifier.
-     * @param density The desired screen density indicated by the resource as
-     *                found in {@link android.util.DisplayMetrics}.
-     * @param theme The theme used to style the drawable attributes, may be
-     *              {@code null}.
-     * @return Drawable An object that can be used to draw this resource.
-     * @throws NotFoundException Throws NotFoundException if the given ID does
-     *         not exist.
-     */
-    @Nullable
-    @SuppressWarnings("deprecation")
-    public static Drawable getDrawableForDensity(@NonNull Resources res, @DrawableRes int id,
-            int density, @Nullable Theme theme) throws NotFoundException {
-        if (SDK_INT >= 21) {
-            return res.getDrawableForDensity(id, density, theme);
-        } else if (SDK_INT >= 15) {
-            return res.getDrawableForDensity(id, density);
-        } else {
-            return res.getDrawable(id);
-        }
-    }
-
-    /**
-     * Returns a themed color integer associated with a particular resource ID.
-     * If the resource holds a complex {@link ColorStateList}, then the default
-     * color from the set is returned.
-     * <p>
-     * Prior to API level 23, the theme will not be applied and this method
-     * calls through to {@link Resources#getColor(int)}.
-     *
-     * @param id The desired resource identifier, as generated by the aapt
-     *           tool. This integer encodes the package, type, and resource
-     *           entry. The value 0 is an invalid identifier.
-     * @param theme The theme used to style the color attributes, may be
-     *              {@code null}.
-     * @return A single color value in the form {@code 0xAARRGGBB}.
-     * @throws NotFoundException Throws NotFoundException if the given ID does
-     *         not exist.
-     */
-    @ColorInt
-    @SuppressWarnings("deprecation")
-    public static int getColor(@NonNull Resources res, @ColorRes int id, @Nullable Theme theme)
-            throws NotFoundException {
-        if (SDK_INT >= 23) {
-            return res.getColor(id, theme);
-        } else {
-            return res.getColor(id);
-        }
-    }
-
-    /**
-     * Returns a themed color state list associated with a particular resource
-     * ID. The resource may contain either a single raw color value or a
-     * complex {@link ColorStateList} holding multiple possible colors.
-     * <p>
-     * Prior to API level 23, the theme will not be applied and this method
-     * calls through to {@link Resources#getColorStateList(int)}.
-     *
-     * @param id The desired resource identifier of a {@link ColorStateList},
-     *           as generated by the aapt tool. This integer encodes the
-     *           package, type, and resource entry. The value 0 is an invalid
-     *           identifier.
-     * @param theme The theme used to style the color attributes, may be
-     *              {@code null}.
-     * @return A themed ColorStateList object containing either a single solid
-     *         color or multiple colors that can be selected based on a state.
-     * @throws NotFoundException Throws NotFoundException if the given ID does
-     *         not exist.
-     */
-    @Nullable
-    @SuppressWarnings("deprecation")
-    public static ColorStateList getColorStateList(@NonNull Resources res, @ColorRes int id,
-            @Nullable Theme theme) throws NotFoundException {
-        if (SDK_INT >= 23) {
-            return res.getColorStateList(id, theme);
-        } else {
-            return res.getColorStateList(id);
-        }
-    }
-
-    /**
-     * Returns a font Typeface associated with a particular resource ID.
-     * <p>
-     * Prior to API level 23, font resources with more than one font in a family will only load the
-     * first font in that family.
-     *
-     * @param context A context to retrieve the Resources from.
-     * @param id The desired resource identifier of a {@link Typeface},
-     *           as generated by the aapt tool. This integer encodes the
-     *           package, type, and resource entry. The value 0 is an invalid
-     *           identifier.
-     * @return A font Typeface object.
-     * @throws NotFoundException Throws NotFoundException if the given ID does
-     *         not exist.
-     */
-    @Nullable
-    public static Typeface getFont(@NonNull Context context, @FontRes int id)
-            throws NotFoundException {
-        if (context.isRestricted()) {
-            return null;
-        }
-        return loadFont(context, id, new TypedValue(), Typeface.NORMAL, null);
-    }
-
-    /** @hide */
-    @RestrictTo(LIBRARY_GROUP)
-    public static Typeface getFont(@NonNull Context context, @FontRes int id, TypedValue value,
-            int style, @Nullable TextView targetView) throws NotFoundException {
-        if (context.isRestricted()) {
-            return null;
-        }
-        return loadFont(context, id, value, style, targetView);
-    }
-
-    private static Typeface loadFont(@NonNull Context context, int id, TypedValue value,
-            int style, @Nullable TextView targetView) {
-        final Resources resources = context.getResources();
-        resources.getValue(id, value, true);
-        Typeface typeface = loadFont(context, resources, value, id, style, targetView);
-        if (typeface != null) {
-            return typeface;
-        }
-        throw new NotFoundException("Font resource ID #0x"
-                + Integer.toHexString(id));
-    }
-
-    private static Typeface loadFont(
-            @NonNull Context context, Resources wrapper, TypedValue value, int id, int style,
-            @Nullable TextView targetView) {
-        if (value.string == null) {
-            throw new NotFoundException("Resource \"" + wrapper.getResourceName(id) + "\" ("
-                    + Integer.toHexString(id) + ") is not a Font: " + value);
-        }
-
-        final String file = value.string.toString();
-        if (!file.startsWith("res/")) {
-            // Early exit if the specified string is unlikely to the resource path.
-            return null;
-        }
-
-        Typeface cached = TypefaceCompat.findFromCache(wrapper, id, style);
-        if (cached != null) {
-            return cached;
-        }
-
-        try {
-            if (file.toLowerCase().endsWith(".xml")) {
-                final XmlResourceParser rp = wrapper.getXml(id);
-                final FamilyResourceEntry familyEntry =
-                        FontResourcesParserCompat.parse(rp, wrapper);
-                if (familyEntry == null) {
-                    Log.e(TAG, "Failed to find font-family tag");
-                    return null;
-                }
-                return TypefaceCompat.createFromResourcesFamilyXml(
-                        context, familyEntry, wrapper, id, style, targetView);
-            }
-            return TypefaceCompat.createFromResourcesFontFile(context, wrapper, id, file, style);
-        } catch (XmlPullParserException e) {
-            Log.e(TAG, "Failed to parse xml resource " + file, e);
-        } catch (IOException e) {
-            Log.e(TAG, "Failed to read xml resource " + file, e);
-        }
-        return null;
-    }
-
-    private ResourcesCompat() {}
-}
diff --git a/compat/res/values/attrs.xml b/compat/res/values/attrs.xml
index 1833794..04d7690 100644
--- a/compat/res/values/attrs.xml
+++ b/compat/res/values/attrs.xml
@@ -32,7 +32,12 @@
         documentation for these values. -->
         <attr name="fontProviderCerts" format="reference" />
         <!-- The strategy to be used when fetching font data from a font provider in XML layouts.
-          -->
+        This attribute is ignored when the resource is loaded from code, as it is equivalent to the
+        choice of API between {@link
+        android.support.v4.content.res.ResourcesCompat#getFont(Context, int)} (blocking) and
+        {@link
+        android.support.v4.content.res.ResourcesCompat#getFont(Context, int, FontCallback, Handler)}
+        (async). -->
         <attr name="fontProviderFetchStrategy">
             <!-- The blocking font fetch works as follows.
               First, check the local cache, then if the requested font is not cached, request the
@@ -74,5 +79,10 @@
          common values are 400 for regular weight and 700 for bold weight. If unspecified, the value
          in the font's header tables will be used. -->
         <attr name="fontWeight" format="integer" />
+
+        <!-- References to the framework attrs -->
+        <attr name="android:fontStyle" />
+        <attr name="android:font" />
+        <attr name="android:fontWeight" />
     </declare-styleable>
 </resources>
diff --git a/compat/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java b/compat/src/main/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
similarity index 97%
rename from compat/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
rename to compat/src/main/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
index 3905ca5..0dcd902 100644
--- a/compat/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
+++ b/compat/src/main/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
@@ -20,6 +20,8 @@
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.content.pm.PackageManager;
 import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.view.View;
 
 /**
@@ -188,8 +190,9 @@
      * @param packageManager The current package manager
      * @return The localized description.
      */
+    @Nullable
     public static String loadDescription(
-            AccessibilityServiceInfo info, PackageManager packageManager) {
+            @NonNull AccessibilityServiceInfo info, @NonNull PackageManager packageManager) {
         if (Build.VERSION.SDK_INT >= 16) {
             return info.loadDescription(packageManager);
         } else {
@@ -206,6 +209,7 @@
      * @param feedbackType The feedback type.
      * @return The string representation.
      */
+    @NonNull
     public static String feedbackTypeToString(int feedbackType) {
         StringBuilder builder = new StringBuilder();
         builder.append("[");
@@ -245,6 +249,7 @@
      * @param flag The flag.
      * @return The string representation.
      */
+    @Nullable
     public static String flagToString(int flag) {
         switch (flag) {
             case AccessibilityServiceInfo.DEFAULT:
@@ -276,7 +281,7 @@
      * @see #CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
      * @see #CAPABILITY_CAN_FILTER_KEY_EVENTS
      */
-    public static int getCapabilities(AccessibilityServiceInfo info) {
+    public static int getCapabilities(@NonNull AccessibilityServiceInfo info) {
         if (Build.VERSION.SDK_INT >= 18) {
             return info.getCapabilities();
         } else {
@@ -296,6 +301,7 @@
      * @param capability The capability.
      * @return The string representation.
      */
+    @NonNull
     public static String capabilityToString(int capability) {
         switch (capability) {
             case CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT:
diff --git a/compat/java/android/support/v4/accessibilityservice/package.html b/compat/src/main/java/android/support/v4/accessibilityservice/package.html
similarity index 100%
rename from compat/java/android/support/v4/accessibilityservice/package.html
rename to compat/src/main/java/android/support/v4/accessibilityservice/package.html
diff --git a/compat/java/android/support/v4/app/ActivityCompat.java b/compat/src/main/java/android/support/v4/app/ActivityCompat.java
similarity index 81%
rename from compat/java/android/support/v4/app/ActivityCompat.java
rename to compat/src/main/java/android/support/v4/app/ActivityCompat.java
index f260508..5833481 100644
--- a/compat/java/android/support/v4/app/ActivityCompat.java
+++ b/compat/src/main/java/android/support/v4/app/ActivityCompat.java
@@ -74,6 +74,61 @@
     }
 
     /**
+     * Customizable delegate that allows delegating permission compatibility methods to a custom
+     * implementation.
+     *
+     * <p>
+     *     To delegate permission compatibility methods to a custom class, implement this interface,
+     *     and call {@code ActivityCompat.setPermissionCompatDelegate(delegate);}. All future calls
+     *     to the permission compatibility methods in this class will first check whether the
+     *     delegate can handle the method call, and invoke the corresponding method if it can.
+     * </p>
+     */
+    public interface PermissionCompatDelegate {
+
+        /**
+         * Determines whether the delegate should handle
+         * {@link ActivityCompat#requestPermissions(Activity, String[], int)}, and request
+         * permissions if applicable. If this method returns true, it means that permission
+         * request is successfully handled by the delegate, and platform should not perform any
+         * further requests for permission.
+         *
+         * @param activity The target activity.
+         * @param permissions The requested permissions. Must me non-null and not empty.
+         * @param requestCode Application specific request code to match with a result reported to
+         *    {@link
+         *    OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])}.
+         *    Should be >= 0.
+         *
+         * @return Whether the delegate has handled the permission request.
+         * @see ActivityCompat#requestPermissions(Activity, String[], int)
+         */
+        boolean requestPermissions(@NonNull Activity activity,
+                @NonNull String[] permissions, @IntRange(from = 0) int requestCode);
+
+        /**
+         * Determines whether the delegate should handle the permission request as part of
+         * {@code FragmentActivity#onActivityResult(int, int, Intent)}. If this method returns true,
+         * it means that activity result is successfully handled by the delegate, and no further
+         * action is needed on this activity result.
+         *
+         * @param activity    The target Activity.
+         * @param requestCode The integer request code originally supplied to
+         *                    {@code startActivityForResult()}, allowing you to identify who this
+         *                    result came from.
+         * @param resultCode  The integer result code returned by the child activity
+         *                    through its {@code }setResult()}.
+         * @param data        An Intent, which can return result data to the caller
+         *                    (various data can be attached to Intent "extras").
+         *
+         * @return Whether the delegate has handled the activity result.
+         * @see ActivityCompat#requestPermissions(Activity, String[], int)
+         */
+        boolean onActivityResult(@NonNull Activity activity,
+                @IntRange(from = 0) int requestCode, int resultCode, @Nullable Intent data);
+    }
+
+    /**
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -81,6 +136,8 @@
         void validateRequestPermissionsRequestCode(int requestCode);
     }
 
+    private static PermissionCompatDelegate sDelegate;
+
     /**
      * This class should not be instantiated, but the constructor must be
      * visible for the class to be extended (as in support-v13).
@@ -90,6 +147,25 @@
     }
 
     /**
+     * Sets the permission delegate for {@code ActivityCompat}. Replaces the previously set
+     * delegate.
+     *
+     * @param delegate The delegate to be set. {@code null} to clear the set delegate.
+     */
+    public static void setPermissionCompatDelegate(
+            @Nullable PermissionCompatDelegate delegate) {
+        sDelegate = delegate;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public static PermissionCompatDelegate getPermissionCompatDelegate() {
+        return sDelegate;
+    }
+
+    /**
      * Invalidate the activity's options menu, if able.
      *
      * <p>Before API level 11 (Android 3.0/Honeycomb) the lifecycle of the
@@ -120,7 +196,9 @@
      *
      * @param activity Invalidate the options menu of this activity
      * @return true if this operation was supported and it completed; false if it was not available.
+     * @deprecated Use {@link Activity#invalidateOptionsMenu()} directly.
      */
+    @Deprecated
     public static boolean invalidateOptionsMenu(Activity activity) {
         activity.invalidateOptionsMenu();
         return true;
@@ -146,8 +224,8 @@
      *                supplied here; there are no supported definitions for
      *                building it manually.
      */
-    public static void startActivityForResult(Activity activity, Intent intent, int requestCode,
-            @Nullable Bundle options) {
+    public static void startActivityForResult(@NonNull Activity activity, @NonNull Intent intent,
+            int requestCode, @Nullable Bundle options) {
         if (Build.VERSION.SDK_INT >= 16) {
             activity.startActivityForResult(intent, requestCode, options);
         } else {
@@ -181,9 +259,10 @@
      *                supplied here; there are no supported definitions for
      *                building it manually.
      */
-    public static void startIntentSenderForResult(Activity activity, IntentSender intent,
-            int requestCode, Intent fillInIntent, int flagsMask, int flagsValues,
-            int extraFlags, @Nullable Bundle options) throws IntentSender.SendIntentException {
+    public static void startIntentSenderForResult(@NonNull Activity activity,
+            @NonNull IntentSender intent, int requestCode, @Nullable Intent fillInIntent,
+            int flagsMask, int flagsValues, int extraFlags, @Nullable Bundle options)
+            throws IntentSender.SendIntentException {
         if (Build.VERSION.SDK_INT >= 16) {
             activity.startIntentSenderForResult(intent, requestCode, fillInIntent, flagsMask,
                     flagsValues, extraFlags, options);
@@ -200,7 +279,7 @@
      * <p>On Android 4.1+ calling this method will call through to the native version of this
      * method. For other platforms {@link Activity#finish()} will be called instead.</p>
      */
-    public static void finishAffinity(Activity activity) {
+    public static void finishAffinity(@NonNull Activity activity) {
         if (Build.VERSION.SDK_INT >= 16) {
             activity.finishAffinity();
         } else {
@@ -217,7 +296,7 @@
      * <p>On Android 4.4 or lower, this method only finishes the Activity with no
      * special exit transition.</p>
      */
-    public static void finishAfterTransition(Activity activity) {
+    public static void finishAfterTransition(@NonNull Activity activity) {
         if (Build.VERSION.SDK_INT >= 21) {
             activity.finishAfterTransition();
         } else {
@@ -242,7 +321,7 @@
      * referrer information, applications can spoof it.</p>
      */
     @Nullable
-    public static Uri getReferrer(Activity activity) {
+    public static Uri getReferrer(@NonNull Activity activity) {
         if (Build.VERSION.SDK_INT >= 22) {
             return activity.getReferrer();
         }
@@ -266,8 +345,8 @@
      *
      * @param callback Used to manipulate shared element transitions on the launched Activity.
      */
-    public static void setEnterSharedElementCallback(Activity activity,
-            SharedElementCallback callback) {
+    public static void setEnterSharedElementCallback(@NonNull Activity activity,
+            @Nullable SharedElementCallback callback) {
         if (Build.VERSION.SDK_INT >= 23) {
             android.app.SharedElementCallback frameworkCallback = callback != null
                     ? new SharedElementCallback23Impl(callback)
@@ -290,8 +369,8 @@
      *
      * @param callback Used to manipulate shared element transitions on the launching Activity.
      */
-    public static void setExitSharedElementCallback(Activity activity,
-            SharedElementCallback callback) {
+    public static void setExitSharedElementCallback(@NonNull Activity activity,
+            @Nullable SharedElementCallback callback) {
         if (Build.VERSION.SDK_INT >= 23) {
             android.app.SharedElementCallback frameworkCallback = callback != null
                     ? new SharedElementCallback23Impl(callback)
@@ -305,13 +384,13 @@
         }
     }
 
-    public static void postponeEnterTransition(Activity activity) {
+    public static void postponeEnterTransition(@NonNull Activity activity) {
         if (Build.VERSION.SDK_INT >= 21) {
             activity.postponeEnterTransition();
         }
     }
 
-    public static void startPostponedEnterTransition(Activity activity) {
+    public static void startPostponedEnterTransition(@NonNull Activity activity) {
         if (Build.VERSION.SDK_INT >= 21) {
             activity.startPostponedEnterTransition();
         }
@@ -386,6 +465,12 @@
      */
     public static void requestPermissions(final @NonNull Activity activity,
             final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode) {
+        if (sDelegate != null
+                && sDelegate.requestPermissions(activity, permissions, requestCode)) {
+            // Delegate has handled the permission request.
+            return;
+        }
+
         if (Build.VERSION.SDK_INT >= 23) {
             if (activity instanceof RequestPermissionsRequestCodeValidator) {
                 ((RequestPermissionsRequestCodeValidator) activity)
diff --git a/compat/java/android/support/v4/app/ActivityManagerCompat.java b/compat/src/main/java/android/support/v4/app/ActivityManagerCompat.java
similarity index 100%
rename from compat/java/android/support/v4/app/ActivityManagerCompat.java
rename to compat/src/main/java/android/support/v4/app/ActivityManagerCompat.java
diff --git a/compat/java/android/support/v4/app/ActivityOptionsCompat.java b/compat/src/main/java/android/support/v4/app/ActivityOptionsCompat.java
similarity index 95%
rename from compat/java/android/support/v4/app/ActivityOptionsCompat.java
rename to compat/src/main/java/android/support/v4/app/ActivityOptionsCompat.java
index 7b5916f..6676805 100644
--- a/compat/java/android/support/v4/app/ActivityOptionsCompat.java
+++ b/compat/src/main/java/android/support/v4/app/ActivityOptionsCompat.java
@@ -24,6 +24,7 @@
 import android.graphics.Rect;
 import android.os.Build;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
 import android.support.v4.util.Pair;
@@ -60,7 +61,8 @@
      * @return Returns a new ActivityOptions object that you can use to supply
      * these options as the options Bundle when starting an activity.
      */
-    public static ActivityOptionsCompat makeCustomAnimation(Context context,
+    @NonNull
+    public static ActivityOptionsCompat makeCustomAnimation(@NonNull Context context,
             int enterResId, int exitResId) {
         if (Build.VERSION.SDK_INT >= 16) {
             return createImpl(ActivityOptions.makeCustomAnimation(context, enterResId, exitResId));
@@ -88,7 +90,8 @@
      * @return Returns a new ActivityOptions object that you can use to supply
      * these options as the options Bundle when starting an activity.
      */
-    public static ActivityOptionsCompat makeScaleUpAnimation(View source,
+    @NonNull
+    public static ActivityOptionsCompat makeScaleUpAnimation(@NonNull View source,
             int startX, int startY, int startWidth, int startHeight) {
         if (Build.VERSION.SDK_INT >= 16) {
             return createImpl(ActivityOptions.makeScaleUpAnimation(
@@ -111,7 +114,8 @@
      * @return Returns a new ActivityOptions object that you can use to
      * supply these options as the options Bundle when starting an activity.
      */
-    public static ActivityOptionsCompat makeClipRevealAnimation(View source,
+    @NonNull
+    public static ActivityOptionsCompat makeClipRevealAnimation(@NonNull View source,
             int startX, int startY, int width, int height) {
         if (Build.VERSION.SDK_INT >= 23) {
             return createImpl(ActivityOptions.makeClipRevealAnimation(
@@ -139,8 +143,9 @@
      * @return Returns a new ActivityOptions object that you can use to supply
      * these options as the options Bundle when starting an activity.
      */
-    public static ActivityOptionsCompat makeThumbnailScaleUpAnimation(View source,
-            Bitmap thumbnail, int startX, int startY) {
+    @NonNull
+    public static ActivityOptionsCompat makeThumbnailScaleUpAnimation(@NonNull View source,
+            @NonNull Bitmap thumbnail, int startX, int startY) {
         if (Build.VERSION.SDK_INT >= 16) {
             return createImpl(ActivityOptions.makeThumbnailScaleUpAnimation(
                     source, thumbnail, startX, startY));
@@ -166,8 +171,9 @@
      * @return Returns a new ActivityOptions object that you can use to
      *         supply these options as the options Bundle when starting an activity.
      */
-    public static ActivityOptionsCompat makeSceneTransitionAnimation(Activity activity,
-            View sharedElement, String sharedElementName) {
+    @NonNull
+    public static ActivityOptionsCompat makeSceneTransitionAnimation(@NonNull Activity activity,
+            @NonNull View sharedElement, @NonNull String sharedElementName) {
         if (Build.VERSION.SDK_INT >= 21) {
             return createImpl(ActivityOptions.makeSceneTransitionAnimation(
                     activity, sharedElement, sharedElementName));
@@ -192,8 +198,9 @@
      * @return Returns a new ActivityOptions object that you can use to
      *         supply these options as the options Bundle when starting an activity.
      */
+    @NonNull
     @SuppressWarnings("unchecked")
-    public static ActivityOptionsCompat makeSceneTransitionAnimation(Activity activity,
+    public static ActivityOptionsCompat makeSceneTransitionAnimation(@NonNull Activity activity,
             Pair<View, String>... sharedElements) {
         if (Build.VERSION.SDK_INT >= 21) {
             android.util.Pair<View, String>[] pairs = null;
@@ -219,6 +226,7 @@
      * {@link android.R.attr#launchMode launchMode} values of
      * <code>singleInstance</code> or <code>singleTask</code>.
      */
+    @NonNull
     public static ActivityOptionsCompat makeTaskLaunchBehind() {
         if (Build.VERSION.SDK_INT >= 21) {
             return createImpl(ActivityOptions.makeTaskLaunchBehind());
@@ -230,6 +238,7 @@
      * Create a basic ActivityOptions that has no special animation associated with it.
      * Other options can still be set.
      */
+    @NonNull
     public static ActivityOptionsCompat makeBasic() {
         if (Build.VERSION.SDK_INT >= 23) {
             return createImpl(ActivityOptions.makeBasic());
@@ -314,8 +323,9 @@
      * {@link android.content.pm.PackageManager#FEATURE_PICTURE_IN_PICTURE} enabled.
      * @param screenSpacePixelRect Launch bounds to use for the activity or null for fullscreen.
      */
+    @NonNull
     public ActivityOptionsCompat setLaunchBounds(@Nullable Rect screenSpacePixelRect) {
-        return null;
+        return this;
     }
 
     /**
@@ -335,6 +345,7 @@
      * object; you must not modify it, but can supply it to the startActivity
      * methods that take an options Bundle.
      */
+    @Nullable
     public Bundle toBundle() {
         return null;
     }
@@ -344,7 +355,7 @@
      * otherOptions. Any values defined in otherOptions replace those in the
      * base options.
      */
-    public void update(ActivityOptionsCompat otherOptions) {
+    public void update(@NonNull ActivityOptionsCompat otherOptions) {
         // Do nothing.
     }
 
@@ -372,7 +383,7 @@
      *
      * @param receiver A broadcast receiver that will receive the report.
      */
-    public void requestUsageTimeReport(PendingIntent receiver) {
+    public void requestUsageTimeReport(@NonNull PendingIntent receiver) {
         // Do nothing.
     }
 }
diff --git a/compat/java/android/support/v4/app/AlarmManagerCompat.java b/compat/src/main/java/android/support/v4/app/AlarmManagerCompat.java
similarity index 93%
rename from compat/java/android/support/v4/app/AlarmManagerCompat.java
rename to compat/src/main/java/android/support/v4/app/AlarmManagerCompat.java
index 5a4582b..a297cb5 100644
--- a/compat/java/android/support/v4/app/AlarmManagerCompat.java
+++ b/compat/src/main/java/android/support/v4/app/AlarmManagerCompat.java
@@ -19,6 +19,7 @@
 import android.app.AlarmManager;
 import android.app.PendingIntent;
 import android.os.Build;
+import android.support.annotation.NonNull;
 
 /**
  * Compatibility library for {@link AlarmManager} with fallbacks for older platforms.
@@ -52,8 +53,8 @@
      * @see android.content.Context#registerReceiver
      * @see android.content.Intent#filterEquals
      */
-    public static void setAlarmClock(AlarmManager alarmManager, long triggerTime,
-            PendingIntent showIntent, PendingIntent operation) {
+    public static void setAlarmClock(@NonNull AlarmManager alarmManager, long triggerTime,
+            @NonNull PendingIntent showIntent, @NonNull PendingIntent operation) {
         if (Build.VERSION.SDK_INT >= 21) {
             alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(triggerTime, showIntent),
                     operation);
@@ -110,8 +111,8 @@
      * @see AlarmManager#RTC
      * @see AlarmManager#RTC_WAKEUP
      */
-    public static void setAndAllowWhileIdle(AlarmManager alarmManager, int type,
-            long triggerAtMillis, PendingIntent operation) {
+    public static void setAndAllowWhileIdle(@NonNull AlarmManager alarmManager, int type,
+            long triggerAtMillis, @NonNull PendingIntent operation) {
         if (Build.VERSION.SDK_INT >= 23) {
             alarmManager.setAndAllowWhileIdle(type, triggerAtMillis, operation);
         } else {
@@ -155,8 +156,8 @@
      * @see AlarmManager#RTC
      * @see AlarmManager#RTC_WAKEUP
      */
-    public static void setExact(AlarmManager alarmManager, int type, long triggerAtMillis,
-            PendingIntent operation) {
+    public static void setExact(@NonNull AlarmManager alarmManager, int type, long triggerAtMillis,
+            @NonNull PendingIntent operation) {
         if (Build.VERSION.SDK_INT >= 19) {
             alarmManager.setExact(type, triggerAtMillis, operation);
         } else {
@@ -215,8 +216,8 @@
      * @see AlarmManager#RTC
      * @see AlarmManager#RTC_WAKEUP
      */
-    public static void setExactAndAllowWhileIdle(AlarmManager alarmManager, int type,
-            long triggerAtMillis, PendingIntent operation) {
+    public static void setExactAndAllowWhileIdle(@NonNull AlarmManager alarmManager, int type,
+            long triggerAtMillis, @NonNull PendingIntent operation) {
         if (Build.VERSION.SDK_INT >= 23) {
             alarmManager.setExactAndAllowWhileIdle(type, triggerAtMillis, operation);
         } else {
diff --git a/compat/java/android/support/v4/app/AppOpsManagerCompat.java b/compat/src/main/java/android/support/v4/app/AppOpsManagerCompat.java
similarity index 98%
rename from compat/java/android/support/v4/app/AppOpsManagerCompat.java
rename to compat/src/main/java/android/support/v4/app/AppOpsManagerCompat.java
index ce2d2c6..7e97199 100644
--- a/compat/java/android/support/v4/app/AppOpsManagerCompat.java
+++ b/compat/src/main/java/android/support/v4/app/AppOpsManagerCompat.java
@@ -21,6 +21,7 @@
 import android.app.AppOpsManager;
 import android.content.Context;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 
 /**
  * Helper for accessing features in {@link android.app.AppOpsManager}.
@@ -56,6 +57,7 @@
      * @param permission The permission.
      * @return The app op associated with the permission or null.
      */
+    @Nullable
     public static String permissionToOp(@NonNull String permission) {
         if (SDK_INT >= 23) {
             return AppOpsManager.permissionToOp(permission);
diff --git a/compat/java/android/support/v4/app/BundleCompat.java b/compat/src/main/java/android/support/v4/app/BundleCompat.java
similarity index 93%
rename from compat/java/android/support/v4/app/BundleCompat.java
rename to compat/src/main/java/android/support/v4/app/BundleCompat.java
index e5fc302..21d730d 100644
--- a/compat/java/android/support/v4/app/BundleCompat.java
+++ b/compat/src/main/java/android/support/v4/app/BundleCompat.java
@@ -19,6 +19,8 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.IBinder;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.util.Log;
 
 import java.lang.reflect.InvocationTargetException;
@@ -94,7 +96,8 @@
      * @param key    The key to use while getting the {@link IBinder}.
      * @return       The {@link IBinder} that was obtained.
      */
-    public static IBinder getBinder(Bundle bundle, String key) {
+    @Nullable
+    public static IBinder getBinder(@NonNull Bundle bundle, @Nullable String key) {
         if (Build.VERSION.SDK_INT >= 18) {
             return bundle.getBinder(key);
         } else {
@@ -109,7 +112,8 @@
      * @param key    The key to use while putting the {@link IBinder}.
      * @param binder The {@link IBinder} to put.
      */
-    public static void putBinder(Bundle bundle, String key, IBinder binder) {
+    public static void putBinder(@NonNull Bundle bundle, @Nullable String key,
+            @Nullable IBinder binder) {
         if (Build.VERSION.SDK_INT >= 18) {
             bundle.putBinder(key, binder);
         } else {
diff --git a/compat/java/android/support/v4/app/INotificationSideChannel.aidl b/compat/src/main/java/android/support/v4/app/INotificationSideChannel.aidl
similarity index 100%
rename from compat/java/android/support/v4/app/INotificationSideChannel.aidl
rename to compat/src/main/java/android/support/v4/app/INotificationSideChannel.aidl
diff --git a/compat/java/android/support/v4/app/JobIntentService.java b/compat/src/main/java/android/support/v4/app/JobIntentService.java
similarity index 99%
rename from compat/java/android/support/v4/app/JobIntentService.java
rename to compat/src/main/java/android/support/v4/app/JobIntentService.java
index c0d7f13..87b7441 100644
--- a/compat/java/android/support/v4/app/JobIntentService.java
+++ b/compat/src/main/java/android/support/v4/app/JobIntentService.java
@@ -84,7 +84,7 @@
  *
  * <p>Here is an example implementation of this class:</p>
  *
- * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/app/SimpleJobIntentService.java
+ * {@sample frameworks/support/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/SimpleJobIntentService.java
  *      complete}
  */
 public abstract class JobIntentService extends Service {
diff --git a/compat/java/android/support/v4/app/NotificationBuilderWithBuilderAccessor.java b/compat/src/main/java/android/support/v4/app/NotificationBuilderWithBuilderAccessor.java
similarity index 100%
rename from compat/java/android/support/v4/app/NotificationBuilderWithBuilderAccessor.java
rename to compat/src/main/java/android/support/v4/app/NotificationBuilderWithBuilderAccessor.java
diff --git a/compat/java/android/support/v4/app/NotificationCompat.java b/compat/src/main/java/android/support/v4/app/NotificationCompat.java
similarity index 100%
rename from compat/java/android/support/v4/app/NotificationCompat.java
rename to compat/src/main/java/android/support/v4/app/NotificationCompat.java
diff --git a/compat/java/android/support/v4/app/NotificationCompatBuilder.java b/compat/src/main/java/android/support/v4/app/NotificationCompatBuilder.java
similarity index 100%
rename from compat/java/android/support/v4/app/NotificationCompatBuilder.java
rename to compat/src/main/java/android/support/v4/app/NotificationCompatBuilder.java
diff --git a/compat/java/android/support/v4/app/NotificationCompatExtras.java b/compat/src/main/java/android/support/v4/app/NotificationCompatExtras.java
similarity index 100%
rename from compat/java/android/support/v4/app/NotificationCompatExtras.java
rename to compat/src/main/java/android/support/v4/app/NotificationCompatExtras.java
diff --git a/compat/java/android/support/v4/app/NotificationCompatJellybean.java b/compat/src/main/java/android/support/v4/app/NotificationCompatJellybean.java
similarity index 100%
rename from compat/java/android/support/v4/app/NotificationCompatJellybean.java
rename to compat/src/main/java/android/support/v4/app/NotificationCompatJellybean.java
diff --git a/compat/java/android/support/v4/app/NotificationCompatSideChannelService.java b/compat/src/main/java/android/support/v4/app/NotificationCompatSideChannelService.java
similarity index 100%
rename from compat/java/android/support/v4/app/NotificationCompatSideChannelService.java
rename to compat/src/main/java/android/support/v4/app/NotificationCompatSideChannelService.java
diff --git a/compat/java/android/support/v4/app/NotificationManagerCompat.java b/compat/src/main/java/android/support/v4/app/NotificationManagerCompat.java
similarity index 98%
rename from compat/java/android/support/v4/app/NotificationManagerCompat.java
rename to compat/src/main/java/android/support/v4/app/NotificationManagerCompat.java
index 93775ec..1a0f1bc 100644
--- a/compat/java/android/support/v4/app/NotificationManagerCompat.java
+++ b/compat/src/main/java/android/support/v4/app/NotificationManagerCompat.java
@@ -36,6 +36,8 @@
 import android.os.RemoteException;
 import android.provider.Settings;
 import android.support.annotation.GuardedBy;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.util.Log;
 
 import java.lang.reflect.Field;
@@ -144,7 +146,8 @@
     public static final int IMPORTANCE_MAX = 5;
 
     /** Get a {@link NotificationManagerCompat} instance for a provided context. */
-    public static NotificationManagerCompat from(Context context) {
+    @NonNull
+    public static NotificationManagerCompat from(@NonNull Context context) {
         return new NotificationManagerCompat(context);
     }
 
@@ -167,7 +170,7 @@
      * @param tag the string identifier of the notification.
      * @param id the ID of the notification
      */
-    public void cancel(String tag, int id) {
+    public void cancel(@Nullable String tag, int id) {
         mNotificationManager.cancel(tag, id);
         if (Build.VERSION.SDK_INT <= MAX_SIDE_CHANNEL_SDK_VERSION) {
             pushSideChannelQueue(new CancelTask(mContext.getPackageName(), id, tag));
@@ -197,7 +200,7 @@
      * @param id the ID of the notification. The pair (tag, id) must be unique within your app.
      * @param notification the notification to post to the system
     */
-    public void notify(String tag, int id, Notification notification) {
+    public void notify(@Nullable String tag, int id, @NonNull Notification notification) {
         if (useSideChannelForNotification(notification)) {
             pushSideChannelQueue(new NotifyTask(mContext.getPackageName(), id, tag, notification));
             // Cancel this notification in notification manager if it just transitioned to being
@@ -253,7 +256,8 @@
     /**
      * Get the set of packages that have an enabled notification listener component within them.
      */
-    public static Set<String> getEnabledListenerPackages(Context context) {
+    @NonNull
+    public static Set<String> getEnabledListenerPackages(@NonNull Context context) {
         final String enabledNotificationListeners = Settings.Secure.getString(
                 context.getContentResolver(),
                 SETTING_ENABLED_NOTIFICATION_LISTENERS);
diff --git a/compat/java/android/support/v4/app/RemoteInput.java b/compat/src/main/java/android/support/v4/app/RemoteInput.java
similarity index 100%
rename from compat/java/android/support/v4/app/RemoteInput.java
rename to compat/src/main/java/android/support/v4/app/RemoteInput.java
diff --git a/compat/java/android/support/v4/app/RemoteInputCompatBase.java b/compat/src/main/java/android/support/v4/app/RemoteInputCompatBase.java
similarity index 100%
rename from compat/java/android/support/v4/app/RemoteInputCompatBase.java
rename to compat/src/main/java/android/support/v4/app/RemoteInputCompatBase.java
diff --git a/compat/java/android/support/v4/app/ServiceCompat.java b/compat/src/main/java/android/support/v4/app/ServiceCompat.java
similarity index 96%
rename from compat/java/android/support/v4/app/ServiceCompat.java
rename to compat/src/main/java/android/support/v4/app/ServiceCompat.java
index 1676ee8..2e63b23 100644
--- a/compat/java/android/support/v4/app/ServiceCompat.java
+++ b/compat/src/main/java/android/support/v4/app/ServiceCompat.java
@@ -22,6 +22,7 @@
 import android.app.Service;
 import android.os.Build;
 import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
 import android.support.annotation.RestrictTo;
 
 import java.lang.annotation.Retention;
@@ -92,7 +93,7 @@
      * {@link #STOP_FOREGROUND_DETACH}.
      * @see Service#startForeground(int, Notification)
      */
-    public static void stopForeground(Service service, @StopForegroundFlags int flags) {
+    public static void stopForeground(@NonNull Service service, @StopForegroundFlags int flags) {
         if (Build.VERSION.SDK_INT >= 24) {
             service.stopForeground(flags);
         } else {
diff --git a/compat/java/android/support/v4/app/ShareCompat.java b/compat/src/main/java/android/support/v4/app/ShareCompat.java
similarity index 100%
rename from compat/java/android/support/v4/app/ShareCompat.java
rename to compat/src/main/java/android/support/v4/app/ShareCompat.java
diff --git a/compat/java/android/support/v4/app/SharedElementCallback.java b/compat/src/main/java/android/support/v4/app/SharedElementCallback.java
similarity index 100%
rename from compat/java/android/support/v4/app/SharedElementCallback.java
rename to compat/src/main/java/android/support/v4/app/SharedElementCallback.java
diff --git a/compat/java/android/support/v4/app/SupportActivity.java b/compat/src/main/java/android/support/v4/app/SupportActivity.java
similarity index 100%
rename from compat/java/android/support/v4/app/SupportActivity.java
rename to compat/src/main/java/android/support/v4/app/SupportActivity.java
diff --git a/compat/java/android/support/v4/app/package.html b/compat/src/main/java/android/support/v4/app/package.html
similarity index 100%
rename from compat/java/android/support/v4/app/package.html
rename to compat/src/main/java/android/support/v4/app/package.html
diff --git a/compat/java/android/support/v4/content/ContentResolverCompat.java b/compat/src/main/java/android/support/v4/content/ContentResolverCompat.java
similarity index 100%
rename from compat/java/android/support/v4/content/ContentResolverCompat.java
rename to compat/src/main/java/android/support/v4/content/ContentResolverCompat.java
diff --git a/compat/java/android/support/v4/content/ContextCompat.java b/compat/src/main/java/android/support/v4/content/ContextCompat.java
similarity index 94%
rename from compat/java/android/support/v4/content/ContextCompat.java
rename to compat/src/main/java/android/support/v4/content/ContextCompat.java
index fdbe32f..8a4fd7a 100644
--- a/compat/java/android/support/v4/content/ContextCompat.java
+++ b/compat/src/main/java/android/support/v4/content/ContextCompat.java
@@ -79,7 +79,7 @@
      *                length-1 will correspond to the top activity on the resulting task stack.
      * @return true if the underlying API was available and the call was successful, false otherwise
      */
-    public static boolean startActivities(Context context, Intent[] intents) {
+    public static boolean startActivities(@NonNull Context context, @NonNull Intent[] intents) {
         return startActivities(context, intents, null);
     }
 
@@ -110,7 +110,8 @@
      * See {@link android.content.Context#startActivity(Intent, android.os.Bundle)}
      * @return true if the underlying API was available and the call was successful, false otherwise
      */
-    public static boolean startActivities(Context context, Intent[] intents, Bundle options) {
+    public static boolean startActivities(@NonNull Context context, @NonNull Intent[] intents,
+            @Nullable Bundle options) {
         if (Build.VERSION.SDK_INT >= 16) {
             context.startActivities(intents, options);
         } else {
@@ -136,7 +137,8 @@
      *                supplied here; there are no supported definitions for
      *                building it manually.
      */
-    public static void startActivity(Context context, Intent intent, @Nullable Bundle options) {
+    public static void startActivity(@NonNull Context context, @NonNull Intent intent,
+            @Nullable Bundle options) {
         if (Build.VERSION.SDK_INT >= 16) {
             context.startActivity(intent, options);
         } else {
@@ -159,7 +161,8 @@
      *
      * @see ApplicationInfo#dataDir
      */
-    public static File getDataDir(Context context) {
+    @Nullable
+    public static File getDataDir(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 24) {
             return context.getDataDir();
         } else {
@@ -211,7 +214,8 @@
      * @see Context#getObbDir()
      * @see EnvironmentCompat#getStorageState(File)
      */
-    public static File[] getObbDirs(Context context) {
+    @NonNull
+    public static File[] getObbDirs(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 19) {
             return context.getObbDirs();
         } else {
@@ -263,7 +267,8 @@
      * @see Context#getExternalFilesDir(String)
      * @see EnvironmentCompat#getStorageState(File)
      */
-    public static File[] getExternalFilesDirs(Context context, String type) {
+    @NonNull
+    public static File[] getExternalFilesDirs(@NonNull Context context, @Nullable String type) {
         if (Build.VERSION.SDK_INT >= 19) {
             return context.getExternalFilesDirs(type);
         } else {
@@ -315,7 +320,8 @@
      * @see Context#getExternalCacheDir()
      * @see EnvironmentCompat#getStorageState(File)
      */
-    public static File[] getExternalCacheDirs(Context context) {
+    @NonNull
+    public static File[] getExternalCacheDirs(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 19) {
             return context.getExternalCacheDirs();
         } else {
@@ -346,7 +352,8 @@
      *           The value 0 is an invalid identifier.
      * @return Drawable An object that can be used to draw this resource.
      */
-    public static final Drawable getDrawable(Context context, @DrawableRes int id) {
+    @Nullable
+    public static final Drawable getDrawable(@NonNull Context context, @DrawableRes int id) {
         if (Build.VERSION.SDK_INT >= 21) {
             return context.getDrawable(id);
         } else if (Build.VERSION.SDK_INT >= 16) {
@@ -382,7 +389,9 @@
      * @throws android.content.res.Resources.NotFoundException if the given ID
      *         does not exist.
      */
-    public static final ColorStateList getColorStateList(Context context, @ColorRes int id) {
+    @Nullable
+    public static final ColorStateList getColorStateList(@NonNull Context context,
+            @ColorRes int id) {
         if (Build.VERSION.SDK_INT >= 23) {
             return context.getColorStateList(id);
         } else {
@@ -404,7 +413,7 @@
      *         does not exist.
      */
     @ColorInt
-    public static final int getColor(Context context, @ColorRes int id) {
+    public static final int getColor(@NonNull Context context, @ColorRes int id) {
         if (Build.VERSION.SDK_INT >= 23) {
             return context.getColor(id);
         } else {
@@ -444,7 +453,8 @@
      *
      * @see android.content.Context#getFilesDir()
      */
-    public static final File getNoBackupFilesDir(Context context) {
+    @Nullable
+    public static final File getNoBackupFilesDir(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 21) {
             return context.getNoBackupFilesDir();
         } else {
@@ -468,7 +478,7 @@
      *
      * @return The path of the directory holding application code cache files.
      */
-    public static File getCodeCacheDir(Context context) {
+    public static File getCodeCacheDir(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 21) {
             return context.getCodeCacheDir();
         } else {
@@ -522,7 +532,8 @@
      *
      * @see ContextCompat#isDeviceProtectedStorage(Context)
      */
-    public static Context createDeviceProtectedStorageContext(Context context) {
+    @Nullable
+    public static Context createDeviceProtectedStorageContext(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 24) {
             return context.createDeviceProtectedStorageContext();
         } else {
@@ -536,7 +547,7 @@
      *
      * @see ContextCompat#createDeviceProtectedStorageContext(Context)
      */
-    public static boolean isDeviceProtectedStorage(Context context) {
+    public static boolean isDeviceProtectedStorage(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 24) {
             return context.isDeviceProtectedStorage();
         } else {
@@ -554,7 +565,7 @@
      * @see Context#startForegeroundService()
      * @see Context#startService()
      */
-    public static void startForegroundService(Context context, Intent intent) {
+    public static void startForegroundService(@NonNull Context context, @NonNull Intent intent) {
         if (Build.VERSION.SDK_INT >= 26) {
             context.startForegroundService(intent);
         } else {
diff --git a/compat/java/android/support/v4/content/IntentCompat.java b/compat/src/main/java/android/support/v4/content/IntentCompat.java
similarity index 94%
rename from compat/java/android/support/v4/content/IntentCompat.java
rename to compat/src/main/java/android/support/v4/content/IntentCompat.java
index 1a7295b..f5b3a0b 100644
--- a/compat/java/android/support/v4/content/IntentCompat.java
+++ b/compat/src/main/java/android/support/v4/content/IntentCompat.java
@@ -18,6 +18,7 @@
 
 import android.content.Intent;
 import android.os.Build;
+import android.support.annotation.NonNull;
 
 /**
  * Helper for accessing features in {@link android.content.Intent}.
@@ -69,8 +70,9 @@
      * @return Returns a newly created Intent that can be used to launch the
      * activity as a main application entry.
      */
-    public static Intent makeMainSelectorActivity(String selectorAction,
-            String selectorCategory) {
+    @NonNull
+    public static Intent makeMainSelectorActivity(@NonNull String selectorAction,
+            @NonNull String selectorCategory) {
         if (Build.VERSION.SDK_INT >= 15) {
             return Intent.makeMainSelectorActivity(selectorAction, selectorCategory);
         } else {
diff --git a/compat/java/android/support/v4/content/SharedPreferencesCompat.java b/compat/src/main/java/android/support/v4/content/SharedPreferencesCompat.java
similarity index 76%
rename from compat/java/android/support/v4/content/SharedPreferencesCompat.java
rename to compat/src/main/java/android/support/v4/content/SharedPreferencesCompat.java
index 7d51fed..1d43c2e 100644
--- a/compat/java/android/support/v4/content/SharedPreferencesCompat.java
+++ b/compat/src/main/java/android/support/v4/content/SharedPreferencesCompat.java
@@ -19,8 +19,18 @@
 import android.content.SharedPreferences;
 import android.support.annotation.NonNull;
 
+/**
+ * @deprecated This compatibility class is no longer required. Use {@link SharedPreferences}
+ * directly.
+ */
+@Deprecated
 public final class SharedPreferencesCompat {
 
+    /**
+     * @deprecated This compatibility class is no longer required. Use
+     * {@link SharedPreferences.Editor} directly.
+     */
+    @Deprecated
     public final static class EditorCompat {
 
         private static EditorCompat sInstance;
@@ -46,14 +56,22 @@
         private EditorCompat() {
             mHelper = new Helper();
         }
-
+        /**
+         * @deprecated This compatibility class is no longer required. Use
+         * {@link SharedPreferences.Editor} directly.
+         */
+        @Deprecated
         public static EditorCompat getInstance() {
             if (sInstance == null) {
                 sInstance = new EditorCompat();
             }
             return sInstance;
         }
-
+        /**
+         * @deprecated This compatibility method is no longer required. Use
+         * {@link SharedPreferences.Editor#apply()} directly.
+         */
+        @Deprecated
         public void apply(@NonNull SharedPreferences.Editor editor) {
             // Note that this redirection is needed to not break the public API chain
             // of getInstance().apply() calls. Otherwise this method could (and should)
diff --git a/compat/java/android/support/v4/content/package.html b/compat/src/main/java/android/support/v4/content/package.html
similarity index 100%
rename from compat/java/android/support/v4/content/package.html
rename to compat/src/main/java/android/support/v4/content/package.html
diff --git a/compat/java/android/support/v4/content/pm/ActivityInfoCompat.java b/compat/src/main/java/android/support/v4/content/pm/ActivityInfoCompat.java
similarity index 100%
rename from compat/java/android/support/v4/content/pm/ActivityInfoCompat.java
rename to compat/src/main/java/android/support/v4/content/pm/ActivityInfoCompat.java
diff --git a/compat/java/android/support/v4/content/pm/ShortcutInfoCompat.java b/compat/src/main/java/android/support/v4/content/pm/ShortcutInfoCompat.java
similarity index 100%
rename from compat/java/android/support/v4/content/pm/ShortcutInfoCompat.java
rename to compat/src/main/java/android/support/v4/content/pm/ShortcutInfoCompat.java
diff --git a/compat/java/android/support/v4/content/pm/ShortcutManagerCompat.java b/compat/src/main/java/android/support/v4/content/pm/ShortcutManagerCompat.java
similarity index 100%
rename from compat/java/android/support/v4/content/pm/ShortcutManagerCompat.java
rename to compat/src/main/java/android/support/v4/content/pm/ShortcutManagerCompat.java
diff --git a/compat/java/android/support/v4/content/pm/package.html b/compat/src/main/java/android/support/v4/content/pm/package.html
similarity index 100%
rename from compat/java/android/support/v4/content/pm/package.html
rename to compat/src/main/java/android/support/v4/content/pm/package.html
diff --git a/compat/java/android/support/v4/content/res/ConfigurationHelper.java b/compat/src/main/java/android/support/v4/content/res/ConfigurationHelper.java
similarity index 100%
rename from compat/java/android/support/v4/content/res/ConfigurationHelper.java
rename to compat/src/main/java/android/support/v4/content/res/ConfigurationHelper.java
diff --git a/compat/java/android/support/v4/content/res/FontResourcesParserCompat.java b/compat/src/main/java/android/support/v4/content/res/FontResourcesParserCompat.java
similarity index 92%
rename from compat/java/android/support/v4/content/res/FontResourcesParserCompat.java
rename to compat/src/main/java/android/support/v4/content/res/FontResourcesParserCompat.java
index 7fe86ad..8ad07d3 100644
--- a/compat/java/android/support/v4/content/res/FontResourcesParserCompat.java
+++ b/compat/src/main/java/android/support/v4/content/res/FontResourcesParserCompat.java
@@ -252,10 +252,19 @@
             throws XmlPullParserException, IOException {
         AttributeSet attrs = Xml.asAttributeSet(parser);
         TypedArray array = resources.obtainAttributes(attrs, R.styleable.FontFamilyFont);
-        int weight = array.getInt(R.styleable.FontFamilyFont_fontWeight, NORMAL_WEIGHT);
-        boolean isItalic = ITALIC == array.getInt(R.styleable.FontFamilyFont_fontStyle, 0);
-        int resourceId = array.getResourceId(R.styleable.FontFamilyFont_font, 0);
-        String filename = array.getString(R.styleable.FontFamilyFont_font);
+        final int weightAttr = array.hasValue(R.styleable.FontFamilyFont_fontWeight)
+                ? R.styleable.FontFamilyFont_fontWeight
+                : R.styleable.FontFamilyFont_android_fontWeight;
+        int weight = array.getInt(weightAttr, NORMAL_WEIGHT);
+        final int styleAttr = array.hasValue(R.styleable.FontFamilyFont_fontStyle)
+                ? R.styleable.FontFamilyFont_fontStyle
+                : R.styleable.FontFamilyFont_android_fontStyle;
+        boolean isItalic = ITALIC == array.getInt(styleAttr, 0);
+        final int resourceAttr = array.hasValue(R.styleable.FontFamilyFont_font)
+                ? R.styleable.FontFamilyFont_font
+                : R.styleable.FontFamilyFont_android_font;
+        int resourceId = array.getResourceId(resourceAttr, 0);
+        String filename = array.getString(resourceAttr);
         array.recycle();
         while (parser.next() != XmlPullParser.END_TAG) {
             skip(parser);
diff --git a/compat/src/main/java/android/support/v4/content/res/ResourcesCompat.java b/compat/src/main/java/android/support/v4/content/res/ResourcesCompat.java
new file mode 100644
index 0000000..15b8ce9
--- /dev/null
+++ b/compat/src/main/java/android/support/v4/content/res/ResourcesCompat.java
@@ -0,0 +1,417 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.content.res;
+
+import static android.os.Build.VERSION.SDK_INT;
+import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
+import android.content.res.Resources.Theme;
+import android.content.res.XmlResourceParser;
+import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.Looper;
+import android.support.annotation.ColorInt;
+import android.support.annotation.ColorRes;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.FontRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
+import android.support.v4.content.res.FontResourcesParserCompat.FamilyResourceEntry;
+import android.support.v4.graphics.TypefaceCompat;
+import android.support.v4.provider.FontsContractCompat.FontRequestCallback;
+import android.support.v4.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason;
+import android.support.v4.util.Preconditions;
+import android.util.Log;
+import android.util.TypedValue;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+/**
+ * Helper for accessing features in {@link android.content.res.Resources}.
+ */
+public final class ResourcesCompat {
+    private static final String TAG = "ResourcesCompat";
+
+    /**
+     * Return a drawable object associated with a particular resource ID and
+     * styled for the specified theme. Various types of objects will be
+     * returned depending on the underlying resource -- for example, a solid
+     * color, PNG image, scalable image, etc.
+     * <p>
+     * Prior to API level 21, the theme will not be applied and this method
+     * simply calls through to {@link Resources#getDrawable(int)}.
+     *
+     * @param id The desired resource identifier, as generated by the aapt
+     *           tool. This integer encodes the package, type, and resource
+     *           entry. The value 0 is an invalid identifier.
+     * @param theme The theme used to style the drawable attributes, may be
+     *              {@code null}.
+     * @return Drawable An object that can be used to draw this resource.
+     * @throws NotFoundException Throws NotFoundException if the given ID does
+     *         not exist.
+     */
+    @Nullable
+    @SuppressWarnings("deprecation")
+    public static Drawable getDrawable(@NonNull Resources res, @DrawableRes int id,
+            @Nullable Theme theme) throws NotFoundException {
+        if (SDK_INT >= 21) {
+            return res.getDrawable(id, theme);
+        } else {
+            return res.getDrawable(id);
+        }
+    }
+
+
+    /**
+     * Return a drawable object associated with a particular resource ID for
+     * the given screen density in DPI and styled for the specified theme.
+     * <p>
+     * Prior to API level 15, the theme and density will not be applied and
+     * this method simply calls through to {@link Resources#getDrawable(int)}.
+     * <p>
+     * Prior to API level 21, the theme will not be applied and this method
+     * calls through to Resources#getDrawableForDensity(int, int).
+     *
+     * @param id The desired resource identifier, as generated by the aapt
+     *           tool. This integer encodes the package, type, and resource
+     *           entry. The value 0 is an invalid identifier.
+     * @param density The desired screen density indicated by the resource as
+     *                found in {@link android.util.DisplayMetrics}.
+     * @param theme The theme used to style the drawable attributes, may be
+     *              {@code null}.
+     * @return Drawable An object that can be used to draw this resource.
+     * @throws NotFoundException Throws NotFoundException if the given ID does
+     *         not exist.
+     */
+    @Nullable
+    @SuppressWarnings("deprecation")
+    public static Drawable getDrawableForDensity(@NonNull Resources res, @DrawableRes int id,
+            int density, @Nullable Theme theme) throws NotFoundException {
+        if (SDK_INT >= 21) {
+            return res.getDrawableForDensity(id, density, theme);
+        } else if (SDK_INT >= 15) {
+            return res.getDrawableForDensity(id, density);
+        } else {
+            return res.getDrawable(id);
+        }
+    }
+
+    /**
+     * Returns a themed color integer associated with a particular resource ID.
+     * If the resource holds a complex {@link ColorStateList}, then the default
+     * color from the set is returned.
+     * <p>
+     * Prior to API level 23, the theme will not be applied and this method
+     * calls through to {@link Resources#getColor(int)}.
+     *
+     * @param id The desired resource identifier, as generated by the aapt
+     *           tool. This integer encodes the package, type, and resource
+     *           entry. The value 0 is an invalid identifier.
+     * @param theme The theme used to style the color attributes, may be
+     *              {@code null}.
+     * @return A single color value in the form {@code 0xAARRGGBB}.
+     * @throws NotFoundException Throws NotFoundException if the given ID does
+     *         not exist.
+     */
+    @ColorInt
+    @SuppressWarnings("deprecation")
+    public static int getColor(@NonNull Resources res, @ColorRes int id, @Nullable Theme theme)
+            throws NotFoundException {
+        if (SDK_INT >= 23) {
+            return res.getColor(id, theme);
+        } else {
+            return res.getColor(id);
+        }
+    }
+
+    /**
+     * Returns a themed color state list associated with a particular resource
+     * ID. The resource may contain either a single raw color value or a
+     * complex {@link ColorStateList} holding multiple possible colors.
+     * <p>
+     * Prior to API level 23, the theme will not be applied and this method
+     * calls through to {@link Resources#getColorStateList(int)}.
+     *
+     * @param id The desired resource identifier of a {@link ColorStateList},
+     *           as generated by the aapt tool. This integer encodes the
+     *           package, type, and resource entry. The value 0 is an invalid
+     *           identifier.
+     * @param theme The theme used to style the color attributes, may be
+     *              {@code null}.
+     * @return A themed ColorStateList object containing either a single solid
+     *         color or multiple colors that can be selected based on a state.
+     * @throws NotFoundException Throws NotFoundException if the given ID does
+     *         not exist.
+     */
+    @Nullable
+    @SuppressWarnings("deprecation")
+    public static ColorStateList getColorStateList(@NonNull Resources res, @ColorRes int id,
+            @Nullable Theme theme) throws NotFoundException {
+        if (SDK_INT >= 23) {
+            return res.getColorStateList(id, theme);
+        } else {
+            return res.getColorStateList(id);
+        }
+    }
+
+    /**
+     * Returns a font Typeface associated with a particular resource ID.
+     * <p>
+     * This method will block the calling thread to retrieve the requested font, including if it
+     * is from a font provider. If you wish to not have this behavior, use
+     * {@link #getFont(Context, int, FontCallback, Handler)} instead.
+     * <p>
+     * Prior to API level 23, font resources with more than one font in a family will only load the
+     * font closest to a regular weight typeface.
+     *
+     * @param context A context to retrieve the Resources from.
+     * @param id The desired resource identifier of a {@link Typeface},
+     *           as generated by the aapt tool. This integer encodes the
+     *           package, type, and resource entry. The value 0 is an invalid
+     *           identifier.
+     * @return A font Typeface object.
+     * @throws NotFoundException Throws NotFoundException if the given ID does not exist.
+     *
+     * @see #getFont(Context, int, FontCallback, Handler)
+     */
+    @Nullable
+    public static Typeface getFont(@NonNull Context context, @FontRes int id)
+            throws NotFoundException {
+        if (context.isRestricted()) {
+            return null;
+        }
+        return loadFont(context, id, new TypedValue(), Typeface.NORMAL, null /* callback */,
+                null /* handler */, false /* isXmlRequest */);
+    }
+
+    /**
+     * Interface used to receive asynchronous font fetching events.
+     */
+    public abstract static class FontCallback {
+
+        /**
+         * Called when an asynchronous font was finished loading.
+         *
+         * @param typeface The font that was loaded.
+         */
+        public abstract void onFontRetrieved(@NonNull Typeface typeface);
+
+        /**
+         * Called when an asynchronous font failed to load.
+         *
+         * @param reason The reason the font failed to load. One of
+         *      {@link FontRequestFailReason#FAIL_REASON_PROVIDER_NOT_FOUND},
+         *      {@link FontRequestFailReason#FAIL_REASON_WRONG_CERTIFICATES},
+         *      {@link FontRequestFailReason#FAIL_REASON_FONT_LOAD_ERROR},
+         *      {@link FontRequestFailReason#FAIL_REASON_SECURITY_VIOLATION},
+         *      {@link FontRequestFailReason#FAIL_REASON_FONT_NOT_FOUND},
+         *      {@link FontRequestFailReason#FAIL_REASON_FONT_UNAVAILABLE} or
+         *      {@link FontRequestFailReason#FAIL_REASON_MALFORMED_QUERY}.
+         */
+        public abstract void onFontRetrievalFailed(@FontRequestFailReason int reason);
+
+        /**
+         * Call {@link #onFontRetrieved(Typeface)} on the handler given, or the Ui Thread if it is
+         * null.
+         * @hide
+         */
+        @RestrictTo(LIBRARY_GROUP)
+        public final void callbackSuccessAsync(final Typeface typeface, @Nullable Handler handler) {
+            if (handler == null) {
+                handler = new Handler(Looper.getMainLooper());
+            }
+            handler.post(new Runnable() {
+                @Override
+                public void run() {
+                    onFontRetrieved(typeface);
+                }
+            });
+        }
+
+        /**
+         * Call {@link #onFontRetrievalFailed(int)} on the handler given, or the Ui Thread if it is
+         * null.
+         * @hide
+         */
+        @RestrictTo(LIBRARY_GROUP)
+        public final void callbackFailAsync(
+                @FontRequestFailReason final int reason, @Nullable Handler handler) {
+            if (handler == null) {
+                handler = new Handler(Looper.getMainLooper());
+            }
+            handler.post(new Runnable() {
+                @Override
+                public void run() {
+                    onFontRetrievalFailed(reason);
+                }
+            });
+        }
+    }
+
+    /**
+     * Returns a font Typeface associated with a particular resource ID asynchronously.
+     * <p>
+     * Prior to API level 23, font resources with more than one font in a family will only load the
+     * font closest to a regular weight typeface.
+     * </p>
+     *
+     * @param context A context to retrieve the Resources from.
+     * @param id The desired resource identifier of a {@link Typeface}, as generated by the aapt
+     *           tool. This integer encodes the package, type, and resource entry. The value 0 is an
+     *           invalid identifier.
+     * @param fontCallback A callback to receive async fetching of this font. The callback will be
+     *           triggered on the UI thread.
+     * @param handler A handler for the thread the callback should be called on. If null, the
+     *           callback will be called on the UI thread.
+     * @throws NotFoundException Throws NotFoundException if the given ID does not exist.
+     */
+    public static void getFont(@NonNull Context context, @FontRes int id,
+            @NonNull FontCallback fontCallback, @Nullable Handler handler)
+            throws NotFoundException {
+        Preconditions.checkNotNull(fontCallback);
+        if (context.isRestricted()) {
+            fontCallback.callbackFailAsync(
+                    FontRequestCallback.FAIL_REASON_SECURITY_VIOLATION, handler);
+            return;
+        }
+        loadFont(context, id, new TypedValue(), Typeface.NORMAL, fontCallback, handler,
+                false /* isXmlRequest */);
+    }
+
+    /**
+     * Used by TintTypedArray.
+     *
+     * @hide
+     */
+    @RestrictTo(LIBRARY_GROUP)
+    public static Typeface getFont(@NonNull Context context, @FontRes int id, TypedValue value,
+            int style, @Nullable FontCallback fontCallback) throws NotFoundException {
+        if (context.isRestricted()) {
+            return null;
+        }
+        return loadFont(context, id, value, style, fontCallback, null /* handler */,
+                true /* isXmlRequest */);
+    }
+
+    /**
+     *
+     * @param context The Context to get Resources from
+     * @param id The Resource id to load
+     * @param value A TypedValue to use in the fetching
+     * @param style The font style to load
+     * @param fontCallback A callback to trigger when the font is fetched or an error occurs
+     * @param handler A handler to the thread the callback should be called on
+     * @param isRequestFromLayoutInflator Whether this request originated from XML. This is used to
+     *                     determine if we use or ignore the fontProviderFetchStrategy attribute in
+     *                     font provider XML fonts.
+     * @return
+     */
+    private static Typeface loadFont(@NonNull Context context, int id, TypedValue value,
+            int style, @Nullable FontCallback fontCallback, @Nullable Handler handler,
+            boolean isRequestFromLayoutInflator) {
+        final Resources resources = context.getResources();
+        resources.getValue(id, value, true);
+        Typeface typeface = loadFont(context, resources, value, id, style, fontCallback, handler,
+                isRequestFromLayoutInflator);
+        if (typeface == null && fontCallback == null) {
+            throw new NotFoundException("Font resource ID #0x"
+                    + Integer.toHexString(id) + " could not be retrieved.");
+        }
+        return typeface;
+    }
+
+    /**
+     * Load the given font. This method will always return null for asynchronous requests, which
+     * provide a fontCallback, as there is no immediate result. When the callback is not provided,
+     * the request is treated as synchronous and fails if async loading is required.
+     */
+    private static Typeface loadFont(
+            @NonNull Context context, Resources wrapper, TypedValue value, int id, int style,
+            @Nullable FontCallback fontCallback, @Nullable Handler handler,
+            boolean isRequestFromLayoutInflator) {
+        if (value.string == null) {
+            throw new NotFoundException("Resource \"" + wrapper.getResourceName(id) + "\" ("
+                    + Integer.toHexString(id) + ") is not a Font: " + value);
+        }
+
+        final String file = value.string.toString();
+        if (!file.startsWith("res/")) {
+            // Early exit if the specified string is unlikely to be a resource path.
+            if (fontCallback != null) {
+                fontCallback.callbackFailAsync(
+                        FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR, handler);
+            }
+            return null;
+        }
+        Typeface typeface = TypefaceCompat.findFromCache(wrapper, id, style);
+
+        if (typeface != null) {
+            if (fontCallback != null) {
+                fontCallback.callbackSuccessAsync(typeface, handler);
+            }
+            return typeface;
+        }
+
+        try {
+            if (file.toLowerCase().endsWith(".xml")) {
+                final XmlResourceParser rp = wrapper.getXml(id);
+                final FamilyResourceEntry familyEntry =
+                        FontResourcesParserCompat.parse(rp, wrapper);
+                if (familyEntry == null) {
+                    Log.e(TAG, "Failed to find font-family tag");
+                    if (fontCallback != null) {
+                        fontCallback.callbackFailAsync(
+                                FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR, handler);
+                    }
+                    return null;
+                }
+                return TypefaceCompat.createFromResourcesFamilyXml(context, familyEntry, wrapper,
+                        id, style, fontCallback, handler, isRequestFromLayoutInflator);
+            }
+            typeface = TypefaceCompat.createFromResourcesFontFile(
+                    context, wrapper, id, file, style);
+            if (fontCallback != null) {
+                if (typeface != null) {
+                    fontCallback.callbackSuccessAsync(typeface, handler);
+                } else {
+                    fontCallback.callbackFailAsync(
+                            FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR, handler);
+                }
+            }
+            return typeface;
+        } catch (XmlPullParserException e) {
+            Log.e(TAG, "Failed to parse xml resource " + file, e);
+        } catch (IOException e) {
+            Log.e(TAG, "Failed to read xml resource " + file, e);
+        }
+        if (fontCallback != null) {
+            fontCallback.callbackFailAsync(
+                    FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR, handler);
+        }
+        return null;
+    }
+
+    private ResourcesCompat() {}
+}
diff --git a/compat/java/android/support/v4/content/res/TypedArrayUtils.java b/compat/src/main/java/android/support/v4/content/res/TypedArrayUtils.java
similarity index 86%
rename from compat/java/android/support/v4/content/res/TypedArrayUtils.java
rename to compat/src/main/java/android/support/v4/content/res/TypedArrayUtils.java
index e4d6b29..64cb981 100644
--- a/compat/java/android/support/v4/content/res/TypedArrayUtils.java
+++ b/compat/src/main/java/android/support/v4/content/res/TypedArrayUtils.java
@@ -24,6 +24,7 @@
 import android.support.annotation.AnyRes;
 import android.support.annotation.ColorInt;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 import android.support.annotation.StyleableRes;
 import android.util.AttributeSet;
@@ -80,7 +81,7 @@
      * {@code defaultValue} if it does not exist.
      */
     public static boolean getNamedBoolean(@NonNull TypedArray a, @NonNull XmlPullParser parser,
-            String attrName, @StyleableRes int resId, boolean defaultValue) {
+            @NonNull String attrName, @StyleableRes int resId, boolean defaultValue) {
         final boolean hasAttr = hasAttribute(parser, attrName);
         if (!hasAttr) {
             return defaultValue;
@@ -97,7 +98,7 @@
      * {@code defaultValue} if it does not exist.
      */
     public static int getNamedInt(@NonNull TypedArray a, @NonNull XmlPullParser parser,
-            String attrName, @StyleableRes int resId, int defaultValue) {
+            @NonNull String attrName, @StyleableRes int resId, int defaultValue) {
         final boolean hasAttr = hasAttribute(parser, attrName);
         if (!hasAttr) {
             return defaultValue;
@@ -115,7 +116,7 @@
      */
     @ColorInt
     public static int getNamedColor(@NonNull TypedArray a, @NonNull XmlPullParser parser,
-            String attrName, @StyleableRes int resId, @ColorInt int defaultValue) {
+            @NonNull String attrName, @StyleableRes int resId, @ColorInt int defaultValue) {
         final boolean hasAttr = hasAttribute(parser, attrName);
         if (!hasAttr) {
             return defaultValue;
@@ -133,7 +134,7 @@
      */
     @AnyRes
     public static int getNamedResourceId(@NonNull TypedArray a, @NonNull XmlPullParser parser,
-            String attrName, @StyleableRes int resId, @AnyRes int defaultValue) {
+            @NonNull String attrName, @StyleableRes int resId, @AnyRes int defaultValue) {
         final boolean hasAttr = hasAttribute(parser, attrName);
         if (!hasAttr) {
             return defaultValue;
@@ -149,8 +150,9 @@
      * @return a string value in the {@link TypedArray} with the specified {@code resId}, or
      * null if it does not exist.
      */
+    @Nullable
     public static String getNamedString(@NonNull TypedArray a, @NonNull XmlPullParser parser,
-            String attrName, @StyleableRes int resId) {
+            @NonNull String attrName, @StyleableRes int resId) {
         final boolean hasAttr = hasAttribute(parser, attrName);
         if (!hasAttr) {
             return null;
@@ -164,8 +166,9 @@
      * and return a temporary object holding its data.  This object is only
      * valid until the next call on to {@link TypedArray}.
      */
-    public static TypedValue peekNamedValue(TypedArray a, XmlPullParser parser, String attrName,
-            int resId) {
+    @Nullable
+    public static TypedValue peekNamedValue(@NonNull TypedArray a, @NonNull XmlPullParser parser,
+            @NonNull String attrName, int resId) {
         final boolean hasAttr = hasAttribute(parser, attrName);
         if (!hasAttr) {
             return null;
@@ -178,8 +181,9 @@
      * Obtains styled attributes from the theme, if available, or unstyled
      * resources if the theme is null.
      */
-    public static TypedArray obtainAttributes(
-            Resources res, Resources.Theme theme, AttributeSet set, int[] attrs) {
+    @NonNull
+    public static TypedArray obtainAttributes(@NonNull Resources res,
+            @Nullable Resources.Theme theme, @NonNull AttributeSet set, @NonNull int[] attrs) {
         if (theme == null) {
             return res.obtainAttributes(set, attrs);
         }
@@ -190,7 +194,7 @@
      * @return a boolean value of {@code index}. If it does not exist, a boolean value of
      * {@code fallbackIndex}. If it still does not exist, {@code defaultValue}.
      */
-    public static boolean getBoolean(TypedArray a, @StyleableRes int index,
+    public static boolean getBoolean(@NonNull TypedArray a, @StyleableRes int index,
             @StyleableRes int fallbackIndex, boolean defaultValue) {
         boolean val = a.getBoolean(fallbackIndex, defaultValue);
         return a.getBoolean(index, val);
@@ -200,7 +204,8 @@
      * @return a drawable value of {@code index}. If it does not exist, a drawable value of
      * {@code fallbackIndex}. If it still does not exist, {@code null}.
      */
-    public static Drawable getDrawable(TypedArray a, @StyleableRes int index,
+    @Nullable
+    public static Drawable getDrawable(@NonNull TypedArray a, @StyleableRes int index,
             @StyleableRes int fallbackIndex) {
         Drawable val = a.getDrawable(index);
         if (val == null) {
@@ -213,7 +218,7 @@
      * @return an int value of {@code index}. If it does not exist, an int value of
      * {@code fallbackIndex}. If it still does not exist, {@code defaultValue}.
      */
-    public static int getInt(TypedArray a, @StyleableRes int index,
+    public static int getInt(@NonNull TypedArray a, @StyleableRes int index,
             @StyleableRes int fallbackIndex, int defaultValue) {
         int val = a.getInt(fallbackIndex, defaultValue);
         return a.getInt(index, val);
@@ -224,7 +229,7 @@
      * {@code fallbackIndex}. If it still does not exist, {@code defaultValue}.
      */
     @AnyRes
-    public static int getResourceId(TypedArray a, @StyleableRes int index,
+    public static int getResourceId(@NonNull TypedArray a, @StyleableRes int index,
             @StyleableRes int fallbackIndex, @AnyRes int defaultValue) {
         int val = a.getResourceId(fallbackIndex, defaultValue);
         return a.getResourceId(index, val);
@@ -234,7 +239,8 @@
      * @return a string value of {@code index}. If it does not exist, a string value of
      * {@code fallbackIndex}. If it still does not exist, {@code null}.
      */
-    public static String getString(TypedArray a, @StyleableRes int index,
+    @Nullable
+    public static String getString(@NonNull TypedArray a, @StyleableRes int index,
             @StyleableRes int fallbackIndex) {
         String val = a.getString(index);
         if (val == null) {
@@ -249,7 +255,8 @@
      * @return a text value of {@code index}. If it does not exist, a text value of
      * {@code fallbackIndex}. If it still does not exist, {@code null}.
      */
-    public static CharSequence getText(TypedArray a, @StyleableRes int index,
+    @Nullable
+    public static CharSequence getText(@NonNull TypedArray a, @StyleableRes int index,
             @StyleableRes int fallbackIndex) {
         CharSequence val = a.getText(index);
         if (val == null) {
@@ -264,7 +271,8 @@
      * @return a string array value of {@code index}. If it does not exist, a string array value
      * of {@code fallbackIndex}. If it still does not exist, {@code null}.
      */
-    public static CharSequence[] getTextArray(TypedArray a, @StyleableRes int index,
+    @Nullable
+    public static CharSequence[] getTextArray(@NonNull TypedArray a, @StyleableRes int index,
             @StyleableRes int fallbackIndex) {
         CharSequence[] val = a.getTextArray(index);
         if (val == null) {
@@ -277,7 +285,7 @@
      * @return The resource ID value in the {@code context} specified by {@code attr}. If it does
      * not exist, {@code fallbackAttr}.
      */
-    public static int getAttr(Context context, int attr, int fallbackAttr) {
+    public static int getAttr(@NonNull Context context, int attr, int fallbackAttr) {
         TypedValue value = new TypedValue();
         context.getTheme().resolveAttribute(attr, value, true);
         if (value.resourceId != 0) {
diff --git a/compat/java/android/support/v4/database/DatabaseUtilsCompat.java b/compat/src/main/java/android/support/v4/database/DatabaseUtilsCompat.java
similarity index 100%
rename from compat/java/android/support/v4/database/DatabaseUtilsCompat.java
rename to compat/src/main/java/android/support/v4/database/DatabaseUtilsCompat.java
diff --git a/compat/java/android/support/v4/database/package.html b/compat/src/main/java/android/support/v4/database/package.html
similarity index 100%
rename from compat/java/android/support/v4/database/package.html
rename to compat/src/main/java/android/support/v4/database/package.html
diff --git a/compat/java/android/support/v4/graphics/BitmapCompat.java b/compat/src/main/java/android/support/v4/graphics/BitmapCompat.java
similarity index 90%
rename from compat/java/android/support/v4/graphics/BitmapCompat.java
rename to compat/src/main/java/android/support/v4/graphics/BitmapCompat.java
index 20caf80..acc37b1 100644
--- a/compat/java/android/support/v4/graphics/BitmapCompat.java
+++ b/compat/src/main/java/android/support/v4/graphics/BitmapCompat.java
@@ -17,6 +17,7 @@
 
 import android.graphics.Bitmap;
 import android.os.Build;
+import android.support.annotation.NonNull;
 import android.support.annotation.RequiresApi;
 
 /**
@@ -71,11 +72,11 @@
         }
     }
 
-    public static boolean hasMipMap(Bitmap bitmap) {
+    public static boolean hasMipMap(@NonNull Bitmap bitmap) {
         return IMPL.hasMipMap(bitmap);
     }
 
-    public static void setHasMipMap(Bitmap bitmap, boolean hasMipMap) {
+    public static void setHasMipMap(@NonNull Bitmap bitmap, boolean hasMipMap) {
         IMPL.setHasMipMap(bitmap, hasMipMap);
     }
 
@@ -86,7 +87,7 @@
      * @param bitmap the bitmap in which to return its allocation size
      * @return the allocation size in bytes
      */
-    public static int getAllocationByteCount(Bitmap bitmap) {
+    public static int getAllocationByteCount(@NonNull Bitmap bitmap) {
         return IMPL.getAllocationByteCount(bitmap);
     }
 
diff --git a/compat/java/android/support/v4/graphics/PaintCompat.java b/compat/src/main/java/android/support/v4/graphics/PaintCompat.java
similarity index 100%
rename from compat/java/android/support/v4/graphics/PaintCompat.java
rename to compat/src/main/java/android/support/v4/graphics/PaintCompat.java
diff --git a/compat/java/android/support/v4/graphics/PathParser.java b/compat/src/main/java/android/support/v4/graphics/PathParser.java
similarity index 100%
rename from compat/java/android/support/v4/graphics/PathParser.java
rename to compat/src/main/java/android/support/v4/graphics/PathParser.java
diff --git a/compat/java/android/support/v4/graphics/TypefaceCompat.java b/compat/src/main/java/android/support/v4/graphics/TypefaceCompat.java
similarity index 73%
rename from compat/java/android/support/v4/graphics/TypefaceCompat.java
rename to compat/src/main/java/android/support/v4/graphics/TypefaceCompat.java
index 6d114b6..3c55df6 100644
--- a/compat/java/android/support/v4/graphics/TypefaceCompat.java
+++ b/compat/src/main/java/android/support/v4/graphics/TypefaceCompat.java
@@ -23,16 +23,18 @@
 import android.graphics.Typeface;
 import android.os.Build;
 import android.os.CancellationSignal;
+import android.os.Handler;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
+import android.support.v4.content.res.FontResourcesParserCompat;
 import android.support.v4.content.res.FontResourcesParserCompat.FamilyResourceEntry;
 import android.support.v4.content.res.FontResourcesParserCompat.FontFamilyFilesResourceEntry;
 import android.support.v4.content.res.FontResourcesParserCompat.ProviderResourceEntry;
+import android.support.v4.content.res.ResourcesCompat;
 import android.support.v4.provider.FontsContractCompat;
 import android.support.v4.provider.FontsContractCompat.FontInfo;
 import android.support.v4.util.LruCache;
-import android.widget.TextView;
 
 /**
  * Helper for accessing features in {@link Typeface}.
@@ -82,7 +84,8 @@
      *
      * @return null if not found.
      */
-    public static Typeface findFromCache(Resources resources, int id, int style) {
+    @Nullable
+    public static Typeface findFromCache(@NonNull Resources resources, int id, int style) {
         return sTypefaceCache.get(createResourceUid(resources, id, style));
     }
 
@@ -103,18 +106,35 @@
      *
      * @return null if failed to create.
      */
+    @Nullable
     public static Typeface createFromResourcesFamilyXml(
-            Context context, FamilyResourceEntry entry, Resources resources, int id, int style,
-            @Nullable TextView targetView) {
+            @NonNull Context context, @NonNull FamilyResourceEntry entry,
+            @NonNull Resources resources, int id, int style,
+            @Nullable ResourcesCompat.FontCallback fontCallback, @Nullable Handler handler,
+            boolean isRequestFromLayoutInflator) {
         Typeface typeface;
         if (entry instanceof ProviderResourceEntry) {
             ProviderResourceEntry providerEntry = (ProviderResourceEntry) entry;
-            typeface = FontsContractCompat.getFontSync(context,
-                    providerEntry.getRequest(), targetView, providerEntry.getFetchStrategy(),
-                    providerEntry.getTimeout(), style);
+            final boolean isBlocking = isRequestFromLayoutInflator
+                    ? providerEntry.getFetchStrategy()
+                    == FontResourcesParserCompat.FETCH_STRATEGY_BLOCKING
+                    : fontCallback == null;
+            final int timeout = isRequestFromLayoutInflator ? providerEntry.getTimeout()
+                    : FontResourcesParserCompat.INFINITE_TIMEOUT_VALUE;
+            typeface = FontsContractCompat.getFontSync(context, providerEntry.getRequest(),
+                    fontCallback, handler, isBlocking, timeout, style);
         } else {
             typeface = sTypefaceCompatImpl.createFromFontFamilyFilesResourceEntry(
                     context, (FontFamilyFilesResourceEntry) entry, resources, style);
+            if (fontCallback != null) {
+                if (typeface != null) {
+                    fontCallback.callbackSuccessAsync(typeface, handler);
+                } else {
+                    fontCallback.callbackFailAsync(
+                            FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR,
+                            handler);
+                }
+            }
         }
         if (typeface != null) {
             sTypefaceCache.put(createResourceUid(resources, id, style), typeface);
@@ -127,11 +147,13 @@
      */
     @Nullable
     public static Typeface createFromResourcesFontFile(
-            Context context, Resources resources, int id, String path, int style) {
+            @NonNull Context context, @NonNull Resources resources, int id, String path,
+            int style) {
         Typeface typeface = sTypefaceCompatImpl.createFromResourcesFontFile(
                 context, resources, id, path, style);
         if (typeface != null) {
-            sTypefaceCache.put(createResourceUid(resources, id, style), typeface);
+            final String resourceUid = createResourceUid(resources, id, style);
+            sTypefaceCache.put(resourceUid, typeface);
         }
         return typeface;
     }
@@ -139,7 +161,8 @@
     /**
      * Create a Typeface from a given FontInfo list and a map that matches them to ByteBuffers.
      */
-    public static Typeface createFromFontInfo(Context context,
+    @Nullable
+    public static Typeface createFromFontInfo(@NonNull Context context,
             @Nullable CancellationSignal cancellationSignal, @NonNull FontInfo[] fonts, int style) {
         return sTypefaceCompatImpl.createFromFontInfo(context, cancellationSignal, fonts, style);
     }
diff --git a/compat/java/android/support/v4/graphics/TypefaceCompatApi21Impl.java b/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi21Impl.java
similarity index 100%
rename from compat/java/android/support/v4/graphics/TypefaceCompatApi21Impl.java
rename to compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi21Impl.java
diff --git a/compat/java/android/support/v4/graphics/TypefaceCompatApi24Impl.java b/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi24Impl.java
similarity index 97%
rename from compat/java/android/support/v4/graphics/TypefaceCompatApi24Impl.java
rename to compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi24Impl.java
index a107859..89a6ec4 100644
--- a/compat/java/android/support/v4/graphics/TypefaceCompatApi24Impl.java
+++ b/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi24Impl.java
@@ -145,7 +145,8 @@
                 return null;
             }
         }
-        return createFromFamiliesWithDefault(family);
+        final Typeface typeface = createFromFamiliesWithDefault(family);
+        return Typeface.create(typeface, style);
     }
 
     @Override
diff --git a/compat/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java b/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java
similarity index 98%
rename from compat/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java
rename to compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java
index c7066c8..1b55a2e 100644
--- a/compat/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java
+++ b/compat/src/main/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java
@@ -118,7 +118,7 @@
      */
     private static boolean isFontFamilyPrivateAPIAvailable() {
         if (sAddFontFromAssetManager == null) {
-            Log.w(TAG, "Unable to collect necessary private methods."
+            Log.w(TAG, "Unable to collect necessary private methods. "
                     + "Fallback to legacy implementation.");
         }
         return sAddFontFromAssetManager != null;
@@ -273,7 +273,8 @@
         if (!freeze(fontFamily)) {
             return null;
         }
-        return createFromFamiliesWithDefault(fontFamily);
+        final Typeface typeface = createFromFamiliesWithDefault(fontFamily);
+        return Typeface.create(typeface, style);
     }
 
     /**
diff --git a/compat/java/android/support/v4/graphics/TypefaceCompatBaseImpl.java b/compat/src/main/java/android/support/v4/graphics/TypefaceCompatBaseImpl.java
similarity index 100%
rename from compat/java/android/support/v4/graphics/TypefaceCompatBaseImpl.java
rename to compat/src/main/java/android/support/v4/graphics/TypefaceCompatBaseImpl.java
diff --git a/compat/java/android/support/v4/graphics/TypefaceCompatUtil.java b/compat/src/main/java/android/support/v4/graphics/TypefaceCompatUtil.java
similarity index 100%
rename from compat/java/android/support/v4/graphics/TypefaceCompatUtil.java
rename to compat/src/main/java/android/support/v4/graphics/TypefaceCompatUtil.java
diff --git a/compat/java/android/support/v4/graphics/drawable/DrawableCompat.java b/compat/src/main/java/android/support/v4/graphics/drawable/DrawableCompat.java
similarity index 100%
rename from compat/java/android/support/v4/graphics/drawable/DrawableCompat.java
rename to compat/src/main/java/android/support/v4/graphics/drawable/DrawableCompat.java
diff --git a/compat/java/android/support/v4/graphics/drawable/DrawableWrapper.java b/compat/src/main/java/android/support/v4/graphics/drawable/DrawableWrapper.java
similarity index 100%
rename from compat/java/android/support/v4/graphics/drawable/DrawableWrapper.java
rename to compat/src/main/java/android/support/v4/graphics/drawable/DrawableWrapper.java
diff --git a/compat/java/android/support/v4/graphics/drawable/DrawableWrapperApi14.java b/compat/src/main/java/android/support/v4/graphics/drawable/DrawableWrapperApi14.java
similarity index 100%
rename from compat/java/android/support/v4/graphics/drawable/DrawableWrapperApi14.java
rename to compat/src/main/java/android/support/v4/graphics/drawable/DrawableWrapperApi14.java
diff --git a/compat/java/android/support/v4/graphics/drawable/DrawableWrapperApi19.java b/compat/src/main/java/android/support/v4/graphics/drawable/DrawableWrapperApi19.java
similarity index 100%
rename from compat/java/android/support/v4/graphics/drawable/DrawableWrapperApi19.java
rename to compat/src/main/java/android/support/v4/graphics/drawable/DrawableWrapperApi19.java
diff --git a/compat/java/android/support/v4/graphics/drawable/DrawableWrapperApi21.java b/compat/src/main/java/android/support/v4/graphics/drawable/DrawableWrapperApi21.java
similarity index 100%
rename from compat/java/android/support/v4/graphics/drawable/DrawableWrapperApi21.java
rename to compat/src/main/java/android/support/v4/graphics/drawable/DrawableWrapperApi21.java
diff --git a/compat/java/android/support/v4/graphics/drawable/IconCompat.java b/compat/src/main/java/android/support/v4/graphics/drawable/IconCompat.java
similarity index 100%
rename from compat/java/android/support/v4/graphics/drawable/IconCompat.java
rename to compat/src/main/java/android/support/v4/graphics/drawable/IconCompat.java
diff --git a/compat/java/android/support/v4/graphics/drawable/TintAwareDrawable.java b/compat/src/main/java/android/support/v4/graphics/drawable/TintAwareDrawable.java
similarity index 100%
rename from compat/java/android/support/v4/graphics/drawable/TintAwareDrawable.java
rename to compat/src/main/java/android/support/v4/graphics/drawable/TintAwareDrawable.java
diff --git a/compat/java/android/support/v4/hardware/display/DisplayManagerCompat.java b/compat/src/main/java/android/support/v4/hardware/display/DisplayManagerCompat.java
similarity index 95%
rename from compat/java/android/support/v4/hardware/display/DisplayManagerCompat.java
rename to compat/src/main/java/android/support/v4/hardware/display/DisplayManagerCompat.java
index 50d246b..22d39ac 100644
--- a/compat/java/android/support/v4/hardware/display/DisplayManagerCompat.java
+++ b/compat/src/main/java/android/support/v4/hardware/display/DisplayManagerCompat.java
@@ -19,6 +19,8 @@
 import android.content.Context;
 import android.hardware.display.DisplayManager;
 import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
 import android.view.Display;
 import android.view.WindowManager;
@@ -52,7 +54,8 @@
     /**
      * Gets an instance of the display manager given the context.
      */
-    public static DisplayManagerCompat getInstance(Context context) {
+    @NonNull
+    public static DisplayManagerCompat getInstance(@NonNull Context context) {
         synchronized (sInstances) {
             DisplayManagerCompat instance = sInstances.get(context);
             if (instance == null) {
@@ -76,6 +79,7 @@
      * @param displayId The logical display id.
      * @return The display object, or null if there is no valid display with the given id.
      */
+    @Nullable
     public abstract Display getDisplay(int displayId);
 
     /**
@@ -83,6 +87,7 @@
      *
      * @return An array containing all displays.
      */
+    @NonNull
     public abstract Display[] getDisplays();
 
     /**
@@ -101,6 +106,7 @@
      *
      * @see #DISPLAY_CATEGORY_PRESENTATION
      */
+    @NonNull
     public abstract Display[] getDisplays(String category);
 
     private static class DisplayManagerCompatApi14Impl extends DisplayManagerCompat {
diff --git a/compat/java/android/support/v4/hardware/fingerprint/FingerprintManagerCompat.java b/compat/src/main/java/android/support/v4/hardware/fingerprint/FingerprintManagerCompat.java
similarity index 96%
rename from compat/java/android/support/v4/hardware/fingerprint/FingerprintManagerCompat.java
rename to compat/src/main/java/android/support/v4/hardware/fingerprint/FingerprintManagerCompat.java
index 5e23c68..68f9476 100644
--- a/compat/java/android/support/v4/hardware/fingerprint/FingerprintManagerCompat.java
+++ b/compat/src/main/java/android/support/v4/hardware/fingerprint/FingerprintManagerCompat.java
@@ -44,7 +44,8 @@
     private final Context mContext;
 
     /** Get a {@link FingerprintManagerCompat} instance for a provided context. */
-    public static FingerprintManagerCompat from(Context context) {
+    @NonNull
+    public static FingerprintManagerCompat from(@NonNull Context context) {
         return new FingerprintManagerCompat(context);
     }
 
@@ -119,8 +120,9 @@
         }
     }
 
+    @Nullable
     @RequiresApi(23)
-    private static FingerprintManager getFingerprintManagerOrNull(Context context) {
+    private static FingerprintManager getFingerprintManagerOrNull(@NonNull Context context) {
         if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
             return context.getSystemService(FingerprintManager.class);
         } else {
@@ -195,20 +197,20 @@
         private final Cipher mCipher;
         private final Mac mMac;
 
-        public CryptoObject(Signature signature) {
+        public CryptoObject(@NonNull Signature signature) {
             mSignature = signature;
             mCipher = null;
             mMac = null;
 
         }
 
-        public CryptoObject(Cipher cipher) {
+        public CryptoObject(@NonNull Cipher cipher) {
             mCipher = cipher;
             mSignature = null;
             mMac = null;
         }
 
-        public CryptoObject(Mac mac) {
+        public CryptoObject(@NonNull Mac mac) {
             mMac = mac;
             mCipher = null;
             mSignature = null;
@@ -218,18 +220,21 @@
          * Get {@link Signature} object.
          * @return {@link Signature} object or null if this doesn't contain one.
          */
+        @Nullable
         public Signature getSignature() { return mSignature; }
 
         /**
          * Get {@link Cipher} object.
          * @return {@link Cipher} object or null if this doesn't contain one.
          */
+        @Nullable
         public Cipher getCipher() { return mCipher; }
 
         /**
          * Get {@link Mac} object.
          * @return {@link Mac} object or null if this doesn't contain one.
          */
+        @Nullable
         public Mac getMac() { return mMac; }
     }
 
diff --git a/compat/java/android/support/v4/internal/package-info.java b/compat/src/main/java/android/support/v4/internal/package-info.java
similarity index 100%
rename from compat/java/android/support/v4/internal/package-info.java
rename to compat/src/main/java/android/support/v4/internal/package-info.java
diff --git a/compat/java/android/support/v4/internal/view/SupportMenu.java b/compat/src/main/java/android/support/v4/internal/view/SupportMenu.java
similarity index 100%
rename from compat/java/android/support/v4/internal/view/SupportMenu.java
rename to compat/src/main/java/android/support/v4/internal/view/SupportMenu.java
diff --git a/compat/java/android/support/v4/internal/view/SupportMenuItem.java b/compat/src/main/java/android/support/v4/internal/view/SupportMenuItem.java
similarity index 100%
rename from compat/java/android/support/v4/internal/view/SupportMenuItem.java
rename to compat/src/main/java/android/support/v4/internal/view/SupportMenuItem.java
diff --git a/compat/java/android/support/v4/internal/view/SupportSubMenu.java b/compat/src/main/java/android/support/v4/internal/view/SupportSubMenu.java
similarity index 100%
rename from compat/java/android/support/v4/internal/view/SupportSubMenu.java
rename to compat/src/main/java/android/support/v4/internal/view/SupportSubMenu.java
diff --git a/compat/java/android/support/v4/net/ConnectivityManagerCompat.java b/compat/src/main/java/android/support/v4/net/ConnectivityManagerCompat.java
similarity index 93%
rename from compat/java/android/support/v4/net/ConnectivityManagerCompat.java
rename to compat/src/main/java/android/support/v4/net/ConnectivityManagerCompat.java
index cdddb68..c08cac8 100644
--- a/compat/java/android/support/v4/net/ConnectivityManagerCompat.java
+++ b/compat/src/main/java/android/support/v4/net/ConnectivityManagerCompat.java
@@ -32,6 +32,8 @@
 import android.net.NetworkInfo;
 import android.os.Build;
 import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.annotation.RequiresPermission;
 import android.support.annotation.RestrictTo;
 
@@ -91,7 +93,7 @@
      */
     @SuppressWarnings("deprecation")
     @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
-    public static boolean isActiveNetworkMetered(ConnectivityManager cm) {
+    public static boolean isActiveNetworkMetered(@NonNull ConnectivityManager cm) {
         if (Build.VERSION.SDK_INT >= 16) {
             return cm.isActiveNetworkMetered();
         } else {
@@ -128,8 +130,10 @@
      * potentially-stale value from
      * {@link ConnectivityManager#EXTRA_NETWORK_INFO}. May be {@code null}.
      */
+    @Nullable
     @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
-    public static NetworkInfo getNetworkInfoFromBroadcast(ConnectivityManager cm, Intent intent) {
+    public static NetworkInfo getNetworkInfoFromBroadcast(@NonNull ConnectivityManager cm,
+            @NonNull Intent intent) {
         final NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
         if (info != null) {
             return cm.getNetworkInfo(info.getType());
@@ -147,7 +151,7 @@
      *         or {@link #RESTRICT_BACKGROUND_STATUS_WHITELISTED}
      */
     @RestrictBackgroundStatus
-    public static int getRestrictBackgroundStatus(ConnectivityManager cm) {
+    public static int getRestrictBackgroundStatus(@NonNull ConnectivityManager cm) {
         if (Build.VERSION.SDK_INT >= 24) {
             return cm.getRestrictBackgroundStatus();
         } else {
diff --git a/compat/java/android/support/v4/net/DatagramSocketWrapper.java b/compat/src/main/java/android/support/v4/net/DatagramSocketWrapper.java
similarity index 100%
rename from compat/java/android/support/v4/net/DatagramSocketWrapper.java
rename to compat/src/main/java/android/support/v4/net/DatagramSocketWrapper.java
diff --git a/compat/java/android/support/v4/net/TrafficStatsCompat.java b/compat/src/main/java/android/support/v4/net/TrafficStatsCompat.java
similarity index 95%
rename from compat/java/android/support/v4/net/TrafficStatsCompat.java
rename to compat/src/main/java/android/support/v4/net/TrafficStatsCompat.java
index 1049fa5..b74b8d0 100644
--- a/compat/java/android/support/v4/net/TrafficStatsCompat.java
+++ b/compat/src/main/java/android/support/v4/net/TrafficStatsCompat.java
@@ -19,6 +19,7 @@
 import android.net.TrafficStats;
 import android.os.Build;
 import android.os.ParcelFileDescriptor;
+import android.support.annotation.NonNull;
 
 import java.net.DatagramSocket;
 import java.net.Socket;
@@ -131,7 +132,7 @@
      *
      * @see #setThreadStatsTag(int)
      */
-    public static void tagDatagramSocket(DatagramSocket socket) throws SocketException {
+    public static void tagDatagramSocket(@NonNull DatagramSocket socket) throws SocketException {
         if (Build.VERSION.SDK_INT >= 24) {
             TrafficStats.tagDatagramSocket(socket);
         } else {
@@ -148,7 +149,7 @@
     /**
      * Remove any statistics parameters from the given {@link DatagramSocket}.
      */
-    public static void untagDatagramSocket(DatagramSocket socket) throws SocketException {
+    public static void untagDatagramSocket(@NonNull DatagramSocket socket) throws SocketException {
         if (Build.VERSION.SDK_INT >= 24) {
             TrafficStats.untagDatagramSocket(socket);
         } else {
diff --git a/compat/java/android/support/v4/os/BuildCompat.java b/compat/src/main/java/android/support/v4/os/BuildCompat.java
similarity index 100%
rename from compat/java/android/support/v4/os/BuildCompat.java
rename to compat/src/main/java/android/support/v4/os/BuildCompat.java
diff --git a/compat/java/android/support/v4/os/CancellationSignal.java b/compat/src/main/java/android/support/v4/os/CancellationSignal.java
similarity index 100%
rename from compat/java/android/support/v4/os/CancellationSignal.java
rename to compat/src/main/java/android/support/v4/os/CancellationSignal.java
diff --git a/compat/java/android/support/v4/os/ConfigurationCompat.java b/compat/src/main/java/android/support/v4/os/ConfigurationCompat.java
similarity index 100%
rename from compat/java/android/support/v4/os/ConfigurationCompat.java
rename to compat/src/main/java/android/support/v4/os/ConfigurationCompat.java
diff --git a/compat/java/android/support/v4/os/EnvironmentCompat.java b/compat/src/main/java/android/support/v4/os/EnvironmentCompat.java
similarity index 100%
rename from compat/java/android/support/v4/os/EnvironmentCompat.java
rename to compat/src/main/java/android/support/v4/os/EnvironmentCompat.java
diff --git a/compat/java/android/support/v4/os/IResultReceiver.aidl b/compat/src/main/java/android/support/v4/os/IResultReceiver.aidl
similarity index 100%
rename from compat/java/android/support/v4/os/IResultReceiver.aidl
rename to compat/src/main/java/android/support/v4/os/IResultReceiver.aidl
diff --git a/compat/java/android/support/v4/os/LocaleHelper.java b/compat/src/main/java/android/support/v4/os/LocaleHelper.java
similarity index 100%
rename from compat/java/android/support/v4/os/LocaleHelper.java
rename to compat/src/main/java/android/support/v4/os/LocaleHelper.java
diff --git a/compat/java/android/support/v4/os/LocaleListCompat.java b/compat/src/main/java/android/support/v4/os/LocaleListCompat.java
similarity index 100%
rename from compat/java/android/support/v4/os/LocaleListCompat.java
rename to compat/src/main/java/android/support/v4/os/LocaleListCompat.java
diff --git a/compat/java/android/support/v4/os/LocaleListHelper.java b/compat/src/main/java/android/support/v4/os/LocaleListHelper.java
similarity index 100%
rename from compat/java/android/support/v4/os/LocaleListHelper.java
rename to compat/src/main/java/android/support/v4/os/LocaleListHelper.java
diff --git a/compat/java/android/support/v4/os/LocaleListInterface.java b/compat/src/main/java/android/support/v4/os/LocaleListInterface.java
similarity index 100%
rename from compat/java/android/support/v4/os/LocaleListInterface.java
rename to compat/src/main/java/android/support/v4/os/LocaleListInterface.java
diff --git a/compat/java/android/support/v4/os/OperationCanceledException.java b/compat/src/main/java/android/support/v4/os/OperationCanceledException.java
similarity index 100%
rename from compat/java/android/support/v4/os/OperationCanceledException.java
rename to compat/src/main/java/android/support/v4/os/OperationCanceledException.java
diff --git a/compat/java/android/support/v4/os/ParcelableCompat.java b/compat/src/main/java/android/support/v4/os/ParcelableCompat.java
similarity index 100%
rename from compat/java/android/support/v4/os/ParcelableCompat.java
rename to compat/src/main/java/android/support/v4/os/ParcelableCompat.java
diff --git a/compat/java/android/support/v4/os/ParcelableCompatCreatorCallbacks.java b/compat/src/main/java/android/support/v4/os/ParcelableCompatCreatorCallbacks.java
similarity index 100%
rename from compat/java/android/support/v4/os/ParcelableCompatCreatorCallbacks.java
rename to compat/src/main/java/android/support/v4/os/ParcelableCompatCreatorCallbacks.java
diff --git a/compat/java/android/support/v4/os/ResultReceiver.aidl b/compat/src/main/java/android/support/v4/os/ResultReceiver.aidl
similarity index 100%
rename from compat/java/android/support/v4/os/ResultReceiver.aidl
rename to compat/src/main/java/android/support/v4/os/ResultReceiver.aidl
diff --git a/compat/java/android/support/v4/os/ResultReceiver.java b/compat/src/main/java/android/support/v4/os/ResultReceiver.java
similarity index 100%
rename from compat/java/android/support/v4/os/ResultReceiver.java
rename to compat/src/main/java/android/support/v4/os/ResultReceiver.java
diff --git a/compat/java/android/support/v4/os/TraceCompat.java b/compat/src/main/java/android/support/v4/os/TraceCompat.java
similarity index 100%
rename from compat/java/android/support/v4/os/TraceCompat.java
rename to compat/src/main/java/android/support/v4/os/TraceCompat.java
diff --git a/compat/java/android/support/v4/os/UserManagerCompat.java b/compat/src/main/java/android/support/v4/os/UserManagerCompat.java
similarity index 100%
rename from compat/java/android/support/v4/os/UserManagerCompat.java
rename to compat/src/main/java/android/support/v4/os/UserManagerCompat.java
diff --git a/compat/java/android/support/v4/os/package.html b/compat/src/main/java/android/support/v4/os/package.html
similarity index 100%
rename from compat/java/android/support/v4/os/package.html
rename to compat/src/main/java/android/support/v4/os/package.html
diff --git a/compat/java/android/support/v4/provider/FontRequest.java b/compat/src/main/java/android/support/v4/provider/FontRequest.java
similarity index 99%
rename from compat/java/android/support/v4/provider/FontRequest.java
rename to compat/src/main/java/android/support/v4/provider/FontRequest.java
index cb32f06..b14f85e 100644
--- a/compat/java/android/support/v4/provider/FontRequest.java
+++ b/compat/src/main/java/android/support/v4/provider/FontRequest.java
@@ -89,6 +89,7 @@
      * Returns the selected font provider's authority. This tells the system what font provider
      * it should request the font from.
      */
+    @NonNull
     public String getProviderAuthority() {
         return mProviderAuthority;
     }
@@ -97,6 +98,7 @@
      * Returns the selected font provider's package. This helps the system verify that the provider
      * identified by the given authority is the one requested.
      */
+    @NonNull
     public String getProviderPackage() {
         return mProviderPackage;
     }
@@ -105,6 +107,7 @@
      * Returns the query string. Refer to your font provider's documentation on the format of this
      * string.
      */
+    @NonNull
     public String getQuery() {
         return mQuery;
     }
diff --git a/compat/java/android/support/v4/provider/FontsContractCompat.java b/compat/src/main/java/android/support/v4/provider/FontsContractCompat.java
similarity index 87%
rename from compat/java/android/support/v4/provider/FontsContractCompat.java
rename to compat/src/main/java/android/support/v4/provider/FontsContractCompat.java
index 6ad46a1..0926186 100644
--- a/compat/java/android/support/v4/provider/FontsContractCompat.java
+++ b/compat/src/main/java/android/support/v4/provider/FontsContractCompat.java
@@ -17,7 +17,6 @@
 package android.support.v4.provider;
 
 import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-import static android.support.v4.content.res.FontResourcesParserCompat.FetchStrategy;
 
 import android.annotation.SuppressLint;
 import android.content.ContentResolver;
@@ -46,17 +45,16 @@
 import android.support.annotation.RestrictTo;
 import android.support.annotation.VisibleForTesting;
 import android.support.v4.content.res.FontResourcesParserCompat;
+import android.support.v4.content.res.ResourcesCompat;
 import android.support.v4.graphics.TypefaceCompat;
 import android.support.v4.graphics.TypefaceCompatUtil;
 import android.support.v4.provider.SelfDestructiveThread.ReplyCallback;
 import android.support.v4.util.LruCache;
 import android.support.v4.util.Preconditions;
 import android.support.v4.util.SimpleArrayMap;
-import android.widget.TextView;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.WeakReference;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -166,11 +164,11 @@
     // space open for new provider codes, these should all be negative numbers.
     /** @hide */
     @RestrictTo(LIBRARY_GROUP)
-    public static final int RESULT_CODE_PROVIDER_NOT_FOUND = -1;
+    /* package */ static final int RESULT_CODE_PROVIDER_NOT_FOUND = -1;
     /** @hide */
     @RestrictTo(LIBRARY_GROUP)
-    public static final int RESULT_CODE_WRONG_CERTIFICATES = -2;
-    // Note -3 is used by Typeface to indicate the font failed to load.
+    /* package */ static final int RESULT_CODE_WRONG_CERTIFICATES = -2;
+    // Note -3 is used by FontRequestCallback to indicate the font failed to load.
 
     private static final LruCache<String, Typeface> sTypefaceCache = new LruCache<>(16);
 
@@ -179,51 +177,87 @@
             new SelfDestructiveThread("fonts", Process.THREAD_PRIORITY_BACKGROUND,
                     BACKGROUND_THREAD_KEEP_ALIVE_DURATION_MS);
 
-    private static Typeface getFontInternal(final Context context, final FontRequest request,
+    @NonNull
+    private static TypefaceResult getFontInternal(final Context context, final FontRequest request,
             int style) {
         FontFamilyResult result;
         try {
             result = fetchFonts(context, null /* CancellationSignal */, request);
         } catch (PackageManager.NameNotFoundException e) {
-            return null;
+            return new TypefaceResult(null, FontRequestCallback.FAIL_REASON_PROVIDER_NOT_FOUND);
         }
         if (result.getStatusCode() == FontFamilyResult.STATUS_OK) {
-            return TypefaceCompat.createFromFontInfo(context, null /* CancellationSignal */,
-                    result.getFonts(), style);
+            final Typeface typeface = TypefaceCompat.createFromFontInfo(
+                    context, null /* CancellationSignal */, result.getFonts(), style);
+            return new TypefaceResult(typeface, typeface != null
+                    ? FontRequestCallback.RESULT_OK
+                    : FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR);
         }
-        return null;
+        int resultCode = result.getStatusCode() == FontFamilyResult.STATUS_WRONG_CERTIFICATES
+                ? FontRequestCallback.FAIL_REASON_WRONG_CERTIFICATES
+                : FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR;
+        return new TypefaceResult(null, resultCode);
     }
 
     private static final Object sLock = new Object();
     @GuardedBy("sLock")
-    private static final SimpleArrayMap<String, ArrayList<ReplyCallback<Typeface>>>
+    private static final SimpleArrayMap<String, ArrayList<ReplyCallback<TypefaceResult>>>
             sPendingReplies = new SimpleArrayMap<>();
 
+    private static final class TypefaceResult {
+        final Typeface mTypeface;
+        @FontRequestCallback.FontRequestFailReason final int mResult;
+
+        TypefaceResult(@Nullable Typeface typeface,
+                @FontRequestCallback.FontRequestFailReason int result) {
+            mTypeface = typeface;
+            mResult = result;
+        }
+    }
+
+    /**
+     * Used for tests, should not be used otherwise.
+     * @hide
+     **/
+    @RestrictTo(LIBRARY_GROUP)
+    public static final void resetCache() {
+        sTypefaceCache.evictAll();
+    }
+
     /** @hide */
     @RestrictTo(LIBRARY_GROUP)
     public static Typeface getFontSync(final Context context, final FontRequest request,
-            final @Nullable TextView targetView, @FetchStrategy int strategy, int timeout,
+            final @Nullable ResourcesCompat.FontCallback fontCallback,
+            final @Nullable Handler handler, boolean isBlockingFetch, int timeout,
             final int style) {
         final String id = request.getIdentifier() + "-" + style;
         Typeface cached = sTypefaceCache.get(id);
         if (cached != null) {
+            if (fontCallback != null) {
+                fontCallback.onFontRetrieved(cached);
+            }
             return cached;
         }
 
-        final boolean isBlockingFetch =
-                strategy == FontResourcesParserCompat.FETCH_STRATEGY_BLOCKING;
-
         if (isBlockingFetch && timeout == FontResourcesParserCompat.INFINITE_TIMEOUT_VALUE) {
             // Wait forever. No need to post to the thread.
-            return getFontInternal(context, request, style);
+            TypefaceResult typefaceResult = getFontInternal(context, request, style);
+            if (fontCallback != null) {
+                if (typefaceResult.mResult == FontFamilyResult.STATUS_OK) {
+                    fontCallback.callbackSuccessAsync(typefaceResult.mTypeface, handler);
+                } else {
+                    fontCallback.callbackFailAsync(typefaceResult.mResult, handler);
+                }
+            }
+            return typefaceResult.mTypeface;
         }
 
-        final Callable<Typeface> fetcher = new Callable<Typeface>() {
+        final Callable<TypefaceResult> fetcher = new Callable<TypefaceResult>() {
             @Override
-            public Typeface call() throws Exception {
-                Typeface typeface = getFontInternal(context, request, style);
-                if (typeface != null) {
-                    sTypefaceCache.put(id, typeface);
+            public TypefaceResult call() throws Exception {
+                TypefaceResult typeface = getFontInternal(context, request, style);
+                if (typeface.mTypeface != null) {
+                    sTypefaceCache.put(id, typeface.mTypeface);
                 }
                 return typeface;
             }
@@ -231,45 +265,53 @@
 
         if (isBlockingFetch) {
             try {
-                return sBackgroundThread.postAndWait(fetcher, timeout);
+                return sBackgroundThread.postAndWait(fetcher, timeout).mTypeface;
             } catch (InterruptedException e) {
                 return null;
             }
         } else {
-            final WeakReference<TextView> textViewWeak = new WeakReference<TextView>(targetView);
-            final ReplyCallback<Typeface> reply = new ReplyCallback<Typeface>() {
-                @Override
-                public void onReply(final Typeface typeface) {
-                    final TextView textView = textViewWeak.get();
-                    if (textView != null) {
-                        targetView.setTypeface(typeface, style);
-                    }
-                }
-            };
+            final ReplyCallback<TypefaceResult> reply = fontCallback == null ? null
+                    : new ReplyCallback<TypefaceResult>() {
+                        @Override
+                        public void onReply(final TypefaceResult typeface) {
+                            if (typeface.mResult == FontFamilyResult.STATUS_OK) {
+                                fontCallback.callbackSuccessAsync(typeface.mTypeface, handler);
+                            } else {
+                                fontCallback.callbackFailAsync(typeface.mResult, handler);
+                            }
+                        }
+                    };
 
             synchronized (sLock) {
                 if (sPendingReplies.containsKey(id)) {
                     // Already requested. Do not request the same provider again and insert the
                     // reply to the queue instead.
-                    sPendingReplies.get(id).add(reply);
+                    if (reply != null) {
+                        sPendingReplies.get(id).add(reply);
+                    }
                     return null;
                 }
-                ArrayList<ReplyCallback<Typeface>> pendingReplies = new ArrayList<>();
-                pendingReplies.add(reply);
-                sPendingReplies.put(id, pendingReplies);
+                if (reply != null) {
+                    ArrayList<ReplyCallback<TypefaceResult>> pendingReplies = new ArrayList<>();
+                    pendingReplies.add(reply);
+                    sPendingReplies.put(id, pendingReplies);
+                }
             }
-            sBackgroundThread.postAndReply(fetcher, new ReplyCallback<Typeface>() {
+            sBackgroundThread.postAndReply(fetcher, new ReplyCallback<TypefaceResult>() {
                 @Override
-                public void onReply(final Typeface typeface) {
-                    final ArrayList<ReplyCallback<Typeface>> replies;
+                public void onReply(final TypefaceResult typeface) {
+                    final ArrayList<ReplyCallback<TypefaceResult>> replies;
                     synchronized (sLock) {
                         replies = sPendingReplies.get(id);
+                        if (replies == null) {
+                            return;  // Nobody requested replies. Do nothing.
+                        }
                         sPendingReplies.remove(id);
                     }
                     for (int i = 0; i < replies.size(); ++i) {
                         replies.get(i).onReply(typeface);
                     }
-                };
+                }
             });
             return null;
         }
@@ -292,8 +334,9 @@
          * @param weight An integer that indicates the font weight.
          * @param italic A boolean that indicates the font is italic style or not.
          * @param resultCode A boolean that indicates the font contents is ready.
+         *
+         * @hide
          */
-        /** @hide */
         @RestrictTo(LIBRARY_GROUP)
         public FontInfo(@NonNull Uri uri, @IntRange(from = 0) int ttcIndex,
                 @IntRange(from = 1, to = 1000) int weight,
@@ -396,6 +439,9 @@
      * Interface used to receive asynchronously fetched typefaces.
      */
     public static class FontRequestCallback {
+        /** @hide */
+        @RestrictTo(LIBRARY_GROUP)
+        public static final int RESULT_OK = Columns.RESULT_CODE_OK;
         /**
          * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the given
          * provider was not found on the device.
@@ -412,6 +458,11 @@
          */
         public static final int FAIL_REASON_FONT_LOAD_ERROR = -3;
         /**
+         * Constant that signals that the font was not loaded due to security issues. This usually
+         * means the font was attempted to load on a restricted context.
+         */
+        public static final int FAIL_REASON_SECURITY_VIOLATION = -4;
+        /**
          * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the font
          * provider did not return any results for the given query.
          */
@@ -431,9 +482,10 @@
         @RestrictTo(LIBRARY_GROUP)
         @IntDef({ FAIL_REASON_PROVIDER_NOT_FOUND, FAIL_REASON_FONT_LOAD_ERROR,
                 FAIL_REASON_FONT_NOT_FOUND, FAIL_REASON_FONT_UNAVAILABLE,
-                FAIL_REASON_MALFORMED_QUERY, FAIL_REASON_WRONG_CERTIFICATES })
+                FAIL_REASON_MALFORMED_QUERY, FAIL_REASON_WRONG_CERTIFICATES,
+                FAIL_REASON_SECURITY_VIOLATION, RESULT_OK })
         @Retention(RetentionPolicy.SOURCE)
-        @interface FontRequestFailReason {}
+        public @interface FontRequestFailReason {}
 
         public FontRequestCallback() {}
 
@@ -600,6 +652,7 @@
      * @param fonts An array of {@link FontInfo} to be used to create a Typeface.
      * @return A Typeface object. Returns null if typeface creation fails.
      */
+    @Nullable
     public static Typeface buildTypeface(@NonNull Context context,
             @Nullable CancellationSignal cancellationSignal, @NonNull FontInfo[] fonts) {
         return TypefaceCompat.createFromFontInfo(context, cancellationSignal, fonts,
diff --git a/compat/java/android/support/v4/provider/SelfDestructiveThread.java b/compat/src/main/java/android/support/v4/provider/SelfDestructiveThread.java
similarity index 99%
rename from compat/java/android/support/v4/provider/SelfDestructiveThread.java
rename to compat/src/main/java/android/support/v4/provider/SelfDestructiveThread.java
index 885799b..7cfe1f8 100644
--- a/compat/java/android/support/v4/provider/SelfDestructiveThread.java
+++ b/compat/src/main/java/android/support/v4/provider/SelfDestructiveThread.java
@@ -129,7 +129,7 @@
 
     /**
      * Execute the specific callable object on this thread and call the reply callback on the
-     * calling thread once it finishs.
+     * calling thread once it finishes.
      */
     public <T> void postAndReply(final Callable<T> callable, final ReplyCallback<T> reply) {
         final Handler callingHandler = new Handler();
diff --git a/compat/java/android/support/v4/text/BidiFormatter.java b/compat/src/main/java/android/support/v4/text/BidiFormatter.java
similarity index 100%
rename from compat/java/android/support/v4/text/BidiFormatter.java
rename to compat/src/main/java/android/support/v4/text/BidiFormatter.java
diff --git a/compat/java/android/support/v4/text/ICUCompat.java b/compat/src/main/java/android/support/v4/text/ICUCompat.java
similarity index 100%
rename from compat/java/android/support/v4/text/ICUCompat.java
rename to compat/src/main/java/android/support/v4/text/ICUCompat.java
diff --git a/compat/java/android/support/v4/text/TextDirectionHeuristicCompat.java b/compat/src/main/java/android/support/v4/text/TextDirectionHeuristicCompat.java
similarity index 100%
rename from compat/java/android/support/v4/text/TextDirectionHeuristicCompat.java
rename to compat/src/main/java/android/support/v4/text/TextDirectionHeuristicCompat.java
diff --git a/compat/java/android/support/v4/text/TextDirectionHeuristicsCompat.java b/compat/src/main/java/android/support/v4/text/TextDirectionHeuristicsCompat.java
similarity index 100%
rename from compat/java/android/support/v4/text/TextDirectionHeuristicsCompat.java
rename to compat/src/main/java/android/support/v4/text/TextDirectionHeuristicsCompat.java
diff --git a/compat/java/android/support/v4/text/TextUtilsCompat.java b/compat/src/main/java/android/support/v4/text/TextUtilsCompat.java
similarity index 100%
rename from compat/java/android/support/v4/text/TextUtilsCompat.java
rename to compat/src/main/java/android/support/v4/text/TextUtilsCompat.java
diff --git a/compat/java/android/support/v4/text/util/LinkifyCompat.java b/compat/src/main/java/android/support/v4/text/util/LinkifyCompat.java
similarity index 100%
rename from compat/java/android/support/v4/text/util/LinkifyCompat.java
rename to compat/src/main/java/android/support/v4/text/util/LinkifyCompat.java
diff --git a/compat/java/android/support/v4/util/ArrayMap.java b/compat/src/main/java/android/support/v4/util/ArrayMap.java
similarity index 100%
rename from compat/java/android/support/v4/util/ArrayMap.java
rename to compat/src/main/java/android/support/v4/util/ArrayMap.java
diff --git a/compat/java/android/support/v4/util/ArraySet.java b/compat/src/main/java/android/support/v4/util/ArraySet.java
similarity index 100%
rename from compat/java/android/support/v4/util/ArraySet.java
rename to compat/src/main/java/android/support/v4/util/ArraySet.java
diff --git a/compat/java/android/support/v4/util/AtomicFile.java b/compat/src/main/java/android/support/v4/util/AtomicFile.java
similarity index 94%
rename from compat/java/android/support/v4/util/AtomicFile.java
rename to compat/src/main/java/android/support/v4/util/AtomicFile.java
index 275f4e2..aefe705 100644
--- a/compat/java/android/support/v4/util/AtomicFile.java
+++ b/compat/src/main/java/android/support/v4/util/AtomicFile.java
@@ -16,6 +16,8 @@
 
 package android.support.v4.util;
 
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.util.Log;
 
 import java.io.File;
@@ -48,7 +50,7 @@
      * Create a new AtomicFile for a file located at the given File path.
      * The secondary backup file will be the same file path with ".bak" appended.
      */
-    public AtomicFile(File baseName) {
+    public AtomicFile(@NonNull File baseName) {
         mBaseName = baseName;
         mBackupName = new File(baseName.getPath() + ".bak");
     }
@@ -57,6 +59,7 @@
      * Return the path to the base file.  You should not generally use this,
      * as the data at that path may not be valid.
      */
+    @NonNull
     public File getBaseFile() {
         return mBaseName;
     }
@@ -83,6 +86,7 @@
      * safe (or will be lost).  You must do your own threading protection for
      * access to AtomicFile.
      */
+    @NonNull
     public FileOutputStream startWrite() throws IOException {
         // Rename the current file so it may be used as a backup during the next read
         if (mBaseName.exists()) {
@@ -95,7 +99,7 @@
                 mBaseName.delete();
             }
         }
-        FileOutputStream str = null;
+        FileOutputStream str;
         try {
             str = new FileOutputStream(mBaseName);
         } catch (FileNotFoundException e) {
@@ -118,7 +122,7 @@
      * commit the new data.  The next attempt to read the atomic file
      * will return the new file stream.
      */
-    public void finishWrite(FileOutputStream str) {
+    public void finishWrite(@Nullable FileOutputStream str) {
         if (str != null) {
             sync(str);
             try {
@@ -135,7 +139,7 @@
      * returned by {@link #startWrite()}.  This will close the current
      * write stream, and roll back to the previous state of the file.
      */
-    public void failWrite(FileOutputStream str) {
+    public void failWrite(@Nullable FileOutputStream str) {
         if (str != null) {
             sync(str);
             try {
@@ -160,6 +164,7 @@
      * be dropped.  You must do your own threading protection for access to
      * AtomicFile.
      */
+    @NonNull
     public FileInputStream openRead() throws FileNotFoundException {
         if (mBackupName.exists()) {
             mBaseName.delete();
@@ -172,6 +177,7 @@
      * A convenience for {@link #openRead()} that also reads all of the
      * file contents into a byte array which is returned.
      */
+    @NonNull
     public byte[] readFully() throws IOException {
         FileInputStream stream = openRead();
         try {
@@ -200,11 +206,9 @@
         }
     }
 
-    static boolean sync(FileOutputStream stream) {
+    private static boolean sync(@NonNull FileOutputStream stream) {
         try {
-            if (stream != null) {
-                stream.getFD().sync();
-            }
+            stream.getFD().sync();
             return true;
         } catch (IOException e) {
         }
diff --git a/compat/java/android/support/v4/util/CircularArray.java b/compat/src/main/java/android/support/v4/util/CircularArray.java
similarity index 100%
rename from compat/java/android/support/v4/util/CircularArray.java
rename to compat/src/main/java/android/support/v4/util/CircularArray.java
diff --git a/compat/java/android/support/v4/util/CircularIntArray.java b/compat/src/main/java/android/support/v4/util/CircularIntArray.java
similarity index 100%
rename from compat/java/android/support/v4/util/CircularIntArray.java
rename to compat/src/main/java/android/support/v4/util/CircularIntArray.java
diff --git a/compat/java/android/support/v4/util/ContainerHelpers.java b/compat/src/main/java/android/support/v4/util/ContainerHelpers.java
similarity index 100%
rename from compat/java/android/support/v4/util/ContainerHelpers.java
rename to compat/src/main/java/android/support/v4/util/ContainerHelpers.java
diff --git a/compat/java/android/support/v4/util/DebugUtils.java b/compat/src/main/java/android/support/v4/util/DebugUtils.java
similarity index 100%
rename from compat/java/android/support/v4/util/DebugUtils.java
rename to compat/src/main/java/android/support/v4/util/DebugUtils.java
diff --git a/compat/java/android/support/v4/util/LogWriter.java b/compat/src/main/java/android/support/v4/util/LogWriter.java
similarity index 100%
rename from compat/java/android/support/v4/util/LogWriter.java
rename to compat/src/main/java/android/support/v4/util/LogWriter.java
diff --git a/compat/java/android/support/v4/util/LongSparseArray.java b/compat/src/main/java/android/support/v4/util/LongSparseArray.java
similarity index 100%
rename from compat/java/android/support/v4/util/LongSparseArray.java
rename to compat/src/main/java/android/support/v4/util/LongSparseArray.java
diff --git a/compat/java/android/support/v4/util/LruCache.java b/compat/src/main/java/android/support/v4/util/LruCache.java
similarity index 100%
rename from compat/java/android/support/v4/util/LruCache.java
rename to compat/src/main/java/android/support/v4/util/LruCache.java
diff --git a/compat/java/android/support/v4/util/MapCollections.java b/compat/src/main/java/android/support/v4/util/MapCollections.java
similarity index 100%
rename from compat/java/android/support/v4/util/MapCollections.java
rename to compat/src/main/java/android/support/v4/util/MapCollections.java
diff --git a/compat/java/android/support/v4/util/ObjectsCompat.java b/compat/src/main/java/android/support/v4/util/ObjectsCompat.java
similarity index 93%
rename from compat/java/android/support/v4/util/ObjectsCompat.java
rename to compat/src/main/java/android/support/v4/util/ObjectsCompat.java
index 4650060..b6c740e 100644
--- a/compat/java/android/support/v4/util/ObjectsCompat.java
+++ b/compat/src/main/java/android/support/v4/util/ObjectsCompat.java
@@ -16,6 +16,7 @@
 package android.support.v4.util;
 
 import android.os.Build;
+import android.support.annotation.Nullable;
 
 import java.util.Objects;
 
@@ -43,7 +44,7 @@
      *         and {@code false} otherwise
      * @see Object#equals(Object)
      */
-    public static boolean equals(Object a, Object b) {
+    public static boolean equals(@Nullable Object a, @Nullable Object b) {
         if (Build.VERSION.SDK_INT >= 19) {
             return Objects.equals(a, b);
         } else {
diff --git a/compat/java/android/support/v4/util/Pair.java b/compat/src/main/java/android/support/v4/util/Pair.java
similarity index 88%
rename from compat/java/android/support/v4/util/Pair.java
rename to compat/src/main/java/android/support/v4/util/Pair.java
index 46ea5cd..9047aec 100644
--- a/compat/java/android/support/v4/util/Pair.java
+++ b/compat/src/main/java/android/support/v4/util/Pair.java
@@ -16,14 +16,17 @@
 
 package android.support.v4.util;
 
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
 /**
  * Container to ease passing around a tuple of two objects. This object provides a sensible
  * implementation of equals(), returning true if equals() is true on each of the contained
  * objects.
  */
 public class Pair<F, S> {
-    public final F first;
-    public final S second;
+    public final @Nullable F first;
+    public final @Nullable S second;
 
     /**
      * Constructor for a Pair.
@@ -31,7 +34,7 @@
      * @param first the first object in the Pair
      * @param second the second object in the pair
      */
-    public Pair(F first, S second) {
+    public Pair(@Nullable F first, @Nullable S second) {
         this.first = first;
         this.second = second;
     }
@@ -78,7 +81,8 @@
      * @param b the second object in the pair
      * @return a Pair that is templatized with the types of a and b
      */
-    public static <A, B> Pair <A, B> create(A a, B b) {
+    @NonNull
+    public static <A, B> Pair <A, B> create(@Nullable A a, @Nullable B b) {
         return new Pair<A, B>(a, b);
     }
 }
diff --git a/compat/java/android/support/v4/util/PatternsCompat.java b/compat/src/main/java/android/support/v4/util/PatternsCompat.java
similarity index 100%
rename from compat/java/android/support/v4/util/PatternsCompat.java
rename to compat/src/main/java/android/support/v4/util/PatternsCompat.java
diff --git a/compat/java/android/support/v4/util/Pools.java b/compat/src/main/java/android/support/v4/util/Pools.java
similarity index 92%
rename from compat/java/android/support/v4/util/Pools.java
rename to compat/src/main/java/android/support/v4/util/Pools.java
index 6882660..99fd888 100644
--- a/compat/java/android/support/v4/util/Pools.java
+++ b/compat/src/main/java/android/support/v4/util/Pools.java
@@ -18,6 +18,9 @@
 package android.support.v4.util;
 
 
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
 /**
  * Helper class for creating pools of objects. An example use looks like this:
  * <pre>
@@ -53,6 +56,7 @@
         /**
          * @return An instance from the pool if such, null otherwise.
          */
+        @Nullable
         public T acquire();
 
         /**
@@ -63,7 +67,7 @@
          *
          * @throws IllegalStateException If the instance is already in the pool.
          */
-        public boolean release(T instance);
+        public boolean release(@NonNull T instance);
     }
 
     private Pools() {
@@ -108,7 +112,7 @@
         }
 
         @Override
-        public boolean release(T instance) {
+        public boolean release(@NonNull T instance) {
             if (isInPool(instance)) {
                 throw new IllegalStateException("Already in the pool!");
             }
@@ -120,7 +124,7 @@
             return false;
         }
 
-        private boolean isInPool(T instance) {
+        private boolean isInPool(@NonNull T instance) {
             for (int i = 0; i < mPoolSize; i++) {
                 if (mPool[i] == instance) {
                     return true;
@@ -157,7 +161,7 @@
         }
 
         @Override
-        public boolean release(T element) {
+        public boolean release(@NonNull T element) {
             synchronized (mLock) {
                 return super.release(element);
             }
diff --git a/compat/java/android/support/v4/util/Preconditions.java b/compat/src/main/java/android/support/v4/util/Preconditions.java
similarity index 100%
rename from compat/java/android/support/v4/util/Preconditions.java
rename to compat/src/main/java/android/support/v4/util/Preconditions.java
diff --git a/compat/java/android/support/v4/util/SimpleArrayMap.java b/compat/src/main/java/android/support/v4/util/SimpleArrayMap.java
similarity index 100%
rename from compat/java/android/support/v4/util/SimpleArrayMap.java
rename to compat/src/main/java/android/support/v4/util/SimpleArrayMap.java
diff --git a/compat/java/android/support/v4/util/SparseArrayCompat.java b/compat/src/main/java/android/support/v4/util/SparseArrayCompat.java
similarity index 100%
rename from compat/java/android/support/v4/util/SparseArrayCompat.java
rename to compat/src/main/java/android/support/v4/util/SparseArrayCompat.java
diff --git a/compat/java/android/support/v4/util/TimeUtils.java b/compat/src/main/java/android/support/v4/util/TimeUtils.java
similarity index 100%
rename from compat/java/android/support/v4/util/TimeUtils.java
rename to compat/src/main/java/android/support/v4/util/TimeUtils.java
diff --git a/compat/java/android/support/v4/util/package.html b/compat/src/main/java/android/support/v4/util/package.html
similarity index 100%
rename from compat/java/android/support/v4/util/package.html
rename to compat/src/main/java/android/support/v4/util/package.html
diff --git a/compat/java/android/support/v4/view/AccessibilityDelegateCompat.java b/compat/src/main/java/android/support/v4/view/AccessibilityDelegateCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/AccessibilityDelegateCompat.java
rename to compat/src/main/java/android/support/v4/view/AccessibilityDelegateCompat.java
diff --git a/compat/java/android/support/v4/view/ActionProvider.java b/compat/src/main/java/android/support/v4/view/ActionProvider.java
similarity index 100%
rename from compat/java/android/support/v4/view/ActionProvider.java
rename to compat/src/main/java/android/support/v4/view/ActionProvider.java
diff --git a/compat/java/android/support/v4/view/GestureDetectorCompat.java b/compat/src/main/java/android/support/v4/view/GestureDetectorCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/GestureDetectorCompat.java
rename to compat/src/main/java/android/support/v4/view/GestureDetectorCompat.java
diff --git a/compat/java/android/support/v4/view/GravityCompat.java b/compat/src/main/java/android/support/v4/view/GravityCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/GravityCompat.java
rename to compat/src/main/java/android/support/v4/view/GravityCompat.java
diff --git a/compat/java/android/support/v4/view/InputDeviceCompat.java b/compat/src/main/java/android/support/v4/view/InputDeviceCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/InputDeviceCompat.java
rename to compat/src/main/java/android/support/v4/view/InputDeviceCompat.java
diff --git a/compat/java/android/support/v4/view/LayoutInflaterCompat.java b/compat/src/main/java/android/support/v4/view/LayoutInflaterCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/LayoutInflaterCompat.java
rename to compat/src/main/java/android/support/v4/view/LayoutInflaterCompat.java
diff --git a/compat/java/android/support/v4/view/LayoutInflaterFactory.java b/compat/src/main/java/android/support/v4/view/LayoutInflaterFactory.java
similarity index 100%
rename from compat/java/android/support/v4/view/LayoutInflaterFactory.java
rename to compat/src/main/java/android/support/v4/view/LayoutInflaterFactory.java
diff --git a/compat/java/android/support/v4/view/MarginLayoutParamsCompat.java b/compat/src/main/java/android/support/v4/view/MarginLayoutParamsCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/MarginLayoutParamsCompat.java
rename to compat/src/main/java/android/support/v4/view/MarginLayoutParamsCompat.java
diff --git a/compat/java/android/support/v4/view/MenuCompat.java b/compat/src/main/java/android/support/v4/view/MenuCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/MenuCompat.java
rename to compat/src/main/java/android/support/v4/view/MenuCompat.java
diff --git a/compat/java/android/support/v4/view/MenuItemCompat.java b/compat/src/main/java/android/support/v4/view/MenuItemCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/MenuItemCompat.java
rename to compat/src/main/java/android/support/v4/view/MenuItemCompat.java
diff --git a/compat/java/android/support/v4/view/MotionEventCompat.java b/compat/src/main/java/android/support/v4/view/MotionEventCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/MotionEventCompat.java
rename to compat/src/main/java/android/support/v4/view/MotionEventCompat.java
diff --git a/compat/java/android/support/v4/view/NestedScrollingChild.java b/compat/src/main/java/android/support/v4/view/NestedScrollingChild.java
similarity index 100%
rename from compat/java/android/support/v4/view/NestedScrollingChild.java
rename to compat/src/main/java/android/support/v4/view/NestedScrollingChild.java
diff --git a/compat/java/android/support/v4/view/NestedScrollingChild2.java b/compat/src/main/java/android/support/v4/view/NestedScrollingChild2.java
similarity index 100%
rename from compat/java/android/support/v4/view/NestedScrollingChild2.java
rename to compat/src/main/java/android/support/v4/view/NestedScrollingChild2.java
diff --git a/compat/java/android/support/v4/view/NestedScrollingParent.java b/compat/src/main/java/android/support/v4/view/NestedScrollingParent.java
similarity index 100%
rename from compat/java/android/support/v4/view/NestedScrollingParent.java
rename to compat/src/main/java/android/support/v4/view/NestedScrollingParent.java
diff --git a/compat/java/android/support/v4/view/NestedScrollingParent2.java b/compat/src/main/java/android/support/v4/view/NestedScrollingParent2.java
similarity index 100%
rename from compat/java/android/support/v4/view/NestedScrollingParent2.java
rename to compat/src/main/java/android/support/v4/view/NestedScrollingParent2.java
diff --git a/compat/java/android/support/v4/view/OnApplyWindowInsetsListener.java b/compat/src/main/java/android/support/v4/view/OnApplyWindowInsetsListener.java
similarity index 100%
rename from compat/java/android/support/v4/view/OnApplyWindowInsetsListener.java
rename to compat/src/main/java/android/support/v4/view/OnApplyWindowInsetsListener.java
diff --git a/compat/java/android/support/v4/view/PointerIconCompat.java b/compat/src/main/java/android/support/v4/view/PointerIconCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/PointerIconCompat.java
rename to compat/src/main/java/android/support/v4/view/PointerIconCompat.java
diff --git a/compat/java/android/support/v4/view/ScaleGestureDetectorCompat.java b/compat/src/main/java/android/support/v4/view/ScaleGestureDetectorCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/ScaleGestureDetectorCompat.java
rename to compat/src/main/java/android/support/v4/view/ScaleGestureDetectorCompat.java
diff --git a/compat/java/android/support/v4/view/ScrollingView.java b/compat/src/main/java/android/support/v4/view/ScrollingView.java
similarity index 100%
rename from compat/java/android/support/v4/view/ScrollingView.java
rename to compat/src/main/java/android/support/v4/view/ScrollingView.java
diff --git a/compat/java/android/support/v4/view/TintableBackgroundView.java b/compat/src/main/java/android/support/v4/view/TintableBackgroundView.java
similarity index 100%
rename from compat/java/android/support/v4/view/TintableBackgroundView.java
rename to compat/src/main/java/android/support/v4/view/TintableBackgroundView.java
diff --git a/compat/java/android/support/v4/view/VelocityTrackerCompat.java b/compat/src/main/java/android/support/v4/view/VelocityTrackerCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/VelocityTrackerCompat.java
rename to compat/src/main/java/android/support/v4/view/VelocityTrackerCompat.java
diff --git a/compat/java/android/support/v4/view/ViewCompat.java b/compat/src/main/java/android/support/v4/view/ViewCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/ViewCompat.java
rename to compat/src/main/java/android/support/v4/view/ViewCompat.java
diff --git a/compat/java/android/support/v4/view/ViewConfigurationCompat.java b/compat/src/main/java/android/support/v4/view/ViewConfigurationCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/ViewConfigurationCompat.java
rename to compat/src/main/java/android/support/v4/view/ViewConfigurationCompat.java
diff --git a/compat/java/android/support/v4/view/ViewGroupCompat.java b/compat/src/main/java/android/support/v4/view/ViewGroupCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/ViewGroupCompat.java
rename to compat/src/main/java/android/support/v4/view/ViewGroupCompat.java
diff --git a/compat/java/android/support/v4/view/ViewParentCompat.java b/compat/src/main/java/android/support/v4/view/ViewParentCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/ViewParentCompat.java
rename to compat/src/main/java/android/support/v4/view/ViewParentCompat.java
diff --git a/compat/java/android/support/v4/view/ViewPropertyAnimatorCompat.java b/compat/src/main/java/android/support/v4/view/ViewPropertyAnimatorCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/ViewPropertyAnimatorCompat.java
rename to compat/src/main/java/android/support/v4/view/ViewPropertyAnimatorCompat.java
diff --git a/compat/java/android/support/v4/view/ViewPropertyAnimatorListener.java b/compat/src/main/java/android/support/v4/view/ViewPropertyAnimatorListener.java
similarity index 100%
rename from compat/java/android/support/v4/view/ViewPropertyAnimatorListener.java
rename to compat/src/main/java/android/support/v4/view/ViewPropertyAnimatorListener.java
diff --git a/compat/java/android/support/v4/view/ViewPropertyAnimatorListenerAdapter.java b/compat/src/main/java/android/support/v4/view/ViewPropertyAnimatorListenerAdapter.java
similarity index 100%
rename from compat/java/android/support/v4/view/ViewPropertyAnimatorListenerAdapter.java
rename to compat/src/main/java/android/support/v4/view/ViewPropertyAnimatorListenerAdapter.java
diff --git a/compat/java/android/support/v4/view/ViewPropertyAnimatorUpdateListener.java b/compat/src/main/java/android/support/v4/view/ViewPropertyAnimatorUpdateListener.java
similarity index 100%
rename from compat/java/android/support/v4/view/ViewPropertyAnimatorUpdateListener.java
rename to compat/src/main/java/android/support/v4/view/ViewPropertyAnimatorUpdateListener.java
diff --git a/compat/java/android/support/v4/view/WindowCompat.java b/compat/src/main/java/android/support/v4/view/WindowCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/WindowCompat.java
rename to compat/src/main/java/android/support/v4/view/WindowCompat.java
diff --git a/compat/java/android/support/v4/view/WindowInsetsCompat.java b/compat/src/main/java/android/support/v4/view/WindowInsetsCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/WindowInsetsCompat.java
rename to compat/src/main/java/android/support/v4/view/WindowInsetsCompat.java
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java b/compat/src/main/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
rename to compat/src/main/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java b/compat/src/main/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
rename to compat/src/main/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java b/compat/src/main/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
rename to compat/src/main/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityNodeProviderCompat.java b/compat/src/main/java/android/support/v4/view/accessibility/AccessibilityNodeProviderCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/accessibility/AccessibilityNodeProviderCompat.java
rename to compat/src/main/java/android/support/v4/view/accessibility/AccessibilityNodeProviderCompat.java
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java b/compat/src/main/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java
rename to compat/src/main/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java b/compat/src/main/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java
rename to compat/src/main/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java
diff --git a/compat/java/android/support/v4/view/accessibility/package.html b/compat/src/main/java/android/support/v4/view/accessibility/package.html
similarity index 100%
rename from compat/java/android/support/v4/view/accessibility/package.html
rename to compat/src/main/java/android/support/v4/view/accessibility/package.html
diff --git a/compat/java/android/support/v4/view/animation/PathInterpolatorApi14.java b/compat/src/main/java/android/support/v4/view/animation/PathInterpolatorApi14.java
similarity index 100%
rename from compat/java/android/support/v4/view/animation/PathInterpolatorApi14.java
rename to compat/src/main/java/android/support/v4/view/animation/PathInterpolatorApi14.java
diff --git a/compat/java/android/support/v4/view/animation/PathInterpolatorCompat.java b/compat/src/main/java/android/support/v4/view/animation/PathInterpolatorCompat.java
similarity index 100%
rename from compat/java/android/support/v4/view/animation/PathInterpolatorCompat.java
rename to compat/src/main/java/android/support/v4/view/animation/PathInterpolatorCompat.java
diff --git a/compat/java/android/support/v4/view/package.html b/compat/src/main/java/android/support/v4/view/package.html
similarity index 100%
rename from compat/java/android/support/v4/view/package.html
rename to compat/src/main/java/android/support/v4/view/package.html
diff --git a/compat/java/android/support/v4/widget/AutoSizeableTextView.java b/compat/src/main/java/android/support/v4/widget/AutoSizeableTextView.java
similarity index 100%
rename from compat/java/android/support/v4/widget/AutoSizeableTextView.java
rename to compat/src/main/java/android/support/v4/widget/AutoSizeableTextView.java
diff --git a/compat/java/android/support/v4/widget/CompoundButtonCompat.java b/compat/src/main/java/android/support/v4/widget/CompoundButtonCompat.java
similarity index 100%
rename from compat/java/android/support/v4/widget/CompoundButtonCompat.java
rename to compat/src/main/java/android/support/v4/widget/CompoundButtonCompat.java
diff --git a/compat/java/android/support/v4/widget/EdgeEffectCompat.java b/compat/src/main/java/android/support/v4/widget/EdgeEffectCompat.java
similarity index 97%
rename from compat/java/android/support/v4/widget/EdgeEffectCompat.java
rename to compat/src/main/java/android/support/v4/widget/EdgeEffectCompat.java
index 9293e60..0d370a8 100644
--- a/compat/java/android/support/v4/widget/EdgeEffectCompat.java
+++ b/compat/src/main/java/android/support/v4/widget/EdgeEffectCompat.java
@@ -18,6 +18,7 @@
 import android.content.Context;
 import android.graphics.Canvas;
 import android.os.Build;
+import android.support.annotation.NonNull;
 import android.support.annotation.RequiresApi;
 import android.widget.EdgeEffect;
 
@@ -170,7 +171,8 @@
      *
      * @see {@link EdgeEffect#onPull(float, float)}
      */
-    public static void onPull(EdgeEffect edgeEffect, float deltaDistance, float displacement) {
+    public static void onPull(@NonNull EdgeEffect edgeEffect, float deltaDistance,
+            float displacement) {
         IMPL.onPull(edgeEffect, deltaDistance, displacement);
     }
 
diff --git a/compat/java/android/support/v4/widget/ImageViewCompat.java b/compat/src/main/java/android/support/v4/widget/ImageViewCompat.java
similarity index 91%
rename from compat/java/android/support/v4/widget/ImageViewCompat.java
rename to compat/src/main/java/android/support/v4/widget/ImageViewCompat.java
index acaaf63..b517de5 100644
--- a/compat/java/android/support/v4/widget/ImageViewCompat.java
+++ b/compat/src/main/java/android/support/v4/widget/ImageViewCompat.java
@@ -20,6 +20,8 @@
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
 import android.widget.ImageView;
 
@@ -130,21 +132,24 @@
     /**
      * Return the tint applied to the image drawable, if specified.
      */
-    public static ColorStateList getImageTintList(ImageView view) {
+    @Nullable
+    public static ColorStateList getImageTintList(@NonNull ImageView view) {
         return IMPL.getImageTintList(view);
     }
 
     /**
      * Applies a tint to the image drawable.
      */
-    public static void setImageTintList(ImageView view, ColorStateList tintList) {
+    public static void setImageTintList(@NonNull ImageView view,
+            @Nullable ColorStateList tintList) {
         IMPL.setImageTintList(view, tintList);
     }
 
     /**
      * Return the blending mode used to apply the tint to the image drawable, if specified.
      */
-    public static PorterDuff.Mode getImageTintMode(ImageView view) {
+    @Nullable
+    public static PorterDuff.Mode getImageTintMode(@NonNull ImageView view) {
         return IMPL.getImageTintMode(view);
     }
 
@@ -153,7 +158,7 @@
      * {@link #setImageTintList(android.widget.ImageView, android.content.res.ColorStateList)}
      * to the image drawable. The default mode is {@link PorterDuff.Mode#SRC_IN}.
      */
-    public static void setImageTintMode(ImageView view, PorterDuff.Mode mode) {
+    public static void setImageTintMode(@NonNull ImageView view, @Nullable PorterDuff.Mode mode) {
         IMPL.setImageTintMode(view, mode);
     }
 
diff --git a/compat/java/android/support/v4/widget/ListPopupWindowCompat.java b/compat/src/main/java/android/support/v4/widget/ListPopupWindowCompat.java
similarity index 95%
rename from compat/java/android/support/v4/widget/ListPopupWindowCompat.java
rename to compat/src/main/java/android/support/v4/widget/ListPopupWindowCompat.java
index ab86e58..4532733 100644
--- a/compat/java/android/support/v4/widget/ListPopupWindowCompat.java
+++ b/compat/src/main/java/android/support/v4/widget/ListPopupWindowCompat.java
@@ -17,6 +17,8 @@
 package android.support.v4.widget;
 
 import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.view.View;
 import android.view.View.OnTouchListener;
 import android.widget.ListPopupWindow;
@@ -88,8 +90,9 @@
      * @return a touch listener that controls drag-to-open behavior, or {@code null} on
      *         unsupported APIs
      */
+    @Nullable
     public static OnTouchListener createDragToOpenListener(
-            ListPopupWindow listPopupWindow, View src) {
+            @NonNull ListPopupWindow listPopupWindow, @NonNull View src) {
         if (Build.VERSION.SDK_INT >= 19) {
             return listPopupWindow.createDragToOpenListener(src);
         } else {
diff --git a/compat/java/android/support/v4/widget/ListViewCompat.java b/compat/src/main/java/android/support/v4/widget/ListViewCompat.java
similarity index 100%
rename from compat/java/android/support/v4/widget/ListViewCompat.java
rename to compat/src/main/java/android/support/v4/widget/ListViewCompat.java
diff --git a/compat/java/android/support/v4/widget/PopupMenuCompat.java b/compat/src/main/java/android/support/v4/widget/PopupMenuCompat.java
similarity index 91%
rename from compat/java/android/support/v4/widget/PopupMenuCompat.java
rename to compat/src/main/java/android/support/v4/widget/PopupMenuCompat.java
index 639a84b..10c5ff3 100644
--- a/compat/java/android/support/v4/widget/PopupMenuCompat.java
+++ b/compat/src/main/java/android/support/v4/widget/PopupMenuCompat.java
@@ -17,6 +17,8 @@
 package android.support.v4.widget;
 
 import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.view.View.OnTouchListener;
 import android.widget.PopupMenu;
 
@@ -47,7 +49,8 @@
      * @return a touch listener that controls drag-to-open behavior, or {@code null} on
      *         unsupported APIs
      */
-    public static OnTouchListener getDragToOpenListener(Object popupMenu) {
+    @Nullable
+    public static OnTouchListener getDragToOpenListener(@NonNull Object popupMenu) {
         if (Build.VERSION.SDK_INT >= 19) {
             return ((PopupMenu) popupMenu).getDragToOpenListener();
         } else {
diff --git a/compat/java/android/support/v4/widget/PopupWindowCompat.java b/compat/src/main/java/android/support/v4/widget/PopupWindowCompat.java
similarity index 94%
rename from compat/java/android/support/v4/widget/PopupWindowCompat.java
rename to compat/src/main/java/android/support/v4/widget/PopupWindowCompat.java
index d846b40..d9de3db 100644
--- a/compat/java/android/support/v4/widget/PopupWindowCompat.java
+++ b/compat/src/main/java/android/support/v4/widget/PopupWindowCompat.java
@@ -17,6 +17,7 @@
 package android.support.v4.widget;
 
 import android.os.Build;
+import android.support.annotation.NonNull;
 import android.support.annotation.RequiresApi;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.view.ViewCompat;
@@ -213,8 +214,8 @@
      * @param yoff A vertical offset from the anchor in pixels
      * @param gravity Alignment of the popup relative to the anchor
      */
-    public static void showAsDropDown(PopupWindow popup, View anchor, int xoff, int yoff,
-            int gravity) {
+    public static void showAsDropDown(@NonNull PopupWindow popup, @NonNull View anchor,
+            int xoff, int yoff, int gravity) {
         IMPL.showAsDropDown(popup, anchor, xoff, yoff, gravity);
     }
 
@@ -224,7 +225,7 @@
      *
      * @param overlapAnchor Whether the popup should overlap its anchor.
      */
-    public static void setOverlapAnchor(PopupWindow popupWindow, boolean overlapAnchor) {
+    public static void setOverlapAnchor(@NonNull PopupWindow popupWindow, boolean overlapAnchor) {
         IMPL.setOverlapAnchor(popupWindow, overlapAnchor);
     }
 
@@ -234,7 +235,7 @@
      *
      * @return Whether the popup should overlap its anchor.
      */
-    public static boolean getOverlapAnchor(PopupWindow popupWindow) {
+    public static boolean getOverlapAnchor(@NonNull PopupWindow popupWindow) {
         return IMPL.getOverlapAnchor(popupWindow);
     }
 
@@ -247,7 +248,7 @@
      *
      * @see android.view.WindowManager.LayoutParams#type
      */
-    public static void setWindowLayoutType(PopupWindow popupWindow, int layoutType) {
+    public static void setWindowLayoutType(@NonNull PopupWindow popupWindow, int layoutType) {
         IMPL.setWindowLayoutType(popupWindow, layoutType);
     }
 
@@ -256,7 +257,7 @@
      *
      * @see #setWindowLayoutType(PopupWindow popupWindow, int)
      */
-    public static int getWindowLayoutType(PopupWindow popupWindow) {
+    public static int getWindowLayoutType(@NonNull PopupWindow popupWindow) {
         return IMPL.getWindowLayoutType(popupWindow);
     }
 }
diff --git a/compat/java/android/support/v4/widget/ScrollerCompat.java b/compat/src/main/java/android/support/v4/widget/ScrollerCompat.java
similarity index 100%
rename from compat/java/android/support/v4/widget/ScrollerCompat.java
rename to compat/src/main/java/android/support/v4/widget/ScrollerCompat.java
diff --git a/compat/java/android/support/v4/widget/TextViewCompat.java b/compat/src/main/java/android/support/v4/widget/TextViewCompat.java
similarity index 97%
rename from compat/java/android/support/v4/widget/TextViewCompat.java
rename to compat/src/main/java/android/support/v4/widget/TextViewCompat.java
index 8d9e4ab..dc87a38 100644
--- a/compat/java/android/support/v4/widget/TextViewCompat.java
+++ b/compat/src/main/java/android/support/v4/widget/TextViewCompat.java
@@ -479,6 +479,7 @@
     /**
      * Returns drawables for the start, top, end, and bottom borders from the given text view.
      */
+    @NonNull
     public static Drawable[] getCompoundDrawablesRelative(@NonNull TextView textView) {
         return IMPL.getCompoundDrawablesRelative(textView);
     }
@@ -493,7 +494,8 @@
      *
      * @attr name android:autoSizeTextType
      */
-    public static void setAutoSizeTextTypeWithDefaults(TextView textView, int autoSizeTextType) {
+    public static void setAutoSizeTextTypeWithDefaults(@NonNull TextView textView,
+            int autoSizeTextType) {
         IMPL.setAutoSizeTextTypeWithDefaults(textView, autoSizeTextType);
     }
 
@@ -519,7 +521,7 @@
      * @attr name android:autoSizeStepGranularity
      */
     public static void setAutoSizeTextTypeUniformWithConfiguration(
-            TextView textView,
+            @NonNull TextView textView,
             int autoSizeMinTextSize,
             int autoSizeMaxTextSize,
             int autoSizeStepGranularity,
@@ -542,7 +544,7 @@
      * @attr name android:autoSizeTextType
      * @attr name android:autoSizePresetSizes
      */
-    public static void setAutoSizeTextTypeUniformWithPresetSizes(TextView textView,
+    public static void setAutoSizeTextTypeUniformWithPresetSizes(@NonNull TextView textView,
             @NonNull int[] presetSizes, int unit) throws IllegalArgumentException {
         IMPL.setAutoSizeTextTypeUniformWithPresetSizes(textView, presetSizes, unit);
     }
@@ -556,7 +558,7 @@
      *
      * @attr name android:autoSizeTextType
      */
-    public static int getAutoSizeTextType(TextView textView) {
+    public static int getAutoSizeTextType(@NonNull TextView textView) {
         return IMPL.getAutoSizeTextType(textView);
     }
 
@@ -565,7 +567,7 @@
      *
      * @attr name android:autoSizeStepGranularity
      */
-    public static int getAutoSizeStepGranularity(TextView textView) {
+    public static int getAutoSizeStepGranularity(@NonNull TextView textView) {
         return IMPL.getAutoSizeStepGranularity(textView);
     }
 
@@ -575,7 +577,7 @@
      *
      * @attr name android:autoSizeMinTextSize
      */
-    public static int getAutoSizeMinTextSize(TextView textView) {
+    public static int getAutoSizeMinTextSize(@NonNull TextView textView) {
         return IMPL.getAutoSizeMinTextSize(textView);
     }
 
@@ -585,7 +587,7 @@
      *
      * @attr name android:autoSizeMaxTextSize
      */
-    public static int getAutoSizeMaxTextSize(TextView textView) {
+    public static int getAutoSizeMaxTextSize(@NonNull TextView textView) {
         return IMPL.getAutoSizeMaxTextSize(textView);
     }
 
@@ -594,7 +596,8 @@
      *
      * @attr name android:autoSizePresetSizes
      */
-    public static int[] getAutoSizeTextAvailableSizes(TextView textView) {
+    @NonNull
+    public static int[] getAutoSizeTextAvailableSizes(@NonNull TextView textView) {
         return IMPL.getAutoSizeTextAvailableSizes(textView);
     }
 }
diff --git a/compat/java/android/support/v4/widget/TintableCompoundButton.java b/compat/src/main/java/android/support/v4/widget/TintableCompoundButton.java
similarity index 100%
rename from compat/java/android/support/v4/widget/TintableCompoundButton.java
rename to compat/src/main/java/android/support/v4/widget/TintableCompoundButton.java
diff --git a/compat/java/android/support/v4/widget/TintableImageSourceView.java b/compat/src/main/java/android/support/v4/widget/TintableImageSourceView.java
similarity index 100%
rename from compat/java/android/support/v4/widget/TintableImageSourceView.java
rename to compat/src/main/java/android/support/v4/widget/TintableImageSourceView.java
diff --git a/compat/java/android/support/v4/widget/package.html b/compat/src/main/java/android/support/v4/widget/package.html
similarity index 100%
rename from compat/java/android/support/v4/widget/package.html
rename to compat/src/main/java/android/support/v4/widget/package.html
diff --git a/compat/tests/java/android/support/v4/app/ActivityCompatTest.java b/compat/tests/java/android/support/v4/app/ActivityCompatTest.java
new file mode 100644
index 0000000..3b4f1b5
--- /dev/null
+++ b/compat/tests/java/android/support/v4/app/ActivityCompatTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.app;
+
+import static org.mockito.AdditionalMatchers.aryEq;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.same;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import android.Manifest;
+import android.app.Activity;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.BaseInstrumentationTestCase;
+import android.support.v4.app.ActivityCompat.PermissionCompatDelegate;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class ActivityCompatTest extends BaseInstrumentationTestCase<TestSupportActivity> {
+
+    public ActivityCompatTest() {
+        super(TestSupportActivity.class);
+    }
+
+    @SmallTest
+    @Test
+    public void testPermissionDelegate() {
+        Activity activity = mActivityTestRule.getActivity();
+        ActivityCompat.PermissionCompatDelegate delegate = mock(PermissionCompatDelegate.class);
+
+        // First test setting the delegate
+        ActivityCompat.setPermissionCompatDelegate(delegate);
+
+        ActivityCompat.requestPermissions(activity, new String[]{
+                Manifest.permission.ACCESS_FINE_LOCATION}, 42);
+        verify(delegate).requestPermissions(same(activity), aryEq(
+                new String[]{Manifest.permission.ACCESS_FINE_LOCATION}), eq(42));
+
+        // Test clearing the delegate
+        ActivityCompat.setPermissionCompatDelegate(null);
+
+        ActivityCompat.requestPermissions(activity, new String[]{
+                Manifest.permission.ACCESS_FINE_LOCATION}, 42);
+        verifyNoMoreInteractions(delegate);
+    }
+}
diff --git a/compat/tests/java/android/support/v4/content/res/FontResourcesParserCompatTest.java b/compat/tests/java/android/support/v4/content/res/FontResourcesParserCompatTest.java
index e7f40cf..6120eed 100644
--- a/compat/tests/java/android/support/v4/content/res/FontResourcesParserCompatTest.java
+++ b/compat/tests/java/android/support/v4/content/res/FontResourcesParserCompatTest.java
@@ -28,6 +28,7 @@
 import android.app.Instrumentation;
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
+import android.os.Build;
 import android.support.compat.test.R;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
@@ -89,6 +90,41 @@
     }
 
     @Test
+    public void testParseAndroidAttrs() throws XmlPullParserException, IOException {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {
+            // The following tests are only expected to pass on v22+ devices. The android
+            // resources are stripped in older versions and hence won't be parsed.
+            return;
+        }
+
+        @SuppressLint("ResourceType")
+        XmlResourceParser parser = mResources.getXml(R.font.samplexmlfont2);
+
+        FamilyResourceEntry result = FontResourcesParserCompat.parse(parser, mResources);
+
+        assertNotNull(result);
+        FontFamilyFilesResourceEntry filesEntry = (FontFamilyFilesResourceEntry) result;
+        FontFileResourceEntry[] fileEntries = filesEntry.getEntries();
+        assertEquals(4, fileEntries.length);
+        FontFileResourceEntry font1 = fileEntries[0];
+        assertEquals(400, font1.getWeight());
+        assertEquals(false, font1.isItalic());
+        assertEquals(R.font.samplefont, font1.getResourceId());
+        FontFileResourceEntry font2 = fileEntries[1];
+        assertEquals(400, font2.getWeight());
+        assertEquals(true, font2.isItalic());
+        assertEquals(R.font.samplefont2, font2.getResourceId());
+        FontFileResourceEntry font3 = fileEntries[2];
+        assertEquals(700, font3.getWeight());
+        assertEquals(false, font3.isItalic());
+        assertEquals(R.font.samplefont3, font3.getResourceId());
+        FontFileResourceEntry font4 = fileEntries[3];
+        assertEquals(700, font4.getWeight());
+        assertEquals(true, font4.isItalic());
+        assertEquals(R.font.samplefont4, font4.getResourceId());
+    }
+
+    @Test
     public void testParseDownloadableFont() throws IOException, XmlPullParserException {
         @SuppressLint("ResourceType")
         XmlResourceParser parser = mResources.getXml(R.font.samplexmldownloadedfont);
@@ -98,10 +134,10 @@
         assertNotNull(result);
         ProviderResourceEntry providerEntry = (ProviderResourceEntry) result;
         FontRequest request = providerEntry.getRequest();
-        assertEquals("com.example.test.fontprovider.authority",
+        assertEquals("android.support.provider.fonts.font",
                 request.getProviderAuthority());
-        assertEquals("com.example.test.fontprovider.package", request.getProviderPackage());
-        assertEquals("MyRequestedFont", request.getQuery());
+        assertEquals("android.support.compat.test", request.getProviderPackage());
+        assertEquals("singleFontFamily", request.getQuery());
     }
 
     @Test
diff --git a/compat/tests/java/android/support/v4/content/res/ResourcesCompatTest.java b/compat/tests/java/android/support/v4/content/res/ResourcesCompatTest.java
index 56f5ab4..b326dd6 100644
--- a/compat/tests/java/android/support/v4/content/res/ResourcesCompatTest.java
+++ b/compat/tests/java/android/support/v4/content/res/ResourcesCompatTest.java
@@ -20,6 +20,7 @@
 import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
 
 import android.content.Context;
 import android.content.res.ColorStateList;
@@ -27,15 +28,21 @@
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
+import android.support.annotation.NonNull;
 import android.support.compat.test.R;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
+import android.support.v4.provider.FontsContractCompat;
+import android.support.v4.provider.MockFontProvider;
 import android.support.v4.testutils.TestUtils;
 import android.util.DisplayMetrics;
 
 import org.junit.Before;
 import org.junit.Test;
 
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 @SmallTest
 public class ResourcesCompatTest {
     private Context mContext;
@@ -45,6 +52,7 @@
     public void setup() {
         mContext = InstrumentationRegistry.getContext();
         mResources = mContext.getResources();
+        MockFontProvider.prepareFontFiles(mContext);
     }
 
     @Test
@@ -293,15 +301,49 @@
     }
 
     @Test
-    public void testGetFont_fontFile() {
+    public void testGetFont_fontFile_sync() {
         Typeface font = ResourcesCompat.getFont(mContext, R.font.samplefont);
 
         assertNotNull(font);
         assertNotSame(Typeface.DEFAULT, font);
     }
 
+    private static final class FontCallback extends ResourcesCompat.FontCallback {
+        private final CountDownLatch mLatch;
+        Typeface mTypeface;
+
+        FontCallback(CountDownLatch latch) {
+            mLatch = latch;
+        }
+
+        @Override
+        public void onFontRetrieved(@NonNull Typeface typeface) {
+            mTypeface = typeface;
+            mLatch.countDown();
+        }
+
+        @Override
+        public void onFontRetrievalFailed(int reason) {
+            mLatch.countDown();
+        }
+    }
+
     @Test
-    public void testGetFont_xmlFile() {
+    public void testGetFont_fontFile_async() throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(1);
+        final FontCallback callback = new FontCallback(latch);
+        FontsContractCompat.resetCache();
+
+        ResourcesCompat.getFont(mContext, R.font.samplefont, callback, null);
+
+        assertTrue(latch.await(5L, TimeUnit.SECONDS));
+
+        assertNotNull(callback.mTypeface);
+        assertNotSame(Typeface.DEFAULT, callback.mTypeface);
+    }
+
+    @Test
+    public void testGetFont_xmlFile_sync() {
         Typeface font = ResourcesCompat.getFont(mContext, R.font.samplexmlfont);
 
         assertNotNull(font);
@@ -309,6 +351,47 @@
     }
 
     @Test
+    public void testGetFont_xmlFile_async() throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(1);
+        final FontCallback callback = new FontCallback(latch);
+
+        ResourcesCompat.getFont(mContext, R.font.samplexmlfont, callback, null);
+
+        assertTrue(latch.await(5L, TimeUnit.SECONDS));
+
+        assertNotNull(callback.mTypeface);
+        assertNotSame(Typeface.DEFAULT, callback.mTypeface);
+    }
+
+    @Test
+    public void testGetFont_xmlProviderFile_sync() {
+        Typeface font = ResourcesCompat.getFont(mContext, R.font.samplexmldownloadedfont);
+
+        assertNotNull(font);
+        assertNotSame(Typeface.DEFAULT, font);
+    }
+
+    @Test
+    public void testGetFont_xmlProviderFile_async() throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(1);
+        final FontCallback callback = new FontCallback(latch);
+
+        // Font provider non-blocking requests post on the calling thread so can't run on
+        // the test thread as it doesn't have a Looper.
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                ResourcesCompat.getFont(mContext, R.font.samplexmldownloadedfont, callback, null);
+            }
+        });
+
+        assertTrue(latch.await(5L, TimeUnit.SECONDS));
+
+        assertNotNull(callback.mTypeface);
+        assertNotSame(Typeface.DEFAULT, callback.mTypeface);
+    }
+
+    @Test
     public void testGetFont_invalidXmlFile() {
         try {
             assertNull(
diff --git a/compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java b/compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java
index dab7f0f..dff4c33 100644
--- a/compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java
+++ b/compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java
@@ -17,7 +17,10 @@
 package android.support.v4.graphics;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 import android.annotation.SuppressLint;
 import android.app.Instrumentation;
@@ -28,16 +31,17 @@
 import android.content.res.Resources;
 import android.graphics.Paint;
 import android.graphics.Typeface;
+import android.support.annotation.NonNull;
 import android.support.compat.test.R;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
-import android.support.testutils.PollingCheck;
 import android.support.v4.content.res.FontResourcesParserCompat;
 import android.support.v4.content.res.FontResourcesParserCompat.FamilyResourceEntry;
 import android.support.v4.content.res.FontResourcesParserCompat.ProviderResourceEntry;
+import android.support.v4.content.res.ResourcesCompat;
 import android.support.v4.provider.FontRequest;
+import android.support.v4.provider.FontsContractCompat;
 import android.support.v4.provider.MockFontProvider;
-import android.widget.TextView;
 
 import org.junit.After;
 import org.junit.Before;
@@ -47,6 +51,8 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 @SmallTest
 public class TypefaceCompatTest {
@@ -134,91 +140,169 @@
         return new ProviderResourceEntry(request, entry.getFetchStrategy(), entry.getTimeout());
     }
 
-    @Test
-    public void testCreateFromResourcesFamilyXml_resourceFont_syncloading() throws Exception {
-        Typeface typeface = TypefaceCompat.createFromResourcesFamilyXml(mContext,
-                getProviderResourceEntry(R.font.styletest_sync_providerfont), mResources,
-                R.font.styletest_sync_providerfont, Typeface.NORMAL, null /* TextView */);
-        typeface = Typeface.create(typeface, Typeface.NORMAL);
-        assertEquals(R.font.large_a, getSelectedFontResourceId(typeface));
+    public static class FontCallback extends ResourcesCompat.FontCallback {
+        private final CountDownLatch mLatch;
+        Typeface mTypeface;
 
-        typeface = TypefaceCompat.createFromResourcesFamilyXml(mContext,
-                getProviderResourceEntry(R.font.styletest_sync_providerfont), mResources,
-                R.font.styletest_sync_providerfont, Typeface.ITALIC, null /* TextView */);
-        typeface = Typeface.create(typeface, Typeface.ITALIC);
-        assertEquals(R.font.large_b, getSelectedFontResourceId(typeface));
+        FontCallback(CountDownLatch latch) {
+            mLatch = latch;
+        }
 
-        typeface = TypefaceCompat.createFromResourcesFamilyXml(mContext,
-                getProviderResourceEntry(R.font.styletest_sync_providerfont), mResources,
-                R.font.styletest_sync_providerfont, Typeface.BOLD, null /* TextView */);
-        typeface = Typeface.create(typeface, Typeface.BOLD);
-        assertEquals(R.font.large_c, getSelectedFontResourceId(typeface));
+        @Override
+        public void onFontRetrieved(@NonNull Typeface typeface) {
+            mTypeface = typeface;
+            mLatch.countDown();
+        }
 
-        typeface = TypefaceCompat.createFromResourcesFamilyXml(mContext,
-                getProviderResourceEntry(R.font.styletest_sync_providerfont), mResources,
-                R.font.styletest_sync_providerfont, Typeface.BOLD_ITALIC, null /* TextView */);
-        typeface = Typeface.create(typeface, Typeface.BOLD_ITALIC);
-        assertEquals(R.font.large_d, getSelectedFontResourceId(typeface));
+        @Override
+        public void onFontRetrievalFailed(int reason) {
+            mLatch.countDown();
+        }
     }
 
     @Test
     public void testCreateFromResourcesFamilyXml_resourceFont_asyncloading() throws Exception {
+        final Instrumentation inst = InstrumentationRegistry.getInstrumentation();
+        CountDownLatch latch = new CountDownLatch(1);
+        final FontCallback callback = new FontCallback(latch);
+
+        inst.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                TypefaceCompat.createFromResourcesFamilyXml(mContext,
+                        getProviderResourceEntry(R.font.styletest_async_providerfont), mResources,
+                        R.font.styletest_async_providerfont, Typeface.NORMAL, callback,
+                        null /* handler */, false /* isXmlRequest */);
+            }
+        });
+        assertTrue(latch.await(5L, TimeUnit.SECONDS));
+
+        assertEquals(R.font.large_a, getSelectedFontResourceId(callback.mTypeface));
+
+        latch = new CountDownLatch(1);
+        final FontCallback callback2 = new FontCallback(latch);
+        inst.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                TypefaceCompat.createFromResourcesFamilyXml(mContext,
+                        getProviderResourceEntry(R.font.styletest_async_providerfont), mResources,
+                        R.font.styletest_async_providerfont, Typeface.ITALIC, callback2,
+                        null /* handler */, false /* isXmlRequest */);
+            }
+        });
+        assertTrue(latch.await(5L, TimeUnit.SECONDS));
+        assertEquals(R.font.large_b, getSelectedFontResourceId(callback2.mTypeface));
+
+        latch = new CountDownLatch(1);
+        final FontCallback callback3 = new FontCallback(latch);
+        inst.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                TypefaceCompat.createFromResourcesFamilyXml(mContext,
+                        getProviderResourceEntry(R.font.styletest_async_providerfont), mResources,
+                        R.font.styletest_async_providerfont, Typeface.BOLD, callback3,
+                        null /* handler */, false /* isXmlRequest */);
+            }
+        });
+        assertTrue(latch.await(5L, TimeUnit.SECONDS));
+        assertEquals(R.font.large_c, getSelectedFontResourceId(callback3.mTypeface));
+
+        latch = new CountDownLatch(1);
+        final FontCallback callback4 = new FontCallback(latch);
+        inst.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                TypefaceCompat.createFromResourcesFamilyXml(mContext,
+                        getProviderResourceEntry(R.font.styletest_async_providerfont), mResources,
+                        R.font.styletest_async_providerfont, Typeface.BOLD_ITALIC, callback4,
+                        null /* handler */, false /* isXmlRequest */);
+            }
+        });
+        assertTrue(latch.await(5L, TimeUnit.SECONDS));
+        assertEquals(R.font.large_d, getSelectedFontResourceId(callback4.mTypeface));
+    }
+
+    @Test
+    public void testProviderFont_xmlRequest() {
+        Typeface typeface = TypefaceCompat.createFromResourcesFamilyXml(mContext,
+                getProviderResourceEntry(R.font.samplexmldownloadedfontblocking), mResources,
+                R.font.samplexmldownloadedfontblocking, Typeface.NORMAL, null,
+                null /* handler */, true /* isXmlRequest */);
+
+        assertNotNull(typeface);
+        assertNotEquals(Typeface.DEFAULT, typeface);
+    }
+
+    @Test
+    public void testProviderFont_nonXmlRequest_noCallback() {
+        // If we don't give a callback, the request should be blocking.
+        Typeface typeface = TypefaceCompat.createFromResourcesFamilyXml(mContext,
+                getProviderResourceEntry(R.font.samplexmldownloadedfontblocking), mResources,
+                R.font.samplexmldownloadedfontblocking, Typeface.NORMAL, null,
+                null /* handler */, false /* isXmlRequest */);
+
+        assertNotNull(typeface);
+        assertNotEquals(Typeface.DEFAULT, typeface);
+    }
+
+    @Test
+    public void testProviderFont_nonXmlRequest_withCallback() throws InterruptedException {
         Instrumentation inst = InstrumentationRegistry.getInstrumentation();
-        final TextView textView = new TextView(mContext);
-        PollingCheck.PollingCheckCondition condition = new PollingCheck.PollingCheckCondition() {
-            @Override
-            public boolean canProceed() {
-                return textView.getTypeface() != null;
-            }
-        };
+        CountDownLatch latch = new CountDownLatch(1);
+        final FontCallback callback = new FontCallback(latch);
+        FontsContractCompat.resetCache();
 
-        textView.setTypeface(null);
+        final Typeface[] result = new Typeface[1];
         inst.runOnMainSync(new Runnable() {
             @Override
             public void run() {
-                TypefaceCompat.createFromResourcesFamilyXml(mContext,
-                        getProviderResourceEntry(R.font.styletest_async_providerfont), mResources,
-                        R.font.styletest_async_providerfont, Typeface.NORMAL, textView);
+                result[0] = TypefaceCompat.createFromResourcesFamilyXml(mContext,
+                        getProviderResourceEntry(R.font.samplexmldownloadedfontblocking),
+                        mResources, R.font.samplexmldownloadedfontblocking, Typeface.NORMAL,
+                        callback, null /* handler */, false /* isXmlRequest */);
             }
         });
-        PollingCheck.waitFor(condition);
-        assertEquals(R.font.large_a, getSelectedFontResourceId(textView.getTypeface()));
+        assertTrue(latch.await(5L, TimeUnit.SECONDS));
+        assertNotNull(callback.mTypeface);
+        assertNull(result[0]);
+    }
 
-        textView.setTypeface(null);
+    @Test
+    public void testProviderFont_nonXmlRequest_withCallback_cached() throws InterruptedException {
+        Instrumentation inst = InstrumentationRegistry.getInstrumentation();
+        CountDownLatch latch = new CountDownLatch(1);
+        final FontCallback callback = new FontCallback(latch);
+        FontsContractCompat.resetCache();
+
+        final Typeface[] result = new Typeface[2];
         inst.runOnMainSync(new Runnable() {
             @Override
             public void run() {
-                TypefaceCompat.createFromResourcesFamilyXml(mContext,
-                        getProviderResourceEntry(R.font.styletest_async_providerfont), mResources,
-                        R.font.styletest_async_providerfont, Typeface.ITALIC, textView);
+                result[0] = TypefaceCompat.createFromResourcesFamilyXml(mContext,
+                        getProviderResourceEntry(R.font.samplexmldownloadedfontblocking),
+                        mResources, R.font.samplexmldownloadedfontblocking, Typeface.NORMAL,
+                        callback, null /* handler */, false /* isXmlRequest */);
             }
         });
-        PollingCheck.waitFor(condition);
-        assertEquals(R.font.large_b, getSelectedFontResourceId(textView.getTypeface()));
+        assertTrue(latch.await(5L, TimeUnit.SECONDS));
+        assertNotNull(callback.mTypeface);
+        assertNull(result[0]);
 
-        textView.setTypeface(null);
+        latch = new CountDownLatch(1);
+        final FontCallback callback2 = new FontCallback(latch);
+
         inst.runOnMainSync(new Runnable() {
             @Override
             public void run() {
-                TypefaceCompat.createFromResourcesFamilyXml(mContext,
-                        getProviderResourceEntry(R.font.styletest_async_providerfont), mResources,
-                        R.font.styletest_async_providerfont, Typeface.BOLD, textView);
+                result[1] = TypefaceCompat.createFromResourcesFamilyXml(mContext,
+                        getProviderResourceEntry(R.font.samplexmldownloadedfontblocking),
+                        mResources, R.font.samplexmldownloadedfontblocking, Typeface.NORMAL,
+                        callback2, null /* handler */, false /* isXmlRequest */);
             }
         });
-        PollingCheck.waitFor(condition);
-        assertEquals(R.font.large_c, getSelectedFontResourceId(textView.getTypeface()));
-
-        textView.setTypeface(null);
-        inst.runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                TypefaceCompat.createFromResourcesFamilyXml(mContext,
-                        getProviderResourceEntry(R.font.styletest_async_providerfont), mResources,
-                        R.font.styletest_async_providerfont, Typeface.BOLD_ITALIC, textView);
-            }
-        });
-        PollingCheck.waitFor(condition);
-        assertEquals(R.font.large_d, getSelectedFontResourceId(textView.getTypeface()));
+        assertTrue(latch.await(5L, TimeUnit.SECONDS));
+        assertNotNull(callback2.mTypeface);
+        assertNotNull(result[1]);
     }
 
     @Test
@@ -228,33 +312,45 @@
         final FamilyResourceEntry entry = FontResourcesParserCompat.parse(
                 mResources.getXml(R.font.styletestfont), mResources);
         Typeface typeface = TypefaceCompat.createFromResourcesFamilyXml(mContext, entry, mResources,
-                R.font.styletestfont, Typeface.NORMAL, null /* text view */);
-        assertEquals(typeface, TypefaceCompat.findFromCache(
-                mResources, R.font.styletestfont, Typeface.NORMAL));
+                R.font.styletestfont, Typeface.NORMAL, null /* callback */, null /* handler */,
+                false /* isXmlRequest */);
+        Typeface cachedTypeface = TypefaceCompat.findFromCache(
+                mResources, R.font.styletestfont, Typeface.NORMAL);
+        assertNotNull(cachedTypeface);
+        assertEquals(typeface, cachedTypeface);
         typeface = Typeface.create(typeface, Typeface.NORMAL);
         // styletestfont has a node of fontStyle="normal" fontWeight="400" font="@font/large_a".
         assertEquals(R.font.large_a, getSelectedFontResourceId(typeface));
 
         typeface = TypefaceCompat.createFromResourcesFamilyXml(mContext, entry, mResources,
-                R.font.styletestfont, Typeface.ITALIC, null);
-        assertEquals(typeface, TypefaceCompat.findFromCache(
-                mResources, R.font.styletestfont, Typeface.ITALIC));
+                R.font.styletestfont, Typeface.ITALIC, null /* callback */, null /* handler */,
+                false /* isXmlRequest */);
+        cachedTypeface = TypefaceCompat.findFromCache(
+                mResources, R.font.styletestfont, Typeface.ITALIC);
+        assertNotNull(cachedTypeface);
+        assertEquals(typeface, cachedTypeface);
         typeface = Typeface.create(typeface, Typeface.ITALIC);
         // styletestfont has a node of fontStyle="italic" fontWeight="400" font="@font/large_b".
         assertEquals(R.font.large_b, getSelectedFontResourceId(typeface));
 
         typeface = TypefaceCompat.createFromResourcesFamilyXml(mContext, entry, mResources,
-                R.font.styletestfont, Typeface.BOLD, null);
-        assertEquals(typeface, TypefaceCompat.findFromCache(
-                mResources, R.font.styletestfont, Typeface.BOLD));
+                R.font.styletestfont, Typeface.BOLD, null /* callback */, null /* handler */,
+                false /* isXmlRequest */);
+        cachedTypeface = TypefaceCompat.findFromCache(
+                mResources, R.font.styletestfont, Typeface.BOLD);
+        assertNotNull(cachedTypeface);
+        assertEquals(typeface, cachedTypeface);
         typeface = Typeface.create(typeface, Typeface.BOLD);
         // styletestfont has a node of fontStyle="normal" fontWeight="700" font="@font/large_c".
         assertEquals(R.font.large_c, getSelectedFontResourceId(typeface));
 
         typeface = TypefaceCompat.createFromResourcesFamilyXml(mContext, entry, mResources,
-                R.font.styletestfont, Typeface.BOLD_ITALIC, null);
-        assertEquals(typeface, TypefaceCompat.findFromCache(
-                mResources, R.font.styletestfont, Typeface.BOLD_ITALIC));
+                R.font.styletestfont, Typeface.BOLD_ITALIC, null /* callback */,
+                null /* handler */, false /* isXmlRequest */);
+        cachedTypeface = TypefaceCompat.findFromCache(
+                mResources, R.font.styletestfont, Typeface.BOLD_ITALIC);
+        assertNotNull(cachedTypeface);
+        assertEquals(typeface, cachedTypeface);
         typeface = Typeface.create(typeface, Typeface.BOLD_ITALIC);
         // styletestfont has a node of fontStyle="italic" fontWeight="700" font="@font/large_d".
         assertEquals(R.font.large_d, getSelectedFontResourceId(typeface));
@@ -265,15 +361,19 @@
         Typeface typeface = TypefaceCompat.createFromResourcesFontFile(mContext, mResources,
                 R.font.large_a, "res/font/large_a.ttf", Typeface.NORMAL);
         assertNotNull(typeface);
-        assertEquals(typeface, TypefaceCompat.findFromCache(
-                mResources, R.font.large_a, Typeface.NORMAL));
+        Typeface cachedTypeface = TypefaceCompat.findFromCache(
+                mResources, R.font.large_a, Typeface.NORMAL);
+        assertNotNull(cachedTypeface);
+        assertEquals(typeface, cachedTypeface);
         assertEquals(R.font.large_a, getSelectedFontResourceId(typeface));
 
         typeface = TypefaceCompat.createFromResourcesFontFile(mContext, mResources, R.font.large_b,
                 "res/font/large_b.ttf", Typeface.NORMAL);
         assertNotNull(typeface);
-        assertEquals(typeface, TypefaceCompat.findFromCache(
-                mResources, R.font.large_b, Typeface.NORMAL));
+        cachedTypeface = TypefaceCompat.findFromCache(
+                mResources, R.font.large_b, Typeface.NORMAL);
+        assertNotNull(cachedTypeface);
+        assertEquals(typeface, cachedTypeface);
         assertEquals(R.font.large_b, getSelectedFontResourceId(typeface));
     }
 }
diff --git a/compat/tests/res/font/samplexmldownloadedfont.xml b/compat/tests/res/font/samplexmldownloadedfont.xml
index 659d196..824ad33 100644
--- a/compat/tests/res/font/samplexmldownloadedfont.xml
+++ b/compat/tests/res/font/samplexmldownloadedfont.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <font-family xmlns:app="http://schemas.android.com/apk/res-auto"
-    app:fontProviderAuthority="com.example.test.fontprovider.authority"
-    app:fontProviderPackage="com.example.test.fontprovider.package"
-    app:fontProviderQuery="MyRequestedFont">
+    app:fontProviderAuthority="android.support.provider.fonts.font"
+    app:fontProviderPackage="android.support.compat.test"
+    app:fontProviderQuery="singleFontFamily"
+    app:fontProviderCerts="@array/mock_provider_certs">
 </font-family>
diff --git a/compat/tests/res/font/samplexmldownloadedfontblocking.xml b/compat/tests/res/font/samplexmldownloadedfontblocking.xml
new file mode 100644
index 0000000..3da2382
--- /dev/null
+++ b/compat/tests/res/font/samplexmldownloadedfontblocking.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<font-family xmlns:app="http://schemas.android.com/apk/res-auto"
+    app:fontProviderAuthority="android.support.provider.fonts.font"
+    app:fontProviderPackage="android.support.compat.test"
+    app:fontProviderQuery="singleFontFamily"
+    app:fontProviderFetchStrategy="blocking"
+    app:fontProviderCerts="@array/mock_provider_certs"
+    app:fontProviderFetchTimeout="-1">
+</font-family>
diff --git a/compat/tests/res/font/samplexmlfont2.xml b/compat/tests/res/font/samplexmlfont2.xml
new file mode 100644
index 0000000..b2f4c50
--- /dev/null
+++ b/compat/tests/res/font/samplexmlfont2.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<font-family xmlns:android="http://schemas.android.com/apk/res/android" >
+    <font android:fontStyle="normal" android:fontWeight="400" android:font="@font/samplefont" />
+    <font android:fontStyle="italic" android:fontWeight="400" android:font="@font/samplefont2" />
+    <font android:fontStyle="normal" android:fontWeight="700" android:font="@font/samplefont3" />
+    <font android:fontStyle="italic" android:fontWeight="700" android:font="@font/samplefont4" />
+</font-family>
diff --git a/compat/tests/res/values/arrays.xml b/compat/tests/res/values/arrays.xml
index 1aa87fd..5c127ca 100644
--- a/compat/tests/res/values/arrays.xml
+++ b/compat/tests/res/values/arrays.xml
@@ -30,4 +30,9 @@
         <item>@array/certs1</item>
         <item>@array/certs2</item>
     </array>
+
+    <!-- These are the actual certs for the test running app. -->
+    <array name="mock_provider_certs">
+        <item>MIIB3TCCAUYCAQEwDQYJKoZIhvcNAQEFBQAwNzEWMBQGA1UEAwwNQW5kcm9pZCBEZWJ1ZzEQMA4GA1UECgwHQW5kcm9pZDELMAkGA1UEBhMCVVMwHhcNMTcwMzEwMjE0NzIxWhcNNDcwMzAzMjE0NzIxWjA3MRYwFAYDVQQDDA1BbmRyb2lkIERlYnVnMRAwDgYDVQQKDAdBbmRyb2lkMQswCQYDVQQGEwJVUzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAg9zgUpOAhXrfE17OYlLWkTGCvnSXWi94SpnyVBVZqq33OCbNKaIi5s314f4rhTFp4LDLFozIUihTOH1pJGLvRFqFu78vIpWBNOlj5mDJThBme6Z+eElnIttK/ivcfyaFM1dc55apQIlf9aDCLX6lEp7p1/O0rJKuXWalte+nYwcCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBE6FFD5jx725gyV9Nevmlv7ndQ8/CKj1NC4C2g7sh/wLtegEU8k6VCUyLRl8EEEnXQUtRg7KVquDWwMTKtXZP8EghQ1AGIklH2u1z4w9DgdD0CrJZ9TGPN3jpbOj5RujkHoRr+g6mwMluq0vH1GnOUMEtshkybq15SbDOmXjEUJA==</item>
+    </array>
 </resources>
\ No newline at end of file
diff --git a/content/Android.mk b/content/Android.mk
index eff8215..32caf53 100644
--- a/content/Android.mk
+++ b/content/Android.mk
@@ -18,7 +18,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-content
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-compat \
diff --git a/content/AndroidManifest.xml b/content/AndroidManifest.xml
index 8304504..8d2bc4b 100644
--- a/content/AndroidManifest.xml
+++ b/content/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="android.support.content">
     <uses-sdk android:minSdkVersion="14" />
-    <application>
-        <meta-data android:name="android.support.content.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/content/api/27.0.0.txt b/content/api/27.0.0.txt
new file mode 100644
index 0000000..e0b4fa3
--- /dev/null
+++ b/content/api/27.0.0.txt
@@ -0,0 +1,54 @@
+package android.support.content {
+
+  public class ContentPager {
+    ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner);
+    ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner, int);
+    method public static android.os.Bundle createArgs(int, int);
+    method public android.support.content.Query query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal, android.support.content.ContentPager.ContentCallback);
+    method public void reset();
+    field public static final int CURSOR_DISPOSITION_COPIED = 1; // 0x1
+    field public static final int CURSOR_DISPOSITION_PAGED = 2; // 0x2
+    field public static final int CURSOR_DISPOSITION_REPAGED = 3; // 0x3
+    field public static final int CURSOR_DISPOSITION_WRAPPED = 4; // 0x4
+    field public static final java.lang.String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
+    field public static final java.lang.String EXTRA_REQUESTED_LIMIT = "android-support:extra-ignored-limit";
+    field public static final java.lang.String EXTRA_SUGGESTED_LIMIT = "android-support:extra-suggested-limit";
+    field public static final java.lang.String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
+    field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-arg-limit";
+    field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-arg-offset";
+  }
+
+  public static abstract interface ContentPager.ContentCallback {
+    method public abstract void onCursorReady(android.support.content.Query, android.database.Cursor);
+  }
+
+  public static abstract class ContentPager.CursorDisposition implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract interface ContentPager.QueryRunner {
+    method public abstract void cancel(android.support.content.Query);
+    method public abstract boolean isRunning(android.support.content.Query);
+    method public abstract void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+  }
+
+  public static abstract interface ContentPager.QueryRunner.Callback {
+    method public abstract void onQueryFinished(android.support.content.Query, android.database.Cursor);
+    method public abstract android.database.Cursor runQueryInBackground(android.support.content.Query);
+  }
+
+  public final class LoaderQueryRunner implements android.support.content.ContentPager.QueryRunner {
+    ctor public LoaderQueryRunner(android.content.Context, android.app.LoaderManager);
+    method public void cancel(android.support.content.Query);
+    method public boolean isRunning(android.support.content.Query);
+    method public void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+  }
+
+  public final class Query {
+    method public int getId();
+    method public int getLimit();
+    method public int getOffset();
+    method public android.net.Uri getUri();
+  }
+
+}
+
diff --git a/content/build.gradle b/content/build.gradle
index 1b2d182..af33423 100644
--- a/content/build.gradle
+++ b/content/build.gradle
@@ -29,11 +29,6 @@
     defaultConfig {
         minSdkVersion 14
     }
-
-    sourceSets {
-        main.java.srcDirs = ['src']
-        main.res.srcDir 'res'
-    }
 }
 
 supportLibrary {
diff --git a/content/src/android/support/content/ContentPager.java b/content/src/main/java/android/support/content/ContentPager.java
similarity index 100%
rename from content/src/android/support/content/ContentPager.java
rename to content/src/main/java/android/support/content/ContentPager.java
diff --git a/content/src/android/support/content/InMemoryCursor.java b/content/src/main/java/android/support/content/InMemoryCursor.java
similarity index 100%
rename from content/src/android/support/content/InMemoryCursor.java
rename to content/src/main/java/android/support/content/InMemoryCursor.java
diff --git a/content/src/android/support/content/LoaderQueryRunner.java b/content/src/main/java/android/support/content/LoaderQueryRunner.java
similarity index 100%
rename from content/src/android/support/content/LoaderQueryRunner.java
rename to content/src/main/java/android/support/content/LoaderQueryRunner.java
diff --git a/content/src/android/support/content/Query.java b/content/src/main/java/android/support/content/Query.java
similarity index 100%
rename from content/src/android/support/content/Query.java
rename to content/src/main/java/android/support/content/Query.java
diff --git a/core-ui/Android.mk b/core-ui/Android.mk
index bb7a4be..184d7be 100644
--- a/core-ui/Android.mk
+++ b/core-ui/Android.mk
@@ -26,7 +26,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-core-ui
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under,java)
+LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-compat \
diff --git a/core-ui/AndroidManifest.xml b/core-ui/AndroidManifest.xml
index 715f92c..f498d26 100644
--- a/core-ui/AndroidManifest.xml
+++ b/core-ui/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.coreui">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.coreui.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/core-ui/api/26.1.0.txt b/core-ui/api/26.1.0.txt
new file mode 100644
index 0000000..6ae4b1a
--- /dev/null
+++ b/core-ui/api/26.1.0.txt
@@ -0,0 +1,655 @@
+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 deprecated 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 deprecated interface ActionBarDrawerToggle.DelegateProvider {
+    method public abstract android.support.v4.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+  }
+
+}
+
+package android.support.v4.view {
+
+  public abstract class AbsSavedState implements android.os.Parcelable {
+    ctor protected AbsSavedState(android.os.Parcelable);
+    ctor protected AbsSavedState(android.os.Parcel);
+    ctor protected AbsSavedState(android.os.Parcel, java.lang.ClassLoader);
+    method public int describeContents();
+    method public final android.os.Parcelable getSuperState();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.view.AbsSavedState> CREATOR;
+    field public static final android.support.v4.view.AbsSavedState EMPTY_STATE;
+  }
+
+  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 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 dispatchNestedPreScroll(int, int, int[], int[], int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(int);
+    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 boolean startNestedScroll(int, int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(int);
+  }
+
+  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 onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  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 setBackgroundDrawable(android.graphics.drawable.Drawable);
+    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 ViewPager extends android.view.ViewGroup {
+    ctor public ViewPager(android.content.Context);
+    ctor public ViewPager(android.content.Context, android.util.AttributeSet);
+    method public void addOnAdapterChangeListener(android.support.v4.view.ViewPager.OnAdapterChangeListener);
+    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 removeOnAdapterChangeListener(android.support.v4.view.ViewPager.OnAdapterChangeListener);
+    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);
+    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer, int);
+    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 abstract class ViewPager.DecorView implements java.lang.annotation.Annotation {
+  }
+
+  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.OnAdapterChangeListener {
+    method public abstract void onAdapterChanged(android.support.v4.view.ViewPager, android.support.v4.view.PagerAdapter, android.support.v4.view.PagerAdapter);
+  }
+
+  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.support.v4.view.AbsSavedState {
+    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);
+  }
+
+}
+
+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);
+  }
+
+}
+
+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 class CircularProgressDrawable extends android.graphics.drawable.Drawable {
+    ctor public CircularProgressDrawable(android.content.Context);
+    method public void draw(android.graphics.Canvas);
+    method public boolean getArrowEnabled();
+    method public float getArrowHeight();
+    method public float getArrowScale();
+    method public float getArrowWidth();
+    method public int getBackgroundColor();
+    method public float getCenterRadius();
+    method public int[] getColorSchemeColors();
+    method public float getEndTrim();
+    method public int getOpacity();
+    method public float getProgressRotation();
+    method public float getStartTrim();
+    method public android.graphics.Paint.Cap getStrokeCap();
+    method public float getStrokeWidth();
+    method public boolean isRunning();
+    method public void setAlpha(int);
+    method public void setArrowDimensions(float, float);
+    method public void setArrowEnabled(boolean);
+    method public void setArrowScale(float);
+    method public void setBackgroundColor(int);
+    method public void setCenterRadius(float);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setColorSchemeColors(int...);
+    method public void setProgressRotation(float);
+    method public void setStartEndTrim(float, float);
+    method public void setStrokeCap(android.graphics.Paint.Cap);
+    method public void setStrokeWidth(float);
+    method public void setStyle(int);
+    method public void start();
+    method public void stop();
+    field public static final int DEFAULT = 1; // 0x1
+    field public static final int LARGE = 0; // 0x0
+  }
+
+  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 addDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
+    method public void closeDrawer(android.view.View);
+    method public void closeDrawer(android.view.View, boolean);
+    method public void closeDrawer(int);
+    method public void closeDrawer(int, boolean);
+    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(android.view.View, boolean);
+    method public void openDrawer(int);
+    method public void openDrawer(int, boolean);
+    method public void removeDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
+    method public void setDrawerElevation(float);
+    method public deprecated 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_UNDEFINED = 3; // 0x3
+    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.support.v4.view.AbsSavedState {
+    ctor public DrawerLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    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 abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
+    ctor public ExploreByTouchHelper(android.view.View);
+    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 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 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 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 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 {
+    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 dispatchNestedPreScroll(int, int, int[], int[], int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    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);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static abstract interface NestedScrollView.OnScrollChangeListener {
+    method public abstract void onScrollChange(android.support.v4.widget.NestedScrollView, int, 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 deprecated 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 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 {
+    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 int getProgressViewEndOffset();
+    method public int getProgressViewStartOffset();
+    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 setOnChildScrollUpCallback(android.support.v4.widget.SwipeRefreshLayout.OnChildScrollUpCallback);
+    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.OnChildScrollUpCallback {
+    method public abstract boolean canChildScrollUp(android.support.v4.widget.SwipeRefreshLayout, android.view.View);
+  }
+
+  public static abstract interface SwipeRefreshLayout.OnRefreshListener {
+    method public abstract void onRefresh();
+  }
+
+  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/core-ui/api/27.0.0.txt b/core-ui/api/27.0.0.txt
new file mode 100644
index 0000000..6ae4b1a
--- /dev/null
+++ b/core-ui/api/27.0.0.txt
@@ -0,0 +1,655 @@
+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 deprecated 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 deprecated interface ActionBarDrawerToggle.DelegateProvider {
+    method public abstract android.support.v4.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+  }
+
+}
+
+package android.support.v4.view {
+
+  public abstract class AbsSavedState implements android.os.Parcelable {
+    ctor protected AbsSavedState(android.os.Parcelable);
+    ctor protected AbsSavedState(android.os.Parcel);
+    ctor protected AbsSavedState(android.os.Parcel, java.lang.ClassLoader);
+    method public int describeContents();
+    method public final android.os.Parcelable getSuperState();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.view.AbsSavedState> CREATOR;
+    field public static final android.support.v4.view.AbsSavedState EMPTY_STATE;
+  }
+
+  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 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 dispatchNestedPreScroll(int, int, int[], int[], int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(int);
+    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 boolean startNestedScroll(int, int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(int);
+  }
+
+  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 onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  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 setBackgroundDrawable(android.graphics.drawable.Drawable);
+    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 ViewPager extends android.view.ViewGroup {
+    ctor public ViewPager(android.content.Context);
+    ctor public ViewPager(android.content.Context, android.util.AttributeSet);
+    method public void addOnAdapterChangeListener(android.support.v4.view.ViewPager.OnAdapterChangeListener);
+    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 removeOnAdapterChangeListener(android.support.v4.view.ViewPager.OnAdapterChangeListener);
+    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);
+    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer, int);
+    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 abstract class ViewPager.DecorView implements java.lang.annotation.Annotation {
+  }
+
+  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.OnAdapterChangeListener {
+    method public abstract void onAdapterChanged(android.support.v4.view.ViewPager, android.support.v4.view.PagerAdapter, android.support.v4.view.PagerAdapter);
+  }
+
+  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.support.v4.view.AbsSavedState {
+    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);
+  }
+
+}
+
+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);
+  }
+
+}
+
+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 class CircularProgressDrawable extends android.graphics.drawable.Drawable {
+    ctor public CircularProgressDrawable(android.content.Context);
+    method public void draw(android.graphics.Canvas);
+    method public boolean getArrowEnabled();
+    method public float getArrowHeight();
+    method public float getArrowScale();
+    method public float getArrowWidth();
+    method public int getBackgroundColor();
+    method public float getCenterRadius();
+    method public int[] getColorSchemeColors();
+    method public float getEndTrim();
+    method public int getOpacity();
+    method public float getProgressRotation();
+    method public float getStartTrim();
+    method public android.graphics.Paint.Cap getStrokeCap();
+    method public float getStrokeWidth();
+    method public boolean isRunning();
+    method public void setAlpha(int);
+    method public void setArrowDimensions(float, float);
+    method public void setArrowEnabled(boolean);
+    method public void setArrowScale(float);
+    method public void setBackgroundColor(int);
+    method public void setCenterRadius(float);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setColorSchemeColors(int...);
+    method public void setProgressRotation(float);
+    method public void setStartEndTrim(float, float);
+    method public void setStrokeCap(android.graphics.Paint.Cap);
+    method public void setStrokeWidth(float);
+    method public void setStyle(int);
+    method public void start();
+    method public void stop();
+    field public static final int DEFAULT = 1; // 0x1
+    field public static final int LARGE = 0; // 0x0
+  }
+
+  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 addDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
+    method public void closeDrawer(android.view.View);
+    method public void closeDrawer(android.view.View, boolean);
+    method public void closeDrawer(int);
+    method public void closeDrawer(int, boolean);
+    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(android.view.View, boolean);
+    method public void openDrawer(int);
+    method public void openDrawer(int, boolean);
+    method public void removeDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
+    method public void setDrawerElevation(float);
+    method public deprecated 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_UNDEFINED = 3; // 0x3
+    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.support.v4.view.AbsSavedState {
+    ctor public DrawerLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    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 abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
+    ctor public ExploreByTouchHelper(android.view.View);
+    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 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 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 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 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 {
+    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 dispatchNestedPreScroll(int, int, int[], int[], int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    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);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static abstract interface NestedScrollView.OnScrollChangeListener {
+    method public abstract void onScrollChange(android.support.v4.widget.NestedScrollView, int, 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 deprecated 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 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 {
+    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 int getProgressViewEndOffset();
+    method public int getProgressViewStartOffset();
+    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 setOnChildScrollUpCallback(android.support.v4.widget.SwipeRefreshLayout.OnChildScrollUpCallback);
+    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.OnChildScrollUpCallback {
+    method public abstract boolean canChildScrollUp(android.support.v4.widget.SwipeRefreshLayout, android.view.View);
+  }
+
+  public static abstract interface SwipeRefreshLayout.OnRefreshListener {
+    method public abstract void onRefresh();
+  }
+
+  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/core-ui/build.gradle b/core-ui/build.gradle
index 46abf57..38a4fe2 100644
--- a/core-ui/build.gradle
+++ b/core-ui/build.gradle
@@ -16,12 +16,6 @@
         minSdkVersion 14
     }
 
-    sourceSets {
-        main.java.srcDirs = [
-                'java'
-        ]
-    }
-
     buildTypes.all {
         consumerProguardFiles 'proguard-rules.pro'
     }
diff --git a/core-ui/java/android/support/v4/app/ActionBarDrawerToggle.java b/core-ui/src/main/java/android/support/v4/app/ActionBarDrawerToggle.java
similarity index 100%
rename from core-ui/java/android/support/v4/app/ActionBarDrawerToggle.java
rename to core-ui/src/main/java/android/support/v4/app/ActionBarDrawerToggle.java
diff --git a/core-ui/java/android/support/v4/app/package.html b/core-ui/src/main/java/android/support/v4/app/package.html
similarity index 100%
rename from core-ui/java/android/support/v4/app/package.html
rename to core-ui/src/main/java/android/support/v4/app/package.html
diff --git a/core-ui/java/android/support/v4/view/AbsSavedState.java b/core-ui/src/main/java/android/support/v4/view/AbsSavedState.java
similarity index 90%
rename from core-ui/java/android/support/v4/view/AbsSavedState.java
rename to core-ui/src/main/java/android/support/v4/view/AbsSavedState.java
index 4cf38ac..86f491f 100644
--- a/core-ui/java/android/support/v4/view/AbsSavedState.java
+++ b/core-ui/src/main/java/android/support/v4/view/AbsSavedState.java
@@ -18,6 +18,8 @@
 
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 
 /**
  * A {@link Parcelable} implementation that should be used by inheritance
@@ -40,7 +42,7 @@
      *
      * @param superState The state of the superclass of this view
      */
-    protected AbsSavedState(Parcelable superState) {
+    protected AbsSavedState(@NonNull Parcelable superState) {
         if (superState == null) {
             throw new IllegalArgumentException("superState must not be null");
         }
@@ -52,7 +54,7 @@
      *
      * @param source parcel to read from
      */
-    protected AbsSavedState(Parcel source) {
+    protected AbsSavedState(@NonNull Parcel source) {
         this(source, null);
     }
 
@@ -62,11 +64,12 @@
      * @param source parcel to read from
      * @param loader ClassLoader to use for reading
      */
-    protected AbsSavedState(Parcel source, ClassLoader loader) {
+    protected AbsSavedState(@NonNull Parcel source, @Nullable ClassLoader loader) {
         Parcelable superState = source.readParcelable(loader);
         mSuperState = superState != null ? superState : EMPTY_STATE;
     }
 
+    @Nullable
     public final Parcelable getSuperState() {
         return mSuperState;
     }
diff --git a/core-ui/java/android/support/v4/view/AsyncLayoutInflater.java b/core-ui/src/main/java/android/support/v4/view/AsyncLayoutInflater.java
similarity index 98%
rename from core-ui/java/android/support/v4/view/AsyncLayoutInflater.java
rename to core-ui/src/main/java/android/support/v4/view/AsyncLayoutInflater.java
index e194a50..d26e5b8 100644
--- a/core-ui/java/android/support/v4/view/AsyncLayoutInflater.java
+++ b/core-ui/src/main/java/android/support/v4/view/AsyncLayoutInflater.java
@@ -107,7 +107,8 @@
     };
 
     public interface OnInflateFinishedListener {
-        void onInflateFinished(View view, int resid, ViewGroup parent);
+        void onInflateFinished(@NonNull View view, @LayoutRes int resid,
+                @Nullable ViewGroup parent);
     }
 
     private static class InflateRequest {
diff --git a/core-ui/java/android/support/v4/view/NestedScrollingChildHelper.java b/core-ui/src/main/java/android/support/v4/view/NestedScrollingChildHelper.java
similarity index 100%
rename from core-ui/java/android/support/v4/view/NestedScrollingChildHelper.java
rename to core-ui/src/main/java/android/support/v4/view/NestedScrollingChildHelper.java
diff --git a/core-ui/java/android/support/v4/view/NestedScrollingParentHelper.java b/core-ui/src/main/java/android/support/v4/view/NestedScrollingParentHelper.java
similarity index 100%
rename from core-ui/java/android/support/v4/view/NestedScrollingParentHelper.java
rename to core-ui/src/main/java/android/support/v4/view/NestedScrollingParentHelper.java
diff --git a/core-ui/java/android/support/v4/view/PagerAdapter.java b/core-ui/src/main/java/android/support/v4/view/PagerAdapter.java
similarity index 90%
rename from core-ui/java/android/support/v4/view/PagerAdapter.java
rename to core-ui/src/main/java/android/support/v4/view/PagerAdapter.java
index 1b1dc3d..a8fb099 100644
--- a/core-ui/java/android/support/v4/view/PagerAdapter.java
+++ b/core-ui/src/main/java/android/support/v4/view/PagerAdapter.java
@@ -19,6 +19,8 @@
 import android.database.DataSetObservable;
 import android.database.DataSetObserver;
 import android.os.Parcelable;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.view.View;
 import android.view.ViewGroup;
 
@@ -92,7 +94,7 @@
      * @param container The containing View which is displaying this adapter's
      * page views.
      */
-    public void startUpdate(ViewGroup container) {
+    public void startUpdate(@NonNull ViewGroup container) {
         startUpdate((View) container);
     }
 
@@ -107,7 +109,8 @@
      * @return Returns an Object representing the new page.  This does not
      * need to be a View, but can be some other container of the page.
      */
-    public Object instantiateItem(ViewGroup container, int position) {
+    @NonNull
+    public Object instantiateItem(@NonNull ViewGroup container, int position) {
         return instantiateItem((View) container, position);
     }
 
@@ -121,7 +124,7 @@
      * @param object The same object that was returned by
      * {@link #instantiateItem(View, int)}.
      */
-    public void destroyItem(ViewGroup container, int position, Object object) {
+    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
         destroyItem((View) container, position, object);
     }
 
@@ -134,7 +137,7 @@
      * @param object The same object that was returned by
      * {@link #instantiateItem(View, int)}.
      */
-    public void setPrimaryItem(ViewGroup container, int position, Object object) {
+    public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
         setPrimaryItem((View) container, position, object);
     }
 
@@ -145,7 +148,7 @@
      * @param container The containing View which is displaying this adapter's
      * page views.
      */
-    public void finishUpdate(ViewGroup container) {
+    public void finishUpdate(@NonNull ViewGroup container) {
         finishUpdate((View) container);
     }
 
@@ -157,7 +160,7 @@
      * @deprecated Use {@link #startUpdate(ViewGroup)}
      */
     @Deprecated
-    public void startUpdate(View container) {
+    public void startUpdate(@NonNull View container) {
     }
 
     /**
@@ -174,7 +177,8 @@
      * @deprecated Use {@link #instantiateItem(ViewGroup, int)}
      */
     @Deprecated
-    public Object instantiateItem(View container, int position) {
+    @NonNull
+    public Object instantiateItem(@NonNull View container, int position) {
         throw new UnsupportedOperationException(
                 "Required method instantiateItem was not overridden");
     }
@@ -192,7 +196,7 @@
      * @deprecated Use {@link #destroyItem(ViewGroup, int, Object)}
      */
     @Deprecated
-    public void destroyItem(View container, int position, Object object) {
+    public void destroyItem(@NonNull View container, int position, @NonNull Object object) {
         throw new UnsupportedOperationException("Required method destroyItem was not overridden");
     }
 
@@ -208,7 +212,7 @@
      * @deprecated Use {@link #setPrimaryItem(ViewGroup, int, Object)}
      */
     @Deprecated
-    public void setPrimaryItem(View container, int position, Object object) {
+    public void setPrimaryItem(@NonNull View container, int position, @NonNull Object object) {
     }
 
     /**
@@ -221,7 +225,7 @@
      * @deprecated Use {@link #finishUpdate(ViewGroup)}
      */
     @Deprecated
-    public void finishUpdate(View container) {
+    public void finishUpdate(@NonNull View container) {
     }
 
     /**
@@ -233,7 +237,7 @@
      * @param object Object to check for association with <code>view</code>
      * @return true if <code>view</code> is associated with the key object <code>object</code>
      */
-    public abstract boolean isViewFromObject(View view, Object object);
+    public abstract boolean isViewFromObject(@NonNull View view, @NonNull Object object);
 
     /**
      * Save any instance state associated with this adapter and its pages that should be
@@ -241,6 +245,7 @@
      *
      * @return Saved state for this adapter
      */
+    @Nullable
     public Parcelable saveState() {
         return null;
     }
@@ -252,7 +257,7 @@
      * @param state State previously saved by a call to {@link #saveState()}
      * @param loader A ClassLoader that should be used to instantiate any restored objects
      */
-    public void restoreState(Parcelable state, ClassLoader loader) {
+    public void restoreState(@Nullable Parcelable state, @Nullable ClassLoader loader) {
     }
 
     /**
@@ -270,7 +275,7 @@
      *         {@link #POSITION_UNCHANGED} if the object's position has not changed,
      *         or {@link #POSITION_NONE} if the item is no longer present.
      */
-    public int getItemPosition(Object object) {
+    public int getItemPosition(@NonNull Object object) {
         return POSITION_UNCHANGED;
     }
 
@@ -292,7 +297,7 @@
      *
      * @param observer The {@link android.database.DataSetObserver} which will receive callbacks.
      */
-    public void registerDataSetObserver(DataSetObserver observer) {
+    public void registerDataSetObserver(@NonNull DataSetObserver observer) {
         mObservable.registerObserver(observer);
     }
 
@@ -301,7 +306,7 @@
      *
      * @param observer The {@link android.database.DataSetObserver} which will be unregistered.
      */
-    public void unregisterDataSetObserver(DataSetObserver observer) {
+    public void unregisterDataSetObserver(@NonNull DataSetObserver observer) {
         mObservable.unregisterObserver(observer);
     }
 
@@ -320,6 +325,7 @@
      * @param position The position of the title requested
      * @return A title for the requested page
      */
+    @Nullable
     public CharSequence getPageTitle(int position) {
         return null;
     }
diff --git a/core-ui/java/android/support/v4/view/PagerTabStrip.java b/core-ui/src/main/java/android/support/v4/view/PagerTabStrip.java
similarity index 97%
rename from core-ui/java/android/support/v4/view/PagerTabStrip.java
rename to core-ui/src/main/java/android/support/v4/view/PagerTabStrip.java
index f4c0b21..6c88572 100644
--- a/core-ui/java/android/support/v4/view/PagerTabStrip.java
+++ b/core-ui/src/main/java/android/support/v4/view/PagerTabStrip.java
@@ -24,6 +24,8 @@
 import android.support.annotation.ColorInt;
 import android.support.annotation.ColorRes;
 import android.support.annotation.DrawableRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v4.content.ContextCompat;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
@@ -76,11 +78,11 @@
     private float mInitialMotionY;
     private int mTouchSlop;
 
-    public PagerTabStrip(Context context) {
+    public PagerTabStrip(@NonNull Context context) {
         this(context, null);
     }
 
-    public PagerTabStrip(Context context, AttributeSet attrs) {
+    public PagerTabStrip(@NonNull Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
 
         mIndicatorColor = mTextColor;
diff --git a/core-ui/java/android/support/v4/view/PagerTitleStrip.java b/core-ui/src/main/java/android/support/v4/view/PagerTitleStrip.java
similarity index 98%
rename from core-ui/java/android/support/v4/view/PagerTitleStrip.java
rename to core-ui/src/main/java/android/support/v4/view/PagerTitleStrip.java
index b63e4f4..79a6240 100644
--- a/core-ui/java/android/support/v4/view/PagerTitleStrip.java
+++ b/core-ui/src/main/java/android/support/v4/view/PagerTitleStrip.java
@@ -22,6 +22,8 @@
 import android.graphics.drawable.Drawable;
 import android.support.annotation.ColorInt;
 import android.support.annotation.FloatRange;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v4.widget.TextViewCompat;
 import android.text.TextUtils.TruncateAt;
 import android.text.method.SingleLineTransformationMethod;
@@ -102,11 +104,11 @@
         text.setTransformationMethod(new SingleLineAllCapsTransform(text.getContext()));
     }
 
-    public PagerTitleStrip(Context context) {
+    public PagerTitleStrip(@NonNull Context context) {
         this(context, null);
     }
 
-    public PagerTitleStrip(Context context, AttributeSet attrs) {
+    public PagerTitleStrip(@NonNull Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
 
         addView(mPrevText = new TextView(context));
diff --git a/core-ui/java/android/support/v4/view/ViewPager.java b/core-ui/src/main/java/android/support/v4/view/ViewPager.java
similarity index 98%
rename from core-ui/java/android/support/v4/view/ViewPager.java
rename to core-ui/src/main/java/android/support/v4/view/ViewPager.java
index 8cd973c..36d8696 100644
--- a/core-ui/java/android/support/v4/view/ViewPager.java
+++ b/core-ui/src/main/java/android/support/v4/view/ViewPager.java
@@ -347,7 +347,7 @@
          *                 position of the pager. 0 is front and center. 1 is one full
          *                 page position to the right, and -1 is one page position to the left.
          */
-        void transformPage(View page, float position);
+        void transformPage(@NonNull View page, float position);
     }
 
     /**
@@ -381,12 +381,12 @@
     public @interface DecorView {
     }
 
-    public ViewPager(Context context) {
+    public ViewPager(@NonNull Context context) {
         super(context);
         initViewPager();
     }
 
-    public ViewPager(Context context, AttributeSet attrs) {
+    public ViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
         initViewPager();
     }
@@ -496,7 +496,7 @@
      *
      * @param adapter Adapter to use
      */
-    public void setAdapter(PagerAdapter adapter) {
+    public void setAdapter(@Nullable PagerAdapter adapter) {
         if (mAdapter != null) {
             mAdapter.setViewPagerObserver(null);
             mAdapter.startUpdate(this);
@@ -561,6 +561,7 @@
      *
      * @return The currently registered PagerAdapter
      */
+    @Nullable
     public PagerAdapter getAdapter() {
         return mAdapter;
     }
@@ -712,7 +713,7 @@
      *
      * @param listener listener to add
      */
-    public void addOnPageChangeListener(OnPageChangeListener listener) {
+    public void addOnPageChangeListener(@NonNull OnPageChangeListener listener) {
         if (mOnPageChangeListeners == null) {
             mOnPageChangeListeners = new ArrayList<>();
         }
@@ -725,7 +726,7 @@
      *
      * @param listener listener to remove
      */
-    public void removeOnPageChangeListener(OnPageChangeListener listener) {
+    public void removeOnPageChangeListener(@NonNull OnPageChangeListener listener) {
         if (mOnPageChangeListeners != null) {
             mOnPageChangeListeners.remove(listener);
         }
@@ -757,7 +758,8 @@
      *                            to be drawn from last to first instead of first to last.
      * @param transformer PageTransformer that will modify each page's animation properties
      */
-    public void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) {
+    public void setPageTransformer(boolean reverseDrawingOrder,
+            @Nullable PageTransformer transformer) {
         setPageTransformer(reverseDrawingOrder, transformer, View.LAYER_TYPE_HARDWARE);
     }
 
@@ -774,8 +776,8 @@
      *                      {@link View#LAYER_TYPE_SOFTWARE}, or
      *                      {@link View#LAYER_TYPE_NONE}.
      */
-    public void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer,
-            int pageLayerType) {
+    public void setPageTransformer(boolean reverseDrawingOrder,
+            @Nullable PageTransformer transformer, int pageLayerType) {
         final boolean hasTransformer = transformer != null;
         final boolean needsPopulate = hasTransformer != (mPageTransformer != null);
         mPageTransformer = transformer;
@@ -881,7 +883,7 @@
      *
      * @param d Drawable to display between pages
      */
-    public void setPageMarginDrawable(Drawable d) {
+    public void setPageMarginDrawable(@Nullable Drawable d) {
         mMarginDrawable = d;
         if (d != null) refreshDrawableState();
         setWillNotDraw(d == null);
@@ -1383,7 +1385,7 @@
         Parcelable adapterState;
         ClassLoader loader;
 
-        public SavedState(Parcelable superState) {
+        public SavedState(@NonNull Parcelable superState) {
             super(superState);
         }
 
@@ -2744,7 +2746,7 @@
      * @param event The key event to execute.
      * @return Return true if the event was handled, else false.
      */
-    public boolean executeKeyEvent(KeyEvent event) {
+    public boolean executeKeyEvent(@NonNull KeyEvent event) {
         boolean handled = false;
         if (event.getAction() == KeyEvent.ACTION_DOWN) {
             switch (event.getKeyCode()) {
diff --git a/core-ui/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java b/core-ui/src/main/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java
similarity index 100%
rename from core-ui/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java
rename to core-ui/src/main/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java
diff --git a/core-ui/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java b/core-ui/src/main/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java
similarity index 100%
rename from core-ui/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java
rename to core-ui/src/main/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java
diff --git a/core-ui/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java b/core-ui/src/main/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java
similarity index 100%
rename from core-ui/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java
rename to core-ui/src/main/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java
diff --git a/core-ui/java/android/support/v4/view/animation/LookupTableInterpolator.java b/core-ui/src/main/java/android/support/v4/view/animation/LookupTableInterpolator.java
similarity index 100%
rename from core-ui/java/android/support/v4/view/animation/LookupTableInterpolator.java
rename to core-ui/src/main/java/android/support/v4/view/animation/LookupTableInterpolator.java
diff --git a/core-ui/java/android/support/v4/view/package.html b/core-ui/src/main/java/android/support/v4/view/package.html
similarity index 100%
rename from core-ui/java/android/support/v4/view/package.html
rename to core-ui/src/main/java/android/support/v4/view/package.html
diff --git a/core-ui/java/android/support/v4/widget/AutoScrollHelper.java b/core-ui/src/main/java/android/support/v4/widget/AutoScrollHelper.java
similarity index 99%
rename from core-ui/java/android/support/v4/widget/AutoScrollHelper.java
rename to core-ui/src/main/java/android/support/v4/widget/AutoScrollHelper.java
index d0407be..60d208d 100644
--- a/core-ui/java/android/support/v4/widget/AutoScrollHelper.java
+++ b/core-ui/src/main/java/android/support/v4/widget/AutoScrollHelper.java
@@ -18,6 +18,7 @@
 
 import android.content.res.Resources;
 import android.os.SystemClock;
+import android.support.annotation.NonNull;
 import android.support.v4.view.ViewCompat;
 import android.util.DisplayMetrics;
 import android.view.MotionEvent;
@@ -205,7 +206,7 @@
      *
      * @param target The view to automatically scroll.
      */
-    public AutoScrollHelper(View target) {
+    public AutoScrollHelper(@NonNull View target) {
         mTarget = target;
 
         final DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
@@ -289,6 +290,7 @@
      *            {@link #NO_MAX} to leave the relative value unconstrained.
      * @return The scroll helper, which may used to chain setter calls.
      */
+    @NonNull
     public AutoScrollHelper setMaximumVelocity(float horizontalMax, float verticalMax) {
         mMaximumVelocity[HORIZONTAL] = horizontalMax / 1000f;
         mMaximumVelocity[VERTICAL] = verticalMax / 1000f;
@@ -307,6 +309,7 @@
      *            {@link #NO_MIN} to leave the relative value unconstrained.
      * @return The scroll helper, which may used to chain setter calls.
      */
+    @NonNull
     public AutoScrollHelper setMinimumVelocity(float horizontalMin, float verticalMin) {
         mMinimumVelocity[HORIZONTAL] = horizontalMin / 1000f;
         mMinimumVelocity[VERTICAL] = verticalMin / 1000f;
@@ -328,6 +331,7 @@
      *            ignore.
      * @return The scroll helper, which may used to chain setter calls.
      */
+    @NonNull
     public AutoScrollHelper setRelativeVelocity(float horizontal, float vertical) {
         mRelativeVelocity[HORIZONTAL] = horizontal / 1000f;
         mRelativeVelocity[VERTICAL] = vertical / 1000f;
@@ -349,6 +353,7 @@
      * @param type The type of edge to use.
      * @return The scroll helper, which may used to chain setter calls.
      */
+    @NonNull
     public AutoScrollHelper setEdgeType(int type) {
         mEdgeType = type;
         return this;
@@ -368,6 +373,7 @@
      *            maximum value.
      * @return The scroll helper, which may used to chain setter calls.
      */
+    @NonNull
     public AutoScrollHelper setRelativeEdges(float horizontal, float vertical) {
         mRelativeEdges[HORIZONTAL] = horizontal;
         mRelativeEdges[VERTICAL] = vertical;
@@ -390,6 +396,7 @@
      *            value.
      * @return The scroll helper, which may used to chain setter calls.
      */
+    @NonNull
     public AutoScrollHelper setMaximumEdges(float horizontalMax, float verticalMax) {
         mMaximumEdges[HORIZONTAL] = horizontalMax;
         mMaximumEdges[VERTICAL] = verticalMax;
@@ -407,6 +414,7 @@
      * @param delayMillis The activation delay in milliseconds.
      * @return The scroll helper, which may used to chain setter calls.
      */
+    @NonNull
     public AutoScrollHelper setActivationDelay(int delayMillis) {
         mActivationDelay = delayMillis;
         return this;
@@ -422,6 +430,7 @@
      * @param durationMillis The ramp-up duration in milliseconds.
      * @return The scroll helper, which may used to chain setter calls.
      */
+    @NonNull
     public AutoScrollHelper setRampUpDuration(int durationMillis) {
         mScroller.setRampUpDuration(durationMillis);
         return this;
@@ -437,6 +446,7 @@
      * @param durationMillis The ramp-down duration in milliseconds.
      * @return The scroll helper, which may used to chain setter calls.
      */
+    @NonNull
     public AutoScrollHelper setRampDownDuration(int durationMillis) {
         mScroller.setRampDownDuration(durationMillis);
         return this;
diff --git a/core-ui/java/android/support/v4/widget/CircleImageView.java b/core-ui/src/main/java/android/support/v4/widget/CircleImageView.java
similarity index 100%
rename from core-ui/java/android/support/v4/widget/CircleImageView.java
rename to core-ui/src/main/java/android/support/v4/widget/CircleImageView.java
diff --git a/core-ui/java/android/support/v4/widget/CircularProgressDrawable.java b/core-ui/src/main/java/android/support/v4/widget/CircularProgressDrawable.java
similarity index 99%
rename from core-ui/java/android/support/v4/widget/CircularProgressDrawable.java
rename to core-ui/src/main/java/android/support/v4/widget/CircularProgressDrawable.java
index ac29541..2055669 100644
--- a/core-ui/java/android/support/v4/widget/CircularProgressDrawable.java
+++ b/core-ui/src/main/java/android/support/v4/widget/CircularProgressDrawable.java
@@ -132,7 +132,7 @@
     /**
      * @param context application context
      */
-    public CircularProgressDrawable(Context context) {
+    public CircularProgressDrawable(@NonNull Context context) {
         mResources = Preconditions.checkNotNull(context).getResources();
 
         mRing = new Ring();
@@ -215,7 +215,7 @@
      *
      * @param strokeCap stroke cap
      */
-    public void setStrokeCap(Paint.Cap strokeCap) {
+    public void setStrokeCap(@NonNull Paint.Cap strokeCap) {
         mRing.setStrokeCap(strokeCap);
         invalidateSelf();
     }
@@ -225,6 +225,7 @@
      *
      * @return stroke cap
      */
+    @NonNull
     public Paint.Cap getStrokeCap() {
         return mRing.getStrokeCap();
     }
@@ -373,6 +374,7 @@
      *
      * @return list of ARGB colors
      */
+    @NonNull
     public int[] getColorSchemeColors() {
         return mRing.getColors();
     }
@@ -383,7 +385,7 @@
      *
      * @param colors list of ARGB colors to be used in the spinner
      */
-    public void setColorSchemeColors(int... colors) {
+    public void setColorSchemeColors(@NonNull int... colors) {
         mRing.setColors(colors);
         mRing.setColorIndex(0);
         invalidateSelf();
diff --git a/core-ui/java/android/support/v4/widget/ContentLoadingProgressBar.java b/core-ui/src/main/java/android/support/v4/widget/ContentLoadingProgressBar.java
similarity index 93%
rename from core-ui/java/android/support/v4/widget/ContentLoadingProgressBar.java
rename to core-ui/src/main/java/android/support/v4/widget/ContentLoadingProgressBar.java
index 98b63a4..356c7b9 100644
--- a/core-ui/java/android/support/v4/widget/ContentLoadingProgressBar.java
+++ b/core-ui/src/main/java/android/support/v4/widget/ContentLoadingProgressBar.java
@@ -17,6 +17,8 @@
 package android.support.v4.widget;
 
 import android.content.Context;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.ProgressBar;
@@ -61,11 +63,11 @@
         }
     };
 
-    public ContentLoadingProgressBar(Context context) {
+    public ContentLoadingProgressBar(@NonNull Context context) {
         this(context, null);
     }
 
-    public ContentLoadingProgressBar(Context context, AttributeSet attrs) {
+    public ContentLoadingProgressBar(@NonNull Context context, @Nullable AttributeSet attrs) {
         super(context, attrs, 0);
     }
 
diff --git a/core-ui/java/android/support/v4/widget/CursorAdapter.java b/core-ui/src/main/java/android/support/v4/widget/CursorAdapter.java
similarity index 100%
rename from core-ui/java/android/support/v4/widget/CursorAdapter.java
rename to core-ui/src/main/java/android/support/v4/widget/CursorAdapter.java
diff --git a/core-ui/java/android/support/v4/widget/CursorFilter.java b/core-ui/src/main/java/android/support/v4/widget/CursorFilter.java
similarity index 100%
rename from core-ui/java/android/support/v4/widget/CursorFilter.java
rename to core-ui/src/main/java/android/support/v4/widget/CursorFilter.java
diff --git a/core-ui/java/android/support/v4/widget/DrawerLayout.java b/core-ui/src/main/java/android/support/v4/widget/DrawerLayout.java
similarity index 98%
rename from core-ui/java/android/support/v4/widget/DrawerLayout.java
rename to core-ui/src/main/java/android/support/v4/widget/DrawerLayout.java
index c7b40e9..a73e1f1 100644
--- a/core-ui/java/android/support/v4/widget/DrawerLayout.java
+++ b/core-ui/src/main/java/android/support/v4/widget/DrawerLayout.java
@@ -248,7 +248,7 @@
          * @param drawerView The child view that was moved
          * @param slideOffset The new offset of this drawer within its range, from 0-1
          */
-        void onDrawerSlide(View drawerView, float slideOffset);
+        void onDrawerSlide(@NonNull View drawerView, float slideOffset);
 
         /**
          * Called when a drawer has settled in a completely open state.
@@ -256,14 +256,14 @@
          *
          * @param drawerView Drawer view that is now open
          */
-        void onDrawerOpened(View drawerView);
+        void onDrawerOpened(@NonNull View drawerView);
 
         /**
          * Called when a drawer has settled in a completely closed state.
          *
          * @param drawerView Drawer view that is now closed
          */
-        void onDrawerClosed(View drawerView);
+        void onDrawerClosed(@NonNull View drawerView);
 
         /**
          * Called when the drawer motion state changes. The new state will
@@ -296,15 +296,15 @@
         }
     }
 
-    public DrawerLayout(Context context) {
+    public DrawerLayout(@NonNull Context context) {
         this(context, null);
     }
 
-    public DrawerLayout(Context context, AttributeSet attrs) {
+    public DrawerLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, 0);
     }
 
-    public DrawerLayout(Context context, AttributeSet attrs, int defStyle) {
+    public DrawerLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
         setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
         final float density = getResources().getDisplayMetrics().density;
@@ -626,7 +626,7 @@
      * @see #LOCK_MODE_LOCKED_CLOSED
      * @see #LOCK_MODE_LOCKED_OPEN
      */
-    public void setDrawerLockMode(@LockMode int lockMode, View drawerView) {
+    public void setDrawerLockMode(@LockMode int lockMode, @NonNull View drawerView) {
         if (!isDrawerView(drawerView)) {
             throw new IllegalArgumentException("View " + drawerView + " is not a "
                     + "drawer with appropriate layout_gravity");
@@ -700,7 +700,7 @@
      *         {@link #LOCK_MODE_LOCKED_OPEN}.
      */
     @LockMode
-    public int getDrawerLockMode(View drawerView) {
+    public int getDrawerLockMode(@NonNull View drawerView) {
         if (!isDrawerView(drawerView)) {
             throw new IllegalArgumentException("View " + drawerView + " is not a drawer");
         }
@@ -718,7 +718,7 @@
      *            drawer to set the title for.
      * @param title The title for the drawer.
      */
-    public void setDrawerTitle(@EdgeGravity int edgeGravity, CharSequence title) {
+    public void setDrawerTitle(@EdgeGravity int edgeGravity, @Nullable CharSequence title) {
         final int absGravity = GravityCompat.getAbsoluteGravity(
                 edgeGravity, ViewCompat.getLayoutDirection(this));
         if (absGravity == Gravity.LEFT) {
@@ -1276,7 +1276,7 @@
      *
      * @param bg Background drawable to draw behind the status bar
      */
-    public void setStatusBarBackground(Drawable bg) {
+    public void setStatusBarBackground(@Nullable Drawable bg) {
         mStatusBarBackground = bg;
         invalidate();
     }
@@ -1286,6 +1286,7 @@
      *
      * @return The status bar background drawable, or null if none set
      */
+    @Nullable
     public Drawable getStatusBarBackgroundDrawable() {
         return mStatusBarBackground;
     }
@@ -1577,7 +1578,7 @@
      *
      * @param drawerView Drawer view to open
      */
-    public void openDrawer(View drawerView) {
+    public void openDrawer(@NonNull View drawerView) {
         openDrawer(drawerView, true);
     }
 
@@ -1587,7 +1588,7 @@
      * @param drawerView Drawer view to open
      * @param animate Whether opening of the drawer should be animated.
      */
-    public void openDrawer(View drawerView, boolean animate) {
+    public void openDrawer(@NonNull View drawerView, boolean animate) {
         if (!isDrawerView(drawerView)) {
             throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer");
         }
@@ -1646,7 +1647,7 @@
      *
      * @param drawerView Drawer view to close
      */
-    public void closeDrawer(View drawerView) {
+    public void closeDrawer(@NonNull View drawerView) {
         closeDrawer(drawerView, true);
     }
 
@@ -1656,7 +1657,7 @@
      * @param drawerView Drawer view to close
      * @param animate Whether closing of the drawer should be animated.
      */
-    public void closeDrawer(View drawerView, boolean animate) {
+    public void closeDrawer(@NonNull View drawerView, boolean animate) {
         if (!isDrawerView(drawerView)) {
             throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer");
         }
@@ -1718,7 +1719,7 @@
      * @return true if the given drawer view is in an open state
      * @see #isDrawerVisible(android.view.View)
      */
-    public boolean isDrawerOpen(View drawer) {
+    public boolean isDrawerOpen(@NonNull View drawer) {
         if (!isDrawerView(drawer)) {
             throw new IllegalArgumentException("View " + drawer + " is not a drawer");
         }
@@ -1751,7 +1752,7 @@
      * @return true if the given drawer is visible on-screen
      * @see #isDrawerOpen(android.view.View)
      */
-    public boolean isDrawerVisible(View drawer) {
+    public boolean isDrawerVisible(@NonNull View drawer) {
         if (!isDrawerView(drawer)) {
             throw new IllegalArgumentException("View " + drawer + " is not a drawer");
         }
@@ -2001,7 +2002,7 @@
         @LockMode int lockModeStart;
         @LockMode int lockModeEnd;
 
-        public SavedState(Parcel in, ClassLoader loader) {
+        public SavedState(@NonNull Parcel in, @Nullable ClassLoader loader) {
             super(in, loader);
             openDrawerGravity = in.readInt();
             lockModeLeft = in.readInt();
@@ -2010,7 +2011,7 @@
             lockModeEnd = in.readInt();
         }
 
-        public SavedState(Parcelable superState) {
+        public SavedState(@NonNull Parcelable superState) {
             super(superState);
         }
 
@@ -2218,7 +2219,7 @@
         boolean isPeeking;
         int openState;
 
-        public LayoutParams(Context c, AttributeSet attrs) {
+        public LayoutParams(@NonNull Context c, @Nullable AttributeSet attrs) {
             super(c, attrs);
 
             final TypedArray a = c.obtainStyledAttributes(attrs, LAYOUT_ATTRS);
@@ -2235,16 +2236,16 @@
             this.gravity = gravity;
         }
 
-        public LayoutParams(LayoutParams source) {
+        public LayoutParams(@NonNull LayoutParams source) {
             super(source);
             this.gravity = source.gravity;
         }
 
-        public LayoutParams(ViewGroup.LayoutParams source) {
+        public LayoutParams(@NonNull ViewGroup.LayoutParams source) {
             super(source);
         }
 
-        public LayoutParams(ViewGroup.MarginLayoutParams source) {
+        public LayoutParams(@NonNull ViewGroup.MarginLayoutParams source) {
             super(source);
         }
     }
diff --git a/core-ui/java/android/support/v4/widget/ExploreByTouchHelper.java b/core-ui/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java
similarity index 98%
rename from core-ui/java/android/support/v4/widget/ExploreByTouchHelper.java
rename to core-ui/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java
index 8a29eff..2b5ed0a 100644
--- a/core-ui/java/android/support/v4/widget/ExploreByTouchHelper.java
+++ b/core-ui/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java
@@ -129,7 +129,7 @@
      *
      * @param host view whose virtual view hierarchy is exposed by this helper
      */
-    public ExploreByTouchHelper(View host) {
+    public ExploreByTouchHelper(@NonNull View host) {
         if (host == null) {
             throw new IllegalArgumentException("View may not be null");
         }
@@ -1107,7 +1107,8 @@
      *            populate the event
      * @param event The event to populate
      */
-    protected void onPopulateEventForVirtualView(int virtualViewId, AccessibilityEvent event) {
+    protected void onPopulateEventForVirtualView(int virtualViewId,
+            @NonNull AccessibilityEvent event) {
         // Default implementation is no-op.
     }
 
@@ -1119,7 +1120,7 @@
      *
      * @param event the event to populate with information about the host view
      */
-    protected void onPopulateEventForHost(AccessibilityEvent event) {
+    protected void onPopulateEventForHost(@NonNull AccessibilityEvent event) {
         // Default implementation is no-op.
     }
 
@@ -1187,7 +1188,7 @@
      * @param node The node to populate
      */
     protected abstract void onPopulateNodeForVirtualView(
-            int virtualViewId, AccessibilityNodeInfoCompat node);
+            int virtualViewId, @NonNull AccessibilityNodeInfoCompat node);
 
     /**
      * Populates an {@link AccessibilityNodeInfoCompat} with information
@@ -1197,7 +1198,7 @@
      *
      * @param node the node to populate with information about the host view
      */
-    protected void onPopulateNodeForHost(AccessibilityNodeInfoCompat node) {
+    protected void onPopulateNodeForHost(@NonNull AccessibilityNodeInfoCompat node) {
         // Default implementation is no-op.
     }
 
@@ -1225,7 +1226,7 @@
      * @return true if the action was performed
      */
     protected abstract boolean onPerformActionForVirtualView(
-            int virtualViewId, int action, Bundle arguments);
+            int virtualViewId, int action, @Nullable Bundle arguments);
 
     /**
      * Exposes a virtual view hierarchy to the accessibility framework.
diff --git a/core-ui/java/android/support/v4/widget/FocusStrategy.java b/core-ui/src/main/java/android/support/v4/widget/FocusStrategy.java
similarity index 100%
rename from core-ui/java/android/support/v4/widget/FocusStrategy.java
rename to core-ui/src/main/java/android/support/v4/widget/FocusStrategy.java
diff --git a/core-ui/java/android/support/v4/widget/ListViewAutoScrollHelper.java b/core-ui/src/main/java/android/support/v4/widget/ListViewAutoScrollHelper.java
similarity index 95%
rename from core-ui/java/android/support/v4/widget/ListViewAutoScrollHelper.java
rename to core-ui/src/main/java/android/support/v4/widget/ListViewAutoScrollHelper.java
index 73d18ce..c373f27 100644
--- a/core-ui/java/android/support/v4/widget/ListViewAutoScrollHelper.java
+++ b/core-ui/src/main/java/android/support/v4/widget/ListViewAutoScrollHelper.java
@@ -16,6 +16,7 @@
 
 package android.support.v4.widget;
 
+import android.support.annotation.NonNull;
 import android.view.View;
 import android.widget.ListView;
 
@@ -26,7 +27,7 @@
 public class ListViewAutoScrollHelper extends AutoScrollHelper {
     private final ListView mTarget;
 
-    public ListViewAutoScrollHelper(ListView target) {
+    public ListViewAutoScrollHelper(@NonNull ListView target) {
         super(target);
 
         mTarget = target;
diff --git a/core-ui/java/android/support/v4/widget/NestedScrollView.java b/core-ui/src/main/java/android/support/v4/widget/NestedScrollView.java
similarity index 99%
rename from core-ui/java/android/support/v4/widget/NestedScrollView.java
rename to core-ui/src/main/java/android/support/v4/widget/NestedScrollView.java
index 517686f..73ff084 100644
--- a/core-ui/java/android/support/v4/widget/NestedScrollView.java
+++ b/core-ui/src/main/java/android/support/v4/widget/NestedScrollView.java
@@ -26,6 +26,8 @@
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 import android.support.v4.view.AccessibilityDelegateCompat;
 import android.support.v4.view.InputDeviceCompat;
@@ -181,15 +183,16 @@
 
     private OnScrollChangeListener mOnScrollChangeListener;
 
-    public NestedScrollView(Context context) {
+    public NestedScrollView(@NonNull Context context) {
         this(context, null);
     }
 
-    public NestedScrollView(Context context, AttributeSet attrs) {
+    public NestedScrollView(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, 0);
     }
 
-    public NestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
+    public NestedScrollView(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         super(context, attrs, defStyleAttr);
         initScrollView();
 
@@ -441,7 +444,7 @@
      * @see android.view.View#getScrollX()
      * @see android.view.View#getScrollY()
      */
-    public void setOnScrollChangeListener(OnScrollChangeListener l) {
+    public void setOnScrollChangeListener(@Nullable OnScrollChangeListener l) {
         mOnScrollChangeListener = l;
     }
 
@@ -552,7 +555,7 @@
      * @param event The key event to execute.
      * @return Return true if the event was handled, else false.
      */
-    public boolean executeKeyEvent(KeyEvent event) {
+    public boolean executeKeyEvent(@NonNull KeyEvent event) {
         mTempRect.setEmpty();
 
         if (!canScroll()) {
diff --git a/core-ui/java/android/support/v4/widget/ResourceCursorAdapter.java b/core-ui/src/main/java/android/support/v4/widget/ResourceCursorAdapter.java
similarity index 100%
rename from core-ui/java/android/support/v4/widget/ResourceCursorAdapter.java
rename to core-ui/src/main/java/android/support/v4/widget/ResourceCursorAdapter.java
diff --git a/core-ui/java/android/support/v4/widget/SimpleCursorAdapter.java b/core-ui/src/main/java/android/support/v4/widget/SimpleCursorAdapter.java
similarity index 100%
rename from core-ui/java/android/support/v4/widget/SimpleCursorAdapter.java
rename to core-ui/src/main/java/android/support/v4/widget/SimpleCursorAdapter.java
diff --git a/core-ui/java/android/support/v4/widget/SlidingPaneLayout.java b/core-ui/src/main/java/android/support/v4/widget/SlidingPaneLayout.java
similarity index 98%
rename from core-ui/java/android/support/v4/widget/SlidingPaneLayout.java
rename to core-ui/src/main/java/android/support/v4/widget/SlidingPaneLayout.java
index 602df70..5676ccf 100644
--- a/core-ui/java/android/support/v4/widget/SlidingPaneLayout.java
+++ b/core-ui/src/main/java/android/support/v4/widget/SlidingPaneLayout.java
@@ -30,6 +30,8 @@
 import android.os.Parcelable;
 import android.support.annotation.ColorInt;
 import android.support.annotation.DrawableRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
 import android.support.v4.content.ContextCompat;
 import android.support.v4.view.AbsSavedState;
@@ -213,20 +215,20 @@
          * @param panel The child view that was moved
          * @param slideOffset The new offset of this sliding pane within its range, from 0-1
          */
-        void onPanelSlide(View panel, float slideOffset);
+        void onPanelSlide(@NonNull View panel, float slideOffset);
         /**
          * Called when a sliding pane becomes slid completely open. The pane may or may not
          * be interactive at this point depending on how much of the pane is visible.
          * @param panel The child view that was slid to an open position, revealing other panes
          */
-        void onPanelOpened(View panel);
+        void onPanelOpened(@NonNull View panel);
 
         /**
          * Called when a sliding pane becomes slid completely closed. The pane is now guaranteed
          * to be interactive. It may now obscure other views in the layout.
          * @param panel The child view that was slid to a closed position
          */
-        void onPanelClosed(View panel);
+        void onPanelClosed(@NonNull View panel);
     }
 
     /**
@@ -245,15 +247,15 @@
         }
     }
 
-    public SlidingPaneLayout(Context context) {
+    public SlidingPaneLayout(@NonNull Context context) {
         this(context, null);
     }
 
-    public SlidingPaneLayout(Context context, AttributeSet attrs) {
+    public SlidingPaneLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, 0);
     }
 
-    public SlidingPaneLayout(Context context, AttributeSet attrs, int defStyle) {
+    public SlidingPaneLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
 
         final float density = context.getResources().getDisplayMetrics().density;
@@ -324,7 +326,7 @@
         return mCoveredFadeColor;
     }
 
-    public void setPanelSlideListener(PanelSlideListener listener) {
+    public void setPanelSlideListener(@Nullable PanelSlideListener listener) {
         mPanelSlideListener = listener;
     }
 
@@ -1081,7 +1083,7 @@
      *
      * @param d drawable to use as a shadow
      */
-    public void setShadowDrawableLeft(Drawable d) {
+    public void setShadowDrawableLeft(@Nullable Drawable d) {
         mShadowDrawableLeft = d;
     }
 
@@ -1091,7 +1093,7 @@
      *
      * @param d drawable to use as a shadow
      */
-    public void setShadowDrawableRight(Drawable d) {
+    public void setShadowDrawableRight(@Nullable Drawable d) {
         mShadowDrawableRight = d;
     }
 
@@ -1410,20 +1412,20 @@
             super(width, height);
         }
 
-        public LayoutParams(android.view.ViewGroup.LayoutParams source) {
+        public LayoutParams(@NonNull android.view.ViewGroup.LayoutParams source) {
             super(source);
         }
 
-        public LayoutParams(MarginLayoutParams source) {
+        public LayoutParams(@NonNull MarginLayoutParams source) {
             super(source);
         }
 
-        public LayoutParams(LayoutParams source) {
+        public LayoutParams(@NonNull LayoutParams source) {
             super(source);
             this.weight = source.weight;
         }
 
-        public LayoutParams(Context c, AttributeSet attrs) {
+        public LayoutParams(@NonNull Context c, @Nullable AttributeSet attrs) {
             super(c, attrs);
 
             final TypedArray a = c.obtainStyledAttributes(attrs, ATTRS);
diff --git a/core-ui/java/android/support/v4/widget/Space.java b/core-ui/src/main/java/android/support/v4/widget/Space.java
similarity index 88%
rename from core-ui/java/android/support/v4/widget/Space.java
rename to core-ui/src/main/java/android/support/v4/widget/Space.java
index 77a2d2e..7d37a72 100644
--- a/core-ui/java/android/support/v4/widget/Space.java
+++ b/core-ui/src/main/java/android/support/v4/widget/Space.java
@@ -19,6 +19,8 @@
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.graphics.Canvas;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.util.AttributeSet;
 import android.view.View;
 
@@ -28,18 +30,18 @@
  */
 public class Space extends View {
 
-    public Space(Context context, AttributeSet attrs, int defStyle) {
+    public Space(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
         if (getVisibility() == VISIBLE) {
             setVisibility(INVISIBLE);
         }
     }
 
-    public Space(Context context, AttributeSet attrs) {
+    public Space(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, 0);
     }
 
-    public Space(Context context) {
+    public Space(@NonNull Context context) {
         this(context, null);
     }
 
diff --git a/core-ui/java/android/support/v4/widget/SwipeProgressBar.java b/core-ui/src/main/java/android/support/v4/widget/SwipeProgressBar.java
similarity index 100%
rename from core-ui/java/android/support/v4/widget/SwipeProgressBar.java
rename to core-ui/src/main/java/android/support/v4/widget/SwipeProgressBar.java
diff --git a/core-ui/java/android/support/v4/widget/SwipeRefreshLayout.java b/core-ui/src/main/java/android/support/v4/widget/SwipeRefreshLayout.java
similarity index 98%
rename from core-ui/java/android/support/v4/widget/SwipeRefreshLayout.java
rename to core-ui/src/main/java/android/support/v4/widget/SwipeRefreshLayout.java
index 2181bab..ca04e46 100644
--- a/core-ui/java/android/support/v4/widget/SwipeRefreshLayout.java
+++ b/core-ui/src/main/java/android/support/v4/widget/SwipeRefreshLayout.java
@@ -20,6 +20,7 @@
 import android.content.res.TypedArray;
 import android.support.annotation.ColorInt;
 import android.support.annotation.ColorRes;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
 import android.support.v4.content.ContextCompat;
@@ -316,7 +317,7 @@
      *
      * @param context
      */
-    public SwipeRefreshLayout(Context context) {
+    public SwipeRefreshLayout(@NonNull Context context) {
         this(context, null);
     }
 
@@ -326,7 +327,7 @@
      * @param context
      * @param attrs
      */
-    public SwipeRefreshLayout(Context context, AttributeSet attrs) {
+    public SwipeRefreshLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
 
         mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
@@ -387,7 +388,7 @@
      * Set the listener to be notified when a refresh is triggered via the swipe
      * gesture.
      */
-    public void setOnRefreshListener(OnRefreshListener listener) {
+    public void setOnRefreshListener(@Nullable OnRefreshListener listener) {
         mListener = listener;
     }
 
@@ -1189,6 +1190,6 @@
          *
          * @return Whether it is possible for the child view of parent layout to scroll up.
          */
-        boolean canChildScrollUp(SwipeRefreshLayout parent, @Nullable View child);
+        boolean canChildScrollUp(@NonNull SwipeRefreshLayout parent, @Nullable View child);
     }
 }
diff --git a/core-ui/java/android/support/v4/widget/ViewDragHelper.java b/core-ui/src/main/java/android/support/v4/widget/ViewDragHelper.java
similarity index 97%
rename from core-ui/java/android/support/v4/widget/ViewDragHelper.java
rename to core-ui/src/main/java/android/support/v4/widget/ViewDragHelper.java
index c222c17..09c6f66 100644
--- a/core-ui/java/android/support/v4/widget/ViewDragHelper.java
+++ b/core-ui/src/main/java/android/support/v4/widget/ViewDragHelper.java
@@ -18,6 +18,8 @@
 package android.support.v4.widget;
 
 import android.content.Context;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v4.view.ViewCompat;
 import android.util.Log;
 import android.view.MotionEvent;
@@ -167,7 +169,9 @@
          * @param dx Change in X position from the last call
          * @param dy Change in Y position from the last call
          */
-        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {}
+        public void onViewPositionChanged(@NonNull View changedView, int left, int top, int dx,
+                int dy) {
+        }
 
         /**
          * Called when a child view is captured for dragging or settling. The ID of the pointer
@@ -178,7 +182,7 @@
          * @param capturedChild Child view that was captured
          * @param activePointerId Pointer id tracking the child capture
          */
-        public void onViewCaptured(View capturedChild, int activePointerId) {}
+        public void onViewCaptured(@NonNull View capturedChild, int activePointerId) {}
 
         /**
          * Called when the child view is no longer being actively dragged.
@@ -198,7 +202,7 @@
          * @param xvel X velocity of the pointer as it left the screen in pixels per second.
          * @param yvel Y velocity of the pointer as it left the screen in pixels per second.
          */
-        public void onViewReleased(View releasedChild, float xvel, float yvel) {}
+        public void onViewReleased(@NonNull View releasedChild, float xvel, float yvel) {}
 
         /**
          * Called when one of the subscribed edges in the parent view has been touched
@@ -256,7 +260,7 @@
          * @param child Child view to check
          * @return range of horizontal motion in pixels
          */
-        public int getViewHorizontalDragRange(View child) {
+        public int getViewHorizontalDragRange(@NonNull View child) {
             return 0;
         }
 
@@ -267,7 +271,7 @@
          * @param child Child view to check
          * @return range of vertical motion in pixels
          */
-        public int getViewVerticalDragRange(View child) {
+        public int getViewVerticalDragRange(@NonNull View child) {
             return 0;
         }
 
@@ -287,7 +291,7 @@
          * @param pointerId ID of the pointer attempting the capture
          * @return true if capture should be allowed, false otherwise
          */
-        public abstract boolean tryCaptureView(View child, int pointerId);
+        public abstract boolean tryCaptureView(@NonNull View child, int pointerId);
 
         /**
          * Restrict the motion of the dragged child view along the horizontal axis.
@@ -300,7 +304,7 @@
          * @param dx Proposed change in position for left
          * @return The new clamped position for left
          */
-        public int clampViewPositionHorizontal(View child, int left, int dx) {
+        public int clampViewPositionHorizontal(@NonNull View child, int left, int dx) {
             return 0;
         }
 
@@ -315,7 +319,7 @@
          * @param dy Proposed change in position for top
          * @return The new clamped position for top
          */
-        public int clampViewPositionVertical(View child, int top, int dy) {
+        public int clampViewPositionVertical(@NonNull View child, int top, int dy) {
             return 0;
         }
     }
@@ -345,7 +349,7 @@
      * @param cb Callback to provide information and receive events
      * @return a new ViewDragHelper instance
      */
-    public static ViewDragHelper create(ViewGroup forParent, Callback cb) {
+    public static ViewDragHelper create(@NonNull ViewGroup forParent, @NonNull Callback cb) {
         return new ViewDragHelper(forParent.getContext(), forParent, cb);
     }
 
@@ -358,7 +362,8 @@
      * @param cb Callback to provide information and receive events
      * @return a new ViewDragHelper instance
      */
-    public static ViewDragHelper create(ViewGroup forParent, float sensitivity, Callback cb) {
+    public static ViewDragHelper create(@NonNull ViewGroup forParent, float sensitivity,
+            @NonNull Callback cb) {
         final ViewDragHelper helper = create(forParent, cb);
         helper.mTouchSlop = (int) (helper.mTouchSlop * (1 / sensitivity));
         return helper;
@@ -372,7 +377,8 @@
      * @param context Context to initialize config-dependent params from
      * @param forParent Parent view to monitor
      */
-    private ViewDragHelper(Context context, ViewGroup forParent, Callback cb) {
+    private ViewDragHelper(@NonNull Context context, @NonNull ViewGroup forParent,
+            @NonNull Callback cb) {
         if (forParent == null) {
             throw new IllegalArgumentException("Parent view may not be null");
         }
@@ -458,7 +464,7 @@
      * @param childView Child view to capture
      * @param activePointerId ID of the pointer that is dragging the captured child view
      */
-    public void captureChildView(View childView, int activePointerId) {
+    public void captureChildView(@NonNull View childView, int activePointerId) {
         if (childView.getParent() != mParentView) {
             throw new IllegalArgumentException("captureChildView: parameter must be a descendant "
                     + "of the ViewDragHelper's tracked parent view (" + mParentView + ")");
@@ -473,6 +479,7 @@
     /**
      * @return The currently captured view, or null if no view has been captured.
      */
+    @Nullable
     public View getCapturedView() {
         return mCapturedView;
     }
@@ -537,7 +544,7 @@
      * @param finalTop Final top position of child
      * @return true if animation should continue through {@link #continueSettling(boolean)} calls
      */
-    public boolean smoothSlideViewTo(View child, int finalLeft, int finalTop) {
+    public boolean smoothSlideViewTo(@NonNull View child, int finalLeft, int finalTop) {
         mCapturedView = child;
         mActivePointerId = INVALID_POINTER;
 
@@ -918,7 +925,7 @@
      * @param y Y coordinate of the active touch point
      * @return true if child views of v can be scrolled by delta of dx.
      */
-    protected boolean canScroll(View v, boolean checkV, int dx, int dy, int x, int y) {
+    protected boolean canScroll(@NonNull View v, boolean checkV, int dx, int dy, int x, int y) {
         if (v instanceof ViewGroup) {
             final ViewGroup group = (ViewGroup) v;
             final int scrollX = v.getScrollX();
@@ -948,7 +955,7 @@
      * @param ev MotionEvent provided to onInterceptTouchEvent
      * @return true if the parent view should return true from onInterceptTouchEvent
      */
-    public boolean shouldInterceptTouchEvent(MotionEvent ev) {
+    public boolean shouldInterceptTouchEvent(@NonNull MotionEvent ev) {
         final int action = ev.getActionMasked();
         final int actionIndex = ev.getActionIndex();
 
@@ -1082,7 +1089,7 @@
      *
      * @param ev The touch event received by the parent view
      */
-    public void processTouchEvent(MotionEvent ev) {
+    public void processTouchEvent(@NonNull MotionEvent ev) {
         final int action = ev.getActionMasked();
         final int actionIndex = ev.getActionIndex();
 
@@ -1453,7 +1460,7 @@
      * @param y Y position to test in the parent's coordinate system
      * @return true if the supplied view is under the given point, false otherwise
      */
-    public boolean isViewUnder(View view, int x, int y) {
+    public boolean isViewUnder(@Nullable View view, int x, int y) {
         if (view == null) {
             return false;
         }
@@ -1471,6 +1478,7 @@
      * @param y Y position to test in the parent's coordinate system
      * @return The topmost child view under (x, y) or null if none found.
      */
+    @Nullable
     public View findTopChildUnder(int x, int y) {
         final int childCount = mParentView.getChildCount();
         for (int i = childCount - 1; i >= 0; i--) {
diff --git a/core-ui/java/android/support/v4/widget/package.html b/core-ui/src/main/java/android/support/v4/widget/package.html
similarity index 100%
rename from core-ui/java/android/support/v4/widget/package.html
rename to core-ui/src/main/java/android/support/v4/widget/package.html
diff --git a/core-ui/tests/java/android/support/v4/view/BaseViewPagerTest.java b/core-ui/tests/java/android/support/v4/view/BaseViewPagerTest.java
index 10b68fa..f26942b 100644
--- a/core-ui/tests/java/android/support/v4/view/BaseViewPagerTest.java
+++ b/core-ui/tests/java/android/support/v4/view/BaseViewPagerTest.java
@@ -64,6 +64,7 @@
 import android.support.coreui.test.R;
 import android.support.test.espresso.ViewAction;
 import android.support.test.espresso.action.EspressoKey;
+import android.support.test.filters.FlakyTest;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.MediumTest;
 import android.support.v4.BaseInstrumentationTestCase;
@@ -1075,6 +1076,7 @@
         verifyScrollCallbacksToLowerPage(wrap(swipeRight()), 0);
     }
 
+    @FlakyTest(bugId = 38260187)
     @Test
     @LargeTest
     public void testKeyboardNavigation() {
diff --git a/core-utils/Android.mk b/core-utils/Android.mk
index 5ea200e..a6855fc 100644
--- a/core-utils/Android.mk
+++ b/core-utils/Android.mk
@@ -27,10 +27,7 @@
 LOCAL_MODULE := android-support-core-utils
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_SRC_FILES := \
-    $(call all-java-files-under,gingerbread) \
-    $(call all-java-files-under,kitkat) \
-    $(call all-java-files-under,api21) \
-    $(call all-java-files-under,java)
+    $(call all-java-files-under,src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-compat \
diff --git a/core-utils/AndroidManifest.xml b/core-utils/AndroidManifest.xml
index c24e023..248229b 100644
--- a/core-utils/AndroidManifest.xml
+++ b/core-utils/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.coreutils">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.coreutils.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/core-utils/api/26.1.0.txt b/core-utils/api/26.1.0.txt
new file mode 100644
index 0000000..d535653
--- /dev/null
+++ b/core-utils/api/26.1.0.txt
@@ -0,0 +1,321 @@
+package android.support.v4.app {
+
+  public class AppLaunchChecker {
+    ctor public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray[] getMetrics();
+    method public android.util.SparseIntArray[] remove(android.app.Activity);
+    method public android.util.SparseIntArray[] reset();
+    method public android.util.SparseIntArray[] stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  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;
+    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 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);
+    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<D> 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 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 Loader<D> {
+    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<D> {
+    method public abstract void onLoadCanceled(android.support.v4.content.Loader<D>);
+  }
+
+  public static abstract interface Loader.OnLoadCompleteListener<D> {
+    method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
+  }
+
+  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);
+    method public void sendBroadcastSync(android.content.Intent);
+    method public void unregisterReceiver(android.content.BroadcastReceiver);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(java.lang.String, java.lang.String);
+    method public static java.lang.String matches(java.lang.String, java.lang.String[]);
+    method public static java.lang.String matches(java.lang.String[], java.lang.String);
+    method public static java.lang.String[] matchesMany(java.lang.String[], java.lang.String);
+  }
+
+  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 abstract deprecated 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.graphics {
+
+  public final class ColorUtils {
+    method public static int HSLToColor(float[]);
+    method public static int LABToColor(double, double, double);
+    method public static void LABToXYZ(double, double, double, double[]);
+    method public static void RGBToHSL(int, int, int, float[]);
+    method public static void RGBToLAB(int, int, int, double[]);
+    method public static void RGBToXYZ(int, int, int, double[]);
+    method public static int XYZToColor(double, double, double);
+    method public static void XYZToLAB(double, double, double, double[]);
+    method public static int blendARGB(int, int, float);
+    method public static void blendHSL(float[], float[], float, float[]);
+    method public static void blendLAB(double[], double[], double, double[]);
+    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 void colorToLAB(int, double[]);
+    method public static void colorToXYZ(int, double[]);
+    method public static int compositeColors(int, int);
+    method public static double distanceEuclidean(double[], double[]);
+    method public static int setAlphaComponent(int, int);
+  }
+
+}
+
+package android.support.v4.graphics.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 setDither(boolean);
+    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 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);
+  }
+
+}
+
+package android.support.v4.math {
+
+  public class MathUtils {
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+  }
+
+}
+
+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 boolean isVirtual();
+    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);
+  }
+
+}
+
diff --git a/core-utils/api/27.0.0.txt b/core-utils/api/27.0.0.txt
new file mode 100644
index 0000000..d535653
--- /dev/null
+++ b/core-utils/api/27.0.0.txt
@@ -0,0 +1,321 @@
+package android.support.v4.app {
+
+  public class AppLaunchChecker {
+    ctor public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray[] getMetrics();
+    method public android.util.SparseIntArray[] remove(android.app.Activity);
+    method public android.util.SparseIntArray[] reset();
+    method public android.util.SparseIntArray[] stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  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;
+    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 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);
+    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<D> 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 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 Loader<D> {
+    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<D> {
+    method public abstract void onLoadCanceled(android.support.v4.content.Loader<D>);
+  }
+
+  public static abstract interface Loader.OnLoadCompleteListener<D> {
+    method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
+  }
+
+  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);
+    method public void sendBroadcastSync(android.content.Intent);
+    method public void unregisterReceiver(android.content.BroadcastReceiver);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(java.lang.String, java.lang.String);
+    method public static java.lang.String matches(java.lang.String, java.lang.String[]);
+    method public static java.lang.String matches(java.lang.String[], java.lang.String);
+    method public static java.lang.String[] matchesMany(java.lang.String[], java.lang.String);
+  }
+
+  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 abstract deprecated 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.graphics {
+
+  public final class ColorUtils {
+    method public static int HSLToColor(float[]);
+    method public static int LABToColor(double, double, double);
+    method public static void LABToXYZ(double, double, double, double[]);
+    method public static void RGBToHSL(int, int, int, float[]);
+    method public static void RGBToLAB(int, int, int, double[]);
+    method public static void RGBToXYZ(int, int, int, double[]);
+    method public static int XYZToColor(double, double, double);
+    method public static void XYZToLAB(double, double, double, double[]);
+    method public static int blendARGB(int, int, float);
+    method public static void blendHSL(float[], float[], float, float[]);
+    method public static void blendLAB(double[], double[], double, double[]);
+    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 void colorToLAB(int, double[]);
+    method public static void colorToXYZ(int, double[]);
+    method public static int compositeColors(int, int);
+    method public static double distanceEuclidean(double[], double[]);
+    method public static int setAlphaComponent(int, int);
+  }
+
+}
+
+package android.support.v4.graphics.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 setDither(boolean);
+    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 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);
+  }
+
+}
+
+package android.support.v4.math {
+
+  public class MathUtils {
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+  }
+
+}
+
+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 boolean isVirtual();
+    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);
+  }
+
+}
+
diff --git a/core-utils/build.gradle b/core-utils/build.gradle
index 0fe309b..55fe2bb 100644
--- a/core-utils/build.gradle
+++ b/core-utils/build.gradle
@@ -14,18 +14,6 @@
     defaultConfig {
         minSdkVersion 14
     }
-
-    sourceSets {
-        main.java.srcDirs = [
-                'gingerbread',
-                'kitkat',
-                'api20',
-                'api21',
-                'api23',
-                'api24',
-                'java'
-        ]
-    }
 }
 
 supportLibrary {
diff --git a/core-utils/java/android/support/v4/app/AppLaunchChecker.java b/core-utils/src/main/java/android/support/v4/app/AppLaunchChecker.java
similarity index 90%
rename from core-utils/java/android/support/v4/app/AppLaunchChecker.java
rename to core-utils/src/main/java/android/support/v4/app/AppLaunchChecker.java
index f8beb91..af9512a 100644
--- a/core-utils/java/android/support/v4/app/AppLaunchChecker.java
+++ b/core-utils/src/main/java/android/support/v4/app/AppLaunchChecker.java
@@ -22,8 +22,8 @@
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
 import android.support.v4.content.IntentCompat;
-import android.support.v4.content.SharedPreferencesCompat;
 
 /**
  * This class provides APIs for determining how an app has been launched.
@@ -46,7 +46,7 @@
      * @param context Context to check
      * @return true if this app has been started by the user from the launcher at least once
      */
-    public static boolean hasStartedFromLauncher(Context context) {
+    public static boolean hasStartedFromLauncher(@NonNull Context context) {
         return context.getSharedPreferences(SHARED_PREFS_NAME, 0)
                 .getBoolean(KEY_STARTED_FROM_LAUNCHER, false);
     }
@@ -62,7 +62,7 @@
      *
      * @param activity the Activity currently running onCreate
      */
-    public static void onActivityCreate(Activity activity) {
+    public static void onActivityCreate(@NonNull Activity activity) {
         final SharedPreferences sp = activity.getSharedPreferences(SHARED_PREFS_NAME, 0);
         if (sp.getBoolean(KEY_STARTED_FROM_LAUNCHER, false)) {
             return;
@@ -76,8 +76,7 @@
         if (Intent.ACTION_MAIN.equals(launchIntent.getAction())
                 && (launchIntent.hasCategory(Intent.CATEGORY_LAUNCHER)
                 || launchIntent.hasCategory(IntentCompat.CATEGORY_LEANBACK_LAUNCHER))) {
-            SharedPreferencesCompat.EditorCompat.getInstance().apply(
-                    sp.edit().putBoolean(KEY_STARTED_FROM_LAUNCHER, true));
+            sp.edit().putBoolean(KEY_STARTED_FROM_LAUNCHER, true).apply();
         }
     }
 }
diff --git a/core-utils/java/android/support/v4/app/FrameMetricsAggregator.java b/core-utils/src/main/java/android/support/v4/app/FrameMetricsAggregator.java
similarity index 100%
rename from core-utils/java/android/support/v4/app/FrameMetricsAggregator.java
rename to core-utils/src/main/java/android/support/v4/app/FrameMetricsAggregator.java
diff --git a/core-utils/java/android/support/v4/app/NavUtils.java b/core-utils/src/main/java/android/support/v4/app/NavUtils.java
similarity index 92%
rename from core-utils/java/android/support/v4/app/NavUtils.java
rename to core-utils/src/main/java/android/support/v4/app/NavUtils.java
index 99d4493..d259417 100644
--- a/core-utils/java/android/support/v4/app/NavUtils.java
+++ b/core-utils/src/main/java/android/support/v4/app/NavUtils.java
@@ -24,6 +24,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.Build;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.util.Log;
 
@@ -53,7 +54,8 @@
      * @return true if navigating up should recreate a new task stack, false if the same task
      *         should be used for the destination
      */
-    public static boolean shouldUpRecreateTask(Activity sourceActivity, Intent targetIntent) {
+    public static boolean shouldUpRecreateTask(@NonNull Activity sourceActivity,
+            @NonNull Intent targetIntent) {
         if (Build.VERSION.SDK_INT >= 16) {
             return sourceActivity.shouldUpRecreateTask(targetIntent);
         } else {
@@ -74,7 +76,7 @@
      *
      * @param sourceActivity The current activity from which the user is attempting to navigate up
      */
-    public static void navigateUpFromSameTask(Activity sourceActivity) {
+    public static void navigateUpFromSameTask(@NonNull Activity sourceActivity) {
         Intent upIntent = getParentActivityIntent(sourceActivity);
 
         if (upIntent == null) {
@@ -101,7 +103,7 @@
      * @param sourceActivity The current activity from which the user is attempting to navigate up
      * @param upIntent An intent representing the target destination for up navigation
      */
-    public static void navigateUpTo(Activity sourceActivity, Intent upIntent) {
+    public static void navigateUpTo(@NonNull Activity sourceActivity, @NonNull Intent upIntent) {
         if (Build.VERSION.SDK_INT >= 16) {
             sourceActivity.navigateUpTo(upIntent);
         } else {
@@ -121,7 +123,8 @@
      * @param sourceActivity Activity to fetch a parent intent for
      * @return a new Intent targeting the defined parent activity of sourceActivity
      */
-    public static Intent getParentActivityIntent(Activity sourceActivity) {
+    @Nullable
+    public static Intent getParentActivityIntent(@NonNull Activity sourceActivity) {
         if (Build.VERSION.SDK_INT >= 16) {
             // Prefer the "real" JB definition if available,
             // else fall back to the meta-data element.
@@ -157,7 +160,9 @@
      * @return a new Intent targeting the defined parent activity of sourceActivity
      * @throws NameNotFoundException if the ComponentName for sourceActivityClass is invalid
      */
-    public static Intent getParentActivityIntent(Context context, Class<?> sourceActivityClass)
+    @Nullable
+    public static Intent getParentActivityIntent(@NonNull Context context,
+            @NonNull Class<?> sourceActivityClass)
             throws NameNotFoundException {
         String parentActivity = getParentActivityName(context,
                 new ComponentName(context, sourceActivityClass));
@@ -182,7 +187,9 @@
      * @return a new Intent targeting the defined parent activity of sourceActivity
      * @throws NameNotFoundException if the ComponentName for sourceActivityClass is invalid
      */
-    public static Intent getParentActivityIntent(Context context, ComponentName componentName)
+    @Nullable
+    public static Intent getParentActivityIntent(@NonNull Context context,
+            @NonNull ComponentName componentName)
             throws NameNotFoundException {
         String parentActivity = getParentActivityName(context, componentName);
         if (parentActivity == null) return null;
@@ -207,7 +214,7 @@
      *         it was not specified
      */
     @Nullable
-    public static String getParentActivityName(Activity sourceActivity) {
+    public static String getParentActivityName(@NonNull Activity sourceActivity) {
         try {
             return getParentActivityName(sourceActivity, sourceActivity.getComponentName());
         } catch (NameNotFoundException e) {
@@ -226,7 +233,8 @@
      *         it was not specified
      */
     @Nullable
-    public static String getParentActivityName(Context context, ComponentName componentName)
+    public static String getParentActivityName(@NonNull Context context,
+            @NonNull ComponentName componentName)
             throws NameNotFoundException {
         PackageManager pm = context.getPackageManager();
         ActivityInfo info = pm.getActivityInfo(componentName, PackageManager.GET_META_DATA);
diff --git a/core-utils/java/android/support/v4/app/TaskStackBuilder.java b/core-utils/src/main/java/android/support/v4/app/TaskStackBuilder.java
similarity index 93%
rename from core-utils/java/android/support/v4/app/TaskStackBuilder.java
rename to core-utils/src/main/java/android/support/v4/app/TaskStackBuilder.java
index dc9a2dc..14aadce 100644
--- a/core-utils/java/android/support/v4/app/TaskStackBuilder.java
+++ b/core-utils/src/main/java/android/support/v4/app/TaskStackBuilder.java
@@ -16,7 +16,6 @@
 
 package android.support.v4.app;
 
-import android.support.annotation.RequiresApi;
 import android.app.Activity;
 import android.app.PendingIntent;
 import android.content.ComponentName;
@@ -25,6 +24,9 @@
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.Build;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
 import android.support.v4.content.ContextCompat;
 import android.util.Log;
 
@@ -70,6 +72,7 @@
     private static final String TAG = "TaskStackBuilder";
 
     public interface SupportParentable {
+        @Nullable
         Intent getSupportParentActivityIntent();
     }
 
@@ -117,7 +120,8 @@
      * @param context The context that will launch the new task stack or generate a PendingIntent
      * @return A new TaskStackBuilder
      */
-    public static TaskStackBuilder create(Context context) {
+    @NonNull
+    public static TaskStackBuilder create(@NonNull Context context) {
         return new TaskStackBuilder(context);
     }
 
@@ -142,7 +146,8 @@
      * @param nextIntent Intent for the next Activity in the synthesized task stack
      * @return This TaskStackBuilder for method chaining
      */
-    public TaskStackBuilder addNextIntent(Intent nextIntent) {
+    @NonNull
+    public TaskStackBuilder addNextIntent(@NonNull Intent nextIntent) {
         mIntents.add(nextIntent);
         return this;
     }
@@ -159,7 +164,8 @@
      *                   Its chain of parents as specified in the manifest will be added.
      * @return This TaskStackBuilder for method chaining.
      */
-    public TaskStackBuilder addNextIntentWithParentStack(Intent nextIntent) {
+    @NonNull
+    public TaskStackBuilder addNextIntentWithParentStack(@NonNull Intent nextIntent) {
         ComponentName target = nextIntent.getComponent();
         if (target == null) {
             target = nextIntent.resolveActivity(mSourceContext.getPackageManager());
@@ -178,7 +184,8 @@
      * @param sourceActivity All parents of this activity will be added
      * @return This TaskStackBuilder for method chaining
      */
-    public TaskStackBuilder addParentStack(Activity sourceActivity) {
+    @NonNull
+    public TaskStackBuilder addParentStack(@NonNull Activity sourceActivity) {
         Intent parent = null;
         if (sourceActivity instanceof SupportParentable) {
             parent = ((SupportParentable) sourceActivity).getSupportParentActivityIntent();
@@ -207,7 +214,8 @@
      * @param sourceActivityClass All parents of this activity will be added
      * @return This TaskStackBuilder for method chaining
      */
-    public TaskStackBuilder addParentStack(Class<?> sourceActivityClass) {
+    @NonNull
+    public TaskStackBuilder addParentStack(@NonNull Class<?> sourceActivityClass) {
         return addParentStack(new ComponentName(mSourceContext, sourceActivityClass));
     }
 
@@ -264,6 +272,7 @@
      * @param index Index from 0-getIntentCount()
      * @return the intent at position index
      */
+    @Nullable
     public Intent editIntentAt(int index) {
         return mIntents.get(index);
     }
@@ -300,7 +309,7 @@
      * @param options Additional options for how the Activity should be started.
      * See {@link android.content.Context#startActivity(Intent, Bundle)}
      */
-    public void startActivities(Bundle options) {
+    public void startActivities(@Nullable Bundle options) {
         if (mIntents.isEmpty()) {
             throw new IllegalStateException(
                     "No intents added to TaskStackBuilder; cannot startActivities");
@@ -325,8 +334,10 @@
      *              {@link PendingIntent#FLAG_UPDATE_CURRENT}, or any of the flags supported by
      *              {@link Intent#fillIn(Intent, int)} to control which unspecified parts of the
      *              intent that can be supplied when the actual send happens.
-     * @return The obtained PendingIntent
+     * @return The obtained PendingIntent.  May return null only if
+     * {@link PendingIntent#FLAG_NO_CREATE} has been supplied.
      */
+    @Nullable
     public PendingIntent getPendingIntent(int requestCode, int flags) {
         return getPendingIntent(requestCode, flags, null);
     }
@@ -342,9 +353,11 @@
      *              intent that can be supplied when the actual send happens.
      * @param options Additional options for how the Activity should be started.
      * See {@link android.content.Context#startActivity(Intent, Bundle)}
-     * @return The obtained PendingIntent
+     * @return The obtained PendingIntent.  May return null only if
+     * {@link PendingIntent#FLAG_NO_CREATE} has been supplied.
      */
-    public PendingIntent getPendingIntent(int requestCode, int flags, Bundle options) {
+    @Nullable
+    public PendingIntent getPendingIntent(int requestCode, int flags, @Nullable Bundle options) {
         if (mIntents.isEmpty()) {
             throw new IllegalStateException(
                     "No intents added to TaskStackBuilder; cannot getPendingIntent");
@@ -364,6 +377,7 @@
      *
      * @return An array containing the intents added to this builder.
      */
+    @NonNull
     public Intent[] getIntents() {
         Intent[] intents = new Intent[mIntents.size()];
         if (intents.length == 0) return intents;
diff --git a/core-utils/java/android/support/v4/app/package.html b/core-utils/src/main/java/android/support/v4/app/package.html
similarity index 100%
rename from core-utils/java/android/support/v4/app/package.html
rename to core-utils/src/main/java/android/support/v4/app/package.html
diff --git a/core-utils/java/android/support/v4/content/AsyncTaskLoader.java b/core-utils/src/main/java/android/support/v4/content/AsyncTaskLoader.java
similarity index 97%
rename from core-utils/java/android/support/v4/content/AsyncTaskLoader.java
rename to core-utils/src/main/java/android/support/v4/content/AsyncTaskLoader.java
index faa13ad..5882f69 100644
--- a/core-utils/java/android/support/v4/content/AsyncTaskLoader.java
+++ b/core-utils/src/main/java/android/support/v4/content/AsyncTaskLoader.java
@@ -21,6 +21,8 @@
 import android.content.Context;
 import android.os.Handler;
 import android.os.SystemClock;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 import android.support.v4.os.OperationCanceledException;
 import android.support.v4.util.TimeUtils;
@@ -121,11 +123,11 @@
     long mLastLoadCompleteTime = -10000;
     Handler mHandler;
 
-    public AsyncTaskLoader(Context context) {
+    public AsyncTaskLoader(@NonNull Context context) {
         this(context, ModernAsyncTask.THREAD_POOL_EXECUTOR);
     }
 
-    private AsyncTaskLoader(Context context, Executor executor) {
+    private AsyncTaskLoader(@NonNull Context context, @NonNull Executor executor) {
         super(context);
         mExecutor = executor;
     }
@@ -200,7 +202,7 @@
      * @param data The value that was returned by {@link #loadInBackground}, or null
      * if the task threw {@link OperationCanceledException}.
      */
-    public void onCanceled(D data) {
+    public void onCanceled(@Nullable D data) {
     }
 
     void executePendingTask() {
@@ -284,6 +286,7 @@
      * @see #cancelLoadInBackground
      * @see #onCanceled
      */
+    @Nullable
     public abstract D loadInBackground();
 
     /**
@@ -298,6 +301,7 @@
      *
      * @see #loadInBackground
      */
+    @Nullable
     protected D onLoadInBackground() {
         return loadInBackground();
     }
diff --git a/core-utils/java/android/support/v4/content/CursorLoader.java b/core-utils/src/main/java/android/support/v4/content/CursorLoader.java
similarity index 90%
rename from core-utils/java/android/support/v4/content/CursorLoader.java
rename to core-utils/src/main/java/android/support/v4/content/CursorLoader.java
index 503bb9c..5c6925d 100644
--- a/core-utils/java/android/support/v4/content/CursorLoader.java
+++ b/core-utils/src/main/java/android/support/v4/content/CursorLoader.java
@@ -20,6 +20,8 @@
 import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v4.os.CancellationSignal;
 import android.support.v4.os.OperationCanceledException;
 
@@ -115,7 +117,7 @@
      * calls to {@link #setUri(Uri)}, {@link #setSelection(String)}, etc
      * to specify the query to perform.
      */
-    public CursorLoader(Context context) {
+    public CursorLoader(@NonNull Context context) {
         super(context);
         mObserver = new ForceLoadContentObserver();
     }
@@ -126,8 +128,9 @@
      * ContentResolver.query()} for documentation on the meaning of the
      * parameters.  These will be passed as-is to that call.
      */
-    public CursorLoader(Context context, Uri uri, String[] projection, String selection,
-            String[] selectionArgs, String sortOrder) {
+    public CursorLoader(@NonNull Context context, @NonNull Uri uri, @Nullable String[] projection,
+            @Nullable String selection, @Nullable String[] selectionArgs,
+            @Nullable String sortOrder) {
         super(context);
         mObserver = new ForceLoadContentObserver();
         mUri = uri;
@@ -183,43 +186,48 @@
         mCursor = null;
     }
 
+    @NonNull
     public Uri getUri() {
         return mUri;
     }
 
-    public void setUri(Uri uri) {
+    public void setUri(@NonNull Uri uri) {
         mUri = uri;
     }
 
+    @Nullable
     public String[] getProjection() {
         return mProjection;
     }
 
-    public void setProjection(String[] projection) {
+    public void setProjection(@Nullable String[] projection) {
         mProjection = projection;
     }
 
+    @Nullable
     public String getSelection() {
         return mSelection;
     }
 
-    public void setSelection(String selection) {
+    public void setSelection(@Nullable String selection) {
         mSelection = selection;
     }
 
+    @Nullable
     public String[] getSelectionArgs() {
         return mSelectionArgs;
     }
 
-    public void setSelectionArgs(String[] selectionArgs) {
+    public void setSelectionArgs(@Nullable String[] selectionArgs) {
         mSelectionArgs = selectionArgs;
     }
 
+    @Nullable
     public String getSortOrder() {
         return mSortOrder;
     }
 
-    public void setSortOrder(String sortOrder) {
+    public void setSortOrder(@Nullable String sortOrder) {
         mSortOrder = sortOrder;
     }
 
diff --git a/core-utils/java/android/support/v4/content/FileProvider.java b/core-utils/src/main/java/android/support/v4/content/FileProvider.java
similarity index 97%
rename from core-utils/java/android/support/v4/content/FileProvider.java
rename to core-utils/src/main/java/android/support/v4/content/FileProvider.java
index c49fc12..8599911 100644
--- a/core-utils/java/android/support/v4/content/FileProvider.java
+++ b/core-utils/src/main/java/android/support/v4/content/FileProvider.java
@@ -33,6 +33,8 @@
 import android.os.ParcelFileDescriptor;
 import android.provider.OpenableColumns;
 import android.support.annotation.GuardedBy;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.text.TextUtils;
 import android.webkit.MimeTypeMap;
 
@@ -362,7 +364,7 @@
      * @param info A {@link ProviderInfo} for the new provider.
      */
     @Override
-    public void attachInfo(Context context, ProviderInfo info) {
+    public void attachInfo(@NonNull Context context, @NonNull ProviderInfo info) {
         super.attachInfo(context, info);
 
         // Sanity check our security
@@ -396,7 +398,8 @@
      * @throws IllegalArgumentException When the given {@link File} is outside
      * the paths supported by the provider.
      */
-    public static Uri getUriForFile(Context context, String authority, File file) {
+    public static Uri getUriForFile(@NonNull Context context, @NonNull String authority,
+            @NonNull File file) {
         final PathStrategy strategy = getPathStrategy(context, authority);
         return strategy.getUriForFile(file);
     }
@@ -430,8 +433,9 @@
      *
      */
     @Override
-    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
-            String sortOrder) {
+    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
+            @Nullable String[] selectionArgs,
+            @Nullable String sortOrder) {
         // ContentProvider has already checked granted permissions
         final File file = mStrategy.getFileForUri(uri);
 
@@ -470,7 +474,7 @@
      * extension; otherwise <code>application/octet-stream</code>.
      */
     @Override
-    public String getType(Uri uri) {
+    public String getType(@NonNull Uri uri) {
         // ContentProvider has already checked granted permissions
         final File file = mStrategy.getFileForUri(uri);
 
@@ -491,7 +495,7 @@
      * subclass FileProvider if you want to provide different functionality.
      */
     @Override
-    public Uri insert(Uri uri, ContentValues values) {
+    public Uri insert(@NonNull Uri uri, ContentValues values) {
         throw new UnsupportedOperationException("No external inserts");
     }
 
@@ -500,7 +504,8 @@
      * subclass FileProvider if you want to provide different functionality.
      */
     @Override
-    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+    public int update(@NonNull Uri uri, ContentValues values, @Nullable String selection,
+            @Nullable String[] selectionArgs) {
         throw new UnsupportedOperationException("No external updates");
     }
 
@@ -516,7 +521,8 @@
      * @return 1 if the delete succeeds; otherwise, 0.
      */
     @Override
-    public int delete(Uri uri, String selection, String[] selectionArgs) {
+    public int delete(@NonNull Uri uri, @Nullable String selection,
+            @Nullable String[] selectionArgs) {
         // ContentProvider has already checked granted permissions
         final File file = mStrategy.getFileForUri(uri);
         return file.delete() ? 1 : 0;
@@ -538,7 +544,8 @@
      * @return A new {@link ParcelFileDescriptor} with which you can access the file.
      */
     @Override
-    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
+    public ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode)
+            throws FileNotFoundException {
         // ContentProvider has already checked granted permissions
         final File file = mStrategy.getFileForUri(uri);
         final int fileMode = modeToMode(mode);
diff --git a/core-utils/java/android/support/v4/content/Loader.java b/core-utils/src/main/java/android/support/v4/content/Loader.java
similarity index 96%
rename from core-utils/java/android/support/v4/content/Loader.java
rename to core-utils/src/main/java/android/support/v4/content/Loader.java
index 40b459f..2ac10d7 100644
--- a/core-utils/java/android/support/v4/content/Loader.java
+++ b/core-utils/src/main/java/android/support/v4/content/Loader.java
@@ -19,6 +19,8 @@
 import android.content.Context;
 import android.database.ContentObserver;
 import android.os.Handler;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v4.util.DebugUtils;
 
 import java.io.FileDescriptor;
@@ -80,7 +82,7 @@
          * @param loader the loader that completed the load
          * @param data the result of the load
          */
-        public void onLoadComplete(Loader<D> loader, D data);
+        void onLoadComplete(@NonNull Loader<D> loader, @Nullable D data);
     }
 
     /**
@@ -97,7 +99,7 @@
          *
          * @param loader the loader that canceled the load
          */
-        public void onLoadCanceled(Loader<D> loader);
+        void onLoadCanceled(@NonNull Loader<D> loader);
     }
 
     /**
@@ -110,7 +112,7 @@
      *
      * @param context used to retrieve the application context.
      */
-    public Loader(Context context) {
+    public Loader(@NonNull Context context) {
         mContext = context.getApplicationContext();
     }
 
@@ -121,7 +123,7 @@
      *
      * @param data the result of the load
      */
-    public void deliverResult(D data) {
+    public void deliverResult(@Nullable D data) {
         if (mListener != null) {
             mListener.onLoadComplete(this, data);
         }
@@ -142,6 +144,7 @@
     /**
      * @return an application context retrieved from the Context passed to the constructor.
      */
+    @NonNull
     public Context getContext() {
         return mContext;
     }
@@ -160,7 +163,7 @@
      *
      * <p>Must be called from the process's main thread.
      */
-    public void registerListener(int id, OnLoadCompleteListener<D> listener) {
+    public void registerListener(int id, @NonNull OnLoadCompleteListener<D> listener) {
         if (mListener != null) {
             throw new IllegalStateException("There is already a listener registered");
         }
@@ -173,7 +176,7 @@
      *
      * Must be called from the process's main thread.
      */
-    public void unregisterListener(OnLoadCompleteListener<D> listener) {
+    public void unregisterListener(@NonNull OnLoadCompleteListener<D> listener) {
         if (mListener == null) {
             throw new IllegalStateException("No listener register");
         }
@@ -192,7 +195,7 @@
      *
      * @param listener The listener to register.
      */
-    public void registerOnLoadCanceledListener(OnLoadCanceledListener<D> listener) {
+    public void registerOnLoadCanceledListener(@NonNull OnLoadCanceledListener<D> listener) {
         if (mOnLoadCanceledListener != null) {
             throw new IllegalStateException("There is already a listener registered");
         }
@@ -207,7 +210,7 @@
      *
      * @param listener The listener to unregister.
      */
-    public void unregisterOnLoadCanceledListener(OnLoadCanceledListener<D> listener) {
+    public void unregisterOnLoadCanceledListener(@NonNull OnLoadCanceledListener<D> listener) {
         if (mOnLoadCanceledListener == null) {
             throw new IllegalStateException("No listener register");
         }
@@ -493,7 +496,8 @@
      * For debugging, converts an instance of the Loader's data class to
      * a string that can be printed.  Must handle a null data.
      */
-    public String dataToString(D data) {
+    @NonNull
+    public String dataToString(@Nullable D data) {
         StringBuilder sb = new StringBuilder(64);
         DebugUtils.buildShortClassTag(data, sb);
         sb.append("}");
diff --git a/core-utils/java/android/support/v4/content/LocalBroadcastManager.java b/core-utils/src/main/java/android/support/v4/content/LocalBroadcastManager.java
similarity index 96%
rename from core-utils/java/android/support/v4/content/LocalBroadcastManager.java
rename to core-utils/src/main/java/android/support/v4/content/LocalBroadcastManager.java
index 324bb30..aaaf8be 100644
--- a/core-utils/java/android/support/v4/content/LocalBroadcastManager.java
+++ b/core-utils/src/main/java/android/support/v4/content/LocalBroadcastManager.java
@@ -16,10 +16,6 @@
 
 package android.support.v4.content;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Set;
-
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -27,8 +23,13 @@
 import android.net.Uri;
 import android.os.Handler;
 import android.os.Message;
+import android.support.annotation.NonNull;
 import android.util.Log;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Set;
+
 /**
  * Helper to register for and send broadcasts of Intents to local objects
  * within your process.  This has a number of advantages over sending
@@ -98,7 +99,8 @@
     private static final Object mLock = new Object();
     private static LocalBroadcastManager mInstance;
 
-    public static LocalBroadcastManager getInstance(Context context) {
+    @NonNull
+    public static LocalBroadcastManager getInstance(@NonNull Context context) {
         synchronized (mLock) {
             if (mInstance == null) {
                 mInstance = new LocalBroadcastManager(context.getApplicationContext());
@@ -132,7 +134,8 @@
      *
      * @see #unregisterReceiver
      */
-    public void registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
+    public void registerReceiver(@NonNull BroadcastReceiver receiver,
+            @NonNull IntentFilter filter) {
         synchronized (mReceivers) {
             ReceiverRecord entry = new ReceiverRecord(filter, receiver);
             ArrayList<ReceiverRecord> filters = mReceivers.get(receiver);
@@ -162,7 +165,7 @@
      *
      * @see #registerReceiver
      */
-    public void unregisterReceiver(BroadcastReceiver receiver) {
+    public void unregisterReceiver(@NonNull BroadcastReceiver receiver) {
         synchronized (mReceivers) {
             final ArrayList<ReceiverRecord> filters = mReceivers.remove(receiver);
             if (filters == null) {
@@ -205,7 +208,7 @@
      * broadcast receivers.  (Note tha delivery may not ultimately take place if one of those
      * receivers is unregistered before it is dispatched.)
      */
-    public boolean sendBroadcast(Intent intent) {
+    public boolean sendBroadcast(@NonNull Intent intent) {
         synchronized (mReceivers) {
             final String action = intent.getAction();
             final String type = intent.resolveTypeIfNeeded(
@@ -281,7 +284,7 @@
      * the Intent this function will block and immediately dispatch them before
      * returning.
      */
-    public void sendBroadcastSync(Intent intent) {
+    public void sendBroadcastSync(@NonNull Intent intent) {
         if (sendBroadcast(intent)) {
             executePendingBroadcasts();
         }
diff --git a/core-utils/java/android/support/v4/content/MimeTypeFilter.java b/core-utils/src/main/java/android/support/v4/content/MimeTypeFilter.java
similarity index 98%
rename from core-utils/java/android/support/v4/content/MimeTypeFilter.java
rename to core-utils/src/main/java/android/support/v4/content/MimeTypeFilter.java
index 8734c4d..8a90c62 100644
--- a/core-utils/java/android/support/v4/content/MimeTypeFilter.java
+++ b/core-utils/src/main/java/android/support/v4/content/MimeTypeFilter.java
@@ -87,6 +87,7 @@
      * Matches one nullable MIME type against an array of MIME type filters.
      * @return The first matching filter, or null if nothing matches.
      */
+    @Nullable
     public static String matches(
             @Nullable String mimeType, @NonNull String[] filters) {
         if (mimeType == null) {
@@ -108,6 +109,7 @@
      * Matches multiple MIME types against an array of MIME type filters.
      * @return The first matching MIME type, or null if nothing matches.
      */
+    @Nullable
     public static String matches(
             @Nullable String[] mimeTypes, @NonNull String filter) {
         if (mimeTypes == null) {
@@ -129,6 +131,7 @@
      * Matches multiple MIME types against an array of MIME type filters.
      * @return The list of matching MIME types, or empty array if nothing matches.
      */
+    @NonNull
     public static String[] matchesMany(
             @Nullable String[] mimeTypes, @NonNull String filter) {
         if (mimeTypes == null) {
diff --git a/core-utils/java/android/support/v4/content/ModernAsyncTask.java b/core-utils/src/main/java/android/support/v4/content/ModernAsyncTask.java
similarity index 100%
rename from core-utils/java/android/support/v4/content/ModernAsyncTask.java
rename to core-utils/src/main/java/android/support/v4/content/ModernAsyncTask.java
diff --git a/core-utils/java/android/support/v4/content/PermissionChecker.java b/core-utils/src/main/java/android/support/v4/content/PermissionChecker.java
similarity index 97%
rename from core-utils/java/android/support/v4/content/PermissionChecker.java
rename to core-utils/src/main/java/android/support/v4/content/PermissionChecker.java
index 0866273..c9f18a9 100644
--- a/core-utils/java/android/support/v4/content/PermissionChecker.java
+++ b/core-utils/src/main/java/android/support/v4/content/PermissionChecker.java
@@ -24,6 +24,7 @@
 import android.os.Process;
 import android.support.annotation.IntDef;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 import android.support.v4.app.AppOpsManagerCompat;
 
@@ -91,7 +92,7 @@
      */
     @PermissionResult
     public static int checkPermission(@NonNull Context context, @NonNull String permission,
-            int pid, int uid, String packageName) {
+            int pid, int uid, @Nullable String packageName) {
         if (context.checkPermission(permission, pid, uid) == PackageManager.PERMISSION_DENIED) {
             return PERMISSION_DENIED;
         }
@@ -146,7 +147,7 @@
      */
     @PermissionResult
     public static int checkCallingPermission(@NonNull Context context,
-            @NonNull String permission, String packageName) {
+            @NonNull String permission, @Nullable String packageName) {
         if (Binder.getCallingPid() == Process.myPid()) {
             return PERMISSION_DENIED;
         }
diff --git a/core-utils/java/android/support/v4/content/WakefulBroadcastReceiver.java b/core-utils/src/main/java/android/support/v4/content/WakefulBroadcastReceiver.java
similarity index 95%
rename from core-utils/java/android/support/v4/content/WakefulBroadcastReceiver.java
rename to core-utils/src/main/java/android/support/v4/content/WakefulBroadcastReceiver.java
index b0cd653..8ec3eee 100644
--- a/core-utils/java/android/support/v4/content/WakefulBroadcastReceiver.java
+++ b/core-utils/src/main/java/android/support/v4/content/WakefulBroadcastReceiver.java
@@ -45,7 +45,7 @@
  * {@link WakefulBroadcastReceiver#startWakefulService startWakefulService()}
  * holds an extra identifying the wake lock.</p>
  *
- * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulReceiver.java
+ * {@sample frameworks/support/samples/Support4Demos/src/main/java/com/example/android/supportv4/content/SimpleWakefulReceiver.java
  *      complete}
  *
  * <p>The service (in this example, an {@link android.app.IntentService}) does
@@ -55,7 +55,7 @@
  * is the same intent that the {@link WakefulBroadcastReceiver} originally
  * passed in.</p>
  *
- * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulService.java
+ * {@sample frameworks/support/samples/Support4Demos/src/main/java/com/example/android/supportv4/content/SimpleWakefulService.java
  *      complete}
  *
  * @deprecated As of {@link android.os.Build.VERSION_CODES#O Android O}, background check
diff --git a/core-utils/java/android/support/v4/content/package.html b/core-utils/src/main/java/android/support/v4/content/package.html
similarity index 100%
rename from core-utils/java/android/support/v4/content/package.html
rename to core-utils/src/main/java/android/support/v4/content/package.html
diff --git a/core-utils/java/android/support/v4/graphics/ColorUtils.java b/core-utils/src/main/java/android/support/v4/graphics/ColorUtils.java
similarity index 100%
rename from core-utils/java/android/support/v4/graphics/ColorUtils.java
rename to core-utils/src/main/java/android/support/v4/graphics/ColorUtils.java
diff --git a/core-utils/gingerbread/android/support/v4/graphics/drawable/RoundedBitmapDrawable.java b/core-utils/src/main/java/android/support/v4/graphics/drawable/RoundedBitmapDrawable.java
similarity index 97%
rename from core-utils/gingerbread/android/support/v4/graphics/drawable/RoundedBitmapDrawable.java
rename to core-utils/src/main/java/android/support/v4/graphics/drawable/RoundedBitmapDrawable.java
index d515561..795126d 100644
--- a/core-utils/gingerbread/android/support/v4/graphics/drawable/RoundedBitmapDrawable.java
+++ b/core-utils/src/main/java/android/support/v4/graphics/drawable/RoundedBitmapDrawable.java
@@ -27,6 +27,8 @@
 import android.graphics.RectF;
 import android.graphics.Shader;
 import android.graphics.drawable.Drawable;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
 import android.util.DisplayMetrics;
 import android.view.Gravity;
@@ -66,6 +68,7 @@
     /**
      * Returns the paint used to render this drawable.
      */
+    @NonNull
     public final Paint getPaint() {
         return mPaint;
     }
@@ -73,6 +76,7 @@
     /**
      * Returns the bitmap used by this drawable to render. May be null.
      */
+    @Nullable
     public final Bitmap getBitmap() {
         return mBitmap;
     }
@@ -92,7 +96,7 @@
      * @see android.graphics.Bitmap#setDensity(int)
      * @see android.graphics.Bitmap#getDensity()
      */
-    public void setTargetDensity(Canvas canvas) {
+    public void setTargetDensity(@NonNull Canvas canvas) {
         setTargetDensity(canvas.getDensity());
     }
 
@@ -104,7 +108,7 @@
      * @see android.graphics.Bitmap#setDensity(int)
      * @see android.graphics.Bitmap#getDensity()
      */
-    public void setTargetDensity(DisplayMetrics metrics) {
+    public void setTargetDensity(@NonNull DisplayMetrics metrics) {
         setTargetDensity(metrics.densityDpi);
     }
 
@@ -253,7 +257,7 @@
     }
 
     @Override
-    public void draw(Canvas canvas) {
+    public void draw(@NonNull Canvas canvas) {
         final Bitmap bitmap = mBitmap;
         if (bitmap == null) {
             return;
diff --git a/core-utils/api21/android/support/v4/graphics/drawable/RoundedBitmapDrawable21.java b/core-utils/src/main/java/android/support/v4/graphics/drawable/RoundedBitmapDrawable21.java
similarity index 100%
rename from core-utils/api21/android/support/v4/graphics/drawable/RoundedBitmapDrawable21.java
rename to core-utils/src/main/java/android/support/v4/graphics/drawable/RoundedBitmapDrawable21.java
diff --git a/core-utils/java/android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory.java b/core-utils/src/main/java/android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory.java
similarity index 87%
rename from core-utils/java/android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory.java
rename to core-utils/src/main/java/android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory.java
index 5e144c7..7790055 100644
--- a/core-utils/java/android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory.java
+++ b/core-utils/src/main/java/android/support/v4/graphics/drawable/RoundedBitmapDrawableFactory.java
@@ -21,11 +21,15 @@
 import android.graphics.BitmapFactory;
 import android.graphics.Rect;
 import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v4.graphics.BitmapCompat;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.view.ViewCompat;
 import android.util.Log;
 
+import java.io.InputStream;
+
 /**
  * Constructs {@link RoundedBitmapDrawable RoundedBitmapDrawable} objects,
  * either from Bitmaps directly, or from streams and files.
@@ -63,7 +67,8 @@
      * Returns a new drawable by creating it from a bitmap, setting initial target density based on
      * the display metrics of the resources.
      */
-    public static RoundedBitmapDrawable create(Resources res, Bitmap bitmap) {
+    @NonNull
+    public static RoundedBitmapDrawable create(@NonNull Resources res, @Nullable Bitmap bitmap) {
         if (Build.VERSION.SDK_INT >= 21) {
             return new RoundedBitmapDrawable21(res, bitmap);
         }
@@ -73,8 +78,8 @@
     /**
      * Returns a new drawable, creating it by opening a given file path and decoding the bitmap.
      */
-    public static RoundedBitmapDrawable create(Resources res,
-            String filepath) {
+    @NonNull
+    public static RoundedBitmapDrawable create(@NonNull Resources res, @NonNull String filepath) {
         final RoundedBitmapDrawable drawable = create(res, BitmapFactory.decodeFile(filepath));
         if (drawable.getBitmap() == null) {
             Log.w(TAG, "RoundedBitmapDrawable cannot decode " + filepath);
@@ -86,8 +91,8 @@
     /**
      * Returns a new drawable, creating it by decoding a bitmap from the given input stream.
      */
-    public static RoundedBitmapDrawable create(Resources res,
-            java.io.InputStream is) {
+    @NonNull
+    public static RoundedBitmapDrawable create(@NonNull Resources res, @NonNull InputStream is) {
         final RoundedBitmapDrawable drawable = create(res, BitmapFactory.decodeStream(is));
         if (drawable.getBitmap() == null) {
             Log.w(TAG, "RoundedBitmapDrawable cannot decode " + is);
diff --git a/core-utils/java/android/support/v4/math/MathUtils.java b/core-utils/src/main/java/android/support/v4/math/MathUtils.java
similarity index 100%
rename from core-utils/java/android/support/v4/math/MathUtils.java
rename to core-utils/src/main/java/android/support/v4/math/MathUtils.java
diff --git a/core-utils/src/main/java/android/support/v4/print/OWNERS b/core-utils/src/main/java/android/support/v4/print/OWNERS
new file mode 100644
index 0000000..a9a2145
--- /dev/null
+++ b/core-utils/src/main/java/android/support/v4/print/OWNERS
@@ -0,0 +1,2 @@
+moltmann@google.com
+svetoslavganov@google.com
\ No newline at end of file
diff --git a/core-utils/java/android/support/v4/print/PrintHelper.java b/core-utils/src/main/java/android/support/v4/print/PrintHelper.java
similarity index 100%
rename from core-utils/java/android/support/v4/print/PrintHelper.java
rename to core-utils/src/main/java/android/support/v4/print/PrintHelper.java
diff --git a/core-utils/java/android/support/v4/provider/DocumentFile.java b/core-utils/src/main/java/android/support/v4/provider/DocumentFile.java
similarity index 100%
rename from core-utils/java/android/support/v4/provider/DocumentFile.java
rename to core-utils/src/main/java/android/support/v4/provider/DocumentFile.java
diff --git a/core-utils/kitkat/android/support/v4/provider/DocumentsContractApi19.java b/core-utils/src/main/java/android/support/v4/provider/DocumentsContractApi19.java
similarity index 100%
rename from core-utils/kitkat/android/support/v4/provider/DocumentsContractApi19.java
rename to core-utils/src/main/java/android/support/v4/provider/DocumentsContractApi19.java
diff --git a/core-utils/java/android/support/v4/provider/RawDocumentFile.java b/core-utils/src/main/java/android/support/v4/provider/RawDocumentFile.java
similarity index 100%
rename from core-utils/java/android/support/v4/provider/RawDocumentFile.java
rename to core-utils/src/main/java/android/support/v4/provider/RawDocumentFile.java
diff --git a/core-utils/java/android/support/v4/provider/SingleDocumentFile.java b/core-utils/src/main/java/android/support/v4/provider/SingleDocumentFile.java
similarity index 100%
rename from core-utils/java/android/support/v4/provider/SingleDocumentFile.java
rename to core-utils/src/main/java/android/support/v4/provider/SingleDocumentFile.java
diff --git a/core-utils/java/android/support/v4/provider/TreeDocumentFile.java b/core-utils/src/main/java/android/support/v4/provider/TreeDocumentFile.java
similarity index 100%
rename from core-utils/java/android/support/v4/provider/TreeDocumentFile.java
rename to core-utils/src/main/java/android/support/v4/provider/TreeDocumentFile.java
diff --git a/customtabs/Android.mk b/customtabs/Android.mk
index cfd9971..f9195e8 100644
--- a/customtabs/Android.mk
+++ b/customtabs/Android.mk
@@ -26,10 +26,10 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-customtabs
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_AIDL_INCLUDES := $LOCAL_PATH/src
+LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/src/main/java
 LOCAL_SRC_FILES := \
-    $(call all-java-files-under,src) \
-    $(call all-Iaidl-files-under,src)
+    $(call all-java-files-under,src/main/java) \
+    $(call all-Iaidl-files-under,src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-annotations \
diff --git a/customtabs/AndroidManifest.xml b/customtabs/AndroidManifest.xml
index 6a25c8a..c913ad6 100644
--- a/customtabs/AndroidManifest.xml
+++ b/customtabs/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.customtabs">
     <uses-sdk android:minSdkVersion="15"/>
-    <application>
-        <meta-data android:name="android.support.customtabs.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/customtabs/OWNERS b/customtabs/OWNERS
new file mode 100644
index 0000000..a0bf18a
--- /dev/null
+++ b/customtabs/OWNERS
@@ -0,0 +1,2 @@
+lizeb@google.com
+yusufo@google.com
\ No newline at end of file
diff --git a/customtabs/api/26.1.0.txt b/customtabs/api/26.1.0.txt
new file mode 100644
index 0000000..58cd212
--- /dev/null
+++ b/customtabs/api/26.1.0.txt
@@ -0,0 +1,142 @@
+package android.support.customtabs {
+
+  public class CustomTabsCallback {
+    ctor public CustomTabsCallback();
+    method public void extraCallback(java.lang.String, android.os.Bundle);
+    method public void onMessageChannelReady(android.os.Bundle);
+    method public void onNavigationEvent(int, android.os.Bundle);
+    method public void onPostMessage(java.lang.String, 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 static boolean connectAndInitialize(android.content.Context, java.lang.String);
+    method public android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
+    method public static java.lang.String getPackageName(android.content.Context, java.util.List<java.lang.String>);
+    method public static java.lang.String getPackageName(android.content.Context, java.util.List<java.lang.String>, boolean);
+    method public android.support.customtabs.CustomTabsSession newSession(android.support.customtabs.CustomTabsCallback);
+    method public boolean warmup(long);
+  }
+
+  public final class CustomTabsIntent {
+    method public static int getMaxToolbarItems();
+    method public void launchUrl(android.content.Context, android.net.Uri);
+    method public static android.content.Intent setAlwaysUseBrowserUI(android.content.Intent);
+    method public static boolean shouldAlwaysUseBrowserUI(android.content.Intent);
+    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_DEFAULT_SHARE_MENU_ITEM = "android.support.customtabs.extra.SHARE_MENU_ITEM";
+    field public static final java.lang.String EXTRA_ENABLE_INSTANT_APPS = "android.support.customtabs.extra.EXTRA_ENABLE_INSTANT_APPS";
+    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_REMOTEVIEWS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS";
+    field public static final java.lang.String EXTRA_REMOTEVIEWS_CLICKED_ID = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_CLICKED_ID";
+    field public static final java.lang.String EXTRA_REMOTEVIEWS_PENDINGINTENT = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_PENDINGINTENT";
+    field public static final java.lang.String EXTRA_REMOTEVIEWS_VIEW_IDS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_VIEW_IDS";
+    field public static final java.lang.String EXTRA_SECONDARY_TOOLBAR_COLOR = "android.support.customtabs.extra.SECONDARY_TOOLBAR_COLOR";
+    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 EXTRA_TOOLBAR_ITEMS = "android.support.customtabs.extra.TOOLBAR_ITEMS";
+    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_ID = "android.support.customtabs.customaction.ID";
+    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 static final int TOOLBAR_ACTION_BUTTON_ID = 0; // 0x0
+    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 addDefaultShareMenuItem();
+    method public android.support.customtabs.CustomTabsIntent.Builder addMenuItem(java.lang.String, android.app.PendingIntent);
+    method public deprecated android.support.customtabs.CustomTabsIntent.Builder addToolbarItem(int, android.graphics.Bitmap, java.lang.String, android.app.PendingIntent) throws java.lang.IllegalStateException;
+    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 setInstantAppsEnabled(boolean);
+    method public android.support.customtabs.CustomTabsIntent.Builder setSecondaryToolbarColor(int);
+    method public android.support.customtabs.CustomTabsIntent.Builder setSecondaryToolbarViews(android.widget.RemoteViews, int[], android.app.PendingIntent);
+    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 int postMessage(android.support.customtabs.CustomTabsSessionToken, java.lang.String, android.os.Bundle);
+    method protected abstract boolean requestPostMessageChannel(android.support.customtabs.CustomTabsSessionToken, android.net.Uri);
+    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";
+    field public static final int RESULT_FAILURE_DISALLOWED = -1; // 0xffffffff
+    field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
+    field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
+    field public static final int RESULT_SUCCESS = 0; // 0x0
+  }
+
+  public static abstract class CustomTabsService.Result implements java.lang.annotation.Annotation {
+  }
+
+  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 int postMessage(java.lang.String, android.os.Bundle);
+    method public boolean requestPostMessageChannel(android.net.Uri);
+    method public boolean setActionButton(android.graphics.Bitmap, java.lang.String);
+    method public boolean setSecondaryToolbarViews(android.widget.RemoteViews, int[], android.app.PendingIntent);
+    method public deprecated boolean setToolbarItem(int, 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);
+    method public boolean isAssociatedWith(android.support.customtabs.CustomTabsSession);
+  }
+
+  public class PostMessageService extends android.app.Service {
+    ctor public PostMessageService();
+    method public android.os.IBinder onBind(android.content.Intent);
+  }
+
+  public abstract class PostMessageServiceConnection implements android.content.ServiceConnection {
+    ctor public PostMessageServiceConnection(android.support.customtabs.CustomTabsSessionToken);
+    method public boolean bindSessionToPostMessageService(android.content.Context, java.lang.String);
+    method public final boolean notifyMessageChannelReady(android.os.Bundle);
+    method public void onPostMessageServiceConnected();
+    method public void onPostMessageServiceDisconnected();
+    method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
+    method public final void onServiceDisconnected(android.content.ComponentName);
+    method public final boolean postMessage(java.lang.String, android.os.Bundle);
+    method public void unbindFromContext(android.content.Context);
+  }
+
+}
+
diff --git a/customtabs/api/27.0.0.txt b/customtabs/api/27.0.0.txt
new file mode 100644
index 0000000..8494391
--- /dev/null
+++ b/customtabs/api/27.0.0.txt
@@ -0,0 +1,157 @@
+package android.support.customtabs {
+
+  public class CustomTabsCallback {
+    ctor public CustomTabsCallback();
+    method public void extraCallback(java.lang.String, android.os.Bundle);
+    method public void onMessageChannelReady(android.os.Bundle);
+    method public void onNavigationEvent(int, android.os.Bundle);
+    method public void onPostMessage(java.lang.String, android.os.Bundle);
+    method public void onRelationshipValidationResult(int, android.net.Uri, boolean, 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 static boolean connectAndInitialize(android.content.Context, java.lang.String);
+    method public android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
+    method public static java.lang.String getPackageName(android.content.Context, java.util.List<java.lang.String>);
+    method public static java.lang.String getPackageName(android.content.Context, java.util.List<java.lang.String>, boolean);
+    method public android.support.customtabs.CustomTabsSession newSession(android.support.customtabs.CustomTabsCallback);
+    method public boolean warmup(long);
+  }
+
+  public final class CustomTabsIntent {
+    method public static int getMaxToolbarItems();
+    method public void launchUrl(android.content.Context, android.net.Uri);
+    method public static android.content.Intent setAlwaysUseBrowserUI(android.content.Intent);
+    method public static boolean shouldAlwaysUseBrowserUI(android.content.Intent);
+    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_DEFAULT_SHARE_MENU_ITEM = "android.support.customtabs.extra.SHARE_MENU_ITEM";
+    field public static final java.lang.String EXTRA_ENABLE_INSTANT_APPS = "android.support.customtabs.extra.EXTRA_ENABLE_INSTANT_APPS";
+    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_REMOTEVIEWS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS";
+    field public static final java.lang.String EXTRA_REMOTEVIEWS_CLICKED_ID = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_CLICKED_ID";
+    field public static final java.lang.String EXTRA_REMOTEVIEWS_PENDINGINTENT = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_PENDINGINTENT";
+    field public static final java.lang.String EXTRA_REMOTEVIEWS_VIEW_IDS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_VIEW_IDS";
+    field public static final java.lang.String EXTRA_SECONDARY_TOOLBAR_COLOR = "android.support.customtabs.extra.SECONDARY_TOOLBAR_COLOR";
+    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 EXTRA_TOOLBAR_ITEMS = "android.support.customtabs.extra.TOOLBAR_ITEMS";
+    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_ID = "android.support.customtabs.customaction.ID";
+    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 static final int TOOLBAR_ACTION_BUTTON_ID = 0; // 0x0
+    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 addDefaultShareMenuItem();
+    method public android.support.customtabs.CustomTabsIntent.Builder addMenuItem(java.lang.String, android.app.PendingIntent);
+    method public deprecated android.support.customtabs.CustomTabsIntent.Builder addToolbarItem(int, android.graphics.Bitmap, java.lang.String, android.app.PendingIntent) throws java.lang.IllegalStateException;
+    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 setInstantAppsEnabled(boolean);
+    method public android.support.customtabs.CustomTabsIntent.Builder setSecondaryToolbarColor(int);
+    method public android.support.customtabs.CustomTabsIntent.Builder setSecondaryToolbarViews(android.widget.RemoteViews, int[], android.app.PendingIntent);
+    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 int postMessage(android.support.customtabs.CustomTabsSessionToken, java.lang.String, android.os.Bundle);
+    method protected abstract boolean requestPostMessageChannel(android.support.customtabs.CustomTabsSessionToken, android.net.Uri);
+    method protected abstract boolean updateVisuals(android.support.customtabs.CustomTabsSessionToken, android.os.Bundle);
+    method protected abstract boolean validateRelationship(android.support.customtabs.CustomTabsSessionToken, int, android.net.Uri, 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";
+    field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
+    field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
+    field public static final int RESULT_FAILURE_DISALLOWED = -1; // 0xffffffff
+    field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
+    field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
+    field public static final int RESULT_SUCCESS = 0; // 0x0
+  }
+
+  public static abstract class CustomTabsService.Relation implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract class CustomTabsService.Result implements java.lang.annotation.Annotation {
+  }
+
+  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 static android.support.customtabs.CustomTabsSession createMockSessionForTesting(android.content.ComponentName);
+    method public boolean mayLaunchUrl(android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
+    method public int postMessage(java.lang.String, android.os.Bundle);
+    method public boolean requestPostMessageChannel(android.net.Uri);
+    method public boolean setActionButton(android.graphics.Bitmap, java.lang.String);
+    method public boolean setSecondaryToolbarViews(android.widget.RemoteViews, int[], android.app.PendingIntent);
+    method public deprecated boolean setToolbarItem(int, android.graphics.Bitmap, java.lang.String);
+    method public boolean validateRelationship(int, android.net.Uri, android.os.Bundle);
+  }
+
+  public class CustomTabsSessionToken {
+    method public static android.support.customtabs.CustomTabsSessionToken createMockSessionTokenForTesting();
+    method public android.support.customtabs.CustomTabsCallback getCallback();
+    method public static android.support.customtabs.CustomTabsSessionToken getSessionTokenFromIntent(android.content.Intent);
+    method public boolean isAssociatedWith(android.support.customtabs.CustomTabsSession);
+  }
+
+  public class PostMessageService extends android.app.Service {
+    ctor public PostMessageService();
+    method public android.os.IBinder onBind(android.content.Intent);
+  }
+
+  public abstract class PostMessageServiceConnection implements android.content.ServiceConnection {
+    ctor public PostMessageServiceConnection(android.support.customtabs.CustomTabsSessionToken);
+    method public boolean bindSessionToPostMessageService(android.content.Context, java.lang.String);
+    method public final boolean notifyMessageChannelReady(android.os.Bundle);
+    method public void onPostMessageServiceConnected();
+    method public void onPostMessageServiceDisconnected();
+    method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
+    method public final void onServiceDisconnected(android.content.ComponentName);
+    method public final boolean postMessage(java.lang.String, android.os.Bundle);
+    method public void unbindFromContext(android.content.Context);
+  }
+
+  public class TrustedWebUtils {
+    method public static void launchAsTrustedWebActivity(android.content.Context, android.support.customtabs.CustomTabsIntent, android.net.Uri);
+    field public static final java.lang.String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY = "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
+  }
+
+}
+
diff --git a/customtabs/api/current.txt b/customtabs/api/current.txt
index 58cd212..8494391 100644
--- a/customtabs/api/current.txt
+++ b/customtabs/api/current.txt
@@ -6,6 +6,7 @@
     method public void onMessageChannelReady(android.os.Bundle);
     method public void onNavigationEvent(int, android.os.Bundle);
     method public void onPostMessage(java.lang.String, android.os.Bundle);
+    method public void onRelationshipValidationResult(int, android.net.Uri, boolean, 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
@@ -88,15 +89,21 @@
     method protected abstract int postMessage(android.support.customtabs.CustomTabsSessionToken, java.lang.String, android.os.Bundle);
     method protected abstract boolean requestPostMessageChannel(android.support.customtabs.CustomTabsSessionToken, android.net.Uri);
     method protected abstract boolean updateVisuals(android.support.customtabs.CustomTabsSessionToken, android.os.Bundle);
+    method protected abstract boolean validateRelationship(android.support.customtabs.CustomTabsSessionToken, int, android.net.Uri, 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";
+    field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
+    field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
     field public static final int RESULT_FAILURE_DISALLOWED = -1; // 0xffffffff
     field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
     field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
     field public static final int RESULT_SUCCESS = 0; // 0x0
   }
 
+  public static abstract class CustomTabsService.Relation implements java.lang.annotation.Annotation {
+  }
+
   public static abstract class CustomTabsService.Result implements java.lang.annotation.Annotation {
   }
 
@@ -107,15 +114,18 @@
   }
 
   public final class CustomTabsSession {
+    method public static android.support.customtabs.CustomTabsSession createMockSessionForTesting(android.content.ComponentName);
     method public boolean mayLaunchUrl(android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
     method public int postMessage(java.lang.String, android.os.Bundle);
     method public boolean requestPostMessageChannel(android.net.Uri);
     method public boolean setActionButton(android.graphics.Bitmap, java.lang.String);
     method public boolean setSecondaryToolbarViews(android.widget.RemoteViews, int[], android.app.PendingIntent);
     method public deprecated boolean setToolbarItem(int, android.graphics.Bitmap, java.lang.String);
+    method public boolean validateRelationship(int, android.net.Uri, android.os.Bundle);
   }
 
   public class CustomTabsSessionToken {
+    method public static android.support.customtabs.CustomTabsSessionToken createMockSessionTokenForTesting();
     method public android.support.customtabs.CustomTabsCallback getCallback();
     method public static android.support.customtabs.CustomTabsSessionToken getSessionTokenFromIntent(android.content.Intent);
     method public boolean isAssociatedWith(android.support.customtabs.CustomTabsSession);
@@ -138,5 +148,10 @@
     method public void unbindFromContext(android.content.Context);
   }
 
+  public class TrustedWebUtils {
+    method public static void launchAsTrustedWebActivity(android.content.Context, android.support.customtabs.CustomTabsIntent, android.net.Uri);
+    field public static final java.lang.String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY = "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
+  }
+
 }
 
diff --git a/customtabs/build.gradle b/customtabs/build.gradle
index 6cf8b77..fc90301 100644
--- a/customtabs/build.gradle
+++ b/customtabs/build.gradle
@@ -15,11 +15,7 @@
     }
 
     sourceSets {
-        main.java.srcDirs = ['src']
-        main.aidl.srcDirs = ['src']
-        main.res.srcDir 'res'
-        main.assets.srcDir 'assets'
-        main.resources.srcDir 'java'
+        main.aidl.srcDirs = ['src/main/java']
     }
 }
 
diff --git a/customtabs/src/android/support/customtabs/CustomTabsCallback.java b/customtabs/src/main/java/android/support/customtabs/CustomTabsCallback.java
similarity index 79%
rename from customtabs/src/android/support/customtabs/CustomTabsCallback.java
rename to customtabs/src/main/java/android/support/customtabs/CustomTabsCallback.java
index 818118a..f8d349a 100644
--- a/customtabs/src/android/support/customtabs/CustomTabsCallback.java
+++ b/customtabs/src/main/java/android/support/customtabs/CustomTabsCallback.java
@@ -16,7 +16,9 @@
 
 package android.support.customtabs;
 
+import android.net.Uri;
 import android.os.Bundle;
+import android.support.customtabs.CustomTabsService.Relation;
 
 /**
  * A callback class for custom tabs client to get messages regarding events in their custom tabs. In
@@ -98,4 +100,18 @@
      * @param extras Reserved for future use.
      */
     public void onPostMessage(String message, Bundle extras) {}
+
+    /**
+     * Called when a relationship validation result is available.
+     *
+     * @param relation Relation for which the result is available. Value previously passed to
+     *                 {@link CustomTabsSession#validateRelationship(int, Uri, Bundle)}. Must be one
+     *                 of the {@code CustomTabsService#RELATION_* } constants.
+     * @param requestedOrigin Origin requested. Value previously passed to
+     *                        {@link CustomTabsSession#validateRelationship(int, Uri, Bundle)}.
+     * @param result Whether the relation was validated.
+     * @param extras Reserved for future use.
+     */
+    public void onRelationshipValidationResult(@Relation int relation, Uri requestedOrigin,
+                                               boolean result, Bundle extras) {}
 }
diff --git a/customtabs/src/android/support/customtabs/CustomTabsClient.java b/customtabs/src/main/java/android/support/customtabs/CustomTabsClient.java
similarity index 93%
rename from customtabs/src/android/support/customtabs/CustomTabsClient.java
rename to customtabs/src/main/java/android/support/customtabs/CustomTabsClient.java
index 09f3110..2e955cb 100644
--- a/customtabs/src/android/support/customtabs/CustomTabsClient.java
+++ b/customtabs/src/main/java/android/support/customtabs/CustomTabsClient.java
@@ -31,6 +31,7 @@
 import android.os.RemoteException;
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
+import android.support.customtabs.CustomTabsService.Relation;
 import android.text.TextUtils;
 
 import java.util.ArrayList;
@@ -234,6 +235,20 @@
                     }
                 });
             }
+
+            @Override
+            public void onRelationshipValidationResult(
+                    final @Relation int relation, final Uri requestedOrigin, final boolean result,
+                    final @Nullable Bundle extras) throws RemoteException {
+                if (callback == null) return;
+                mHandler.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        callback.onRelationshipValidationResult(
+                                relation, requestedOrigin, result, extras);
+                    }
+                });
+            }
         };
 
         try {
diff --git a/customtabs/src/android/support/customtabs/CustomTabsIntent.java b/customtabs/src/main/java/android/support/customtabs/CustomTabsIntent.java
similarity index 100%
rename from customtabs/src/android/support/customtabs/CustomTabsIntent.java
rename to customtabs/src/main/java/android/support/customtabs/CustomTabsIntent.java
diff --git a/customtabs/src/android/support/customtabs/CustomTabsService.java b/customtabs/src/main/java/android/support/customtabs/CustomTabsService.java
similarity index 85%
rename from customtabs/src/android/support/customtabs/CustomTabsService.java
rename to customtabs/src/main/java/android/support/customtabs/CustomTabsService.java
index 5a940cf..aad174c 100644
--- a/customtabs/src/android/support/customtabs/CustomTabsService.java
+++ b/customtabs/src/main/java/android/support/customtabs/CustomTabsService.java
@@ -78,6 +78,23 @@
      */
     public static final int RESULT_FAILURE_MESSAGING_ERROR = -3;
 
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({RELATION_USE_AS_ORIGIN, RELATION_HANDLE_ALL_URLS})
+    public @interface Relation {
+    }
+
+    /**
+     * Used for {@link CustomTabsSession#validateRelationship(int, Uri, Bundle)}. For
+     * App -> Web transitions, requests the app to use the declared origin to be used as origin for
+     * the client app in the web APIs context.
+     */
+    public static final int RELATION_USE_AS_ORIGIN = 1;
+    /**
+     * Used for {@link CustomTabsSession#validateRelationship(int, Uri, Bundle)}. Requests the
+     * ability to handle all URLs from a given origin.
+     */
+    public static final int RELATION_HANDLE_ALL_URLS = 2;
+
     private final Map<IBinder, DeathRecipient> mDeathRecipientMap = new ArrayMap<>();
 
     private ICustomTabsService.Stub mBinder = new ICustomTabsService.Stub() {
@@ -137,6 +154,13 @@
             return CustomTabsService.this.postMessage(
                     new CustomTabsSessionToken(callback), message, extras);
         }
+
+        @Override
+        public boolean validateRelationship(
+                ICustomTabsCallback callback, @Relation int relation, Uri origin, Bundle extras) {
+            return CustomTabsService.this.validateRelationship(
+                    new CustomTabsSessionToken(callback), relation, origin, extras);
+        }
     };
 
     @Override
@@ -268,4 +292,23 @@
     @Result
     protected abstract int postMessage(
             CustomTabsSessionToken sessionToken, String message, Bundle extras);
+
+    /**
+     * Request to validate a relationship between the application and an origin.
+     *
+     * If this method returns true, the validation result will be provided through
+     * {@link CustomTabsCallback#onRelationshipValidationResult(int, Uri, boolean, Bundle)}.
+     * Otherwise the request didn't succeed. The client must call
+     * {@link CustomTabsClient#warmup(long)} before this.
+     *
+     * @param sessionToken The unique identifier for the session. Can not be null.
+     * @param relation Relation to check, must be one of the {@code CustomTabsService#RELATION_* }
+     *                 constants.
+     * @param origin Origin for the relation query.
+     * @param extras Reserved for future use.
+     * @return true if the request has been submitted successfully.
+     */
+    protected abstract boolean validateRelationship(
+            CustomTabsSessionToken sessionToken, @Relation int relation, Uri origin,
+            Bundle extras);
 }
diff --git a/customtabs/src/android/support/customtabs/CustomTabsServiceConnection.java b/customtabs/src/main/java/android/support/customtabs/CustomTabsServiceConnection.java
similarity index 100%
rename from customtabs/src/android/support/customtabs/CustomTabsServiceConnection.java
rename to customtabs/src/main/java/android/support/customtabs/CustomTabsServiceConnection.java
diff --git a/customtabs/src/android/support/customtabs/CustomTabsSession.java b/customtabs/src/main/java/android/support/customtabs/CustomTabsSession.java
similarity index 78%
rename from customtabs/src/android/support/customtabs/CustomTabsSession.java
rename to customtabs/src/main/java/android/support/customtabs/CustomTabsSession.java
index cad897c..a84d63c 100644
--- a/customtabs/src/android/support/customtabs/CustomTabsSession.java
+++ b/customtabs/src/main/java/android/support/customtabs/CustomTabsSession.java
@@ -25,6 +25,8 @@
 import android.os.RemoteException;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
+import android.support.customtabs.CustomTabsService.Relation;
 import android.support.customtabs.CustomTabsService.Result;
 import android.view.View;
 import android.widget.RemoteViews;
@@ -42,6 +44,21 @@
     private final ICustomTabsCallback mCallback;
     private final ComponentName mComponentName;
 
+    /**
+     * Provides browsers a way to generate a mock {@link CustomTabsSession} for testing
+     * purposes.
+     *
+     * @param componentName The component the session should be created for.
+     * @return A mock session with no functionality.
+     */
+    @VisibleForTesting
+    @NonNull
+    public static CustomTabsSession createMockSessionForTesting(
+            @NonNull ComponentName componentName) {
+        return new CustomTabsSession(
+                null, new CustomTabsSessionToken.MockCallback(), componentName);
+    }
+
     /* package */ CustomTabsSession(
             ICustomTabsService service, ICustomTabsCallback callback, ComponentName componentName) {
         mService = service;
@@ -185,6 +202,39 @@
         }
     }
 
+    /**
+     * Requests to validate a relationship between the application and an origin.
+     *
+     * <p>
+     * See <a href="https://developers.google.com/digital-asset-links/v1/getting-started">here</a>
+     * for documentation about Digital Asset Links. This methods requests the browser to verify
+     * a relation with the calling application, to grant the associated rights.
+     *
+     * <p>
+     * If this method returns {@code true}, the validation result will be provided through
+     * {@link CustomTabsCallback#onRelationshipValidationResult(int, Uri, boolean, Bundle)}.
+     * Otherwise the request didn't succeed. The client must call
+     * {@link CustomTabsClient#warmup(long)} before this.
+     *
+     * @param relation Relation to check, must be one of the {@code CustomTabsService#RELATION_* }
+     *                 constants.
+     * @param origin Origin.
+     * @param extras Reserved for future use.
+     * @return {@code true} if the request has been submitted successfully.
+     */
+    public boolean validateRelationship(@Relation int relation, @NonNull Uri origin,
+                                        @Nullable Bundle extras) {
+        if (relation < CustomTabsService.RELATION_USE_AS_ORIGIN
+                || relation > CustomTabsService.RELATION_HANDLE_ALL_URLS) {
+            return false;
+        }
+        try {
+            return mService.validateRelationship(mCallback, relation, origin, extras);
+        } catch (RemoteException e) {
+            return false;
+        }
+    }
+
     /* package */ IBinder getBinder() {
         return mCallback.asBinder();
     }
diff --git a/customtabs/src/android/support/customtabs/CustomTabsSessionToken.java b/customtabs/src/main/java/android/support/customtabs/CustomTabsSessionToken.java
similarity index 72%
rename from customtabs/src/android/support/customtabs/CustomTabsSessionToken.java
rename to customtabs/src/main/java/android/support/customtabs/CustomTabsSessionToken.java
index adfadd9..5a9e1b6 100644
--- a/customtabs/src/android/support/customtabs/CustomTabsSessionToken.java
+++ b/customtabs/src/main/java/android/support/customtabs/CustomTabsSessionToken.java
@@ -17,9 +17,12 @@
 package android.support.customtabs;
 
 import android.content.Intent;
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.support.annotation.NonNull;
+import android.support.customtabs.CustomTabsService.Relation;
 import android.support.v4.app.BundleCompat;
 import android.util.Log;
 
@@ -32,6 +35,29 @@
     private final ICustomTabsCallback mCallbackBinder;
     private final CustomTabsCallback mCallback;
 
+    /* package */ static class MockCallback extends ICustomTabsCallback.Stub {
+        @Override
+        public void onNavigationEvent(int navigationEvent, Bundle extras) {}
+
+        @Override
+        public void extraCallback(String callbackName, Bundle args) {}
+
+        @Override
+        public void onMessageChannelReady(Bundle extras) {}
+
+        @Override
+        public void onPostMessage(String message, Bundle extras) {}
+
+        @Override
+        public void onRelationshipValidationResult(@Relation int relation, Uri requestedOrigin,
+                boolean result, Bundle extras) {}
+
+        @Override
+        public IBinder asBinder() {
+            return this;
+        }
+    }
+
     /**
      * Obtain a {@link CustomTabsSessionToken} from an intent. See {@link CustomTabsIntent.Builder}
      * for ways to generate an intent for custom tabs.
@@ -46,6 +72,17 @@
         return new CustomTabsSessionToken(ICustomTabsCallback.Stub.asInterface(binder));
     }
 
+    /**
+     * Provides browsers a way to generate a mock {@link CustomTabsSessionToken} for testing
+     * purposes.
+     *
+     * @return A mock token with no functionality.
+     */
+    @NonNull
+    public static CustomTabsSessionToken createMockSessionTokenForTesting() {
+        return new CustomTabsSessionToken(new MockCallback());
+    }
+
     CustomTabsSessionToken(ICustomTabsCallback callbackBinder) {
         mCallbackBinder = callbackBinder;
         mCallback = new CustomTabsCallback() {
@@ -85,6 +122,18 @@
                     Log.e(TAG, "RemoteException during ICustomTabsCallback transaction");
                 }
             }
+
+            @Override
+            public void onRelationshipValidationResult(@Relation int relation, Uri origin,
+                                                       boolean result, Bundle extras) {
+                try {
+                    mCallbackBinder.onRelationshipValidationResult(
+                            relation, origin, result, extras);
+                } catch (RemoteException e) {
+                    Log.e(TAG, "RemoteException during ICustomTabsCallback transaction");
+                }
+            }
+
         };
     }
 
diff --git a/customtabs/src/android/support/customtabs/ICustomTabsCallback.aidl b/customtabs/src/main/java/android/support/customtabs/ICustomTabsCallback.aidl
similarity index 90%
rename from customtabs/src/android/support/customtabs/ICustomTabsCallback.aidl
rename to customtabs/src/main/java/android/support/customtabs/ICustomTabsCallback.aidl
index 32b6e9b..3e2c48c 100644
--- a/customtabs/src/android/support/customtabs/ICustomTabsCallback.aidl
+++ b/customtabs/src/main/java/android/support/customtabs/ICustomTabsCallback.aidl
@@ -27,4 +27,5 @@
     void extraCallback(String callbackName, in Bundle args) = 2;
     void onMessageChannelReady(in Bundle extras) = 3;
     void onPostMessage(String message, in Bundle extras) = 4;
+    void onRelationshipValidationResult(int relation, in Uri origin, boolean result, in Bundle extras) = 5;
 }
diff --git a/customtabs/src/android/support/customtabs/ICustomTabsService.aidl b/customtabs/src/main/java/android/support/customtabs/ICustomTabsService.aidl
similarity index 92%
rename from customtabs/src/android/support/customtabs/ICustomTabsService.aidl
rename to customtabs/src/main/java/android/support/customtabs/ICustomTabsService.aidl
index b24b0dd..376c2a4 100644
--- a/customtabs/src/android/support/customtabs/ICustomTabsService.aidl
+++ b/customtabs/src/main/java/android/support/customtabs/ICustomTabsService.aidl
@@ -36,4 +36,5 @@
     boolean updateVisuals(in ICustomTabsCallback callback, in Bundle bundle) = 5;
     boolean requestPostMessageChannel(in ICustomTabsCallback callback, in Uri postMessageOrigin) = 6;
     int postMessage(in ICustomTabsCallback callback, String message, in Bundle extras) = 7;
+    boolean validateRelationship(in ICustomTabsCallback callback, int relation, in Uri origin, in Bundle extras) = 8;
 }
diff --git a/customtabs/src/android/support/customtabs/IPostMessageService.aidl b/customtabs/src/main/java/android/support/customtabs/IPostMessageService.aidl
similarity index 100%
rename from customtabs/src/android/support/customtabs/IPostMessageService.aidl
rename to customtabs/src/main/java/android/support/customtabs/IPostMessageService.aidl
diff --git a/customtabs/src/android/support/customtabs/PostMessageService.java b/customtabs/src/main/java/android/support/customtabs/PostMessageService.java
similarity index 100%
rename from customtabs/src/android/support/customtabs/PostMessageService.java
rename to customtabs/src/main/java/android/support/customtabs/PostMessageService.java
diff --git a/customtabs/src/android/support/customtabs/PostMessageServiceConnection.java b/customtabs/src/main/java/android/support/customtabs/PostMessageServiceConnection.java
similarity index 100%
rename from customtabs/src/android/support/customtabs/PostMessageServiceConnection.java
rename to customtabs/src/main/java/android/support/customtabs/PostMessageServiceConnection.java
diff --git a/customtabs/src/main/java/android/support/customtabs/TrustedWebUtils.java b/customtabs/src/main/java/android/support/customtabs/TrustedWebUtils.java
new file mode 100644
index 0000000..e9a2233
--- /dev/null
+++ b/customtabs/src/main/java/android/support/customtabs/TrustedWebUtils.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.customtabs;
+
+import android.content.Context;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.BundleCompat;
+
+/**
+ * Class for utilities and convenience calls for opening a qualifying web page as a
+ * Trusted Web Activity.
+ *
+ * Trusted Web Activity is a fullscreen UI with no visible browser controls that hosts web pages
+ * meeting certain criteria. The full list of qualifications is at the implementing browser's
+ * discretion, but minimum recommended set is for the web page :
+ *  <ul>
+ *      <li>To have declared delegate_permission/common.handle_all_urls relationship with the
+ *      launching client application ensuring 1:1 trust between the Android native and web
+ *      components. See https://developers.google.com/digital-asset-links/ for details.</li>
+ *      <li>To work as a reliable, fast and engaging standalone component within the launching app's
+ *      flow.</li>
+ *      <li>To be accessible and operable even when offline.</li>
+ *  </ul>
+ *
+ *  Fallback behaviors may also differ with implementation. Possibilities are launching the page in
+ *  a custom tab, or showing it in browser UI. Browsers are encouraged to use
+ *  {@link CustomTabsCallback#onRelationshipValidationResult(int, Uri, boolean, Bundle)}
+ *  for sending details of the verification results.
+ */
+public class TrustedWebUtils {
+
+    /**
+     * Boolean extra that triggers a {@link CustomTabsIntent} launch to be in a fullscreen UI with
+     * no browser controls.
+     *
+     * @see TrustedWebUtils#launchAsTrustedWebActivity(Context, CustomTabsIntent, Uri).
+     */
+    public static final String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY =
+            "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
+
+    private TrustedWebUtils() {}
+
+    /**
+     * Launch the given {@link CustomTabsIntent} as a Trusted Web Activity. The given
+     * {@link CustomTabsIntent} should have a valid {@link CustomTabsSession} associated with it
+     * during construction. Once the Trusted Web Activity is launched, browser side implementations
+     * may have their own fallback behavior (e.g. Showing the page in a custom tab UI with toolbar)
+     * based on qualifications listed above or more.
+     *
+     * @param context {@link Context} to use while launching the {@link CustomTabsIntent}.
+     * @param customTabsIntent The {@link CustomTabsIntent} to use for launching the
+     *                         Trusted Web Activity. Note that all customizations in the given
+     *                         associated with browser toolbar controls will be ignored.
+     * @param uri The web page to launch as Trusted Web Activity.
+     */
+    public static void launchAsTrustedWebActivity(@NonNull Context context,
+            @NonNull CustomTabsIntent customTabsIntent, @NonNull Uri uri) {
+        if (BundleCompat.getBinder(
+                customTabsIntent.intent.getExtras(), CustomTabsIntent.EXTRA_SESSION) == null) {
+            throw new IllegalArgumentException(
+                    "Given CustomTabsIntent should be associated with a valid CustomTabsSession");
+        }
+        customTabsIntent.intent.putExtra(EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY, true);
+        customTabsIntent.launchUrl(context, uri);
+    }
+}
diff --git a/customtabs/tests/src/android/support/customtabs/TestCustomTabsCallback.java b/customtabs/tests/src/android/support/customtabs/TestCustomTabsCallback.java
index 56b1817..804d354 100644
--- a/customtabs/tests/src/android/support/customtabs/TestCustomTabsCallback.java
+++ b/customtabs/tests/src/android/support/customtabs/TestCustomTabsCallback.java
@@ -16,6 +16,7 @@
 
 package android.support.customtabs;
 
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.RemoteException;
 
@@ -50,6 +51,13 @@
                 throws RemoteException {
             TestCustomTabsCallback.this.onPostMessage(message, extras);
         }
+
+        @Override
+        public void onRelationshipValidationResult(int relation, Uri origin, boolean result,
+                                                   Bundle extras) throws RemoteException {
+            TestCustomTabsCallback.this.onRelationshipValidationResult(
+                    relation, origin, result, extras);
+        }
     };
 
     /* package */ ICustomTabsCallback getStub() {
diff --git a/customtabs/tests/src/android/support/customtabs/TestCustomTabsService.java b/customtabs/tests/src/android/support/customtabs/TestCustomTabsService.java
index b5c5e86..e3d5fa8 100644
--- a/customtabs/tests/src/android/support/customtabs/TestCustomTabsService.java
+++ b/customtabs/tests/src/android/support/customtabs/TestCustomTabsService.java
@@ -71,4 +71,10 @@
         if (!mPostMessageRequested) return CustomTabsService.RESULT_FAILURE_DISALLOWED;
         return CustomTabsService.RESULT_SUCCESS;
     }
+
+    @Override
+    protected boolean validateRelationship(CustomTabsSessionToken sessionToken,
+                                           @Relation int relation, Uri origin, Bundle extras) {
+        return false;
+    }
 }
diff --git a/customtabs/tests/src/android/support/customtabs/TrustedWebUtilsTest.java b/customtabs/tests/src/android/support/customtabs/TrustedWebUtilsTest.java
new file mode 100644
index 0000000..a9a5abc
--- /dev/null
+++ b/customtabs/tests/src/android/support/customtabs/TrustedWebUtilsTest.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.customtabs;
+
+import static junit.framework.Assert.assertEquals;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.net.Uri;
+import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.app.BundleCompat;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for TrustedWebUtils.
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class TrustedWebUtilsTest {
+    @Rule
+    public final ActivityTestRule<TestActivity> mActivityTestRule;
+
+    public TrustedWebUtilsTest() {
+        mActivityTestRule = new ActivityTestRule<TestActivity>(TestActivity.class);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testTrustedWebIntentRequiresValidSession() {
+        CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder().build();
+        TrustedWebUtils.launchAsTrustedWebActivity(
+                mActivityTestRule.getActivity(), customTabsIntent, Uri.EMPTY);
+    }
+
+    @Test(expected = ActivityNotFoundException.class)
+    public void testTrustedWebIntentContainsRequiredExtra() {
+        CustomTabsSession mockSession = CustomTabsSession.createMockSessionForTesting(
+                mActivityTestRule.getActivity().getComponentName());
+        CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder(mockSession).build();
+        TrustedWebUtils.launchAsTrustedWebActivity(
+                mActivityTestRule.getActivity(), customTabsIntent, Uri.EMPTY);
+        assertNotNull(BundleCompat.getBinder(
+                customTabsIntent.intent.getExtras(), CustomTabsIntent.EXTRA_SESSION));
+        assertEquals(customTabsIntent.intent.getAction(), Intent.ACTION_VIEW);
+        assertTrue(customTabsIntent.intent.hasExtra(
+                TrustedWebUtils.EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY));
+    }
+}
diff --git a/design/AndroidManifest.xml b/design/AndroidManifest.xml
index aa02181..0eb8b85 100644
--- a/design/AndroidManifest.xml
+++ b/design/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.design">
     <uses-sdk android:minSdkVersion="14" />
-    <application>
-        <meta-data android:name="android.support.design.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/design/api/26.1.0.txt b/design/api/26.1.0.txt
new file mode 100644
index 0000000..602ee48
--- /dev/null
+++ b/design/api/26.1.0.txt
@@ -0,0 +1,618 @@
+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 protected android.support.design.widget.AppBarLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.support.design.widget.AppBarLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.design.widget.AppBarLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public deprecated 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 deprecated 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 onMeasureChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int, int, int, int);
+    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, 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, int);
+    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int);
+    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.support.v4.view.AbsSavedState {
+    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 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 onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, android.view.View, android.graphics.Rect, boolean);
+  }
+
+  public abstract class BaseTransientBottomBar<B extends android.support.design.widget.BaseTransientBottomBar<B>> {
+    ctor protected BaseTransientBottomBar(android.view.ViewGroup, android.view.View, android.support.design.widget.BaseTransientBottomBar.ContentViewCallback);
+    method public B addCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback<B>);
+    method public void dismiss();
+    method public android.content.Context getContext();
+    method public int getDuration();
+    method public android.view.View getView();
+    method public boolean isShown();
+    method public boolean isShownOrQueued();
+    method public B removeCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback<B>);
+    method public B setDuration(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 BaseTransientBottomBar.BaseCallback<B> {
+    ctor public BaseTransientBottomBar.BaseCallback();
+    method public void onDismissed(B, int);
+    method public void onShown(B);
+    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 static abstract interface BaseTransientBottomBar.ContentViewCallback {
+    method public abstract void animateContentIn(int, int);
+    method public abstract void animateContentOut(int, int);
+  }
+
+  public class BottomNavigationView extends android.widget.FrameLayout {
+    ctor public BottomNavigationView(android.content.Context);
+    ctor public BottomNavigationView(android.content.Context, android.util.AttributeSet);
+    ctor public BottomNavigationView(android.content.Context, android.util.AttributeSet, int);
+    method public int getItemBackgroundResource();
+    method public android.content.res.ColorStateList getItemIconTintList();
+    method public android.content.res.ColorStateList getItemTextColor();
+    method public int getMaxItemCount();
+    method public android.view.Menu getMenu();
+    method public int getSelectedItemId();
+    method public void inflateMenu(int);
+    method public void setItemBackgroundResource(int);
+    method public void setItemIconTintList(android.content.res.ColorStateList);
+    method public void setItemTextColor(android.content.res.ColorStateList);
+    method public void setOnNavigationItemReselectedListener(android.support.design.widget.BottomNavigationView.OnNavigationItemReselectedListener);
+    method public void setOnNavigationItemSelectedListener(android.support.design.widget.BottomNavigationView.OnNavigationItemSelectedListener);
+    method public void setSelectedItemId(int);
+  }
+
+  public static abstract interface BottomNavigationView.OnNavigationItemReselectedListener {
+    method public abstract void onNavigationItemReselected(android.view.MenuItem);
+  }
+
+  public static abstract interface BottomNavigationView.OnNavigationItemSelectedListener {
+    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
+  }
+
+  public class BottomSheetBehavior<V extends android.view.View> extends android.support.design.widget.CoordinatorLayout.Behavior {
+    ctor public BottomSheetBehavior();
+    ctor public BottomSheetBehavior(android.content.Context, android.util.AttributeSet);
+    method public static <V extends android.view.View> android.support.design.widget.BottomSheetBehavior<V> from(V);
+    method public final int getPeekHeight();
+    method public boolean getSkipCollapsed();
+    method public final int getState();
+    method public boolean isHideable();
+    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
+    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 void setBottomSheetCallback(android.support.design.widget.BottomSheetBehavior.BottomSheetCallback);
+    method public void setHideable(boolean);
+    method public final void setPeekHeight(int);
+    method public void setSkipCollapsed(boolean);
+    method public final void setState(int);
+    field public static final int PEEK_HEIGHT_AUTO = -1; // 0xffffffff
+    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.BottomSheetCallback {
+    ctor public BottomSheetBehavior.BottomSheetCallback();
+    method public abstract void onSlide(android.view.View, float);
+    method public abstract void onStateChanged(android.view.View, int);
+  }
+
+  protected static class BottomSheetBehavior.SavedState extends android.support.v4.view.AbsSavedState {
+    ctor public BottomSheetBehavior.SavedState(android.os.Parcel);
+    ctor public BottomSheetBehavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public BottomSheetBehavior.SavedState(android.os.Parcelable, int);
+    field public static final android.os.Parcelable.Creator<android.support.design.widget.BottomSheetBehavior.SavedState> CREATOR;
+  }
+
+  public class BottomSheetDialog extends android.support.v7.app.AppCompatDialog {
+    ctor public BottomSheetDialog(android.content.Context);
+    ctor public BottomSheetDialog(android.content.Context, int);
+    ctor protected BottomSheetDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
+  }
+
+  public class BottomSheetDialogFragment extends android.support.v7.app.AppCompatDialogFragment {
+    ctor public BottomSheetDialogFragment();
+  }
+
+  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 protected android.support.design.widget.CollapsingToolbarLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.widget.FrameLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getCollapsedTitleGravity();
+    method public android.graphics.Typeface getCollapsedTitleTypeface();
+    method public android.graphics.drawable.Drawable getContentScrim();
+    method public int getExpandedTitleGravity();
+    method public int getExpandedTitleMarginBottom();
+    method public int getExpandedTitleMarginEnd();
+    method public int getExpandedTitleMarginStart();
+    method public int getExpandedTitleMarginTop();
+    method public android.graphics.Typeface getExpandedTitleTypeface();
+    method public long getScrimAnimationDuration();
+    method public int getScrimVisibleHeightTrigger();
+    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 setCollapsedTitleTextColor(android.content.res.ColorStateList);
+    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 setExpandedTitleMargin(int, int, int, int);
+    method public void setExpandedTitleMarginBottom(int);
+    method public void setExpandedTitleMarginEnd(int);
+    method public void setExpandedTitleMarginStart(int);
+    method public void setExpandedTitleMarginTop(int);
+    method public void setExpandedTitleTextAppearance(int);
+    method public void setExpandedTitleTextColor(android.content.res.ColorStateList);
+    method public void setExpandedTitleTypeface(android.graphics.Typeface);
+    method public void setScrimAnimationDuration(long);
+    method public void setScrimVisibleHeightTrigger(int);
+    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 protected android.support.design.widget.CoordinatorLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public java.util.List<android.view.View> getDependencies(android.view.View);
+    method public java.util.List<android.view.View> getDependents(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 onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, 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<V extends android.view.View> {
+    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 boolean getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect);
+    method public int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
+    method public float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
+    method public static java.lang.Object getTag(android.view.View);
+    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 void onAttachedToLayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
+    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 void onDetachedFromLayoutParams();
+    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 deprecated void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
+    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[], int);
+    method public deprecated void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
+    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int, int);
+    method public deprecated void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
+    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
+    method public boolean onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect, boolean);
+    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 deprecated boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
+    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
+    method public deprecated void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int);
+    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 dodgeInsetEdges;
+    field public int gravity;
+    field public int insetEdge;
+    field public int keyline;
+  }
+
+  protected static class CoordinatorLayout.SavedState extends android.support.v4.view.AbsSavedState {
+    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.support.design.widget.VisibilityAwareImageButton {
+    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 float getCompatElevation();
+    method public android.graphics.drawable.Drawable getContentBackground();
+    method public boolean getContentRect(android.graphics.Rect);
+    method public int getRippleColor();
+    method public int getSize();
+    method public boolean getUseCompatPadding();
+    method public void hide();
+    method public void hide(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setCompatElevation(float);
+    method public void setRippleColor(int);
+    method public void setSize(int);
+    method public void setUseCompatPadding(boolean);
+    method public void show();
+    method public void show(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
+    field public static final int SIZE_AUTO = -1; // 0xffffffff
+    field public static final int SIZE_MINI = 1; // 0x1
+    field public static final int SIZE_NORMAL = 0; // 0x0
+  }
+
+  public static class FloatingActionButton.Behavior extends android.support.design.widget.CoordinatorLayout.Behavior {
+    ctor public FloatingActionButton.Behavior();
+    ctor public FloatingActionButton.Behavior(android.content.Context, android.util.AttributeSet);
+    method public boolean getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.graphics.Rect);
+    method public boolean isAutoHideEnabled();
+    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);
+    method public void setAutoHideEnabled(boolean);
+  }
+
+  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<V extends android.view.View> 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 final int getOverlayTop();
+    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);
+    method public final void setOverlayTop(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.support.v4.view.AbsSavedState {
+    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 extends android.support.design.widget.BaseTransientBottomBar {
+    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 deprecated android.support.design.widget.Snackbar setCallback(android.support.design.widget.Snackbar.Callback);
+    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
+    method public android.support.design.widget.Snackbar setText(int);
+    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 class Snackbar.Callback extends android.support.design.widget.BaseTransientBottomBar.BaseCallback {
+    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<V extends android.view.View> 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 final class TabItem extends android.view.View {
+    ctor public TabItem(android.content.Context);
+    ctor public TabItem(android.content.Context, android.util.AttributeSet);
+  }
+
+  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 addOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
+    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 void clearOnTabSelectedListeners();
+    method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    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 removeOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
+    method public void removeTab(android.support.design.widget.TabLayout.Tab);
+    method public void removeTabAt(int);
+    method public deprecated 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 deprecated void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
+    method public void setupWithViewPager(android.support.v4.view.ViewPager);
+    method public void setupWithViewPager(android.support.v4.view.ViewPager, boolean);
+    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 TextInputEditText extends android.support.v7.widget.AppCompatEditText {
+    ctor public TextInputEditText(android.content.Context);
+    ctor public TextInputEditText(android.content.Context, android.util.AttributeSet);
+    ctor public TextInputEditText(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  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 java.lang.CharSequence getPasswordVisibilityToggleContentDescription();
+    method public android.graphics.drawable.Drawable getPasswordVisibilityToggleDrawable();
+    method public android.graphics.Typeface getTypeface();
+    method public boolean isCounterEnabled();
+    method public boolean isErrorEnabled();
+    method public boolean isHintAnimationEnabled();
+    method public boolean isHintEnabled();
+    method public boolean isPasswordVisibilityToggleEnabled();
+    method public android.os.Parcelable onSaveInstanceState();
+    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 setErrorTextAppearance(int);
+    method public void setHint(java.lang.CharSequence);
+    method public void setHintAnimationEnabled(boolean);
+    method public void setHintEnabled(boolean);
+    method public void setHintTextAppearance(int);
+    method public void setPasswordVisibilityToggleContentDescription(int);
+    method public void setPasswordVisibilityToggleContentDescription(java.lang.CharSequence);
+    method public void setPasswordVisibilityToggleDrawable(int);
+    method public void setPasswordVisibilityToggleDrawable(android.graphics.drawable.Drawable);
+    method public void setPasswordVisibilityToggleEnabled(boolean);
+    method public void setPasswordVisibilityToggleTintList(android.content.res.ColorStateList);
+    method public void setPasswordVisibilityToggleTintMode(android.graphics.PorterDuff.Mode);
+    method public void setTypeface(android.graphics.Typeface);
+  }
+
+   class ViewOffsetBehavior<V extends android.view.View> 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 protected void layoutChild(android.support.design.widget.CoordinatorLayout, V, int);
+    method public boolean setLeftAndRightOffset(int);
+    method public boolean setTopAndBottomOffset(int);
+  }
+
+   class VisibilityAwareImageButton extends android.widget.ImageButton {
+    ctor public VisibilityAwareImageButton(android.content.Context);
+    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet);
+    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet, int);
+  }
+
+}
+
diff --git a/design/api/27.0.0.txt b/design/api/27.0.0.txt
new file mode 100644
index 0000000..602ee48
--- /dev/null
+++ b/design/api/27.0.0.txt
@@ -0,0 +1,618 @@
+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 protected android.support.design.widget.AppBarLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.support.design.widget.AppBarLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.design.widget.AppBarLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public deprecated 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 deprecated 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 onMeasureChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int, int, int, int);
+    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, 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, int);
+    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int);
+    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.support.v4.view.AbsSavedState {
+    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 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 onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, android.view.View, android.graphics.Rect, boolean);
+  }
+
+  public abstract class BaseTransientBottomBar<B extends android.support.design.widget.BaseTransientBottomBar<B>> {
+    ctor protected BaseTransientBottomBar(android.view.ViewGroup, android.view.View, android.support.design.widget.BaseTransientBottomBar.ContentViewCallback);
+    method public B addCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback<B>);
+    method public void dismiss();
+    method public android.content.Context getContext();
+    method public int getDuration();
+    method public android.view.View getView();
+    method public boolean isShown();
+    method public boolean isShownOrQueued();
+    method public B removeCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback<B>);
+    method public B setDuration(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 BaseTransientBottomBar.BaseCallback<B> {
+    ctor public BaseTransientBottomBar.BaseCallback();
+    method public void onDismissed(B, int);
+    method public void onShown(B);
+    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 static abstract interface BaseTransientBottomBar.ContentViewCallback {
+    method public abstract void animateContentIn(int, int);
+    method public abstract void animateContentOut(int, int);
+  }
+
+  public class BottomNavigationView extends android.widget.FrameLayout {
+    ctor public BottomNavigationView(android.content.Context);
+    ctor public BottomNavigationView(android.content.Context, android.util.AttributeSet);
+    ctor public BottomNavigationView(android.content.Context, android.util.AttributeSet, int);
+    method public int getItemBackgroundResource();
+    method public android.content.res.ColorStateList getItemIconTintList();
+    method public android.content.res.ColorStateList getItemTextColor();
+    method public int getMaxItemCount();
+    method public android.view.Menu getMenu();
+    method public int getSelectedItemId();
+    method public void inflateMenu(int);
+    method public void setItemBackgroundResource(int);
+    method public void setItemIconTintList(android.content.res.ColorStateList);
+    method public void setItemTextColor(android.content.res.ColorStateList);
+    method public void setOnNavigationItemReselectedListener(android.support.design.widget.BottomNavigationView.OnNavigationItemReselectedListener);
+    method public void setOnNavigationItemSelectedListener(android.support.design.widget.BottomNavigationView.OnNavigationItemSelectedListener);
+    method public void setSelectedItemId(int);
+  }
+
+  public static abstract interface BottomNavigationView.OnNavigationItemReselectedListener {
+    method public abstract void onNavigationItemReselected(android.view.MenuItem);
+  }
+
+  public static abstract interface BottomNavigationView.OnNavigationItemSelectedListener {
+    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
+  }
+
+  public class BottomSheetBehavior<V extends android.view.View> extends android.support.design.widget.CoordinatorLayout.Behavior {
+    ctor public BottomSheetBehavior();
+    ctor public BottomSheetBehavior(android.content.Context, android.util.AttributeSet);
+    method public static <V extends android.view.View> android.support.design.widget.BottomSheetBehavior<V> from(V);
+    method public final int getPeekHeight();
+    method public boolean getSkipCollapsed();
+    method public final int getState();
+    method public boolean isHideable();
+    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
+    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 void setBottomSheetCallback(android.support.design.widget.BottomSheetBehavior.BottomSheetCallback);
+    method public void setHideable(boolean);
+    method public final void setPeekHeight(int);
+    method public void setSkipCollapsed(boolean);
+    method public final void setState(int);
+    field public static final int PEEK_HEIGHT_AUTO = -1; // 0xffffffff
+    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.BottomSheetCallback {
+    ctor public BottomSheetBehavior.BottomSheetCallback();
+    method public abstract void onSlide(android.view.View, float);
+    method public abstract void onStateChanged(android.view.View, int);
+  }
+
+  protected static class BottomSheetBehavior.SavedState extends android.support.v4.view.AbsSavedState {
+    ctor public BottomSheetBehavior.SavedState(android.os.Parcel);
+    ctor public BottomSheetBehavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public BottomSheetBehavior.SavedState(android.os.Parcelable, int);
+    field public static final android.os.Parcelable.Creator<android.support.design.widget.BottomSheetBehavior.SavedState> CREATOR;
+  }
+
+  public class BottomSheetDialog extends android.support.v7.app.AppCompatDialog {
+    ctor public BottomSheetDialog(android.content.Context);
+    ctor public BottomSheetDialog(android.content.Context, int);
+    ctor protected BottomSheetDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
+  }
+
+  public class BottomSheetDialogFragment extends android.support.v7.app.AppCompatDialogFragment {
+    ctor public BottomSheetDialogFragment();
+  }
+
+  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 protected android.support.design.widget.CollapsingToolbarLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.widget.FrameLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getCollapsedTitleGravity();
+    method public android.graphics.Typeface getCollapsedTitleTypeface();
+    method public android.graphics.drawable.Drawable getContentScrim();
+    method public int getExpandedTitleGravity();
+    method public int getExpandedTitleMarginBottom();
+    method public int getExpandedTitleMarginEnd();
+    method public int getExpandedTitleMarginStart();
+    method public int getExpandedTitleMarginTop();
+    method public android.graphics.Typeface getExpandedTitleTypeface();
+    method public long getScrimAnimationDuration();
+    method public int getScrimVisibleHeightTrigger();
+    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 setCollapsedTitleTextColor(android.content.res.ColorStateList);
+    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 setExpandedTitleMargin(int, int, int, int);
+    method public void setExpandedTitleMarginBottom(int);
+    method public void setExpandedTitleMarginEnd(int);
+    method public void setExpandedTitleMarginStart(int);
+    method public void setExpandedTitleMarginTop(int);
+    method public void setExpandedTitleTextAppearance(int);
+    method public void setExpandedTitleTextColor(android.content.res.ColorStateList);
+    method public void setExpandedTitleTypeface(android.graphics.Typeface);
+    method public void setScrimAnimationDuration(long);
+    method public void setScrimVisibleHeightTrigger(int);
+    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 protected android.support.design.widget.CoordinatorLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.design.widget.CoordinatorLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public java.util.List<android.view.View> getDependencies(android.view.View);
+    method public java.util.List<android.view.View> getDependents(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 onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, 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<V extends android.view.View> {
+    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 boolean getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect);
+    method public int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
+    method public float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
+    method public static java.lang.Object getTag(android.view.View);
+    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 void onAttachedToLayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
+    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 void onDetachedFromLayoutParams();
+    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 deprecated void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
+    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[], int);
+    method public deprecated void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
+    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int, int);
+    method public deprecated void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
+    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
+    method public boolean onRequestChildRectangleOnScreen(android.support.design.widget.CoordinatorLayout, V, android.graphics.Rect, boolean);
+    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 deprecated boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
+    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int, int);
+    method public deprecated void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int);
+    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 dodgeInsetEdges;
+    field public int gravity;
+    field public int insetEdge;
+    field public int keyline;
+  }
+
+  protected static class CoordinatorLayout.SavedState extends android.support.v4.view.AbsSavedState {
+    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.support.design.widget.VisibilityAwareImageButton {
+    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 float getCompatElevation();
+    method public android.graphics.drawable.Drawable getContentBackground();
+    method public boolean getContentRect(android.graphics.Rect);
+    method public int getRippleColor();
+    method public int getSize();
+    method public boolean getUseCompatPadding();
+    method public void hide();
+    method public void hide(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setCompatElevation(float);
+    method public void setRippleColor(int);
+    method public void setSize(int);
+    method public void setUseCompatPadding(boolean);
+    method public void show();
+    method public void show(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
+    field public static final int SIZE_AUTO = -1; // 0xffffffff
+    field public static final int SIZE_MINI = 1; // 0x1
+    field public static final int SIZE_NORMAL = 0; // 0x0
+  }
+
+  public static class FloatingActionButton.Behavior extends android.support.design.widget.CoordinatorLayout.Behavior {
+    ctor public FloatingActionButton.Behavior();
+    ctor public FloatingActionButton.Behavior(android.content.Context, android.util.AttributeSet);
+    method public boolean getInsetDodgeRect(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.graphics.Rect);
+    method public boolean isAutoHideEnabled();
+    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);
+    method public void setAutoHideEnabled(boolean);
+  }
+
+  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<V extends android.view.View> 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 final int getOverlayTop();
+    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);
+    method public final void setOverlayTop(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.support.v4.view.AbsSavedState {
+    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 extends android.support.design.widget.BaseTransientBottomBar {
+    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 deprecated android.support.design.widget.Snackbar setCallback(android.support.design.widget.Snackbar.Callback);
+    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
+    method public android.support.design.widget.Snackbar setText(int);
+    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 class Snackbar.Callback extends android.support.design.widget.BaseTransientBottomBar.BaseCallback {
+    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<V extends android.view.View> 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 final class TabItem extends android.view.View {
+    ctor public TabItem(android.content.Context);
+    ctor public TabItem(android.content.Context, android.util.AttributeSet);
+  }
+
+  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 addOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
+    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 void clearOnTabSelectedListeners();
+    method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    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 removeOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
+    method public void removeTab(android.support.design.widget.TabLayout.Tab);
+    method public void removeTabAt(int);
+    method public deprecated 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 deprecated void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
+    method public void setupWithViewPager(android.support.v4.view.ViewPager);
+    method public void setupWithViewPager(android.support.v4.view.ViewPager, boolean);
+    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 TextInputEditText extends android.support.v7.widget.AppCompatEditText {
+    ctor public TextInputEditText(android.content.Context);
+    ctor public TextInputEditText(android.content.Context, android.util.AttributeSet);
+    ctor public TextInputEditText(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  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 java.lang.CharSequence getPasswordVisibilityToggleContentDescription();
+    method public android.graphics.drawable.Drawable getPasswordVisibilityToggleDrawable();
+    method public android.graphics.Typeface getTypeface();
+    method public boolean isCounterEnabled();
+    method public boolean isErrorEnabled();
+    method public boolean isHintAnimationEnabled();
+    method public boolean isHintEnabled();
+    method public boolean isPasswordVisibilityToggleEnabled();
+    method public android.os.Parcelable onSaveInstanceState();
+    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 setErrorTextAppearance(int);
+    method public void setHint(java.lang.CharSequence);
+    method public void setHintAnimationEnabled(boolean);
+    method public void setHintEnabled(boolean);
+    method public void setHintTextAppearance(int);
+    method public void setPasswordVisibilityToggleContentDescription(int);
+    method public void setPasswordVisibilityToggleContentDescription(java.lang.CharSequence);
+    method public void setPasswordVisibilityToggleDrawable(int);
+    method public void setPasswordVisibilityToggleDrawable(android.graphics.drawable.Drawable);
+    method public void setPasswordVisibilityToggleEnabled(boolean);
+    method public void setPasswordVisibilityToggleTintList(android.content.res.ColorStateList);
+    method public void setPasswordVisibilityToggleTintMode(android.graphics.PorterDuff.Mode);
+    method public void setTypeface(android.graphics.Typeface);
+  }
+
+   class ViewOffsetBehavior<V extends android.view.View> 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 protected void layoutChild(android.support.design.widget.CoordinatorLayout, V, int);
+    method public boolean setLeftAndRightOffset(int);
+    method public boolean setTopAndBottomOffset(int);
+  }
+
+   class VisibilityAwareImageButton extends android.widget.ImageButton {
+    ctor public VisibilityAwareImageButton(android.content.Context);
+    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet);
+    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet, int);
+  }
+
+}
+
diff --git a/dynamic-animation/Android.mk b/dynamic-animation/Android.mk
index 1b33094..11aa484 100644
--- a/dynamic-animation/Android.mk
+++ b/dynamic-animation/Android.mk
@@ -18,7 +18,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-dynamic-animation
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under,src)
+LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-compat \
diff --git a/dynamic-animation/AndroidManifest.xml b/dynamic-animation/AndroidManifest.xml
index a46ea43..bfe97cc 100644
--- a/dynamic-animation/AndroidManifest.xml
+++ b/dynamic-animation/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.dynamicanimation">
     <uses-sdk android:minSdkVersion="16"/>
-    <application>
-        <meta-data android:name="android.support.dynamicanimation.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/dynamic-animation/OWNERS b/dynamic-animation/OWNERS
new file mode 100644
index 0000000..20360e8
--- /dev/null
+++ b/dynamic-animation/OWNERS
@@ -0,0 +1 @@
+tianliu@google.com
\ No newline at end of file
diff --git a/dynamic-animation/api/26.1.0.txt b/dynamic-animation/api/26.1.0.txt
new file mode 100644
index 0000000..73d20b8
--- /dev/null
+++ b/dynamic-animation/api/26.1.0.txt
@@ -0,0 +1,103 @@
+package android.support.animation {
+
+  public abstract class DynamicAnimation<T extends android.support.animation.DynamicAnimation<T>> {
+    method public T addEndListener(android.support.animation.DynamicAnimation.OnAnimationEndListener);
+    method public T addUpdateListener(android.support.animation.DynamicAnimation.OnAnimationUpdateListener);
+    method public void cancel();
+    method public float getMinimumVisibleChange();
+    method public boolean isRunning();
+    method public void removeEndListener(android.support.animation.DynamicAnimation.OnAnimationEndListener);
+    method public void removeUpdateListener(android.support.animation.DynamicAnimation.OnAnimationUpdateListener);
+    method public T setMaxValue(float);
+    method public T setMinValue(float);
+    method public T setMinimumVisibleChange(float);
+    method public T setStartValue(float);
+    method public T setStartVelocity(float);
+    method public void start();
+    field public static final android.support.animation.DynamicAnimation.ViewProperty ALPHA;
+    field public static final float MIN_VISIBLE_CHANGE_ALPHA = 0.00390625f;
+    field public static final float MIN_VISIBLE_CHANGE_PIXELS = 1.0f;
+    field public static final float MIN_VISIBLE_CHANGE_ROTATION_DEGREES = 0.1f;
+    field public static final float MIN_VISIBLE_CHANGE_SCALE = 0.002f;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty ROTATION;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty ROTATION_X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty ROTATION_Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty SCALE_X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty SCALE_Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty SCROLL_X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty SCROLL_Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty TRANSLATION_X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty TRANSLATION_Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty TRANSLATION_Z;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty Z;
+  }
+
+  public static abstract interface DynamicAnimation.OnAnimationEndListener {
+    method public abstract void onAnimationEnd(android.support.animation.DynamicAnimation, boolean, float, float);
+  }
+
+  public static abstract interface DynamicAnimation.OnAnimationUpdateListener {
+    method public abstract void onAnimationUpdate(android.support.animation.DynamicAnimation, float, float);
+  }
+
+  public static abstract class DynamicAnimation.ViewProperty extends android.support.animation.FloatPropertyCompat {
+  }
+
+  public final class FlingAnimation extends android.support.animation.DynamicAnimation {
+    ctor public FlingAnimation(android.support.animation.FloatValueHolder);
+    ctor public FlingAnimation(K, android.support.animation.FloatPropertyCompat<K>);
+    method public float getFriction();
+    method public android.support.animation.FlingAnimation setFriction(float);
+    method public android.support.animation.FlingAnimation setMaxValue(float);
+    method public android.support.animation.FlingAnimation setMinValue(float);
+    method public android.support.animation.FlingAnimation setStartVelocity(float);
+  }
+
+  public abstract class FloatPropertyCompat<T> {
+    ctor public FloatPropertyCompat(java.lang.String);
+    method public static <T> android.support.animation.FloatPropertyCompat<T> createFloatPropertyCompat(android.util.FloatProperty<T>);
+    method public abstract float getValue(T);
+    method public abstract void setValue(T, float);
+  }
+
+  public final class FloatValueHolder {
+    ctor public FloatValueHolder();
+    ctor public FloatValueHolder(float);
+    method public float getValue();
+    method public void setValue(float);
+  }
+
+  public final class SpringAnimation extends android.support.animation.DynamicAnimation {
+    ctor public SpringAnimation(android.support.animation.FloatValueHolder);
+    ctor public SpringAnimation(K, android.support.animation.FloatPropertyCompat<K>);
+    ctor public SpringAnimation(K, android.support.animation.FloatPropertyCompat<K>, float);
+    method public void animateToFinalPosition(float);
+    method public boolean canSkipToEnd();
+    method public android.support.animation.SpringForce getSpring();
+    method public android.support.animation.SpringAnimation setSpring(android.support.animation.SpringForce);
+    method public void skipToEnd();
+  }
+
+  public final class SpringForce {
+    ctor public SpringForce();
+    ctor public SpringForce(float);
+    method public float getDampingRatio();
+    method public float getFinalPosition();
+    method public float getStiffness();
+    method public android.support.animation.SpringForce setDampingRatio(float);
+    method public android.support.animation.SpringForce setFinalPosition(float);
+    method public android.support.animation.SpringForce setStiffness(float);
+    field public static final float DAMPING_RATIO_HIGH_BOUNCY = 0.2f;
+    field public static final float DAMPING_RATIO_LOW_BOUNCY = 0.75f;
+    field public static final float DAMPING_RATIO_MEDIUM_BOUNCY = 0.5f;
+    field public static final float DAMPING_RATIO_NO_BOUNCY = 1.0f;
+    field public static final float STIFFNESS_HIGH = 10000.0f;
+    field public static final float STIFFNESS_LOW = 200.0f;
+    field public static final float STIFFNESS_MEDIUM = 1500.0f;
+    field public static final float STIFFNESS_VERY_LOW = 50.0f;
+  }
+
+}
+
diff --git a/dynamic-animation/api/27.0.0.txt b/dynamic-animation/api/27.0.0.txt
new file mode 100644
index 0000000..73d20b8
--- /dev/null
+++ b/dynamic-animation/api/27.0.0.txt
@@ -0,0 +1,103 @@
+package android.support.animation {
+
+  public abstract class DynamicAnimation<T extends android.support.animation.DynamicAnimation<T>> {
+    method public T addEndListener(android.support.animation.DynamicAnimation.OnAnimationEndListener);
+    method public T addUpdateListener(android.support.animation.DynamicAnimation.OnAnimationUpdateListener);
+    method public void cancel();
+    method public float getMinimumVisibleChange();
+    method public boolean isRunning();
+    method public void removeEndListener(android.support.animation.DynamicAnimation.OnAnimationEndListener);
+    method public void removeUpdateListener(android.support.animation.DynamicAnimation.OnAnimationUpdateListener);
+    method public T setMaxValue(float);
+    method public T setMinValue(float);
+    method public T setMinimumVisibleChange(float);
+    method public T setStartValue(float);
+    method public T setStartVelocity(float);
+    method public void start();
+    field public static final android.support.animation.DynamicAnimation.ViewProperty ALPHA;
+    field public static final float MIN_VISIBLE_CHANGE_ALPHA = 0.00390625f;
+    field public static final float MIN_VISIBLE_CHANGE_PIXELS = 1.0f;
+    field public static final float MIN_VISIBLE_CHANGE_ROTATION_DEGREES = 0.1f;
+    field public static final float MIN_VISIBLE_CHANGE_SCALE = 0.002f;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty ROTATION;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty ROTATION_X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty ROTATION_Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty SCALE_X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty SCALE_Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty SCROLL_X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty SCROLL_Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty TRANSLATION_X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty TRANSLATION_Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty TRANSLATION_Z;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty X;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty Y;
+    field public static final android.support.animation.DynamicAnimation.ViewProperty Z;
+  }
+
+  public static abstract interface DynamicAnimation.OnAnimationEndListener {
+    method public abstract void onAnimationEnd(android.support.animation.DynamicAnimation, boolean, float, float);
+  }
+
+  public static abstract interface DynamicAnimation.OnAnimationUpdateListener {
+    method public abstract void onAnimationUpdate(android.support.animation.DynamicAnimation, float, float);
+  }
+
+  public static abstract class DynamicAnimation.ViewProperty extends android.support.animation.FloatPropertyCompat {
+  }
+
+  public final class FlingAnimation extends android.support.animation.DynamicAnimation {
+    ctor public FlingAnimation(android.support.animation.FloatValueHolder);
+    ctor public FlingAnimation(K, android.support.animation.FloatPropertyCompat<K>);
+    method public float getFriction();
+    method public android.support.animation.FlingAnimation setFriction(float);
+    method public android.support.animation.FlingAnimation setMaxValue(float);
+    method public android.support.animation.FlingAnimation setMinValue(float);
+    method public android.support.animation.FlingAnimation setStartVelocity(float);
+  }
+
+  public abstract class FloatPropertyCompat<T> {
+    ctor public FloatPropertyCompat(java.lang.String);
+    method public static <T> android.support.animation.FloatPropertyCompat<T> createFloatPropertyCompat(android.util.FloatProperty<T>);
+    method public abstract float getValue(T);
+    method public abstract void setValue(T, float);
+  }
+
+  public final class FloatValueHolder {
+    ctor public FloatValueHolder();
+    ctor public FloatValueHolder(float);
+    method public float getValue();
+    method public void setValue(float);
+  }
+
+  public final class SpringAnimation extends android.support.animation.DynamicAnimation {
+    ctor public SpringAnimation(android.support.animation.FloatValueHolder);
+    ctor public SpringAnimation(K, android.support.animation.FloatPropertyCompat<K>);
+    ctor public SpringAnimation(K, android.support.animation.FloatPropertyCompat<K>, float);
+    method public void animateToFinalPosition(float);
+    method public boolean canSkipToEnd();
+    method public android.support.animation.SpringForce getSpring();
+    method public android.support.animation.SpringAnimation setSpring(android.support.animation.SpringForce);
+    method public void skipToEnd();
+  }
+
+  public final class SpringForce {
+    ctor public SpringForce();
+    ctor public SpringForce(float);
+    method public float getDampingRatio();
+    method public float getFinalPosition();
+    method public float getStiffness();
+    method public android.support.animation.SpringForce setDampingRatio(float);
+    method public android.support.animation.SpringForce setFinalPosition(float);
+    method public android.support.animation.SpringForce setStiffness(float);
+    field public static final float DAMPING_RATIO_HIGH_BOUNCY = 0.2f;
+    field public static final float DAMPING_RATIO_LOW_BOUNCY = 0.75f;
+    field public static final float DAMPING_RATIO_MEDIUM_BOUNCY = 0.5f;
+    field public static final float DAMPING_RATIO_NO_BOUNCY = 1.0f;
+    field public static final float STIFFNESS_HIGH = 10000.0f;
+    field public static final float STIFFNESS_LOW = 200.0f;
+    field public static final float STIFFNESS_MEDIUM = 1500.0f;
+    field public static final float STIFFNESS_VERY_LOW = 50.0f;
+  }
+
+}
+
diff --git a/dynamic-animation/build.gradle b/dynamic-animation/build.gradle
index b1557e8..220758d 100644
--- a/dynamic-animation/build.gradle
+++ b/dynamic-animation/build.gradle
@@ -13,11 +13,6 @@
     defaultConfig {
         minSdkVersion 14
     }
-
-    sourceSets {
-        main.java.srcDir 'src'
-        main.res.srcDirs 'res', 'res-public'
-    }
 }
 
 supportLibrary {
diff --git a/dynamic-animation/src/android/support/animation/AnimationHandler.java b/dynamic-animation/src/main/java/android/support/animation/AnimationHandler.java
similarity index 100%
rename from dynamic-animation/src/android/support/animation/AnimationHandler.java
rename to dynamic-animation/src/main/java/android/support/animation/AnimationHandler.java
diff --git a/dynamic-animation/src/android/support/animation/DynamicAnimation.java b/dynamic-animation/src/main/java/android/support/animation/DynamicAnimation.java
similarity index 100%
rename from dynamic-animation/src/android/support/animation/DynamicAnimation.java
rename to dynamic-animation/src/main/java/android/support/animation/DynamicAnimation.java
diff --git a/dynamic-animation/src/android/support/animation/FlingAnimation.java b/dynamic-animation/src/main/java/android/support/animation/FlingAnimation.java
similarity index 100%
rename from dynamic-animation/src/android/support/animation/FlingAnimation.java
rename to dynamic-animation/src/main/java/android/support/animation/FlingAnimation.java
diff --git a/dynamic-animation/src/android/support/animation/FloatPropertyCompat.java b/dynamic-animation/src/main/java/android/support/animation/FloatPropertyCompat.java
similarity index 100%
rename from dynamic-animation/src/android/support/animation/FloatPropertyCompat.java
rename to dynamic-animation/src/main/java/android/support/animation/FloatPropertyCompat.java
diff --git a/dynamic-animation/src/android/support/animation/FloatValueHolder.java b/dynamic-animation/src/main/java/android/support/animation/FloatValueHolder.java
similarity index 100%
rename from dynamic-animation/src/android/support/animation/FloatValueHolder.java
rename to dynamic-animation/src/main/java/android/support/animation/FloatValueHolder.java
diff --git a/dynamic-animation/src/android/support/animation/Force.java b/dynamic-animation/src/main/java/android/support/animation/Force.java
similarity index 100%
rename from dynamic-animation/src/android/support/animation/Force.java
rename to dynamic-animation/src/main/java/android/support/animation/Force.java
diff --git a/dynamic-animation/src/android/support/animation/SpringAnimation.java b/dynamic-animation/src/main/java/android/support/animation/SpringAnimation.java
similarity index 100%
rename from dynamic-animation/src/android/support/animation/SpringAnimation.java
rename to dynamic-animation/src/main/java/android/support/animation/SpringAnimation.java
diff --git a/dynamic-animation/src/android/support/animation/SpringForce.java b/dynamic-animation/src/main/java/android/support/animation/SpringForce.java
similarity index 100%
rename from dynamic-animation/src/android/support/animation/SpringForce.java
rename to dynamic-animation/src/main/java/android/support/animation/SpringForce.java
diff --git a/emoji/OWNERS b/emoji/OWNERS
new file mode 100644
index 0000000..f52b9a6
--- /dev/null
+++ b/emoji/OWNERS
@@ -0,0 +1,2 @@
+clarabayarri@google.com
+siyamed@google.com
\ No newline at end of file
diff --git a/emoji/appcompat/Android.mk b/emoji/appcompat/Android.mk
index 54f6b14..f04d158 100644
--- a/emoji/appcompat/Android.mk
+++ b/emoji/appcompat/Android.mk
@@ -29,7 +29,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-emoji-appcompat
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-annotations \
     android-support-v7-appcompat \
diff --git a/emoji/appcompat/AndroidManifest.xml b/emoji/appcompat/AndroidManifest.xml
index 8261137..bf83391 100644
--- a/emoji/appcompat/AndroidManifest.xml
+++ b/emoji/appcompat/AndroidManifest.xml
@@ -17,8 +17,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.text.emoji.appcompat">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.text.emoji.appcompat.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/emoji/appcompat/api/26.1.0.txt b/emoji/appcompat/api/26.1.0.txt
new file mode 100644
index 0000000..2c5e5c0
--- /dev/null
+++ b/emoji/appcompat/api/26.1.0.txt
@@ -0,0 +1,24 @@
+package android.support.text.emoji.widget {
+
+  public class EmojiAppCompatButton extends android.support.v7.widget.AppCompatButton {
+    ctor public EmojiAppCompatButton(android.content.Context);
+    ctor public EmojiAppCompatButton(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiAppCompatButton(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class EmojiAppCompatEditText extends android.support.v7.widget.AppCompatEditText {
+    ctor public EmojiAppCompatEditText(android.content.Context);
+    ctor public EmojiAppCompatEditText(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiAppCompatEditText(android.content.Context, android.util.AttributeSet, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(int);
+  }
+
+  public class EmojiAppCompatTextView extends android.support.v7.widget.AppCompatTextView {
+    ctor public EmojiAppCompatTextView(android.content.Context);
+    ctor public EmojiAppCompatTextView(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiAppCompatTextView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+}
+
diff --git a/emoji/appcompat/api/27.0.0.txt b/emoji/appcompat/api/27.0.0.txt
new file mode 100644
index 0000000..2c5e5c0
--- /dev/null
+++ b/emoji/appcompat/api/27.0.0.txt
@@ -0,0 +1,24 @@
+package android.support.text.emoji.widget {
+
+  public class EmojiAppCompatButton extends android.support.v7.widget.AppCompatButton {
+    ctor public EmojiAppCompatButton(android.content.Context);
+    ctor public EmojiAppCompatButton(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiAppCompatButton(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class EmojiAppCompatEditText extends android.support.v7.widget.AppCompatEditText {
+    ctor public EmojiAppCompatEditText(android.content.Context);
+    ctor public EmojiAppCompatEditText(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiAppCompatEditText(android.content.Context, android.util.AttributeSet, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(int);
+  }
+
+  public class EmojiAppCompatTextView extends android.support.v7.widget.AppCompatTextView {
+    ctor public EmojiAppCompatTextView(android.content.Context);
+    ctor public EmojiAppCompatTextView(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiAppCompatTextView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+}
+
diff --git a/emoji/appcompat/build.gradle b/emoji/appcompat/build.gradle
index 9b6e0d4..e22000c 100644
--- a/emoji/appcompat/build.gradle
+++ b/emoji/appcompat/build.gradle
@@ -26,10 +26,6 @@
     defaultConfig {
         minSdkVersion 14
     }
-
-    sourceSets {
-        main.java.srcDir 'src'
-    }
 }
 
 supportLibrary {
diff --git a/emoji/appcompat/src/android/support/text/emoji/widget/EmojiAppCompatButton.java b/emoji/appcompat/src/main/java/android/support/text/emoji/widget/EmojiAppCompatButton.java
similarity index 100%
rename from emoji/appcompat/src/android/support/text/emoji/widget/EmojiAppCompatButton.java
rename to emoji/appcompat/src/main/java/android/support/text/emoji/widget/EmojiAppCompatButton.java
diff --git a/emoji/appcompat/src/android/support/text/emoji/widget/EmojiAppCompatEditText.java b/emoji/appcompat/src/main/java/android/support/text/emoji/widget/EmojiAppCompatEditText.java
similarity index 100%
rename from emoji/appcompat/src/android/support/text/emoji/widget/EmojiAppCompatEditText.java
rename to emoji/appcompat/src/main/java/android/support/text/emoji/widget/EmojiAppCompatEditText.java
diff --git a/emoji/appcompat/src/android/support/text/emoji/widget/EmojiAppCompatTextView.java b/emoji/appcompat/src/main/java/android/support/text/emoji/widget/EmojiAppCompatTextView.java
similarity index 100%
rename from emoji/appcompat/src/android/support/text/emoji/widget/EmojiAppCompatTextView.java
rename to emoji/appcompat/src/main/java/android/support/text/emoji/widget/EmojiAppCompatTextView.java
diff --git a/emoji/bundled/Android.mk b/emoji/bundled/Android.mk
index 3b6b181..29f0d58 100644
--- a/emoji/bundled/Android.mk
+++ b/emoji/bundled/Android.mk
@@ -28,7 +28,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-emoji-bundled
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-annotations \
     android-support-emoji \
diff --git a/emoji/bundled/AndroidManifest.xml b/emoji/bundled/AndroidManifest.xml
index a2b14cf..01c1713 100644
--- a/emoji/bundled/AndroidManifest.xml
+++ b/emoji/bundled/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.text.emoji.bundled">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.text.emoji.bundled.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
\ No newline at end of file
diff --git a/emoji/bundled/api/26.1.0.txt b/emoji/bundled/api/26.1.0.txt
new file mode 100644
index 0000000..8812247
--- /dev/null
+++ b/emoji/bundled/api/26.1.0.txt
@@ -0,0 +1,8 @@
+package android.support.text.emoji.bundled {
+
+  public class BundledEmojiCompatConfig extends android.support.text.emoji.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji/bundled/api/27.0.0.txt b/emoji/bundled/api/27.0.0.txt
new file mode 100644
index 0000000..8812247
--- /dev/null
+++ b/emoji/bundled/api/27.0.0.txt
@@ -0,0 +1,8 @@
+package android.support.text.emoji.bundled {
+
+  public class BundledEmojiCompatConfig extends android.support.text.emoji.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji/bundled/build.gradle b/emoji/bundled/build.gradle
index b882ee1..766d165 100644
--- a/emoji/bundled/build.gradle
+++ b/emoji/bundled/build.gradle
@@ -10,7 +10,6 @@
     }
 
     sourceSets {
-        main.java.srcDir 'src'
         main.assets.srcDirs new File(fontDir, "font").getAbsolutePath()
     }
 }
diff --git a/emoji/bundled/src/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java b/emoji/bundled/src/main/java/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java
similarity index 100%
rename from emoji/bundled/src/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java
rename to emoji/bundled/src/main/java/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java
diff --git a/emoji/core/Android.mk b/emoji/core/Android.mk
index 774ba29..8b7a032 100644
--- a/emoji/core/Android.mk
+++ b/emoji/core/Android.mk
@@ -27,8 +27,8 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-emoji
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/src/main/res
 LOCAL_STATIC_JAVA_LIBRARIES := \
     noto-emoji-compat-java
 LOCAL_SHARED_ANDROID_LIBRARIES := \
diff --git a/emoji/core/AndroidManifest.xml b/emoji/core/AndroidManifest.xml
index 1143f40..d153151 100644
--- a/emoji/core/AndroidManifest.xml
+++ b/emoji/core/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.text.emoji">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.text.emoji.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/emoji/core/api/26.1.0.txt b/emoji/core/api/26.1.0.txt
new file mode 100644
index 0000000..d5ce666
--- /dev/null
+++ b/emoji/core/api/26.1.0.txt
@@ -0,0 +1,134 @@
+package android.support.text.emoji {
+
+  public class EmojiCompat {
+    method public static android.support.text.emoji.EmojiCompat get();
+    method public java.lang.String getAssetSignature();
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, int, int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method public boolean hasEmojiGlyph(java.lang.CharSequence);
+    method public boolean hasEmojiGlyph(java.lang.CharSequence, int);
+    method public static android.support.text.emoji.EmojiCompat init(android.support.text.emoji.EmojiCompat.Config);
+    method public java.lang.CharSequence process(java.lang.CharSequence);
+    method public java.lang.CharSequence process(java.lang.CharSequence, int, int);
+    method public java.lang.CharSequence process(java.lang.CharSequence, int, int, int);
+    method public java.lang.CharSequence process(java.lang.CharSequence, int, int, int, int);
+    method public void registerInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
+    field public static final java.lang.String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final java.lang.String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public static abstract class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(android.support.text.emoji.EmojiCompat.MetadataRepoLoader);
+    method protected final android.support.text.emoji.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public android.support.text.emoji.EmojiCompat.Config registerInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
+    method public android.support.text.emoji.EmojiCompat.Config setEmojiSpanIndicatorColor(int);
+    method public android.support.text.emoji.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public android.support.text.emoji.EmojiCompat.Config setReplaceAll(boolean);
+    method public android.support.text.emoji.EmojiCompat.Config unregisterInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
+  }
+
+  public static abstract class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(java.lang.Throwable);
+    method public void onInitialized();
+  }
+
+  public static abstract interface EmojiCompat.MetadataRepoLoader {
+    method public abstract void load(android.support.text.emoji.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public static abstract class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(java.lang.Throwable);
+    method public abstract void onLoaded(android.support.text.emoji.MetadataRepo);
+  }
+
+  public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, java.lang.CharSequence, int, int, android.graphics.Paint.FontMetricsInt);
+  }
+
+  public class FontRequestEmojiCompatConfig extends android.support.text.emoji.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, android.support.v4.provider.FontRequest);
+    method public android.support.text.emoji.FontRequestEmojiCompatConfig setHandler(android.os.Handler);
+    method public android.support.text.emoji.FontRequestEmojiCompatConfig setRetryPolicy(android.support.text.emoji.FontRequestEmojiCompatConfig.RetryPolicy);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends android.support.text.emoji.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public static abstract class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  public final class MetadataRepo {
+    method public static android.support.text.emoji.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static android.support.text.emoji.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static android.support.text.emoji.MetadataRepo create(android.content.res.AssetManager, java.lang.String) throws java.io.IOException;
+  }
+
+}
+
+package android.support.text.emoji.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet, int);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet, int, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet, int);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet, int, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(int);
+  }
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    method public android.text.method.KeyListener getKeyListener(android.text.method.KeyListener);
+    method public int getMaxEmojiCount();
+    method public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+    method public void setMaxEmojiCount(int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet, int, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet, int);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet, int, int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    method public android.text.InputFilter[] getFilters(android.text.InputFilter[]);
+    method public void setAllCaps(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod wrapTransformationMethod(android.text.method.TransformationMethod);
+  }
+
+}
+
diff --git a/emoji/core/api/27.0.0.txt b/emoji/core/api/27.0.0.txt
new file mode 100644
index 0000000..d5ce666
--- /dev/null
+++ b/emoji/core/api/27.0.0.txt
@@ -0,0 +1,134 @@
+package android.support.text.emoji {
+
+  public class EmojiCompat {
+    method public static android.support.text.emoji.EmojiCompat get();
+    method public java.lang.String getAssetSignature();
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, int, int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method public boolean hasEmojiGlyph(java.lang.CharSequence);
+    method public boolean hasEmojiGlyph(java.lang.CharSequence, int);
+    method public static android.support.text.emoji.EmojiCompat init(android.support.text.emoji.EmojiCompat.Config);
+    method public java.lang.CharSequence process(java.lang.CharSequence);
+    method public java.lang.CharSequence process(java.lang.CharSequence, int, int);
+    method public java.lang.CharSequence process(java.lang.CharSequence, int, int, int);
+    method public java.lang.CharSequence process(java.lang.CharSequence, int, int, int, int);
+    method public void registerInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
+    field public static final java.lang.String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final java.lang.String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public static abstract class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(android.support.text.emoji.EmojiCompat.MetadataRepoLoader);
+    method protected final android.support.text.emoji.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public android.support.text.emoji.EmojiCompat.Config registerInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
+    method public android.support.text.emoji.EmojiCompat.Config setEmojiSpanIndicatorColor(int);
+    method public android.support.text.emoji.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public android.support.text.emoji.EmojiCompat.Config setReplaceAll(boolean);
+    method public android.support.text.emoji.EmojiCompat.Config unregisterInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
+  }
+
+  public static abstract class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(java.lang.Throwable);
+    method public void onInitialized();
+  }
+
+  public static abstract interface EmojiCompat.MetadataRepoLoader {
+    method public abstract void load(android.support.text.emoji.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public static abstract class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(java.lang.Throwable);
+    method public abstract void onLoaded(android.support.text.emoji.MetadataRepo);
+  }
+
+  public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, java.lang.CharSequence, int, int, android.graphics.Paint.FontMetricsInt);
+  }
+
+  public class FontRequestEmojiCompatConfig extends android.support.text.emoji.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, android.support.v4.provider.FontRequest);
+    method public android.support.text.emoji.FontRequestEmojiCompatConfig setHandler(android.os.Handler);
+    method public android.support.text.emoji.FontRequestEmojiCompatConfig setRetryPolicy(android.support.text.emoji.FontRequestEmojiCompatConfig.RetryPolicy);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends android.support.text.emoji.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public static abstract class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  public final class MetadataRepo {
+    method public static android.support.text.emoji.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static android.support.text.emoji.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static android.support.text.emoji.MetadataRepo create(android.content.res.AssetManager, java.lang.String) throws java.io.IOException;
+  }
+
+}
+
+package android.support.text.emoji.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet, int);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet, int, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet, int);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet, int, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(int);
+  }
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    method public android.text.method.KeyListener getKeyListener(android.text.method.KeyListener);
+    method public int getMaxEmojiCount();
+    method public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+    method public void setMaxEmojiCount(int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet, int, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet, int);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet, int, int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    method public android.text.InputFilter[] getFilters(android.text.InputFilter[]);
+    method public void setAllCaps(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod wrapTransformationMethod(android.text.method.TransformationMethod);
+  }
+
+}
+
diff --git a/emoji/core/build.gradle b/emoji/core/build.gradle
index c0881d2..b4cd3fc 100644
--- a/emoji/core/build.gradle
+++ b/emoji/core/build.gradle
@@ -29,10 +29,7 @@
     }
 
     sourceSets {
-        main.java {
-            srcDirs = ['src']
-        }
-        main.res.srcDirs = ['res', 'res-public']
+        main.res.srcDirs += 'src/main/res-public'
         main.resources {
             srcDirs = [fontDir.getAbsolutePath()]
             includes = ["LICENSE_UNICODE", "LICENSE_OFL"]
diff --git a/emoji/core/src/android/support/text/emoji/EmojiCompat.java b/emoji/core/src/main/java/android/support/text/emoji/EmojiCompat.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/EmojiCompat.java
rename to emoji/core/src/main/java/android/support/text/emoji/EmojiCompat.java
diff --git a/emoji/core/src/android/support/text/emoji/EmojiMetadata.java b/emoji/core/src/main/java/android/support/text/emoji/EmojiMetadata.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/EmojiMetadata.java
rename to emoji/core/src/main/java/android/support/text/emoji/EmojiMetadata.java
diff --git a/emoji/core/src/android/support/text/emoji/EmojiProcessor.java b/emoji/core/src/main/java/android/support/text/emoji/EmojiProcessor.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/EmojiProcessor.java
rename to emoji/core/src/main/java/android/support/text/emoji/EmojiProcessor.java
diff --git a/emoji/core/src/android/support/text/emoji/EmojiSpan.java b/emoji/core/src/main/java/android/support/text/emoji/EmojiSpan.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/EmojiSpan.java
rename to emoji/core/src/main/java/android/support/text/emoji/EmojiSpan.java
diff --git a/emoji/core/src/android/support/text/emoji/FontRequestEmojiCompatConfig.java b/emoji/core/src/main/java/android/support/text/emoji/FontRequestEmojiCompatConfig.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/FontRequestEmojiCompatConfig.java
rename to emoji/core/src/main/java/android/support/text/emoji/FontRequestEmojiCompatConfig.java
diff --git a/emoji/core/src/android/support/text/emoji/MetadataListReader.java b/emoji/core/src/main/java/android/support/text/emoji/MetadataListReader.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/MetadataListReader.java
rename to emoji/core/src/main/java/android/support/text/emoji/MetadataListReader.java
diff --git a/emoji/core/src/android/support/text/emoji/MetadataRepo.java b/emoji/core/src/main/java/android/support/text/emoji/MetadataRepo.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/MetadataRepo.java
rename to emoji/core/src/main/java/android/support/text/emoji/MetadataRepo.java
diff --git a/emoji/core/src/android/support/text/emoji/TypefaceEmojiSpan.java b/emoji/core/src/main/java/android/support/text/emoji/TypefaceEmojiSpan.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/TypefaceEmojiSpan.java
rename to emoji/core/src/main/java/android/support/text/emoji/TypefaceEmojiSpan.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/EditTextAttributeHelper.java b/emoji/core/src/main/java/android/support/text/emoji/widget/EditTextAttributeHelper.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/EditTextAttributeHelper.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/EditTextAttributeHelper.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiButton.java b/emoji/core/src/main/java/android/support/text/emoji/widget/EmojiButton.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/EmojiButton.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/EmojiButton.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiEditText.java b/emoji/core/src/main/java/android/support/text/emoji/widget/EmojiEditText.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/EmojiEditText.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/EmojiEditText.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiEditTextHelper.java b/emoji/core/src/main/java/android/support/text/emoji/widget/EmojiEditTextHelper.java
similarity index 96%
rename from emoji/core/src/android/support/text/emoji/widget/EmojiEditTextHelper.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/EmojiEditTextHelper.java
index edc511f..a999e34 100644
--- a/emoji/core/src/android/support/text/emoji/widget/EmojiEditTextHelper.java
+++ b/emoji/core/src/main/java/android/support/text/emoji/widget/EmojiEditTextHelper.java
@@ -20,6 +20,7 @@
 import android.os.Build;
 import android.support.annotation.IntRange;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
 import android.support.annotation.RestrictTo;
 import android.support.text.emoji.EmojiCompat;
@@ -130,7 +131,8 @@
     /**
      * Updates the InputConnection with emoji support. Should be called from {@link
      * TextView#onCreateInputConnection(EditorInfo)}. When used on devices running API 18 or below,
-     * this method returns {@code inputConnection} that is given as a parameter.
+     * this method returns {@code inputConnection} that is given as a parameter. If
+     * {@code inputConnection} is {@code null}, returns {@code null}.
      *
      * @param inputConnection InputConnection instance created by TextView
      * @param outAttrs        EditorInfo passed into
@@ -138,10 +140,10 @@
      *
      * @return a new InputConnection instance that wraps {@code inputConnection}
      */
-    @NonNull
-    public InputConnection onCreateInputConnection(@NonNull final InputConnection inputConnection,
+    @Nullable
+    public InputConnection onCreateInputConnection(@Nullable final InputConnection inputConnection,
             @NonNull final EditorInfo outAttrs) {
-        Preconditions.checkNotNull(inputConnection, "inputConnection cannot be null");
+        if (inputConnection == null) return null;
         return mHelper.onCreateInputConnection(inputConnection, outAttrs);
     }
 
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiEditableFactory.java b/emoji/core/src/main/java/android/support/text/emoji/widget/EmojiEditableFactory.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/EmojiEditableFactory.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/EmojiEditableFactory.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiExtractEditText.java b/emoji/core/src/main/java/android/support/text/emoji/widget/EmojiExtractEditText.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/EmojiExtractEditText.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/EmojiExtractEditText.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiExtractTextLayout.java b/emoji/core/src/main/java/android/support/text/emoji/widget/EmojiExtractTextLayout.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/EmojiExtractTextLayout.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/EmojiExtractTextLayout.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiInputConnection.java b/emoji/core/src/main/java/android/support/text/emoji/widget/EmojiInputConnection.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/EmojiInputConnection.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/EmojiInputConnection.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiInputFilter.java b/emoji/core/src/main/java/android/support/text/emoji/widget/EmojiInputFilter.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/EmojiInputFilter.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/EmojiInputFilter.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiKeyListener.java b/emoji/core/src/main/java/android/support/text/emoji/widget/EmojiKeyListener.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/EmojiKeyListener.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/EmojiKeyListener.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiTextView.java b/emoji/core/src/main/java/android/support/text/emoji/widget/EmojiTextView.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/EmojiTextView.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/EmojiTextView.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiTextViewHelper.java b/emoji/core/src/main/java/android/support/text/emoji/widget/EmojiTextViewHelper.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/EmojiTextViewHelper.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/EmojiTextViewHelper.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiTextWatcher.java b/emoji/core/src/main/java/android/support/text/emoji/widget/EmojiTextWatcher.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/EmojiTextWatcher.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/EmojiTextWatcher.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/EmojiTransformationMethod.java b/emoji/core/src/main/java/android/support/text/emoji/widget/EmojiTransformationMethod.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/EmojiTransformationMethod.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/EmojiTransformationMethod.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/ExtractButtonCompat.java b/emoji/core/src/main/java/android/support/text/emoji/widget/ExtractButtonCompat.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/ExtractButtonCompat.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/ExtractButtonCompat.java
diff --git a/emoji/core/src/android/support/text/emoji/widget/SpannableBuilder.java b/emoji/core/src/main/java/android/support/text/emoji/widget/SpannableBuilder.java
similarity index 100%
rename from emoji/core/src/android/support/text/emoji/widget/SpannableBuilder.java
rename to emoji/core/src/main/java/android/support/text/emoji/widget/SpannableBuilder.java
diff --git a/emoji/core/res-public/values/public_attrs.xml b/emoji/core/src/main/res-public/values/public_attrs.xml
similarity index 100%
rename from emoji/core/res-public/values/public_attrs.xml
rename to emoji/core/src/main/res-public/values/public_attrs.xml
diff --git a/emoji/core/res/layout/input_method_extract_view.xml b/emoji/core/src/main/res/layout/input_method_extract_view.xml
similarity index 100%
rename from emoji/core/res/layout/input_method_extract_view.xml
rename to emoji/core/src/main/res/layout/input_method_extract_view.xml
diff --git a/emoji/core/res/values/attrs.xml b/emoji/core/src/main/res/values/attrs.xml
similarity index 100%
rename from emoji/core/res/values/attrs.xml
rename to emoji/core/src/main/res/values/attrs.xml
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperPre19Test.java b/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperPre19Test.java
index d2bd722..0756fa2 100644
--- a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperPre19Test.java
+++ b/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperPre19Test.java
@@ -16,6 +16,7 @@
 
 package android.support.text.emoji.widget;
 
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
@@ -28,6 +29,7 @@
 import android.support.test.runner.AndroidJUnit4;
 import android.text.TextWatcher;
 import android.text.method.KeyListener;
+import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputConnection;
 import android.widget.EditText;
 
@@ -61,12 +63,28 @@
     public void testGetOnCreateInputConnection_returnsSameInputConnection() {
         final InputConnection param = mock(InputConnection.class);
         final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(param,
+                new EditorInfo());
+
+        assertSame(param, inputConnection);
+    }
+
+    @Test
+    public void testGetOnCreateInputConnection_withNullAttrs_returnsSameInputConnection() {
+        final InputConnection param = mock(InputConnection.class);
+        final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(param,
                 null);
 
         assertSame(param, inputConnection);
     }
 
     @Test
+    public void testGetOnCreateInputConnection_withNullInputConnection_returnsNull() {
+        final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(null,
+                new EditorInfo());
+        assertNull(inputConnection);
+    }
+
+    @Test
     public void testDoesNotAttachTextWatcher() {
         final EditText editText = mock(EditText.class);
 
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java b/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java
index efc7ca0..626bca1 100644
--- a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java
+++ b/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java
@@ -16,8 +16,11 @@
 
 package android.support.text.emoji.widget;
 
+import static junit.framework.Assert.assertNotNull;
+
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.mock;
@@ -32,6 +35,7 @@
 import android.support.text.emoji.EmojiCompat;
 import android.text.TextWatcher;
 import android.text.method.KeyListener;
+import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputConnection;
 import android.widget.EditText;
 
@@ -76,16 +80,26 @@
         assertSame(keyListener1, keyListener2);
     }
 
-    @Test(expected = NullPointerException.class)
-    public void testGetOnCreateInputConnection_withNull_throwsException() {
-        mEmojiEditTextHelper.onCreateInputConnection(null, null);
+    @Test
+    public void testGetOnCreateInputConnection_withNullAttrs_returnsInputConnection() {
+        final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(
+                mock(InputConnection.class), null);
+        assertNotNull(inputConnection);
+        assertThat(inputConnection, instanceOf(EmojiInputConnection.class));
+    }
+
+    @Test
+    public void testGetOnCreateInputConnection_withNullInputConnection_returnsNull() {
+        InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(null,
+                new EditorInfo());
+        assertNull(inputConnection);
     }
 
     @Test
     public void testGetOnCreateInputConnection_returnsEmojiInputConnection() {
         final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(
                 mock(InputConnection.class), null);
-
+        assertNotNull(inputConnection);
         assertThat(inputConnection, instanceOf(EmojiInputConnection.class));
     }
 
diff --git a/exifinterface/Android.mk b/exifinterface/Android.mk
index 9da8bc5..4e5bdc0 100644
--- a/exifinterface/Android.mk
+++ b/exifinterface/Android.mk
@@ -23,7 +23,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-exifinterface
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-annotations
diff --git a/exifinterface/AndroidManifest.xml b/exifinterface/AndroidManifest.xml
index 8c449f7..db7cabb 100644
--- a/exifinterface/AndroidManifest.xml
+++ b/exifinterface/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.exifinterface">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.exifinterface.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/exifinterface/OWNERS b/exifinterface/OWNERS
new file mode 100644
index 0000000..03f7167
--- /dev/null
+++ b/exifinterface/OWNERS
@@ -0,0 +1,3 @@
+hdmoon@google.com
+jinpark@google.com
+sungsoo@google.com
\ No newline at end of file
diff --git a/exifinterface/api/26.1.0.txt b/exifinterface/api/26.1.0.txt
new file mode 100644
index 0000000..916a769
--- /dev/null
+++ b/exifinterface/api/26.1.0.txt
@@ -0,0 +1,175 @@
+package android.support.media {
+
+  public class ExifInterface {
+    ctor public ExifInterface(java.lang.String) throws java.io.IOException;
+    ctor public ExifInterface(java.io.InputStream) throws java.io.IOException;
+    method public void flipHorizontally();
+    method public void flipVertically();
+    method public double getAltitude(double);
+    method public java.lang.String getAttribute(java.lang.String);
+    method public double getAttributeDouble(java.lang.String, double);
+    method public int getAttributeInt(java.lang.String, int);
+    method public deprecated boolean getLatLong(float[]);
+    method public double[] getLatLong();
+    method public byte[] getThumbnail();
+    method public android.graphics.Bitmap getThumbnailBitmap();
+    method public byte[] getThumbnailBytes();
+    method public long[] getThumbnailRange();
+    method public boolean hasThumbnail();
+    method public boolean isThumbnailCompressed();
+    method public void resetOrientation();
+    method public void rotate(int);
+    method public void saveAttributes() throws java.io.IOException;
+    method public void setAltitude(double);
+    method public void setAttribute(java.lang.String, java.lang.String);
+    method public void setGpsInfo(android.location.Location);
+    method public void setLatLong(double, double);
+    field public static final int ORIENTATION_FLIP_HORIZONTAL = 2; // 0x2
+    field public static final int ORIENTATION_FLIP_VERTICAL = 4; // 0x4
+    field public static final int ORIENTATION_NORMAL = 1; // 0x1
+    field public static final int ORIENTATION_ROTATE_180 = 3; // 0x3
+    field public static final int ORIENTATION_ROTATE_270 = 8; // 0x8
+    field public static final int ORIENTATION_ROTATE_90 = 6; // 0x6
+    field public static final int ORIENTATION_TRANSPOSE = 5; // 0x5
+    field public static final int ORIENTATION_TRANSVERSE = 7; // 0x7
+    field public static final int ORIENTATION_UNDEFINED = 0; // 0x0
+    field public static final java.lang.String TAG_APERTURE_VALUE = "ApertureValue";
+    field public static final java.lang.String TAG_ARTIST = "Artist";
+    field public static final java.lang.String TAG_BITS_PER_SAMPLE = "BitsPerSample";
+    field public static final java.lang.String TAG_BRIGHTNESS_VALUE = "BrightnessValue";
+    field public static final java.lang.String TAG_CFA_PATTERN = "CFAPattern";
+    field public static final java.lang.String TAG_COLOR_SPACE = "ColorSpace";
+    field public static final java.lang.String TAG_COMPONENTS_CONFIGURATION = "ComponentsConfiguration";
+    field public static final java.lang.String TAG_COMPRESSED_BITS_PER_PIXEL = "CompressedBitsPerPixel";
+    field public static final java.lang.String TAG_COMPRESSION = "Compression";
+    field public static final java.lang.String TAG_CONTRAST = "Contrast";
+    field public static final java.lang.String TAG_COPYRIGHT = "Copyright";
+    field public static final java.lang.String TAG_CUSTOM_RENDERED = "CustomRendered";
+    field public static final java.lang.String TAG_DATETIME = "DateTime";
+    field public static final java.lang.String TAG_DATETIME_DIGITIZED = "DateTimeDigitized";
+    field public static final java.lang.String TAG_DATETIME_ORIGINAL = "DateTimeOriginal";
+    field public static final java.lang.String TAG_DEFAULT_CROP_SIZE = "DefaultCropSize";
+    field public static final java.lang.String TAG_DEVICE_SETTING_DESCRIPTION = "DeviceSettingDescription";
+    field public static final java.lang.String TAG_DIGITAL_ZOOM_RATIO = "DigitalZoomRatio";
+    field public static final java.lang.String TAG_DNG_VERSION = "DNGVersion";
+    field public static final java.lang.String TAG_EXIF_VERSION = "ExifVersion";
+    field public static final java.lang.String TAG_EXPOSURE_BIAS_VALUE = "ExposureBiasValue";
+    field public static final java.lang.String TAG_EXPOSURE_INDEX = "ExposureIndex";
+    field public static final java.lang.String TAG_EXPOSURE_MODE = "ExposureMode";
+    field public static final java.lang.String TAG_EXPOSURE_PROGRAM = "ExposureProgram";
+    field public static final java.lang.String TAG_EXPOSURE_TIME = "ExposureTime";
+    field public static final java.lang.String TAG_FILE_SOURCE = "FileSource";
+    field public static final java.lang.String TAG_FLASH = "Flash";
+    field public static final java.lang.String TAG_FLASHPIX_VERSION = "FlashpixVersion";
+    field public static final java.lang.String TAG_FLASH_ENERGY = "FlashEnergy";
+    field public static final java.lang.String TAG_FOCAL_LENGTH = "FocalLength";
+    field public static final java.lang.String TAG_FOCAL_LENGTH_IN_35MM_FILM = "FocalLengthIn35mmFilm";
+    field public static final java.lang.String TAG_FOCAL_PLANE_RESOLUTION_UNIT = "FocalPlaneResolutionUnit";
+    field public static final java.lang.String TAG_FOCAL_PLANE_X_RESOLUTION = "FocalPlaneXResolution";
+    field public static final java.lang.String TAG_FOCAL_PLANE_Y_RESOLUTION = "FocalPlaneYResolution";
+    field public static final java.lang.String TAG_F_NUMBER = "FNumber";
+    field public static final java.lang.String TAG_GAIN_CONTROL = "GainControl";
+    field public static final java.lang.String TAG_GPS_ALTITUDE = "GPSAltitude";
+    field public static final java.lang.String TAG_GPS_ALTITUDE_REF = "GPSAltitudeRef";
+    field public static final java.lang.String TAG_GPS_AREA_INFORMATION = "GPSAreaInformation";
+    field public static final java.lang.String TAG_GPS_DATESTAMP = "GPSDateStamp";
+    field public static final java.lang.String TAG_GPS_DEST_BEARING = "GPSDestBearing";
+    field public static final java.lang.String TAG_GPS_DEST_BEARING_REF = "GPSDestBearingRef";
+    field public static final java.lang.String TAG_GPS_DEST_DISTANCE = "GPSDestDistance";
+    field public static final java.lang.String TAG_GPS_DEST_DISTANCE_REF = "GPSDestDistanceRef";
+    field public static final java.lang.String TAG_GPS_DEST_LATITUDE = "GPSDestLatitude";
+    field public static final java.lang.String TAG_GPS_DEST_LATITUDE_REF = "GPSDestLatitudeRef";
+    field public static final java.lang.String TAG_GPS_DEST_LONGITUDE = "GPSDestLongitude";
+    field public static final java.lang.String TAG_GPS_DEST_LONGITUDE_REF = "GPSDestLongitudeRef";
+    field public static final java.lang.String TAG_GPS_DIFFERENTIAL = "GPSDifferential";
+    field public static final java.lang.String TAG_GPS_DOP = "GPSDOP";
+    field public static final java.lang.String TAG_GPS_IMG_DIRECTION = "GPSImgDirection";
+    field public static final java.lang.String TAG_GPS_IMG_DIRECTION_REF = "GPSImgDirectionRef";
+    field public static final java.lang.String TAG_GPS_LATITUDE = "GPSLatitude";
+    field public static final java.lang.String TAG_GPS_LATITUDE_REF = "GPSLatitudeRef";
+    field public static final java.lang.String TAG_GPS_LONGITUDE = "GPSLongitude";
+    field public static final java.lang.String TAG_GPS_LONGITUDE_REF = "GPSLongitudeRef";
+    field public static final java.lang.String TAG_GPS_MAP_DATUM = "GPSMapDatum";
+    field public static final java.lang.String TAG_GPS_MEASURE_MODE = "GPSMeasureMode";
+    field public static final java.lang.String TAG_GPS_PROCESSING_METHOD = "GPSProcessingMethod";
+    field public static final java.lang.String TAG_GPS_SATELLITES = "GPSSatellites";
+    field public static final java.lang.String TAG_GPS_SPEED = "GPSSpeed";
+    field public static final java.lang.String TAG_GPS_SPEED_REF = "GPSSpeedRef";
+    field public static final java.lang.String TAG_GPS_STATUS = "GPSStatus";
+    field public static final java.lang.String TAG_GPS_TIMESTAMP = "GPSTimeStamp";
+    field public static final java.lang.String TAG_GPS_TRACK = "GPSTrack";
+    field public static final java.lang.String TAG_GPS_TRACK_REF = "GPSTrackRef";
+    field public static final java.lang.String TAG_GPS_VERSION_ID = "GPSVersionID";
+    field public static final java.lang.String TAG_IMAGE_DESCRIPTION = "ImageDescription";
+    field public static final java.lang.String TAG_IMAGE_LENGTH = "ImageLength";
+    field public static final java.lang.String TAG_IMAGE_UNIQUE_ID = "ImageUniqueID";
+    field public static final java.lang.String TAG_IMAGE_WIDTH = "ImageWidth";
+    field public static final java.lang.String TAG_INTEROPERABILITY_INDEX = "InteroperabilityIndex";
+    field public static final java.lang.String TAG_ISO_SPEED_RATINGS = "ISOSpeedRatings";
+    field public static final java.lang.String TAG_JPEG_INTERCHANGE_FORMAT = "JPEGInterchangeFormat";
+    field public static final java.lang.String TAG_JPEG_INTERCHANGE_FORMAT_LENGTH = "JPEGInterchangeFormatLength";
+    field public static final java.lang.String TAG_LIGHT_SOURCE = "LightSource";
+    field public static final java.lang.String TAG_MAKE = "Make";
+    field public static final java.lang.String TAG_MAKER_NOTE = "MakerNote";
+    field public static final java.lang.String TAG_MAX_APERTURE_VALUE = "MaxApertureValue";
+    field public static final java.lang.String TAG_METERING_MODE = "MeteringMode";
+    field public static final java.lang.String TAG_MODEL = "Model";
+    field public static final java.lang.String TAG_NEW_SUBFILE_TYPE = "NewSubfileType";
+    field public static final java.lang.String TAG_OECF = "OECF";
+    field public static final java.lang.String TAG_ORF_ASPECT_FRAME = "AspectFrame";
+    field public static final java.lang.String TAG_ORF_PREVIEW_IMAGE_LENGTH = "PreviewImageLength";
+    field public static final java.lang.String TAG_ORF_PREVIEW_IMAGE_START = "PreviewImageStart";
+    field public static final java.lang.String TAG_ORF_THUMBNAIL_IMAGE = "ThumbnailImage";
+    field public static final java.lang.String TAG_ORIENTATION = "Orientation";
+    field public static final java.lang.String TAG_PHOTOMETRIC_INTERPRETATION = "PhotometricInterpretation";
+    field public static final java.lang.String TAG_PIXEL_X_DIMENSION = "PixelXDimension";
+    field public static final java.lang.String TAG_PIXEL_Y_DIMENSION = "PixelYDimension";
+    field public static final java.lang.String TAG_PLANAR_CONFIGURATION = "PlanarConfiguration";
+    field public static final java.lang.String TAG_PRIMARY_CHROMATICITIES = "PrimaryChromaticities";
+    field public static final java.lang.String TAG_REFERENCE_BLACK_WHITE = "ReferenceBlackWhite";
+    field public static final java.lang.String TAG_RELATED_SOUND_FILE = "RelatedSoundFile";
+    field public static final java.lang.String TAG_RESOLUTION_UNIT = "ResolutionUnit";
+    field public static final java.lang.String TAG_ROWS_PER_STRIP = "RowsPerStrip";
+    field public static final java.lang.String TAG_RW2_ISO = "ISO";
+    field public static final java.lang.String TAG_RW2_JPG_FROM_RAW = "JpgFromRaw";
+    field public static final java.lang.String TAG_RW2_SENSOR_BOTTOM_BORDER = "SensorBottomBorder";
+    field public static final java.lang.String TAG_RW2_SENSOR_LEFT_BORDER = "SensorLeftBorder";
+    field public static final java.lang.String TAG_RW2_SENSOR_RIGHT_BORDER = "SensorRightBorder";
+    field public static final java.lang.String TAG_RW2_SENSOR_TOP_BORDER = "SensorTopBorder";
+    field public static final java.lang.String TAG_SAMPLES_PER_PIXEL = "SamplesPerPixel";
+    field public static final java.lang.String TAG_SATURATION = "Saturation";
+    field public static final java.lang.String TAG_SCENE_CAPTURE_TYPE = "SceneCaptureType";
+    field public static final java.lang.String TAG_SCENE_TYPE = "SceneType";
+    field public static final java.lang.String TAG_SENSING_METHOD = "SensingMethod";
+    field public static final java.lang.String TAG_SHARPNESS = "Sharpness";
+    field public static final java.lang.String TAG_SHUTTER_SPEED_VALUE = "ShutterSpeedValue";
+    field public static final java.lang.String TAG_SOFTWARE = "Software";
+    field public static final java.lang.String TAG_SPATIAL_FREQUENCY_RESPONSE = "SpatialFrequencyResponse";
+    field public static final java.lang.String TAG_SPECTRAL_SENSITIVITY = "SpectralSensitivity";
+    field public static final java.lang.String TAG_STRIP_BYTE_COUNTS = "StripByteCounts";
+    field public static final java.lang.String TAG_STRIP_OFFSETS = "StripOffsets";
+    field public static final java.lang.String TAG_SUBFILE_TYPE = "SubfileType";
+    field public static final java.lang.String TAG_SUBJECT_AREA = "SubjectArea";
+    field public static final java.lang.String TAG_SUBJECT_DISTANCE = "SubjectDistance";
+    field public static final java.lang.String TAG_SUBJECT_DISTANCE_RANGE = "SubjectDistanceRange";
+    field public static final java.lang.String TAG_SUBJECT_LOCATION = "SubjectLocation";
+    field public static final java.lang.String TAG_SUBSEC_TIME = "SubSecTime";
+    field public static final java.lang.String TAG_SUBSEC_TIME_DIGITIZED = "SubSecTimeDigitized";
+    field public static final java.lang.String TAG_SUBSEC_TIME_ORIGINAL = "SubSecTimeOriginal";
+    field public static final java.lang.String TAG_THUMBNAIL_IMAGE_LENGTH = "ThumbnailImageLength";
+    field public static final java.lang.String TAG_THUMBNAIL_IMAGE_WIDTH = "ThumbnailImageWidth";
+    field public static final java.lang.String TAG_TRANSFER_FUNCTION = "TransferFunction";
+    field public static final java.lang.String TAG_USER_COMMENT = "UserComment";
+    field public static final java.lang.String TAG_WHITE_BALANCE = "WhiteBalance";
+    field public static final java.lang.String TAG_WHITE_POINT = "WhitePoint";
+    field public static final java.lang.String TAG_X_RESOLUTION = "XResolution";
+    field public static final java.lang.String TAG_Y_CB_CR_COEFFICIENTS = "YCbCrCoefficients";
+    field public static final java.lang.String TAG_Y_CB_CR_POSITIONING = "YCbCrPositioning";
+    field public static final java.lang.String TAG_Y_CB_CR_SUB_SAMPLING = "YCbCrSubSampling";
+    field public static final java.lang.String TAG_Y_RESOLUTION = "YResolution";
+    field public static final int WHITEBALANCE_AUTO = 0; // 0x0
+    field public static final int WHITEBALANCE_MANUAL = 1; // 0x1
+  }
+
+}
+
diff --git a/exifinterface/api/27.0.0.txt b/exifinterface/api/27.0.0.txt
new file mode 100644
index 0000000..8533011
--- /dev/null
+++ b/exifinterface/api/27.0.0.txt
@@ -0,0 +1,332 @@
+package android.support.media {
+
+  public class ExifInterface {
+    ctor public ExifInterface(java.lang.String) throws java.io.IOException;
+    ctor public ExifInterface(java.io.InputStream) throws java.io.IOException;
+    method public void flipHorizontally();
+    method public void flipVertically();
+    method public double getAltitude(double);
+    method public java.lang.String getAttribute(java.lang.String);
+    method public double getAttributeDouble(java.lang.String, double);
+    method public int getAttributeInt(java.lang.String, int);
+    method public deprecated boolean getLatLong(float[]);
+    method public double[] getLatLong();
+    method public int getRotationDegrees();
+    method public byte[] getThumbnail();
+    method public android.graphics.Bitmap getThumbnailBitmap();
+    method public byte[] getThumbnailBytes();
+    method public long[] getThumbnailRange();
+    method public boolean hasThumbnail();
+    method public boolean isFlipped();
+    method public boolean isThumbnailCompressed();
+    method public void resetOrientation();
+    method public void rotate(int);
+    method public void saveAttributes() throws java.io.IOException;
+    method public void setAltitude(double);
+    method public void setAttribute(java.lang.String, java.lang.String);
+    method public void setGpsInfo(android.location.Location);
+    method public void setLatLong(double, double);
+    field public static final short ALTITUDE_ABOVE_SEA_LEVEL = 0; // 0x0
+    field public static final short ALTITUDE_BELOW_SEA_LEVEL = 1; // 0x1
+    field public static final int[] BITS_PER_SAMPLE_GREYSCALE_1;
+    field public static final int[] BITS_PER_SAMPLE_GREYSCALE_2;
+    field public static final int[] BITS_PER_SAMPLE_RGB;
+    field public static final int COLOR_SPACE_S_RGB = 1; // 0x1
+    field public static final int COLOR_SPACE_UNCALIBRATED = 65535; // 0xffff
+    field public static final short CONTRAST_HARD = 2; // 0x2
+    field public static final short CONTRAST_NORMAL = 0; // 0x0
+    field public static final short CONTRAST_SOFT = 1; // 0x1
+    field public static final int DATA_DEFLATE_ZIP = 8; // 0x8
+    field public static final int DATA_HUFFMAN_COMPRESSED = 2; // 0x2
+    field public static final int DATA_JPEG = 6; // 0x6
+    field public static final int DATA_JPEG_COMPRESSED = 7; // 0x7
+    field public static final int DATA_LOSSY_JPEG = 34892; // 0x884c
+    field public static final int DATA_PACK_BITS_COMPRESSED = 32773; // 0x8005
+    field public static final int DATA_UNCOMPRESSED = 1; // 0x1
+    field public static final short EXPOSURE_MODE_AUTO = 0; // 0x0
+    field public static final short EXPOSURE_MODE_AUTO_BRACKET = 2; // 0x2
+    field public static final short EXPOSURE_MODE_MANUAL = 1; // 0x1
+    field public static final short EXPOSURE_PROGRAM_ACTION = 6; // 0x6
+    field public static final short EXPOSURE_PROGRAM_APERTURE_PRIORITY = 3; // 0x3
+    field public static final short EXPOSURE_PROGRAM_CREATIVE = 5; // 0x5
+    field public static final short EXPOSURE_PROGRAM_LANDSCAPE_MODE = 8; // 0x8
+    field public static final short EXPOSURE_PROGRAM_MANUAL = 1; // 0x1
+    field public static final short EXPOSURE_PROGRAM_NORMAL = 2; // 0x2
+    field public static final short EXPOSURE_PROGRAM_NOT_DEFINED = 0; // 0x0
+    field public static final short EXPOSURE_PROGRAM_PORTRAIT_MODE = 7; // 0x7
+    field public static final short EXPOSURE_PROGRAM_SHUTTER_PRIORITY = 4; // 0x4
+    field public static final short FILE_SOURCE_DSC = 3; // 0x3
+    field public static final short FILE_SOURCE_OTHER = 0; // 0x0
+    field public static final short FILE_SOURCE_REFLEX_SCANNER = 2; // 0x2
+    field public static final short FILE_SOURCE_TRANSPARENT_SCANNER = 1; // 0x1
+    field public static final short FLAG_FLASH_FIRED = 1; // 0x1
+    field public static final short FLAG_FLASH_MODE_AUTO = 24; // 0x18
+    field public static final short FLAG_FLASH_MODE_COMPULSORY_FIRING = 8; // 0x8
+    field public static final short FLAG_FLASH_MODE_COMPULSORY_SUPPRESSION = 16; // 0x10
+    field public static final short FLAG_FLASH_NO_FLASH_FUNCTION = 32; // 0x20
+    field public static final short FLAG_FLASH_RED_EYE_SUPPORTED = 64; // 0x40
+    field public static final short FLAG_FLASH_RETURN_LIGHT_DETECTED = 6; // 0x6
+    field public static final short FLAG_FLASH_RETURN_LIGHT_NOT_DETECTED = 4; // 0x4
+    field public static final short FORMAT_CHUNKY = 1; // 0x1
+    field public static final short FORMAT_PLANAR = 2; // 0x2
+    field public static final short GAIN_CONTROL_HIGH_GAIN_DOWN = 4; // 0x4
+    field public static final short GAIN_CONTROL_HIGH_GAIN_UP = 2; // 0x2
+    field public static final short GAIN_CONTROL_LOW_GAIN_DOWN = 3; // 0x3
+    field public static final short GAIN_CONTROL_LOW_GAIN_UP = 1; // 0x1
+    field public static final short GAIN_CONTROL_NONE = 0; // 0x0
+    field public static final java.lang.String GPS_DIRECTION_MAGNETIC = "M";
+    field public static final java.lang.String GPS_DIRECTION_TRUE = "T";
+    field public static final java.lang.String GPS_DISTANCE_KILOMETERS = "K";
+    field public static final java.lang.String GPS_DISTANCE_MILES = "M";
+    field public static final java.lang.String GPS_DISTANCE_NAUTICAL_MILES = "N";
+    field public static final java.lang.String GPS_MEASUREMENT_2D = "2";
+    field public static final java.lang.String GPS_MEASUREMENT_3D = "3";
+    field public static final short GPS_MEASUREMENT_DIFFERENTIAL_CORRECTED = 1; // 0x1
+    field public static final java.lang.String GPS_MEASUREMENT_INTERRUPTED = "V";
+    field public static final java.lang.String GPS_MEASUREMENT_IN_PROGRESS = "A";
+    field public static final short GPS_MEASUREMENT_NO_DIFFERENTIAL = 0; // 0x0
+    field public static final java.lang.String GPS_SPEED_KILOMETERS_PER_HOUR = "K";
+    field public static final java.lang.String GPS_SPEED_KNOTS = "N";
+    field public static final java.lang.String GPS_SPEED_MILES_PER_HOUR = "M";
+    field public static final java.lang.String LATITUDE_NORTH = "N";
+    field public static final java.lang.String LATITUDE_SOUTH = "S";
+    field public static final short LIGHT_SOURCE_CLOUDY_WEATHER = 10; // 0xa
+    field public static final short LIGHT_SOURCE_COOL_WHITE_FLUORESCENT = 14; // 0xe
+    field public static final short LIGHT_SOURCE_D50 = 23; // 0x17
+    field public static final short LIGHT_SOURCE_D55 = 20; // 0x14
+    field public static final short LIGHT_SOURCE_D65 = 21; // 0x15
+    field public static final short LIGHT_SOURCE_D75 = 22; // 0x16
+    field public static final short LIGHT_SOURCE_DAYLIGHT = 1; // 0x1
+    field public static final short LIGHT_SOURCE_DAYLIGHT_FLUORESCENT = 12; // 0xc
+    field public static final short LIGHT_SOURCE_DAY_WHITE_FLUORESCENT = 13; // 0xd
+    field public static final short LIGHT_SOURCE_FINE_WEATHER = 9; // 0x9
+    field public static final short LIGHT_SOURCE_FLASH = 4; // 0x4
+    field public static final short LIGHT_SOURCE_FLUORESCENT = 2; // 0x2
+    field public static final short LIGHT_SOURCE_ISO_STUDIO_TUNGSTEN = 24; // 0x18
+    field public static final short LIGHT_SOURCE_OTHER = 255; // 0xff
+    field public static final short LIGHT_SOURCE_SHADE = 11; // 0xb
+    field public static final short LIGHT_SOURCE_STANDARD_LIGHT_A = 17; // 0x11
+    field public static final short LIGHT_SOURCE_STANDARD_LIGHT_B = 18; // 0x12
+    field public static final short LIGHT_SOURCE_STANDARD_LIGHT_C = 19; // 0x13
+    field public static final short LIGHT_SOURCE_TUNGSTEN = 3; // 0x3
+    field public static final short LIGHT_SOURCE_UNKNOWN = 0; // 0x0
+    field public static final short LIGHT_SOURCE_WARM_WHITE_FLUORESCENT = 16; // 0x10
+    field public static final short LIGHT_SOURCE_WHITE_FLUORESCENT = 15; // 0xf
+    field public static final java.lang.String LONGITUDE_EAST = "E";
+    field public static final java.lang.String LONGITUDE_WEST = "W";
+    field public static final short METERING_MODE_AVERAGE = 1; // 0x1
+    field public static final short METERING_MODE_CENTER_WEIGHT_AVERAGE = 2; // 0x2
+    field public static final short METERING_MODE_MULTI_SPOT = 4; // 0x4
+    field public static final short METERING_MODE_OTHER = 255; // 0xff
+    field public static final short METERING_MODE_PARTIAL = 6; // 0x6
+    field public static final short METERING_MODE_PATTERN = 5; // 0x5
+    field public static final short METERING_MODE_SPOT = 3; // 0x3
+    field public static final short METERING_MODE_UNKNOWN = 0; // 0x0
+    field public static final int ORIENTATION_FLIP_HORIZONTAL = 2; // 0x2
+    field public static final int ORIENTATION_FLIP_VERTICAL = 4; // 0x4
+    field public static final int ORIENTATION_NORMAL = 1; // 0x1
+    field public static final int ORIENTATION_ROTATE_180 = 3; // 0x3
+    field public static final int ORIENTATION_ROTATE_270 = 8; // 0x8
+    field public static final int ORIENTATION_ROTATE_90 = 6; // 0x6
+    field public static final int ORIENTATION_TRANSPOSE = 5; // 0x5
+    field public static final int ORIENTATION_TRANSVERSE = 7; // 0x7
+    field public static final int ORIENTATION_UNDEFINED = 0; // 0x0
+    field public static final int ORIGINAL_RESOLUTION_IMAGE = 0; // 0x0
+    field public static final int PHOTOMETRIC_INTERPRETATION_BLACK_IS_ZERO = 1; // 0x1
+    field public static final int PHOTOMETRIC_INTERPRETATION_RGB = 2; // 0x2
+    field public static final int PHOTOMETRIC_INTERPRETATION_WHITE_IS_ZERO = 0; // 0x0
+    field public static final int PHOTOMETRIC_INTERPRETATION_YCBCR = 6; // 0x6
+    field public static final int REDUCED_RESOLUTION_IMAGE = 1; // 0x1
+    field public static final short RENDERED_PROCESS_CUSTOM = 1; // 0x1
+    field public static final short RENDERED_PROCESS_NORMAL = 0; // 0x0
+    field public static final short RESOLUTION_UNIT_CENTIMETERS = 3; // 0x3
+    field public static final short RESOLUTION_UNIT_INCHES = 2; // 0x2
+    field public static final short SATURATION_HIGH = 0; // 0x0
+    field public static final short SATURATION_LOW = 0; // 0x0
+    field public static final short SATURATION_NORMAL = 0; // 0x0
+    field public static final short SCENE_CAPTURE_TYPE_LANDSCAPE = 1; // 0x1
+    field public static final short SCENE_CAPTURE_TYPE_NIGHT = 3; // 0x3
+    field public static final short SCENE_CAPTURE_TYPE_PORTRAIT = 2; // 0x2
+    field public static final short SCENE_CAPTURE_TYPE_STANDARD = 0; // 0x0
+    field public static final short SCENE_TYPE_DIRECTLY_PHOTOGRAPHED = 1; // 0x1
+    field public static final short SENSITIVITY_TYPE_ISO_SPEED = 3; // 0x3
+    field public static final short SENSITIVITY_TYPE_REI = 2; // 0x2
+    field public static final short SENSITIVITY_TYPE_REI_AND_ISO = 6; // 0x6
+    field public static final short SENSITIVITY_TYPE_SOS = 1; // 0x1
+    field public static final short SENSITIVITY_TYPE_SOS_AND_ISO = 5; // 0x5
+    field public static final short SENSITIVITY_TYPE_SOS_AND_REI = 4; // 0x4
+    field public static final short SENSITIVITY_TYPE_SOS_AND_REI_AND_ISO = 7; // 0x7
+    field public static final short SENSITIVITY_TYPE_UNKNOWN = 0; // 0x0
+    field public static final short SENSOR_TYPE_COLOR_SEQUENTIAL = 5; // 0x5
+    field public static final short SENSOR_TYPE_COLOR_SEQUENTIAL_LINEAR = 8; // 0x8
+    field public static final short SENSOR_TYPE_NOT_DEFINED = 1; // 0x1
+    field public static final short SENSOR_TYPE_ONE_CHIP = 2; // 0x2
+    field public static final short SENSOR_TYPE_THREE_CHIP = 4; // 0x4
+    field public static final short SENSOR_TYPE_TRILINEAR = 7; // 0x7
+    field public static final short SENSOR_TYPE_TWO_CHIP = 3; // 0x3
+    field public static final short SHARPNESS_HARD = 2; // 0x2
+    field public static final short SHARPNESS_NORMAL = 0; // 0x0
+    field public static final short SHARPNESS_SOFT = 1; // 0x1
+    field public static final short SUBJECT_DISTANCE_RANGE_CLOSE_VIEW = 2; // 0x2
+    field public static final short SUBJECT_DISTANCE_RANGE_DISTANT_VIEW = 3; // 0x3
+    field public static final short SUBJECT_DISTANCE_RANGE_MACRO = 1; // 0x1
+    field public static final short SUBJECT_DISTANCE_RANGE_UNKNOWN = 0; // 0x0
+    field public static final java.lang.String TAG_APERTURE_VALUE = "ApertureValue";
+    field public static final java.lang.String TAG_ARTIST = "Artist";
+    field public static final java.lang.String TAG_BITS_PER_SAMPLE = "BitsPerSample";
+    field public static final java.lang.String TAG_BODY_SERIAL_NUMBER = "BodySerialNumber";
+    field public static final java.lang.String TAG_BRIGHTNESS_VALUE = "BrightnessValue";
+    field public static final java.lang.String TAG_CAMARA_OWNER_NAME = "CameraOwnerName";
+    field public static final java.lang.String TAG_CFA_PATTERN = "CFAPattern";
+    field public static final java.lang.String TAG_COLOR_SPACE = "ColorSpace";
+    field public static final java.lang.String TAG_COMPONENTS_CONFIGURATION = "ComponentsConfiguration";
+    field public static final java.lang.String TAG_COMPRESSED_BITS_PER_PIXEL = "CompressedBitsPerPixel";
+    field public static final java.lang.String TAG_COMPRESSION = "Compression";
+    field public static final java.lang.String TAG_CONTRAST = "Contrast";
+    field public static final java.lang.String TAG_COPYRIGHT = "Copyright";
+    field public static final java.lang.String TAG_CUSTOM_RENDERED = "CustomRendered";
+    field public static final java.lang.String TAG_DATETIME = "DateTime";
+    field public static final java.lang.String TAG_DATETIME_DIGITIZED = "DateTimeDigitized";
+    field public static final java.lang.String TAG_DATETIME_ORIGINAL = "DateTimeOriginal";
+    field public static final java.lang.String TAG_DEFAULT_CROP_SIZE = "DefaultCropSize";
+    field public static final java.lang.String TAG_DEVICE_SETTING_DESCRIPTION = "DeviceSettingDescription";
+    field public static final java.lang.String TAG_DIGITAL_ZOOM_RATIO = "DigitalZoomRatio";
+    field public static final java.lang.String TAG_DNG_VERSION = "DNGVersion";
+    field public static final java.lang.String TAG_EXIF_VERSION = "ExifVersion";
+    field public static final java.lang.String TAG_EXPOSURE_BIAS_VALUE = "ExposureBiasValue";
+    field public static final java.lang.String TAG_EXPOSURE_INDEX = "ExposureIndex";
+    field public static final java.lang.String TAG_EXPOSURE_MODE = "ExposureMode";
+    field public static final java.lang.String TAG_EXPOSURE_PROGRAM = "ExposureProgram";
+    field public static final java.lang.String TAG_EXPOSURE_TIME = "ExposureTime";
+    field public static final java.lang.String TAG_FILE_SOURCE = "FileSource";
+    field public static final java.lang.String TAG_FLASH = "Flash";
+    field public static final java.lang.String TAG_FLASHPIX_VERSION = "FlashpixVersion";
+    field public static final java.lang.String TAG_FLASH_ENERGY = "FlashEnergy";
+    field public static final java.lang.String TAG_FOCAL_LENGTH = "FocalLength";
+    field public static final java.lang.String TAG_FOCAL_LENGTH_IN_35MM_FILM = "FocalLengthIn35mmFilm";
+    field public static final java.lang.String TAG_FOCAL_PLANE_RESOLUTION_UNIT = "FocalPlaneResolutionUnit";
+    field public static final java.lang.String TAG_FOCAL_PLANE_X_RESOLUTION = "FocalPlaneXResolution";
+    field public static final java.lang.String TAG_FOCAL_PLANE_Y_RESOLUTION = "FocalPlaneYResolution";
+    field public static final java.lang.String TAG_F_NUMBER = "FNumber";
+    field public static final java.lang.String TAG_GAIN_CONTROL = "GainControl";
+    field public static final java.lang.String TAG_GAMMA = "Gamma";
+    field public static final java.lang.String TAG_GPS_ALTITUDE = "GPSAltitude";
+    field public static final java.lang.String TAG_GPS_ALTITUDE_REF = "GPSAltitudeRef";
+    field public static final java.lang.String TAG_GPS_AREA_INFORMATION = "GPSAreaInformation";
+    field public static final java.lang.String TAG_GPS_DATESTAMP = "GPSDateStamp";
+    field public static final java.lang.String TAG_GPS_DEST_BEARING = "GPSDestBearing";
+    field public static final java.lang.String TAG_GPS_DEST_BEARING_REF = "GPSDestBearingRef";
+    field public static final java.lang.String TAG_GPS_DEST_DISTANCE = "GPSDestDistance";
+    field public static final java.lang.String TAG_GPS_DEST_DISTANCE_REF = "GPSDestDistanceRef";
+    field public static final java.lang.String TAG_GPS_DEST_LATITUDE = "GPSDestLatitude";
+    field public static final java.lang.String TAG_GPS_DEST_LATITUDE_REF = "GPSDestLatitudeRef";
+    field public static final java.lang.String TAG_GPS_DEST_LONGITUDE = "GPSDestLongitude";
+    field public static final java.lang.String TAG_GPS_DEST_LONGITUDE_REF = "GPSDestLongitudeRef";
+    field public static final java.lang.String TAG_GPS_DIFFERENTIAL = "GPSDifferential";
+    field public static final java.lang.String TAG_GPS_DOP = "GPSDOP";
+    field public static final java.lang.String TAG_GPS_H_POSITIONING_ERROR = "GPSHPositioningError";
+    field public static final java.lang.String TAG_GPS_IMG_DIRECTION = "GPSImgDirection";
+    field public static final java.lang.String TAG_GPS_IMG_DIRECTION_REF = "GPSImgDirectionRef";
+    field public static final java.lang.String TAG_GPS_LATITUDE = "GPSLatitude";
+    field public static final java.lang.String TAG_GPS_LATITUDE_REF = "GPSLatitudeRef";
+    field public static final java.lang.String TAG_GPS_LONGITUDE = "GPSLongitude";
+    field public static final java.lang.String TAG_GPS_LONGITUDE_REF = "GPSLongitudeRef";
+    field public static final java.lang.String TAG_GPS_MAP_DATUM = "GPSMapDatum";
+    field public static final java.lang.String TAG_GPS_MEASURE_MODE = "GPSMeasureMode";
+    field public static final java.lang.String TAG_GPS_PROCESSING_METHOD = "GPSProcessingMethod";
+    field public static final java.lang.String TAG_GPS_SATELLITES = "GPSSatellites";
+    field public static final java.lang.String TAG_GPS_SPEED = "GPSSpeed";
+    field public static final java.lang.String TAG_GPS_SPEED_REF = "GPSSpeedRef";
+    field public static final java.lang.String TAG_GPS_STATUS = "GPSStatus";
+    field public static final java.lang.String TAG_GPS_TIMESTAMP = "GPSTimeStamp";
+    field public static final java.lang.String TAG_GPS_TRACK = "GPSTrack";
+    field public static final java.lang.String TAG_GPS_TRACK_REF = "GPSTrackRef";
+    field public static final java.lang.String TAG_GPS_VERSION_ID = "GPSVersionID";
+    field public static final java.lang.String TAG_IMAGE_DESCRIPTION = "ImageDescription";
+    field public static final java.lang.String TAG_IMAGE_LENGTH = "ImageLength";
+    field public static final java.lang.String TAG_IMAGE_UNIQUE_ID = "ImageUniqueID";
+    field public static final java.lang.String TAG_IMAGE_WIDTH = "ImageWidth";
+    field public static final java.lang.String TAG_INTEROPERABILITY_INDEX = "InteroperabilityIndex";
+    field public static final java.lang.String TAG_ISO_SPEED = "ISOSpeed";
+    field public static final java.lang.String TAG_ISO_SPEED_LATITUDE_YYY = "ISOSpeedLatitudeyyy";
+    field public static final java.lang.String TAG_ISO_SPEED_LATITUDE_ZZZ = "ISOSpeedLatitudezzz";
+    field public static final deprecated java.lang.String TAG_ISO_SPEED_RATINGS = "ISOSpeedRatings";
+    field public static final java.lang.String TAG_JPEG_INTERCHANGE_FORMAT = "JPEGInterchangeFormat";
+    field public static final java.lang.String TAG_JPEG_INTERCHANGE_FORMAT_LENGTH = "JPEGInterchangeFormatLength";
+    field public static final java.lang.String TAG_LENS_MAKE = "LensMake";
+    field public static final java.lang.String TAG_LENS_MODEL = "LensModel";
+    field public static final java.lang.String TAG_LENS_SERIAL_NUMBER = "LensSerialNumber";
+    field public static final java.lang.String TAG_LENS_SPECIFICATION = "LensSpecification";
+    field public static final java.lang.String TAG_LIGHT_SOURCE = "LightSource";
+    field public static final java.lang.String TAG_MAKE = "Make";
+    field public static final java.lang.String TAG_MAKER_NOTE = "MakerNote";
+    field public static final java.lang.String TAG_MAX_APERTURE_VALUE = "MaxApertureValue";
+    field public static final java.lang.String TAG_METERING_MODE = "MeteringMode";
+    field public static final java.lang.String TAG_MODEL = "Model";
+    field public static final java.lang.String TAG_NEW_SUBFILE_TYPE = "NewSubfileType";
+    field public static final java.lang.String TAG_OECF = "OECF";
+    field public static final java.lang.String TAG_ORF_ASPECT_FRAME = "AspectFrame";
+    field public static final java.lang.String TAG_ORF_PREVIEW_IMAGE_LENGTH = "PreviewImageLength";
+    field public static final java.lang.String TAG_ORF_PREVIEW_IMAGE_START = "PreviewImageStart";
+    field public static final java.lang.String TAG_ORF_THUMBNAIL_IMAGE = "ThumbnailImage";
+    field public static final java.lang.String TAG_ORIENTATION = "Orientation";
+    field public static final java.lang.String TAG_PHOTOGRAPHIC_SENSITIVITY = "PhotographicSensitivity";
+    field public static final java.lang.String TAG_PHOTOMETRIC_INTERPRETATION = "PhotometricInterpretation";
+    field public static final java.lang.String TAG_PIXEL_X_DIMENSION = "PixelXDimension";
+    field public static final java.lang.String TAG_PIXEL_Y_DIMENSION = "PixelYDimension";
+    field public static final java.lang.String TAG_PLANAR_CONFIGURATION = "PlanarConfiguration";
+    field public static final java.lang.String TAG_PRIMARY_CHROMATICITIES = "PrimaryChromaticities";
+    field public static final java.lang.String TAG_RECOMMENDED_EXPOSURE_INDEX = "RecommendedExposureIndex";
+    field public static final java.lang.String TAG_REFERENCE_BLACK_WHITE = "ReferenceBlackWhite";
+    field public static final java.lang.String TAG_RELATED_SOUND_FILE = "RelatedSoundFile";
+    field public static final java.lang.String TAG_RESOLUTION_UNIT = "ResolutionUnit";
+    field public static final java.lang.String TAG_ROWS_PER_STRIP = "RowsPerStrip";
+    field public static final java.lang.String TAG_RW2_ISO = "ISO";
+    field public static final java.lang.String TAG_RW2_JPG_FROM_RAW = "JpgFromRaw";
+    field public static final java.lang.String TAG_RW2_SENSOR_BOTTOM_BORDER = "SensorBottomBorder";
+    field public static final java.lang.String TAG_RW2_SENSOR_LEFT_BORDER = "SensorLeftBorder";
+    field public static final java.lang.String TAG_RW2_SENSOR_RIGHT_BORDER = "SensorRightBorder";
+    field public static final java.lang.String TAG_RW2_SENSOR_TOP_BORDER = "SensorTopBorder";
+    field public static final java.lang.String TAG_SAMPLES_PER_PIXEL = "SamplesPerPixel";
+    field public static final java.lang.String TAG_SATURATION = "Saturation";
+    field public static final java.lang.String TAG_SCENE_CAPTURE_TYPE = "SceneCaptureType";
+    field public static final java.lang.String TAG_SCENE_TYPE = "SceneType";
+    field public static final java.lang.String TAG_SENSING_METHOD = "SensingMethod";
+    field public static final java.lang.String TAG_SENSITIVITY_TYPE = "SensitivityType";
+    field public static final java.lang.String TAG_SHARPNESS = "Sharpness";
+    field public static final java.lang.String TAG_SHUTTER_SPEED_VALUE = "ShutterSpeedValue";
+    field public static final java.lang.String TAG_SOFTWARE = "Software";
+    field public static final java.lang.String TAG_SPATIAL_FREQUENCY_RESPONSE = "SpatialFrequencyResponse";
+    field public static final java.lang.String TAG_SPECTRAL_SENSITIVITY = "SpectralSensitivity";
+    field public static final java.lang.String TAG_STANDARD_OUTPUT_SENSITIVITY = "StandardOutputSensitivity";
+    field public static final java.lang.String TAG_STRIP_BYTE_COUNTS = "StripByteCounts";
+    field public static final java.lang.String TAG_STRIP_OFFSETS = "StripOffsets";
+    field public static final java.lang.String TAG_SUBFILE_TYPE = "SubfileType";
+    field public static final java.lang.String TAG_SUBJECT_AREA = "SubjectArea";
+    field public static final java.lang.String TAG_SUBJECT_DISTANCE = "SubjectDistance";
+    field public static final java.lang.String TAG_SUBJECT_DISTANCE_RANGE = "SubjectDistanceRange";
+    field public static final java.lang.String TAG_SUBJECT_LOCATION = "SubjectLocation";
+    field public static final java.lang.String TAG_SUBSEC_TIME = "SubSecTime";
+    field public static final java.lang.String TAG_SUBSEC_TIME_DIGITIZED = "SubSecTimeDigitized";
+    field public static final java.lang.String TAG_SUBSEC_TIME_ORIGINAL = "SubSecTimeOriginal";
+    field public static final java.lang.String TAG_THUMBNAIL_IMAGE_LENGTH = "ThumbnailImageLength";
+    field public static final java.lang.String TAG_THUMBNAIL_IMAGE_WIDTH = "ThumbnailImageWidth";
+    field public static final java.lang.String TAG_TRANSFER_FUNCTION = "TransferFunction";
+    field public static final java.lang.String TAG_USER_COMMENT = "UserComment";
+    field public static final java.lang.String TAG_WHITE_BALANCE = "WhiteBalance";
+    field public static final java.lang.String TAG_WHITE_POINT = "WhitePoint";
+    field public static final java.lang.String TAG_X_RESOLUTION = "XResolution";
+    field public static final java.lang.String TAG_Y_CB_CR_COEFFICIENTS = "YCbCrCoefficients";
+    field public static final java.lang.String TAG_Y_CB_CR_POSITIONING = "YCbCrPositioning";
+    field public static final java.lang.String TAG_Y_CB_CR_SUB_SAMPLING = "YCbCrSubSampling";
+    field public static final java.lang.String TAG_Y_RESOLUTION = "YResolution";
+    field public static final deprecated int WHITEBALANCE_AUTO = 0; // 0x0
+    field public static final deprecated int WHITEBALANCE_MANUAL = 1; // 0x1
+    field public static final short WHITE_BALANCE_AUTO = 0; // 0x0
+    field public static final short WHITE_BALANCE_MANUAL = 1; // 0x1
+    field public static final short Y_CB_CR_POSITIONING_CENTERED = 1; // 0x1
+    field public static final short Y_CB_CR_POSITIONING_CO_SITED = 2; // 0x2
+  }
+
+}
+
diff --git a/exifinterface/build.gradle b/exifinterface/build.gradle
index b65e1e8..3e034b1 100644
--- a/exifinterface/build.gradle
+++ b/exifinterface/build.gradle
@@ -10,11 +10,6 @@
     defaultConfig {
         minSdkVersion 14
     }
-
-    sourceSets {
-        main.java.srcDirs = ['src']
-        main.res.srcDirs = ['res']
-    }
 }
 
 supportLibrary {
diff --git a/exifinterface/src/android/support/media/ExifInterface.java b/exifinterface/src/main/java/android/support/media/ExifInterface.java
similarity index 99%
rename from exifinterface/src/android/support/media/ExifInterface.java
rename to exifinterface/src/main/java/android/support/media/ExifInterface.java
index b790cd2..72b61cb 100644
--- a/exifinterface/src/android/support/media/ExifInterface.java
+++ b/exifinterface/src/main/java/android/support/media/ExifInterface.java
@@ -22,6 +22,7 @@
 import android.location.Location;
 import android.support.annotation.IntDef;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.util.Log;
 import android.util.Pair;
 
@@ -3699,7 +3700,7 @@
     /**
      * Reads Exif tags from the specified image file.
      */
-    public ExifInterface(String filename) throws IOException {
+    public ExifInterface(@NonNull String filename) throws IOException {
         if (filename == null) {
             throw new IllegalArgumentException("filename cannot be null");
         }
@@ -3720,7 +3721,7 @@
      * should close the input stream after use. This constructor is not intended to be used with
      * an input stream that performs any networking operations.
      */
-    public ExifInterface(InputStream inputStream) throws IOException {
+    public ExifInterface(@NonNull InputStream inputStream) throws IOException {
         if (inputStream == null) {
             throw new IllegalArgumentException("inputStream cannot be null");
         }
@@ -3739,7 +3740,8 @@
      *
      * @param tag the name of the tag.
      */
-    private ExifAttribute getExifAttribute(String tag) {
+    @Nullable
+    private ExifAttribute getExifAttribute(@NonNull String tag) {
         if (TAG_ISO_SPEED_RATINGS.equals(tag)) {
             if (DEBUG) {
                 Log.d(TAG, "getExifAttribute: Replacing TAG_ISO_SPEED_RATINGS with "
@@ -3764,7 +3766,8 @@
      *
      * @param tag the name of the tag.
      */
-    public String getAttribute(String tag) {
+    @Nullable
+    public String getAttribute(@NonNull String tag) {
         ExifAttribute attribute = getExifAttribute(tag);
         if (attribute != null) {
             if (!sTagSetForCompatibility.contains(tag)) {
@@ -3804,7 +3807,7 @@
      * @param tag the name of the tag.
      * @param defaultValue the value to return if the tag is not available.
      */
-    public int getAttributeInt(String tag, int defaultValue) {
+    public int getAttributeInt(@NonNull String tag, int defaultValue) {
         ExifAttribute exifAttribute = getExifAttribute(tag);
         if (exifAttribute == null) {
             return defaultValue;
@@ -3825,7 +3828,7 @@
      * @param tag the name of the tag.
      * @param defaultValue the value to return if the tag is not available.
      */
-    public double getAttributeDouble(String tag, double defaultValue) {
+    public double getAttributeDouble(@NonNull String tag, double defaultValue) {
         ExifAttribute exifAttribute = getExifAttribute(tag);
         if (exifAttribute == null) {
             return defaultValue;
@@ -3844,7 +3847,7 @@
      * @param tag the name of the tag.
      * @param value the value of the tag.
      */
-    public void setAttribute(String tag, String value) {
+    public void setAttribute(@NonNull String tag, @Nullable String value) {
         if (TAG_ISO_SPEED_RATINGS.equals(tag)) {
             if (DEBUG) {
                 Log.d(TAG, "setAttribute: Replacing TAG_ISO_SPEED_RATINGS with "
@@ -4320,6 +4323,7 @@
      * The returned data can be decoded using
      * {@link android.graphics.BitmapFactory#decodeByteArray(byte[],int,int)}
      */
+    @Nullable
     public byte[] getThumbnail() {
         if (mThumbnailCompression == DATA_JPEG || mThumbnailCompression == DATA_JPEG_COMPRESSED) {
             return getThumbnailBytes();
@@ -4331,6 +4335,7 @@
      * Returns the thumbnail bytes inside the image file, regardless of the compression type of the
      * thumbnail image.
      */
+    @Nullable
     public byte[] getThumbnailBytes() {
         if (!mHasThumbnail) {
             return null;
@@ -4379,6 +4384,7 @@
      * Creates and returns a Bitmap object of the thumbnail image based on the byte array and the
      * thumbnail compression value, or {@code null} if the compression type is unsupported.
      */
+    @Nullable
     public Bitmap getThumbnailBitmap() {
         if (!mHasThumbnail) {
             return null;
@@ -4425,6 +4431,7 @@
      * @return two-element array, the offset in the first value, and length in
      *         the second, or {@code null} if no thumbnail was found.
      */
+    @Nullable
     public long[] getThumbnailRange() {
         if (!mHasThumbnail) {
             return null;
@@ -4462,6 +4469,7 @@
      * array where the first element is the latitude and the second element is the longitude.
      * Otherwise, it returns null.
      */
+    @Nullable
     public double[] getLatLong() {
         String latValue = getAttribute(TAG_GPS_LATITUDE);
         String latRef = getAttribute(TAG_GPS_LATITUDE_REF);
diff --git a/fragment/Android.mk b/fragment/Android.mk
index cc1b5f8..efac954 100644
--- a/fragment/Android.mk
+++ b/fragment/Android.mk
@@ -30,7 +30,7 @@
 LOCAL_MODULE := android-support-fragment
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_SRC_FILES := \
-    $(call all-java-files-under, java)
+    $(call all-java-files-under, src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-compat \
diff --git a/fragment/AndroidManifest.xml b/fragment/AndroidManifest.xml
index 4d532bd..ec15d66 100644
--- a/fragment/AndroidManifest.xml
+++ b/fragment/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.fragment">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.fragment.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/fragment/OWNERS b/fragment/OWNERS
new file mode 100644
index 0000000..38b4f66
--- /dev/null
+++ b/fragment/OWNERS
@@ -0,0 +1,3 @@
+adamp@google.com
+ilake@google.com
+mount@google.com
\ No newline at end of file
diff --git a/fragment/api/26.1.0.txt b/fragment/api/26.1.0.txt
new file mode 100644
index 0000000..ccd6f4f
--- /dev/null
+++ b/fragment/api/26.1.0.txt
@@ -0,0 +1,397 @@
+package android.support.v4.app {
+
+  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 final android.view.LayoutInflater getLayoutInflater();
+    method public android.arch.lifecycle.Lifecycle getLifecycle();
+    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 isStateSaved();
+    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 onAttachFragment(android.support.v4.app.Fragment);
+    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 android.animation.Animator onCreateAnimator(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 android.view.LayoutInflater onGetLayoutInflater(android.os.Bundle);
+    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 void onMultiWindowModeChanged(boolean);
+    method public boolean onOptionsItemSelected(android.view.MenuItem);
+    method public void onOptionsMenuClosed(android.view.Menu);
+    method public void onPause();
+    method public void onPictureInPictureModeChanged(boolean);
+    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 postponeEnterTransition();
+    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 startActivity(android.content.Intent, android.os.Bundle);
+    method public void startActivityForResult(android.content.Intent, int);
+    method public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
+    method public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    method public void startPostponedEnterTransition();
+    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.SupportActivity {
+    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 void onAttachFragment(android.support.v4.app.Fragment);
+    method public void onMultiWindowModeChanged(boolean);
+    method public void onPictureInPictureModeChanged(boolean);
+    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 void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
+    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int, android.os.Bundle);
+    method public void startIntentSenderFromFragment(android.support.v4.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    method public void supportFinishAfterTransition();
+    method public deprecated 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 android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
+    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 void dispatchMultiWindowModeChanged(boolean);
+    method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
+    method public void dispatchOptionsMenuClosed(android.view.Menu);
+    method public void dispatchPause();
+    method public void dispatchPictureInPictureModeChanged(boolean);
+    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 android.support.v4.app.Fragment findFragmentByWho(java.lang.String);
+    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 deprecated void restoreAllState(android.os.Parcelable, java.util.List<android.support.v4.app.Fragment>);
+    method public void restoreAllState(android.os.Parcelable, android.support.v4.app.FragmentManagerNonConfig);
+    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 android.support.v4.app.FragmentManagerNonConfig retainNestedNonConfig();
+    method public deprecated java.util.List<android.support.v4.app.Fragment> retainNonConfig();
+    method public android.os.Parcelable saveAllState();
+  }
+
+  public abstract class FragmentHostCallback<E> 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 onStartActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int, android.os.Bundle);
+    method public void onStartIntentSenderFromFragment(android.support.v4.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    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 java.util.List<android.support.v4.app.Fragment> getFragments();
+    method public abstract android.support.v4.app.Fragment getPrimaryNavigationFragment();
+    method public abstract boolean isDestroyed();
+    method public abstract boolean isStateSaved();
+    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 registerFragmentLifecycleCallbacks(android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks, boolean);
+    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);
+    method public abstract void unregisterFragmentLifecycleCallbacks(android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks);
+    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 class FragmentManager.FragmentLifecycleCallbacks {
+    ctor public FragmentManager.FragmentLifecycleCallbacks();
+    method public void onFragmentActivityCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
+    method public void onFragmentAttached(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.content.Context);
+    method public void onFragmentCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
+    method public void onFragmentDestroyed(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentDetached(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentPaused(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentPreAttached(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.content.Context);
+    method public void onFragmentPreCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
+    method public void onFragmentResumed(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentSaveInstanceState(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
+    method public void onFragmentStarted(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentStopped(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentViewCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.view.View, android.os.Bundle);
+    method public void onFragmentViewDestroyed(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+  }
+
+  public static abstract interface FragmentManager.OnBackStackChangedListener {
+    method public abstract void onBackStackChanged();
+  }
+
+  public class FragmentManagerNonConfig {
+  }
+
+  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 deprecated void setup();
+    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 void commitNow();
+    method public abstract void commitNowAllowingStateLoss();
+    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 runOnCommit(java.lang.Runnable);
+    method public abstract deprecated android.support.v4.app.FragmentTransaction setAllowOptimization(boolean);
+    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 setPrimaryNavigationFragment(android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction setReorderingAllowed(boolean);
+    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 <D> android.support.v4.content.Loader<D> getLoader(int);
+    method public boolean hasRunningLoaders();
+    method public abstract <D> android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
+    method public abstract <D> android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
+  }
+
+  public static abstract interface LoaderManager.LoaderCallbacks<D> {
+    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>);
+  }
+
+}
+
diff --git a/fragment/api/27.0.0.txt b/fragment/api/27.0.0.txt
new file mode 100644
index 0000000..ccd6f4f
--- /dev/null
+++ b/fragment/api/27.0.0.txt
@@ -0,0 +1,397 @@
+package android.support.v4.app {
+
+  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 final android.view.LayoutInflater getLayoutInflater();
+    method public android.arch.lifecycle.Lifecycle getLifecycle();
+    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 isStateSaved();
+    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 onAttachFragment(android.support.v4.app.Fragment);
+    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 android.animation.Animator onCreateAnimator(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 android.view.LayoutInflater onGetLayoutInflater(android.os.Bundle);
+    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 void onMultiWindowModeChanged(boolean);
+    method public boolean onOptionsItemSelected(android.view.MenuItem);
+    method public void onOptionsMenuClosed(android.view.Menu);
+    method public void onPause();
+    method public void onPictureInPictureModeChanged(boolean);
+    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 postponeEnterTransition();
+    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 startActivity(android.content.Intent, android.os.Bundle);
+    method public void startActivityForResult(android.content.Intent, int);
+    method public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
+    method public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    method public void startPostponedEnterTransition();
+    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.SupportActivity {
+    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 void onAttachFragment(android.support.v4.app.Fragment);
+    method public void onMultiWindowModeChanged(boolean);
+    method public void onPictureInPictureModeChanged(boolean);
+    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 void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
+    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int, android.os.Bundle);
+    method public void startIntentSenderFromFragment(android.support.v4.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    method public void supportFinishAfterTransition();
+    method public deprecated 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 android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
+    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 void dispatchMultiWindowModeChanged(boolean);
+    method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
+    method public void dispatchOptionsMenuClosed(android.view.Menu);
+    method public void dispatchPause();
+    method public void dispatchPictureInPictureModeChanged(boolean);
+    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 android.support.v4.app.Fragment findFragmentByWho(java.lang.String);
+    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 deprecated void restoreAllState(android.os.Parcelable, java.util.List<android.support.v4.app.Fragment>);
+    method public void restoreAllState(android.os.Parcelable, android.support.v4.app.FragmentManagerNonConfig);
+    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 android.support.v4.app.FragmentManagerNonConfig retainNestedNonConfig();
+    method public deprecated java.util.List<android.support.v4.app.Fragment> retainNonConfig();
+    method public android.os.Parcelable saveAllState();
+  }
+
+  public abstract class FragmentHostCallback<E> 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 onStartActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int, android.os.Bundle);
+    method public void onStartIntentSenderFromFragment(android.support.v4.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    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 java.util.List<android.support.v4.app.Fragment> getFragments();
+    method public abstract android.support.v4.app.Fragment getPrimaryNavigationFragment();
+    method public abstract boolean isDestroyed();
+    method public abstract boolean isStateSaved();
+    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 registerFragmentLifecycleCallbacks(android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks, boolean);
+    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);
+    method public abstract void unregisterFragmentLifecycleCallbacks(android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks);
+    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 class FragmentManager.FragmentLifecycleCallbacks {
+    ctor public FragmentManager.FragmentLifecycleCallbacks();
+    method public void onFragmentActivityCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
+    method public void onFragmentAttached(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.content.Context);
+    method public void onFragmentCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
+    method public void onFragmentDestroyed(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentDetached(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentPaused(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentPreAttached(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.content.Context);
+    method public void onFragmentPreCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
+    method public void onFragmentResumed(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentSaveInstanceState(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.os.Bundle);
+    method public void onFragmentStarted(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentStopped(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+    method public void onFragmentViewCreated(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment, android.view.View, android.os.Bundle);
+    method public void onFragmentViewDestroyed(android.support.v4.app.FragmentManager, android.support.v4.app.Fragment);
+  }
+
+  public static abstract interface FragmentManager.OnBackStackChangedListener {
+    method public abstract void onBackStackChanged();
+  }
+
+  public class FragmentManagerNonConfig {
+  }
+
+  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 deprecated void setup();
+    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 void commitNow();
+    method public abstract void commitNowAllowingStateLoss();
+    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 runOnCommit(java.lang.Runnable);
+    method public abstract deprecated android.support.v4.app.FragmentTransaction setAllowOptimization(boolean);
+    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 setPrimaryNavigationFragment(android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction setReorderingAllowed(boolean);
+    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 <D> android.support.v4.content.Loader<D> getLoader(int);
+    method public boolean hasRunningLoaders();
+    method public abstract <D> android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
+    method public abstract <D> android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
+  }
+
+  public static abstract interface LoaderManager.LoaderCallbacks<D> {
+    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>);
+  }
+
+}
+
diff --git a/fragment/build.gradle b/fragment/build.gradle
index 954cdd8..3a86f38 100644
--- a/fragment/build.gradle
+++ b/fragment/build.gradle
@@ -16,10 +16,6 @@
     defaultConfig {
         minSdkVersion 14
     }
-
-    sourceSets {
-        main.java.srcDirs = ['java']
-    }
 }
 
 supportLibrary {
diff --git a/fragment/java/android/support/v4/app/BackStackRecord.java b/fragment/src/main/java/android/support/v4/app/BackStackRecord.java
similarity index 100%
rename from fragment/java/android/support/v4/app/BackStackRecord.java
rename to fragment/src/main/java/android/support/v4/app/BackStackRecord.java
diff --git a/fragment/java/android/support/v4/app/BaseFragmentActivityApi14.java b/fragment/src/main/java/android/support/v4/app/BaseFragmentActivityApi14.java
similarity index 100%
rename from fragment/java/android/support/v4/app/BaseFragmentActivityApi14.java
rename to fragment/src/main/java/android/support/v4/app/BaseFragmentActivityApi14.java
diff --git a/fragment/java/android/support/v4/app/BaseFragmentActivityApi16.java b/fragment/src/main/java/android/support/v4/app/BaseFragmentActivityApi16.java
similarity index 100%
rename from fragment/java/android/support/v4/app/BaseFragmentActivityApi16.java
rename to fragment/src/main/java/android/support/v4/app/BaseFragmentActivityApi16.java
diff --git a/fragment/java/android/support/v4/app/DialogFragment.java b/fragment/src/main/java/android/support/v4/app/DialogFragment.java
similarity index 100%
rename from fragment/java/android/support/v4/app/DialogFragment.java
rename to fragment/src/main/java/android/support/v4/app/DialogFragment.java
diff --git a/fragment/java/android/support/v4/app/Fragment.java b/fragment/src/main/java/android/support/v4/app/Fragment.java
similarity index 97%
rename from fragment/java/android/support/v4/app/Fragment.java
rename to fragment/src/main/java/android/support/v4/app/Fragment.java
index ba74521..e734a27 100644
--- a/fragment/java/android/support/v4/app/Fragment.java
+++ b/fragment/src/main/java/android/support/v4/app/Fragment.java
@@ -463,6 +463,7 @@
     /**
      * Get the tag name of the fragment, if specified.
      */
+    @Nullable
     final public String getTag() {
         return mTag;
     }
@@ -474,7 +475,7 @@
      * <p>This method cannot be called if the fragment is added to a FragmentManager and
      * if {@link #isStateSaved()} would return true.</p>
      */
-    public void setArguments(Bundle args) {
+    public void setArguments(@Nullable Bundle args) {
         if (mIndex >= 0 && isStateSaved()) {
             throw new IllegalStateException("Fragment already active and state has been saved");
         }
@@ -485,6 +486,7 @@
      * Return the arguments supplied when the fragment was instantiated,
      * if any.
      */
+    @Nullable
     final public Bundle getArguments() {
         return mArguments;
     }
@@ -512,7 +514,7 @@
      *
      * @param state The state the fragment should be restored from.
      */
-    public void setInitialSavedState(SavedState state) {
+    public void setInitialSavedState(@Nullable SavedState state) {
         if (mIndex >= 0) {
             throw new IllegalStateException("Fragment already active");
         }
@@ -532,7 +534,7 @@
      * are going to call back with {@link #onActivityResult(int, int, Intent)}.
      */
     @SuppressWarnings("ReferenceEquality")
-    public void setTargetFragment(Fragment fragment, int requestCode) {
+    public void setTargetFragment(@Nullable Fragment fragment, int requestCode) {
         // Don't allow a caller to set a target fragment in another FragmentManager,
         // but there's a snag: people do set target fragments before fragments get added.
         // We'll have the FragmentManager check that for validity when we move
@@ -558,6 +560,7 @@
     /**
      * Return the target fragment set by {@link #setTargetFragment}.
      */
+    @Nullable
     final public Fragment getTargetFragment() {
         return mTarget;
     }
@@ -572,6 +575,7 @@
     /**
      * Return the {@link Context} this fragment is currently associated with.
      */
+    @Nullable
     public Context getContext() {
         return mHost == null ? null : mHost.getContext();
     }
@@ -581,6 +585,7 @@
      * May return {@code null} if the fragment is associated with a {@link Context}
      * instead.
      */
+    @Nullable
     final public FragmentActivity getActivity() {
         return mHost == null ? null : (FragmentActivity) mHost.getActivity();
     }
@@ -589,6 +594,7 @@
      * Return the host object of this fragment. May return {@code null} if the fragment
      * isn't currently being hosted.
      */
+    @Nullable
     final public Object getHost() {
         return mHost == null ? null : mHost.onGetHost();
     }
@@ -596,6 +602,7 @@
     /**
      * Return <code>getActivity().getResources()</code>.
      */
+    @NonNull
     final public Resources getResources() {
         if (mHost == null) {
             throw new IllegalStateException("Fragment " + this + " not attached to Activity");
@@ -609,6 +616,7 @@
      *
      * @param resId Resource id for the CharSequence text
      */
+    @NonNull
     public final CharSequence getText(@StringRes int resId) {
         return getResources().getText(resId);
     }
@@ -619,6 +627,7 @@
      *
      * @param resId Resource id for the string
      */
+    @NonNull
     public final String getString(@StringRes int resId) {
         return getResources().getString(resId);
     }
@@ -631,7 +640,7 @@
      * @param resId Resource id for the format string
      * @param formatArgs The format arguments that will be used for substitution.
      */
-
+    @NonNull
     public final String getString(@StringRes int resId, Object... formatArgs) {
         return getResources().getString(resId, formatArgs);
     }
@@ -646,6 +655,7 @@
      * <p>If this Fragment is a child of another Fragment, the FragmentManager
      * returned here will be the parent's {@link #getChildFragmentManager()}.
      */
+    @Nullable
     final public FragmentManager getFragmentManager() {
         return mFragmentManager;
     }
@@ -654,6 +664,7 @@
      * Return a private FragmentManager for placing and managing Fragments
      * inside of this Fragment.
      */
+    @NonNull
     final public FragmentManager getChildFragmentManager() {
         if (mChildFragmentManager == null) {
             instantiateChildFragmentManager();
@@ -674,6 +685,7 @@
      * Return this fragment's child FragmentManager one has been previously created,
      * otherwise null.
      */
+    @Nullable
     FragmentManager peekChildFragmentManager() {
         return mChildFragmentManager;
     }
@@ -682,6 +694,7 @@
      * Returns the parent Fragment containing this Fragment.  If this Fragment
      * is attached directly to an Activity, returns null.
      */
+    @Nullable
     final public Fragment getParentFragment() {
         return mParentFragment;
     }
@@ -1082,7 +1095,8 @@
      * a previous saved state, this is the state.
      * @return The LayoutInflater used to inflate Views of this Fragment.
      */
-    public LayoutInflater onGetLayoutInflater(Bundle savedInstanceState) {
+    @NonNull
+    public LayoutInflater onGetLayoutInflater(@Nullable Bundle savedInstanceState) {
         // TODO: move the implementation in getLayoutInflater to here
         return getLayoutInflater(savedInstanceState);
     }
@@ -1113,7 +1127,8 @@
      * a previous saved state, this is the state.
      * @return The LayoutInflater used to inflate Views of this Fragment.
      */
-    LayoutInflater performGetLayoutInflater(Bundle savedInstanceState) {
+    @NonNull
+    LayoutInflater performGetLayoutInflater(@Nullable Bundle savedInstanceState) {
         LayoutInflater layoutInflater = onGetLayoutInflater(savedInstanceState);
         mLayoutInflater = layoutInflater;
         return mLayoutInflater;
@@ -1129,8 +1144,9 @@
      * {@link #getLayoutInflater()} instead of this method.
      */
     @Deprecated
+    @NonNull
     @RestrictTo(LIBRARY_GROUP)
-    public LayoutInflater getLayoutInflater(Bundle savedFragmentState) {
+    public LayoutInflater getLayoutInflater(@Nullable Bundle savedFragmentState) {
         if (mHost == null) {
             throw new IllegalStateException("onGetLayoutInflater() cannot be executed until the "
                     + "Fragment is attached to the FragmentManager.");
@@ -1157,24 +1173,24 @@
      * <p>Here is a typical implementation of a fragment that can take parameters
      * both through attributes supplied here as well from {@link #getArguments()}:</p>
      *
-     * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentArgumentsSupport.java
+     * {@sample frameworks/support/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentArgumentsSupport.java
      *      fragment}
      *
      * <p>Note that parsing the XML attributes uses a "styleable" resource.  The
      * declaration for the styleable used here is:</p>
      *
-     * {@sample frameworks/support/samples/Support4Demos/res/values/attrs.xml fragment_arguments}
+     * {@sample frameworks/support/samples/Support4Demos/src/main/res/values/attrs.xml fragment_arguments}
      *
      * <p>The fragment can then be declared within its activity's content layout
      * through a tag like this:</p>
      *
-     * {@sample frameworks/support/samples/Support4Demos/res/layout/fragment_arguments_support.xml from_attributes}
+     * {@sample frameworks/support/samples/Support4Demos/src/main/res/layout/fragment_arguments_support.xml from_attributes}
      *
      * <p>This fragment can also be created dynamically from arguments given
      * at runtime in the arguments Bundle; here is an example of doing so at
      * creation of the containing activity:</p>
      *
-     * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentArgumentsSupport.java
+     * {@sample frameworks/support/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentArgumentsSupport.java
      *      create}
      *
      * @param context The Activity that is inflating this fragment.
@@ -1356,7 +1372,7 @@
      * @return Return the View for the fragment's UI, or null.
      */
     @Nullable
-    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
             @Nullable Bundle savedInstanceState) {
         return null;
     }
@@ -1371,7 +1387,7 @@
      * @param savedInstanceState If non-null, this fragment is being re-constructed
      * from a previous saved state as given here.
      */
-    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
     }
 
     /**
@@ -1469,7 +1485,7 @@
      *
      * @param outState Bundle in which to place your saved state.
      */
-    public void onSaveInstanceState(Bundle outState) {
+    public void onSaveInstanceState(@NonNull Bundle outState) {
     }
 
     /**
@@ -1768,7 +1784,7 @@
      *
      * @param transition The Transition to use to move Views into the initial Scene.
      */
-    public void setEnterTransition(Object transition) {
+    public void setEnterTransition(@Nullable Object transition) {
         ensureAnimationInfo().mEnterTransition = transition;
     }
 
@@ -1781,6 +1797,7 @@
      *
      * @return the Transition to use to move Views into the initial Scene.
      */
+    @Nullable
     public Object getEnterTransition() {
         if (mAnimationInfo == null) {
             return null;
@@ -1802,7 +1819,7 @@
      *                   is preparing to close. <code>transition</code> must be an
      *                   android.transition.Transition.
      */
-    public void setReturnTransition(Object transition) {
+    public void setReturnTransition(@Nullable Object transition) {
         ensureAnimationInfo().mReturnTransition = transition;
     }
 
@@ -1818,6 +1835,7 @@
      * @return the Transition to use to move Views out of the Scene when the Fragment
      *         is preparing to close.
      */
+    @Nullable
     public Object getReturnTransition() {
         if (mAnimationInfo == null) {
             return null;
@@ -1839,7 +1857,7 @@
      *                   is being closed not due to popping the back stack. <code>transition</code>
      *                   must be an android.transition.Transition.
      */
-    public void setExitTransition(Object transition) {
+    public void setExitTransition(@Nullable Object transition) {
         ensureAnimationInfo().mExitTransition = transition;
     }
 
@@ -1855,6 +1873,7 @@
      * @return the Transition to use to move Views out of the Scene when the Fragment
      *         is being closed not due to popping the back stack.
      */
+    @Nullable
     public Object getExitTransition() {
         if (mAnimationInfo == null) {
             return null;
@@ -1875,7 +1894,7 @@
      *                   previously-started Activity. <code>transition</code>
      *                   must be an android.transition.Transition.
      */
-    public void setReenterTransition(Object transition) {
+    public void setReenterTransition(@Nullable Object transition) {
         ensureAnimationInfo().mReenterTransition = transition;
     }
 
@@ -1908,7 +1927,7 @@
      * @param transition The Transition to use for shared elements transferred into the content
      *                   Scene.  <code>transition</code> must be an android.transition.Transition.
      */
-    public void setSharedElementEnterTransition(Object transition) {
+    public void setSharedElementEnterTransition(@Nullable Object transition) {
         ensureAnimationInfo().mSharedElementEnterTransition = transition;
     }
 
@@ -1921,6 +1940,7 @@
      * @return The Transition to use for shared elements transferred into the content
      *                   Scene.
      */
+    @Nullable
     public Object getSharedElementEnterTransition() {
         if (mAnimationInfo == null) {
             return null;
@@ -1940,7 +1960,7 @@
      * @param transition The Transition to use for shared elements transferred out of the content
      *                   Scene. <code>transition</code> must be an android.transition.Transition.
      */
-    public void setSharedElementReturnTransition(Object transition) {
+    public void setSharedElementReturnTransition(@Nullable Object transition) {
         ensureAnimationInfo().mSharedElementReturnTransition = transition;
     }
 
@@ -1956,6 +1976,7 @@
      * @return The Transition to use for shared elements transferred out of the content
      *                   Scene.
      */
+    @Nullable
     public Object getSharedElementReturnTransition() {
         if (mAnimationInfo == null) {
             return null;
@@ -2231,8 +2252,8 @@
         mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
     }
 
-    View performCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
+    View performCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+            @Nullable Bundle savedInstanceState) {
         if (mChildFragmentManager != null) {
             mChildFragmentManager.noteStateNotSaved();
         }
diff --git a/fragment/java/android/support/v4/app/FragmentActivity.java b/fragment/src/main/java/android/support/v4/app/FragmentActivity.java
similarity index 98%
rename from fragment/java/android/support/v4/app/FragmentActivity.java
rename to fragment/src/main/java/android/support/v4/app/FragmentActivity.java
index e513ff7..614ff35 100644
--- a/fragment/java/android/support/v4/app/FragmentActivity.java
+++ b/fragment/src/main/java/android/support/v4/app/FragmentActivity.java
@@ -153,6 +153,13 @@
             return;
         }
 
+        ActivityCompat.PermissionCompatDelegate delegate =
+                ActivityCompat.getPermissionCompatDelegate();
+        if (delegate != null && delegate.onActivityResult(this, requestCode, resultCode, data)) {
+            // Delegate has handled the activity result
+            return;
+        }
+
         super.onActivityResult(requestCode, resultCode, data);
     }
 
@@ -760,6 +767,7 @@
     @Override
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
             @NonNull int[] grantResults) {
+        mFragments.noteStateNotSaved();
         int index = (requestCode >> 16) & 0xffff;
         if (index != 0) {
             index--;
@@ -969,7 +977,11 @@
                 continue;
             }
             fragment.mLifecycleRegistry.markState(state);
-            markState(fragment.getChildFragmentManager(), state);
+
+            FragmentManager childFragmentManager = fragment.peekChildFragmentManager();
+            if (childFragmentManager != null) {
+                markState(childFragmentManager, state);
+            }
         }
     }
 }
diff --git a/fragment/java/android/support/v4/app/FragmentContainer.java b/fragment/src/main/java/android/support/v4/app/FragmentContainer.java
similarity index 100%
rename from fragment/java/android/support/v4/app/FragmentContainer.java
rename to fragment/src/main/java/android/support/v4/app/FragmentContainer.java
diff --git a/fragment/java/android/support/v4/app/FragmentController.java b/fragment/src/main/java/android/support/v4/app/FragmentController.java
similarity index 100%
rename from fragment/java/android/support/v4/app/FragmentController.java
rename to fragment/src/main/java/android/support/v4/app/FragmentController.java
diff --git a/fragment/java/android/support/v4/app/FragmentHostCallback.java b/fragment/src/main/java/android/support/v4/app/FragmentHostCallback.java
similarity index 98%
rename from fragment/java/android/support/v4/app/FragmentHostCallback.java
rename to fragment/src/main/java/android/support/v4/app/FragmentHostCallback.java
index 7dc9f59..eeae62a 100644
--- a/fragment/java/android/support/v4/app/FragmentHostCallback.java
+++ b/fragment/src/main/java/android/support/v4/app/FragmentHostCallback.java
@@ -94,8 +94,9 @@
      * Return a {@link LayoutInflater}.
      * See {@link Activity#getLayoutInflater()}.
      */
+    @NonNull
     public LayoutInflater onGetLayoutInflater() {
-        return (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        return LayoutInflater.from(mContext);
     }
 
     /**
diff --git a/fragment/java/android/support/v4/app/FragmentManager.java b/fragment/src/main/java/android/support/v4/app/FragmentManager.java
similarity index 99%
rename from fragment/java/android/support/v4/app/FragmentManager.java
rename to fragment/src/main/java/android/support/v4/app/FragmentManager.java
index 6e6caa0..16103f8 100644
--- a/fragment/java/android/support/v4/app/FragmentManager.java
+++ b/fragment/src/main/java/android/support/v4/app/FragmentManager.java
@@ -1605,12 +1605,21 @@
                 @Override
                 public void onAnimationEnd(Animation animation) {
                     super.onAnimationEnd(animation);
-                    container.endViewTransition(viewToAnimate);
+                    // onAnimationEnd() comes during draw(), so there can still be some
+                    // draw events happening after this call. We don't want to detach
+                    // the view until after the onAnimationEnd()
+                    container.post(new Runnable() {
+                        @Override
+                        public void run() {
+                            container.endViewTransition(viewToAnimate);
 
-                    if (fragment.getAnimatingAway() != null) {
-                        fragment.setAnimatingAway(null);
-                        moveToState(fragment, fragment.getStateAfterAnimating(), 0, 0, false);
-                    }
+                            if (fragment.getAnimatingAway() != null) {
+                                fragment.setAnimatingAway(null);
+                                moveToState(fragment, fragment.getStateAfterAnimating(), 0, 0,
+                                        false);
+                            }
+                        }
+                    });
                 }
             });
             setHWLayerAnimListenerIfAlpha(viewToAnimate, anim);
diff --git a/fragment/java/android/support/v4/app/FragmentManagerNonConfig.java b/fragment/src/main/java/android/support/v4/app/FragmentManagerNonConfig.java
similarity index 100%
rename from fragment/java/android/support/v4/app/FragmentManagerNonConfig.java
rename to fragment/src/main/java/android/support/v4/app/FragmentManagerNonConfig.java
diff --git a/fragment/java/android/support/v4/app/FragmentPagerAdapter.java b/fragment/src/main/java/android/support/v4/app/FragmentPagerAdapter.java
similarity index 94%
rename from fragment/java/android/support/v4/app/FragmentPagerAdapter.java
rename to fragment/src/main/java/android/support/v4/app/FragmentPagerAdapter.java
index 61b181d..6b25d2f 100644
--- a/fragment/java/android/support/v4/app/FragmentPagerAdapter.java
+++ b/fragment/src/main/java/android/support/v4/app/FragmentPagerAdapter.java
@@ -44,18 +44,18 @@
  * <p>Here is an example implementation of a pager containing fragments of
  * lists:
  *
- * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentPagerSupport.java
+ * {@sample frameworks/support/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentPagerSupport.java
  *      complete}
  *
  * <p>The <code>R.layout.fragment_pager</code> resource of the top-level fragment is:
  *
- * {@sample frameworks/support/samples/Support4Demos/res/layout/fragment_pager.xml
+ * {@sample frameworks/support/samples/Support4Demos/src/main/res/layout/fragment_pager.xml
  *      complete}
  *
  * <p>The <code>R.layout.fragment_pager_list</code> resource containing each
  * individual fragment's layout is:
  *
- * {@sample frameworks/support/samples/Support4Demos/res/layout/fragment_pager_list.xml
+ * {@sample frameworks/support/samples/Support4Demos/src/main/res/layout/fragment_pager_list.xml
  *      complete}
  */
 public abstract class FragmentPagerAdapter extends PagerAdapter {
diff --git a/fragment/java/android/support/v4/app/FragmentState.java b/fragment/src/main/java/android/support/v4/app/FragmentState.java
similarity index 100%
rename from fragment/java/android/support/v4/app/FragmentState.java
rename to fragment/src/main/java/android/support/v4/app/FragmentState.java
diff --git a/fragment/java/android/support/v4/app/FragmentStatePagerAdapter.java b/fragment/src/main/java/android/support/v4/app/FragmentStatePagerAdapter.java
similarity index 95%
rename from fragment/java/android/support/v4/app/FragmentStatePagerAdapter.java
rename to fragment/src/main/java/android/support/v4/app/FragmentStatePagerAdapter.java
index fc27c4f..040f2db 100644
--- a/fragment/java/android/support/v4/app/FragmentStatePagerAdapter.java
+++ b/fragment/src/main/java/android/support/v4/app/FragmentStatePagerAdapter.java
@@ -47,18 +47,18 @@
  * <p>Here is an example implementation of a pager containing fragments of
  * lists:
  *
- * {@sample frameworks/support/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentStatePagerSupport.java
+ * {@sample frameworks/support/samples/Support13Demos/src/main/java/com/example/android/supportv13/app/FragmentStatePagerSupport.java
  *      complete}
  *
  * <p>The <code>R.layout.fragment_pager</code> resource of the top-level fragment is:
  *
- * {@sample frameworks/support/samples/Support13Demos/res/layout/fragment_pager.xml
+ * {@sample frameworks/support/samples/Support13Demos/src/main/res/layout/fragment_pager.xml
  *      complete}
  *
  * <p>The <code>R.layout.fragment_pager_list</code> resource containing each
  * individual fragment's layout is:
  *
- * {@sample frameworks/support/samples/Support13Demos/res/layout/fragment_pager_list.xml
+ * {@sample frameworks/support/samples/Support13Demos/src/main/res/layout/fragment_pager_list.xml
  *      complete}
  */
 public abstract class FragmentStatePagerAdapter extends PagerAdapter {
diff --git a/fragment/java/android/support/v4/app/FragmentTabHost.java b/fragment/src/main/java/android/support/v4/app/FragmentTabHost.java
similarity index 97%
rename from fragment/java/android/support/v4/app/FragmentTabHost.java
rename to fragment/src/main/java/android/support/v4/app/FragmentTabHost.java
index 09b89b7..6b914fe 100644
--- a/fragment/java/android/support/v4/app/FragmentTabHost.java
+++ b/fragment/src/main/java/android/support/v4/app/FragmentTabHost.java
@@ -41,12 +41,12 @@
  *
  * <p>Here is a simple example of using a FragmentTabHost in an Activity:
  *
- * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabs.java
+ * {@sample frameworks/support/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentTabs.java
  *      complete}
  *
  * <p>This can also be used inside of a fragment through fragment nesting:
  *
- * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsFragmentSupport.java
+ * {@sample frameworks/support/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentTabsFragmentSupport.java
  *      complete}
  */
 public class FragmentTabHost extends TabHost
diff --git a/fragment/java/android/support/v4/app/FragmentTransaction.java b/fragment/src/main/java/android/support/v4/app/FragmentTransaction.java
similarity index 100%
rename from fragment/java/android/support/v4/app/FragmentTransaction.java
rename to fragment/src/main/java/android/support/v4/app/FragmentTransaction.java
diff --git a/fragment/java/android/support/v4/app/FragmentTransition.java b/fragment/src/main/java/android/support/v4/app/FragmentTransition.java
similarity index 100%
rename from fragment/java/android/support/v4/app/FragmentTransition.java
rename to fragment/src/main/java/android/support/v4/app/FragmentTransition.java
diff --git a/fragment/java/android/support/v4/app/FragmentTransitionCompat21.java b/fragment/src/main/java/android/support/v4/app/FragmentTransitionCompat21.java
similarity index 100%
rename from fragment/java/android/support/v4/app/FragmentTransitionCompat21.java
rename to fragment/src/main/java/android/support/v4/app/FragmentTransitionCompat21.java
diff --git a/fragment/java/android/support/v4/app/FragmentTransitionImpl.java b/fragment/src/main/java/android/support/v4/app/FragmentTransitionImpl.java
similarity index 100%
rename from fragment/java/android/support/v4/app/FragmentTransitionImpl.java
rename to fragment/src/main/java/android/support/v4/app/FragmentTransitionImpl.java
diff --git a/fragment/java/android/support/v4/app/ListFragment.java b/fragment/src/main/java/android/support/v4/app/ListFragment.java
similarity index 98%
rename from fragment/java/android/support/v4/app/ListFragment.java
rename to fragment/src/main/java/android/support/v4/app/ListFragment.java
index 21617ad..496bd8e 100644
--- a/fragment/java/android/support/v4/app/ListFragment.java
+++ b/fragment/src/main/java/android/support/v4/app/ListFragment.java
@@ -19,6 +19,8 @@
 import android.content.Context;
 import android.os.Bundle;
 import android.os.Handler;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -142,7 +144,7 @@
      * Attach to list view once the view hierarchy has been created.
      */
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         ensureList();
     }
diff --git a/fragment/java/android/support/v4/app/LoaderManager.java b/fragment/src/main/java/android/support/v4/app/LoaderManager.java
similarity index 100%
rename from fragment/java/android/support/v4/app/LoaderManager.java
rename to fragment/src/main/java/android/support/v4/app/LoaderManager.java
diff --git a/fragment/java/android/support/v4/app/OneShotPreDrawListener.java b/fragment/src/main/java/android/support/v4/app/OneShotPreDrawListener.java
similarity index 100%
rename from fragment/java/android/support/v4/app/OneShotPreDrawListener.java
rename to fragment/src/main/java/android/support/v4/app/OneShotPreDrawListener.java
diff --git a/fragment/java/android/support/v4/app/SuperNotCalledException.java b/fragment/src/main/java/android/support/v4/app/SuperNotCalledException.java
similarity index 100%
rename from fragment/java/android/support/v4/app/SuperNotCalledException.java
rename to fragment/src/main/java/android/support/v4/app/SuperNotCalledException.java
diff --git a/fragment/java/android/support/v4/app/package.html b/fragment/src/main/java/android/support/v4/app/package.html
similarity index 100%
rename from fragment/java/android/support/v4/app/package.html
rename to fragment/src/main/java/android/support/v4/app/package.html
diff --git a/fragment/tests/AndroidManifest.xml b/fragment/tests/AndroidManifest.xml
index e6a520e..4b38f23 100644
--- a/fragment/tests/AndroidManifest.xml
+++ b/fragment/tests/AndroidManifest.xml
@@ -38,6 +38,7 @@
                   android:launchMode="singleInstance"/>
 
         <activity android:name="android.support.v4.app.test.NonConfigOnStopActivity"/>
+        <activity android:name="android.support.v4.app.test.HangingFragmentActivity"/>
     </application>
 
 </manifest>
diff --git a/fragment/tests/java/android/support/v4/app/FragmentReceiveResultTest.java b/fragment/tests/java/android/support/v4/app/FragmentReceiveResultTest.java
index 6a8ac05..f1fb929 100644
--- a/fragment/tests/java/android/support/v4/app/FragmentReceiveResultTest.java
+++ b/fragment/tests/java/android/support/v4/app/FragmentReceiveResultTest.java
@@ -19,6 +19,12 @@
 import static junit.framework.TestCase.assertTrue;
 import static junit.framework.TestCase.fail;
 
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.same;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
 import android.app.Activity;
 import android.app.PendingIntent;
 import android.content.Intent;
@@ -102,6 +108,25 @@
         assertEquals("content 40", mFragment.mResultContent);
     }
 
+    @Test
+    @SmallTest
+    public void testActivityResult_withDelegate() {
+        ActivityCompat.PermissionCompatDelegate
+                delegate = mock(ActivityCompat.PermissionCompatDelegate.class);
+
+        Intent data = new Intent();
+        ActivityCompat.setPermissionCompatDelegate(delegate);
+
+        mActivityRule.getActivity().onActivityResult(42, 43, data);
+
+        verify(delegate).onActivityResult(same(mActivityRule.getActivity()), eq(42), eq(43),
+                same(data));
+
+        ActivityCompat.setPermissionCompatDelegate(null);
+        mActivityRule.getActivity().onActivityResult(42, 43, data);
+        verifyNoMoreInteractions(delegate);
+    }
+
     private TestFragment attachTestFragment() throws Throwable {
         final TestFragment fragment = new TestFragment();
         mActivityRule.runOnUiThread(new Runnable() {
diff --git a/fragment/tests/java/android/support/v4/app/HangingFragmentTest.java b/fragment/tests/java/android/support/v4/app/HangingFragmentTest.java
new file mode 100644
index 0000000..e124b67
--- /dev/null
+++ b/fragment/tests/java/android/support/v4/app/HangingFragmentTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.app;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.app.test.HangingFragmentActivity;
+
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class HangingFragmentTest {
+
+    @Rule
+    public ActivityTestRule<HangingFragmentActivity> mActivityRule =
+            new ActivityTestRule<>(HangingFragmentActivity.class);
+
+    @Test
+    public void testNoCrash() throws InterruptedException {
+        HangingFragmentActivity newActivity = FragmentTestUtil.recreateActivity(
+                mActivityRule, mActivityRule.getActivity());
+        Assert.assertNotNull(newActivity);
+    }
+}
diff --git a/fragment/tests/java/android/support/v4/app/test/HangingFragmentActivity.java b/fragment/tests/java/android/support/v4/app/test/HangingFragmentActivity.java
new file mode 100644
index 0000000..9fab4df
--- /dev/null
+++ b/fragment/tests/java/android/support/v4/app/test/HangingFragmentActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.app.test;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.fragment.test.R;
+
+public class HangingFragmentActivity extends RecreatedActivity {
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(savedInstanceState == null ? R.layout.activity_inflated_fragment
+                : R.layout.activity_content);
+    }
+}
diff --git a/fragment/tests/res/layout/activity_inflated_fragment.xml b/fragment/tests/res/layout/activity_inflated_fragment.xml
new file mode 100644
index 0000000..867c96c
--- /dev/null
+++ b/fragment/tests/res/layout/activity_inflated_fragment.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+    <fragment android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:id="@+id/inflated_fragment"
+              android:name="android.support.v4.app.StrictViewFragment"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/graphics/OWNERS b/graphics/OWNERS
new file mode 100644
index 0000000..4e6deac
--- /dev/null
+++ b/graphics/OWNERS
@@ -0,0 +1 @@
+ztenghui@google.com
\ No newline at end of file
diff --git a/graphics/drawable/Android.mk b/graphics/drawable/Android.mk
index b06fd76..b1f0b38 100644
--- a/graphics/drawable/Android.mk
+++ b/graphics/drawable/Android.mk
@@ -23,7 +23,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-vectordrawable
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, static/src)
+LOCAL_SRC_FILES := $(call all-java-files-under, static/src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/static/res
 LOCAL_MANIFEST_FILE := static/AndroidManifest.xml
 LOCAL_SHARED_ANDROID_LIBRARIES := \
@@ -42,7 +42,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-animatedvectordrawable
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, animated/src)
+LOCAL_SRC_FILES := $(call all-java-files-under, animated/src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/animated/res
 LOCAL_MANIFEST_FILE := animated/AndroidManifest.xml
 LOCAL_SHARED_ANDROID_LIBRARIES := \
diff --git a/graphics/drawable/AndroidManifest.xml b/graphics/drawable/AndroidManifest.xml
deleted file mode 100644
index 83124c7..0000000
--- a/graphics/drawable/AndroidManifest.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?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/animated/AndroidManifest.xml b/graphics/drawable/animated/AndroidManifest.xml
index ec4a4a6..166b786 100644
--- a/graphics/drawable/animated/AndroidManifest.xml
+++ b/graphics/drawable/animated/AndroidManifest.xml
@@ -16,8 +16,4 @@
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.graphics.drawable.animated">
-    <application>
-        <meta-data android:name="android.support.graphics.drawable.animated.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/graphics/drawable/animated/api/26.1.0.txt b/graphics/drawable/animated/api/26.1.0.txt
new file mode 100644
index 0000000..f2601de
--- /dev/null
+++ b/graphics/drawable/animated/api/26.1.0.txt
@@ -0,0 +1,34 @@
+package android.support.graphics.drawable {
+
+  public abstract interface Animatable2Compat {
+    method public abstract void clearAnimationCallbacks();
+    method public abstract void registerAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+    method public abstract boolean unregisterAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+  }
+
+  public static abstract class Animatable2Compat.AnimationCallback {
+    ctor public Animatable2Compat.AnimationCallback();
+    method public void onAnimationEnd(android.graphics.drawable.Drawable);
+    method public void onAnimationStart(android.graphics.drawable.Drawable);
+  }
+
+  public class AnimatedVectorDrawableCompat extends android.support.graphics.drawable.VectorDrawableCommon implements android.support.graphics.drawable.Animatable2Compat {
+    method public void clearAnimationCallbacks();
+    method public static void clearAnimationCallbacks(android.graphics.drawable.Drawable);
+    method public static android.support.graphics.drawable.AnimatedVectorDrawableCompat create(android.content.Context, int);
+    method public static android.support.graphics.drawable.AnimatedVectorDrawableCompat createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public void draw(android.graphics.Canvas);
+    method public int getOpacity();
+    method public boolean isRunning();
+    method public void registerAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+    method public static void registerAnimationCallback(android.graphics.drawable.Drawable, android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void start();
+    method public void stop();
+    method public boolean unregisterAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+    method public static boolean unregisterAnimationCallback(android.graphics.drawable.Drawable, android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+  }
+
+}
+
diff --git a/graphics/drawable/animated/api/27.0.0.txt b/graphics/drawable/animated/api/27.0.0.txt
new file mode 100644
index 0000000..f2601de
--- /dev/null
+++ b/graphics/drawable/animated/api/27.0.0.txt
@@ -0,0 +1,34 @@
+package android.support.graphics.drawable {
+
+  public abstract interface Animatable2Compat {
+    method public abstract void clearAnimationCallbacks();
+    method public abstract void registerAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+    method public abstract boolean unregisterAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+  }
+
+  public static abstract class Animatable2Compat.AnimationCallback {
+    ctor public Animatable2Compat.AnimationCallback();
+    method public void onAnimationEnd(android.graphics.drawable.Drawable);
+    method public void onAnimationStart(android.graphics.drawable.Drawable);
+  }
+
+  public class AnimatedVectorDrawableCompat extends android.support.graphics.drawable.VectorDrawableCommon implements android.support.graphics.drawable.Animatable2Compat {
+    method public void clearAnimationCallbacks();
+    method public static void clearAnimationCallbacks(android.graphics.drawable.Drawable);
+    method public static android.support.graphics.drawable.AnimatedVectorDrawableCompat create(android.content.Context, int);
+    method public static android.support.graphics.drawable.AnimatedVectorDrawableCompat createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public void draw(android.graphics.Canvas);
+    method public int getOpacity();
+    method public boolean isRunning();
+    method public void registerAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+    method public static void registerAnimationCallback(android.graphics.drawable.Drawable, android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void start();
+    method public void stop();
+    method public boolean unregisterAnimationCallback(android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+    method public static boolean unregisterAnimationCallback(android.graphics.drawable.Drawable, android.support.graphics.drawable.Animatable2Compat.AnimationCallback);
+  }
+
+}
+
diff --git a/graphics/drawable/animated/build.gradle b/graphics/drawable/animated/build.gradle
index 29aeb3b..6036284 100644
--- a/graphics/drawable/animated/build.gradle
+++ b/graphics/drawable/animated/build.gradle
@@ -15,10 +15,6 @@
         generatedDensities = []
     }
 
-    sourceSets {
-        main.java.srcDir 'src'
-    }
-
     aaptOptions {
         additionalParameters "--no-version-vectors"
     }
diff --git a/graphics/drawable/animated/lint-baseline.xml b/graphics/drawable/animated/lint-baseline.xml
index eab8464..9fbd83c 100644
--- a/graphics/drawable/animated/lint-baseline.xml
+++ b/graphics/drawable/animated/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 3.0.0-alpha9">
+<issues format="4" by="lint 3.0.0-beta6">
 
     <issue
         id="ResourceType"
@@ -7,7 +7,7 @@
         errorLine1="            parser = resources.getAnimation(id);"
         errorLine2="                                            ~~">
         <location
-            file="src/android/support/graphics/drawable/AnimatorInflaterCompat.java"
+            file="src/main/java/android/support/graphics/drawable/AnimatorInflaterCompat.java"
             line="130"
             column="45"/>
     </issue>
diff --git a/graphics/drawable/animated/src/android/support/graphics/drawable/Animatable2Compat.java b/graphics/drawable/animated/src/main/java/android/support/graphics/drawable/Animatable2Compat.java
similarity index 100%
rename from graphics/drawable/animated/src/android/support/graphics/drawable/Animatable2Compat.java
rename to graphics/drawable/animated/src/main/java/android/support/graphics/drawable/Animatable2Compat.java
diff --git a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java b/graphics/drawable/animated/src/main/java/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
similarity index 100%
rename from graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
rename to graphics/drawable/animated/src/main/java/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
diff --git a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimationUtilsCompat.java b/graphics/drawable/animated/src/main/java/android/support/graphics/drawable/AnimationUtilsCompat.java
similarity index 100%
rename from graphics/drawable/animated/src/android/support/graphics/drawable/AnimationUtilsCompat.java
rename to graphics/drawable/animated/src/main/java/android/support/graphics/drawable/AnimationUtilsCompat.java
diff --git a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatorInflaterCompat.java b/graphics/drawable/animated/src/main/java/android/support/graphics/drawable/AnimatorInflaterCompat.java
similarity index 100%
rename from graphics/drawable/animated/src/android/support/graphics/drawable/AnimatorInflaterCompat.java
rename to graphics/drawable/animated/src/main/java/android/support/graphics/drawable/AnimatorInflaterCompat.java
diff --git a/graphics/drawable/animated/src/android/support/graphics/drawable/ArgbEvaluator.java b/graphics/drawable/animated/src/main/java/android/support/graphics/drawable/ArgbEvaluator.java
similarity index 100%
rename from graphics/drawable/animated/src/android/support/graphics/drawable/ArgbEvaluator.java
rename to graphics/drawable/animated/src/main/java/android/support/graphics/drawable/ArgbEvaluator.java
diff --git a/graphics/drawable/animated/src/android/support/graphics/drawable/PathInterpolatorCompat.java b/graphics/drawable/animated/src/main/java/android/support/graphics/drawable/PathInterpolatorCompat.java
similarity index 100%
rename from graphics/drawable/animated/src/android/support/graphics/drawable/PathInterpolatorCompat.java
rename to graphics/drawable/animated/src/main/java/android/support/graphics/drawable/PathInterpolatorCompat.java
diff --git a/graphics/drawable/static/AndroidManifest.xml b/graphics/drawable/static/AndroidManifest.xml
index d8427ca..97b2f72 100644
--- a/graphics/drawable/static/AndroidManifest.xml
+++ b/graphics/drawable/static/AndroidManifest.xml
@@ -16,8 +16,4 @@
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="android.support.graphics.drawable">
-    <application>
-        <meta-data android:name="android.support.graphics.drawable.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/graphics/drawable/static/api/26.1.0.txt b/graphics/drawable/static/api/26.1.0.txt
new file mode 100644
index 0000000..db07bf2
--- /dev/null
+++ b/graphics/drawable/static/api/26.1.0.txt
@@ -0,0 +1,16 @@
+package android.support.graphics.drawable {
+
+   abstract class VectorDrawableCommon extends android.graphics.drawable.Drawable {
+  }
+
+  public class VectorDrawableCompat extends android.support.graphics.drawable.VectorDrawableCommon {
+    method public static android.support.graphics.drawable.VectorDrawableCompat create(android.content.res.Resources, int, android.content.res.Resources.Theme);
+    method public static android.support.graphics.drawable.VectorDrawableCompat createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public void draw(android.graphics.Canvas);
+    method public int getOpacity();
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter);
+  }
+
+}
+
diff --git a/graphics/drawable/static/api/27.0.0.txt b/graphics/drawable/static/api/27.0.0.txt
new file mode 100644
index 0000000..db07bf2
--- /dev/null
+++ b/graphics/drawable/static/api/27.0.0.txt
@@ -0,0 +1,16 @@
+package android.support.graphics.drawable {
+
+   abstract class VectorDrawableCommon extends android.graphics.drawable.Drawable {
+  }
+
+  public class VectorDrawableCompat extends android.support.graphics.drawable.VectorDrawableCommon {
+    method public static android.support.graphics.drawable.VectorDrawableCompat create(android.content.res.Resources, int, android.content.res.Resources.Theme);
+    method public static android.support.graphics.drawable.VectorDrawableCompat createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public void draw(android.graphics.Canvas);
+    method public int getOpacity();
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter);
+  }
+
+}
+
diff --git a/graphics/drawable/static/build.gradle b/graphics/drawable/static/build.gradle
index ee24ad5..949ba89 100644
--- a/graphics/drawable/static/build.gradle
+++ b/graphics/drawable/static/build.gradle
@@ -14,10 +14,6 @@
         generatedDensities = []
     }
 
-    sourceSets {
-        main.java.srcDir 'src'
-    }
-
     aaptOptions {
         additionalParameters "--no-version-vectors"
     }
diff --git a/graphics/drawable/static/src/android/support/graphics/drawable/AndroidResources.java b/graphics/drawable/static/src/main/java/android/support/graphics/drawable/AndroidResources.java
similarity index 100%
rename from graphics/drawable/static/src/android/support/graphics/drawable/AndroidResources.java
rename to graphics/drawable/static/src/main/java/android/support/graphics/drawable/AndroidResources.java
diff --git a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCommon.java b/graphics/drawable/static/src/main/java/android/support/graphics/drawable/VectorDrawableCommon.java
similarity index 100%
rename from graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCommon.java
rename to graphics/drawable/static/src/main/java/android/support/graphics/drawable/VectorDrawableCommon.java
diff --git a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java b/graphics/drawable/static/src/main/java/android/support/graphics/drawable/VectorDrawableCompat.java
similarity index 100%
rename from graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
rename to graphics/drawable/static/src/main/java/android/support/graphics/drawable/VectorDrawableCompat.java
diff --git a/lifecycle/OWNERS b/lifecycle/OWNERS
new file mode 100644
index 0000000..fc51372
--- /dev/null
+++ b/lifecycle/OWNERS
@@ -0,0 +1,2 @@
+sergeyv@google.com
+yboyar@google.com
\ No newline at end of file
diff --git a/lifecycle/common-java8/src/main/java/android/arch/lifecycle/DefaultLifecycleObserver.java b/lifecycle/common-java8/src/main/java/android/arch/lifecycle/DefaultLifecycleObserver.java
index 77a7dfd..b6f468c 100644
--- a/lifecycle/common-java8/src/main/java/android/arch/lifecycle/DefaultLifecycleObserver.java
+++ b/lifecycle/common-java8/src/main/java/android/arch/lifecycle/DefaultLifecycleObserver.java
@@ -16,6 +16,8 @@
 
 package android.arch.lifecycle;
 
+import android.support.annotation.NonNull;
+
 /**
  * Callback interface for listening to {@link LifecycleOwner} state changes.
  * <p>
@@ -33,7 +35,7 @@
      * @param owner the component, whose state was changed
      */
     @Override
-    default void onCreate(LifecycleOwner owner) {
+    default void onCreate(@NonNull LifecycleOwner owner) {
     }
 
     /**
@@ -44,7 +46,7 @@
      * @param owner the component, whose state was changed
      */
     @Override
-    default void onStart(LifecycleOwner owner) {
+    default void onStart(@NonNull LifecycleOwner owner) {
     }
 
     /**
@@ -56,7 +58,7 @@
      * @param owner the component, whose state was changed
      */
     @Override
-    default void onResume(LifecycleOwner owner) {
+    default void onResume(@NonNull LifecycleOwner owner) {
     }
 
     /**
@@ -68,7 +70,7 @@
      * @param owner the component, whose state was changed
      */
     @Override
-    default void onPause(LifecycleOwner owner) {
+    default void onPause(@NonNull LifecycleOwner owner) {
     }
 
     /**
@@ -80,7 +82,7 @@
      * @param owner the component, whose state was changed
      */
     @Override
-    default void onStop(LifecycleOwner owner) {
+    default void onStop(@NonNull LifecycleOwner owner) {
     }
 
     /**
@@ -92,7 +94,7 @@
      * @param owner the component, whose state was changed
      */
     @Override
-    default void onDestroy(LifecycleOwner owner) {
+    default void onDestroy(@NonNull LifecycleOwner owner) {
     }
 }
 
diff --git a/lifecycle/common/src/main/java/android/arch/lifecycle/ClassesInfoCache.java b/lifecycle/common/src/main/java/android/arch/lifecycle/ClassesInfoCache.java
new file mode 100644
index 0000000..d88e276
--- /dev/null
+++ b/lifecycle/common/src/main/java/android/arch/lifecycle/ClassesInfoCache.java
@@ -0,0 +1,249 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle;
+
+import android.support.annotation.Nullable;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Reflection is expensive, so we cache information about methods
+ * for {@link ReflectiveGenericLifecycleObserver}, so it can call them,
+ * and for {@link Lifecycling} to determine which observer adapter to use.
+ */
+class ClassesInfoCache {
+
+    static ClassesInfoCache sInstance = new ClassesInfoCache();
+
+    private static final int CALL_TYPE_NO_ARG = 0;
+    private static final int CALL_TYPE_PROVIDER = 1;
+    private static final int CALL_TYPE_PROVIDER_WITH_EVENT = 2;
+
+    private final Map<Class, CallbackInfo> mCallbackMap = new HashMap<>();
+    private final Map<Class, Boolean> mHasLifecycleMethods = new HashMap<>();
+
+    boolean hasLifecycleMethods(Class klass) {
+        if (mHasLifecycleMethods.containsKey(klass)) {
+            return mHasLifecycleMethods.get(klass);
+        }
+
+        Method[] methods = getDeclaredMethods(klass);
+        for (Method method : methods) {
+            OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class);
+            if (annotation != null) {
+                // Optimization for reflection, we know that this method is called
+                // when there is no generated adapter. But there are methods with @OnLifecycleEvent
+                // so we know that will use ReflectiveGenericLifecycleObserver,
+                // so we createInfo in advance.
+                // CreateInfo always initialize mHasLifecycleMethods for a class, so we don't do it
+                // here.
+                createInfo(klass, methods);
+                return true;
+            }
+        }
+        mHasLifecycleMethods.put(klass, false);
+        return false;
+    }
+
+    private Method[] getDeclaredMethods(Class klass) {
+        try {
+            return klass.getDeclaredMethods();
+        } catch (NoClassDefFoundError e) {
+            throw new IllegalArgumentException("The observer class has some methods that use "
+                    + "newer APIs which are not available in the current OS version. Lifecycles "
+                    + "cannot access even other methods so you should make sure that your "
+                    + "observer classes only access framework classes that are available "
+                    + "in your min API level OR use lifecycle:compiler annotation processor.", e);
+        }
+    }
+
+    CallbackInfo getInfo(Class klass) {
+        CallbackInfo existing = mCallbackMap.get(klass);
+        if (existing != null) {
+            return existing;
+        }
+        existing = createInfo(klass, null);
+        return existing;
+    }
+
+    private void verifyAndPutHandler(Map<MethodReference, Lifecycle.Event> handlers,
+            MethodReference newHandler, Lifecycle.Event newEvent, Class klass) {
+        Lifecycle.Event event = handlers.get(newHandler);
+        if (event != null && newEvent != event) {
+            Method method = newHandler.mMethod;
+            throw new IllegalArgumentException(
+                    "Method " + method.getName() + " in " + klass.getName()
+                            + " already declared with different @OnLifecycleEvent value: previous"
+                            + " value " + event + ", new value " + newEvent);
+        }
+        if (event == null) {
+            handlers.put(newHandler, newEvent);
+        }
+    }
+
+    private CallbackInfo createInfo(Class klass, @Nullable Method[] declaredMethods) {
+        Class superclass = klass.getSuperclass();
+        Map<MethodReference, Lifecycle.Event> handlerToEvent = new HashMap<>();
+        if (superclass != null) {
+            CallbackInfo superInfo = getInfo(superclass);
+            if (superInfo != null) {
+                handlerToEvent.putAll(superInfo.mHandlerToEvent);
+            }
+        }
+
+        Class[] interfaces = klass.getInterfaces();
+        for (Class intrfc : interfaces) {
+            for (Map.Entry<MethodReference, Lifecycle.Event> entry : getInfo(
+                    intrfc).mHandlerToEvent.entrySet()) {
+                verifyAndPutHandler(handlerToEvent, entry.getKey(), entry.getValue(), klass);
+            }
+        }
+
+        Method[] methods = declaredMethods != null ? declaredMethods : getDeclaredMethods(klass);
+        boolean hasLifecycleMethods = false;
+        for (Method method : methods) {
+            OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class);
+            if (annotation == null) {
+                continue;
+            }
+            hasLifecycleMethods = true;
+            Class<?>[] params = method.getParameterTypes();
+            int callType = CALL_TYPE_NO_ARG;
+            if (params.length > 0) {
+                callType = CALL_TYPE_PROVIDER;
+                if (!params[0].isAssignableFrom(LifecycleOwner.class)) {
+                    throw new IllegalArgumentException(
+                            "invalid parameter type. Must be one and instanceof LifecycleOwner");
+                }
+            }
+            Lifecycle.Event event = annotation.value();
+
+            if (params.length > 1) {
+                callType = CALL_TYPE_PROVIDER_WITH_EVENT;
+                if (!params[1].isAssignableFrom(Lifecycle.Event.class)) {
+                    throw new IllegalArgumentException(
+                            "invalid parameter type. second arg must be an event");
+                }
+                if (event != Lifecycle.Event.ON_ANY) {
+                    throw new IllegalArgumentException(
+                            "Second arg is supported only for ON_ANY value");
+                }
+            }
+            if (params.length > 2) {
+                throw new IllegalArgumentException("cannot have more than 2 params");
+            }
+            MethodReference methodReference = new MethodReference(callType, method);
+            verifyAndPutHandler(handlerToEvent, methodReference, event, klass);
+        }
+        CallbackInfo info = new CallbackInfo(handlerToEvent);
+        mCallbackMap.put(klass, info);
+        mHasLifecycleMethods.put(klass, hasLifecycleMethods);
+        return info;
+    }
+
+    @SuppressWarnings("WeakerAccess")
+    static class CallbackInfo {
+        final Map<Lifecycle.Event, List<MethodReference>> mEventToHandlers;
+        final Map<MethodReference, Lifecycle.Event> mHandlerToEvent;
+
+        CallbackInfo(Map<MethodReference, Lifecycle.Event> handlerToEvent) {
+            mHandlerToEvent = handlerToEvent;
+            mEventToHandlers = new HashMap<>();
+            for (Map.Entry<MethodReference, Lifecycle.Event> entry : handlerToEvent.entrySet()) {
+                Lifecycle.Event event = entry.getValue();
+                List<MethodReference> methodReferences = mEventToHandlers.get(event);
+                if (methodReferences == null) {
+                    methodReferences = new ArrayList<>();
+                    mEventToHandlers.put(event, methodReferences);
+                }
+                methodReferences.add(entry.getKey());
+            }
+        }
+
+        @SuppressWarnings("ConstantConditions")
+        void invokeCallbacks(LifecycleOwner source, Lifecycle.Event event, Object target) {
+            invokeMethodsForEvent(mEventToHandlers.get(event), source, event, target);
+            invokeMethodsForEvent(mEventToHandlers.get(Lifecycle.Event.ON_ANY), source, event,
+                    target);
+        }
+
+        private static void invokeMethodsForEvent(List<MethodReference> handlers,
+                LifecycleOwner source, Lifecycle.Event event, Object mWrapped) {
+            if (handlers != null) {
+                for (int i = handlers.size() - 1; i >= 0; i--) {
+                    handlers.get(i).invokeCallback(source, event, mWrapped);
+                }
+            }
+        }
+    }
+
+    @SuppressWarnings("WeakerAccess")
+    static class MethodReference {
+        final int mCallType;
+        final Method mMethod;
+
+        MethodReference(int callType, Method method) {
+            mCallType = callType;
+            mMethod = method;
+            mMethod.setAccessible(true);
+        }
+
+        void invokeCallback(LifecycleOwner source, Lifecycle.Event event, Object target) {
+            //noinspection TryWithIdenticalCatches
+            try {
+                switch (mCallType) {
+                    case CALL_TYPE_NO_ARG:
+                        mMethod.invoke(target);
+                        break;
+                    case CALL_TYPE_PROVIDER:
+                        mMethod.invoke(target, source);
+                        break;
+                    case CALL_TYPE_PROVIDER_WITH_EVENT:
+                        mMethod.invoke(target, source, event);
+                        break;
+                }
+            } catch (InvocationTargetException e) {
+                throw new RuntimeException("Failed to call observer method", e.getCause());
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass()) {
+                return false;
+            }
+
+            MethodReference that = (MethodReference) o;
+            return mCallType == that.mCallType && mMethod.getName().equals(that.mMethod.getName());
+        }
+
+        @Override
+        public int hashCode() {
+            return 31 * mCallType + mMethod.getName().hashCode();
+        }
+    }
+}
diff --git a/lifecycle/common/src/main/java/android/arch/lifecycle/CompositeGeneratedAdaptersObserver.java b/lifecycle/common/src/main/java/android/arch/lifecycle/CompositeGeneratedAdaptersObserver.java
new file mode 100644
index 0000000..e8cbe7c
--- /dev/null
+++ b/lifecycle/common/src/main/java/android/arch/lifecycle/CompositeGeneratedAdaptersObserver.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle;
+
+
+import android.support.annotation.RestrictTo;
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class CompositeGeneratedAdaptersObserver implements GenericLifecycleObserver {
+
+    private final GeneratedAdapter[] mGeneratedAdapters;
+
+    CompositeGeneratedAdaptersObserver(GeneratedAdapter[] generatedAdapters) {
+        mGeneratedAdapters = generatedAdapters;
+    }
+
+    @Override
+    public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
+        MethodCallsLogger logger = new MethodCallsLogger();
+        for (GeneratedAdapter mGenerated: mGeneratedAdapters) {
+            mGenerated.callMethods(source, event, false, logger);
+        }
+        for (GeneratedAdapter mGenerated: mGeneratedAdapters) {
+            mGenerated.callMethods(source, event, true, logger);
+        }
+    }
+}
diff --git a/lifecycle/common/src/main/java/android/arch/lifecycle/GeneratedAdapter.java b/lifecycle/common/src/main/java/android/arch/lifecycle/GeneratedAdapter.java
new file mode 100644
index 0000000..a8862da
--- /dev/null
+++ b/lifecycle/common/src/main/java/android/arch/lifecycle/GeneratedAdapter.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle;
+
+import android.support.annotation.RestrictTo;
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public interface GeneratedAdapter {
+
+    /**
+     * Called when a state transition event happens.
+     *
+     * @param source The source of the event
+     * @param event The event
+     * @param onAny approveCall onAny handlers
+     * @param logger if passed, used to track called methods and prevent calling the same method
+     *              twice
+     */
+    void callMethods(LifecycleOwner source, Lifecycle.Event event, boolean onAny,
+            MethodCallsLogger logger);
+}
diff --git a/lifecycle/common/src/main/java/android/arch/lifecycle/Lifecycle.java b/lifecycle/common/src/main/java/android/arch/lifecycle/Lifecycle.java
index 02db5ff..c0a2090 100644
--- a/lifecycle/common/src/main/java/android/arch/lifecycle/Lifecycle.java
+++ b/lifecycle/common/src/main/java/android/arch/lifecycle/Lifecycle.java
@@ -17,6 +17,7 @@
 package android.arch.lifecycle;
 
 import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
 
 /**
  * Defines an object that has an Android Lifecycle. {@link android.support.v4.app.Fragment Fragment}
@@ -83,7 +84,7 @@
      * @param observer The observer to notify.
      */
     @MainThread
-    public abstract void addObserver(LifecycleObserver observer);
+    public abstract void addObserver(@NonNull LifecycleObserver observer);
 
     /**
      * Removes the given observer from the observers list.
@@ -99,7 +100,7 @@
      * @param observer The observer to be removed.
      */
     @MainThread
-    public abstract void removeObserver(LifecycleObserver observer);
+    public abstract void removeObserver(@NonNull LifecycleObserver observer);
 
     /**
      * Returns the current state of the Lifecycle.
@@ -193,7 +194,7 @@
          * @param state State to compare with
          * @return true if this State is greater or equal to the given {@code state}
          */
-        public boolean isAtLeast(State state) {
+        public boolean isAtLeast(@NonNull State state) {
             return compareTo(state) >= 0;
         }
     }
diff --git a/lifecycle/common/src/main/java/android/arch/lifecycle/LifecycleOwner.java b/lifecycle/common/src/main/java/android/arch/lifecycle/LifecycleOwner.java
index 934cf3a..068bac1 100644
--- a/lifecycle/common/src/main/java/android/arch/lifecycle/LifecycleOwner.java
+++ b/lifecycle/common/src/main/java/android/arch/lifecycle/LifecycleOwner.java
@@ -16,6 +16,8 @@
 
 package android.arch.lifecycle;
 
+import android.support.annotation.NonNull;
+
 /**
  * A class that has an Android lifecycle. These events can be used by custom components to
  * handle lifecycle changes without implementing any code inside the Activity or the Fragment.
@@ -29,5 +31,6 @@
      *
      * @return The lifecycle of the provider.
      */
+    @NonNull
     Lifecycle getLifecycle();
 }
diff --git a/lifecycle/common/src/main/java/android/arch/lifecycle/Lifecycling.java b/lifecycle/common/src/main/java/android/arch/lifecycle/Lifecycling.java
index 0dfa2e1..7d6b37f 100644
--- a/lifecycle/common/src/main/java/android/arch/lifecycle/Lifecycling.java
+++ b/lifecycle/common/src/main/java/android/arch/lifecycle/Lifecycling.java
@@ -22,27 +22,25 @@
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
  * Internal class to handle lifecycle conversion etc.
+ *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-class Lifecycling {
-    private static Constructor<? extends GenericLifecycleObserver> sREFLECTIVE;
+public class Lifecycling {
 
-    static {
-        try {
-            sREFLECTIVE = ReflectiveGenericLifecycleObserver.class
-                    .getDeclaredConstructor(Object.class);
-        } catch (NoSuchMethodException ignored) {
+    private static final int REFLECTIVE_CALLBACK = 1;
+    private static final int GENERATED_CALLBACK = 2;
 
-        }
-    }
-
-    private static Map<Class, Constructor<? extends GenericLifecycleObserver>> sCallbackCache =
+    private static Map<Class, Integer> sCallbackCache = new HashMap<>();
+    private static Map<Class, List<Constructor<? extends GeneratedAdapter>>> sClassToAdapters =
             new HashMap<>();
 
     @NonNull
@@ -54,24 +52,31 @@
         if (object instanceof GenericLifecycleObserver) {
             return (GenericLifecycleObserver) object;
         }
+
+        final Class<?> klass = object.getClass();
+        int type = getObserverConstructorType(klass);
+        if (type == GENERATED_CALLBACK) {
+            List<Constructor<? extends GeneratedAdapter>> constructors =
+                    sClassToAdapters.get(klass);
+            if (constructors.size() == 1) {
+                GeneratedAdapter generatedAdapter = createGeneratedAdapter(
+                        constructors.get(0), object);
+                return new SingleGeneratedAdapterObserver(generatedAdapter);
+            }
+            GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
+            for (int i = 0; i < constructors.size(); i++) {
+                adapters[i] = createGeneratedAdapter(constructors.get(i), object);
+            }
+            return new CompositeGeneratedAdaptersObserver(adapters);
+        }
+        return new ReflectiveGenericLifecycleObserver(object);
+    }
+
+    private static GeneratedAdapter createGeneratedAdapter(
+            Constructor<? extends GeneratedAdapter> constructor, Object object) {
         //noinspection TryWithIdenticalCatches
         try {
-            final Class<?> klass = object.getClass();
-            Constructor<? extends GenericLifecycleObserver> cachedConstructor = sCallbackCache.get(
-                    klass);
-            if (cachedConstructor != null) {
-                return cachedConstructor.newInstance(object);
-            }
-            cachedConstructor = getGeneratedAdapterConstructor(klass);
-            if (cachedConstructor != null) {
-                if (!cachedConstructor.isAccessible()) {
-                    cachedConstructor.setAccessible(true);
-                }
-            } else {
-                cachedConstructor = sREFLECTIVE;
-            }
-            sCallbackCache.put(klass, cachedConstructor);
-            return cachedConstructor.newInstance(object);
+            return constructor.newInstance(object);
         } catch (IllegalAccessException e) {
             throw new RuntimeException(e);
         } catch (InstantiationException e) {
@@ -82,37 +87,95 @@
     }
 
     @Nullable
-    private static Constructor<? extends GenericLifecycleObserver> getGeneratedAdapterConstructor(
-            Class<?> klass) {
-        Package aPackage = klass.getPackage();
-        final String fullPackage = aPackage != null ? aPackage.getName() : "";
-
-        String name = klass.getCanonicalName();
-        // anonymous class bug:35073837
-        if (name == null) {
-            return null;
-        }
-        final String adapterName = getAdapterName(fullPackage.isEmpty() ? name :
-                name.substring(fullPackage.length() + 1));
+    private static Constructor<? extends GeneratedAdapter> generatedConstructor(Class<?> klass) {
         try {
-            @SuppressWarnings("unchecked")
-            final Class<? extends GenericLifecycleObserver> aClass =
-                    (Class<? extends GenericLifecycleObserver>) Class.forName(
+            Package aPackage = klass.getPackage();
+            String name = klass.getCanonicalName();
+            final String fullPackage = aPackage != null ? aPackage.getName() : "";
+            final String adapterName = getAdapterName(fullPackage.isEmpty() ? name :
+                    name.substring(fullPackage.length() + 1));
+
+            @SuppressWarnings("unchecked") final Class<? extends GeneratedAdapter> aClass =
+                    (Class<? extends GeneratedAdapter>) Class.forName(
                             fullPackage.isEmpty() ? adapterName : fullPackage + "." + adapterName);
-            return aClass.getDeclaredConstructor(klass);
-        } catch (ClassNotFoundException e) {
-            final Class<?> superclass = klass.getSuperclass();
-            if (superclass != null) {
-                return getGeneratedAdapterConstructor(superclass);
+            Constructor<? extends GeneratedAdapter> constructor =
+                    aClass.getDeclaredConstructor(klass);
+            if (!constructor.isAccessible()) {
+                constructor.setAccessible(true);
             }
+            return constructor;
+        } catch (ClassNotFoundException e) {
+            return null;
         } catch (NoSuchMethodException e) {
             // this should not happen
             throw new RuntimeException(e);
         }
-        return null;
     }
 
-    static String getAdapterName(String className) {
+    private static int getObserverConstructorType(Class<?> klass) {
+        if (sCallbackCache.containsKey(klass)) {
+            return sCallbackCache.get(klass);
+        }
+        int type = resolveObserverCallbackType(klass);
+        sCallbackCache.put(klass, type);
+        return type;
+    }
+
+    private static int resolveObserverCallbackType(Class<?> klass) {
+        // anonymous class bug:35073837
+        if (klass.getCanonicalName() == null) {
+            return REFLECTIVE_CALLBACK;
+        }
+
+        Constructor<? extends GeneratedAdapter> constructor = generatedConstructor(klass);
+        if (constructor != null) {
+            sClassToAdapters.put(klass, Collections
+                    .<Constructor<? extends GeneratedAdapter>>singletonList(constructor));
+            return GENERATED_CALLBACK;
+        }
+
+        boolean hasLifecycleMethods = ClassesInfoCache.sInstance.hasLifecycleMethods(klass);
+        if (hasLifecycleMethods) {
+            return REFLECTIVE_CALLBACK;
+        }
+
+        Class<?> superclass = klass.getSuperclass();
+        List<Constructor<? extends GeneratedAdapter>> adapterConstructors = null;
+        if (isLifecycleParent(superclass)) {
+            if (getObserverConstructorType(superclass) == REFLECTIVE_CALLBACK) {
+                return REFLECTIVE_CALLBACK;
+            }
+            adapterConstructors = new ArrayList<>(sClassToAdapters.get(superclass));
+        }
+
+        for (Class<?> intrface : klass.getInterfaces()) {
+            if (!isLifecycleParent(intrface)) {
+                continue;
+            }
+            if (getObserverConstructorType(intrface) == REFLECTIVE_CALLBACK) {
+                return REFLECTIVE_CALLBACK;
+            }
+            if (adapterConstructors == null) {
+                adapterConstructors = new ArrayList<>();
+            }
+            adapterConstructors.addAll(sClassToAdapters.get(intrface));
+        }
+        if (adapterConstructors != null) {
+            sClassToAdapters.put(klass, adapterConstructors);
+            return GENERATED_CALLBACK;
+        }
+
+        return REFLECTIVE_CALLBACK;
+    }
+
+    private static boolean isLifecycleParent(Class<?> klass) {
+        return klass != null && LifecycleObserver.class.isAssignableFrom(klass);
+    }
+
+    /**
+     * Create a name for an adapter class.
+     */
+    public static String getAdapterName(String className) {
         return className.replace(".", "_") + "_LifecycleAdapter";
     }
 }
diff --git a/lifecycle/common/src/main/java/android/arch/lifecycle/MethodCallsLogger.java b/lifecycle/common/src/main/java/android/arch/lifecycle/MethodCallsLogger.java
new file mode 100644
index 0000000..031e43e
--- /dev/null
+++ b/lifecycle/common/src/main/java/android/arch/lifecycle/MethodCallsLogger.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle;
+
+import android.support.annotation.RestrictTo;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class MethodCallsLogger {
+    private Map<String, Integer> mCalledMethods = new HashMap<>();
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public boolean approveCall(String name, int type) {
+        Integer nullableMask = mCalledMethods.get(name);
+        int mask = nullableMask != null ? nullableMask : 0;
+        boolean wasCalled = (mask & type) != 0;
+        mCalledMethods.put(name, mask | type);
+        return !wasCalled;
+    }
+}
diff --git a/lifecycle/common/src/main/java/android/arch/lifecycle/ReflectiveGenericLifecycleObserver.java b/lifecycle/common/src/main/java/android/arch/lifecycle/ReflectiveGenericLifecycleObserver.java
index 44815e6..f010ed8 100644
--- a/lifecycle/common/src/main/java/android/arch/lifecycle/ReflectiveGenericLifecycleObserver.java
+++ b/lifecycle/common/src/main/java/android/arch/lifecycle/ReflectiveGenericLifecycleObserver.java
@@ -16,204 +16,23 @@
 
 package android.arch.lifecycle;
 
+import android.arch.lifecycle.ClassesInfoCache.CallbackInfo;
 import android.arch.lifecycle.Lifecycle.Event;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
 /**
  * An internal implementation of {@link GenericLifecycleObserver} that relies on reflection.
  */
 class ReflectiveGenericLifecycleObserver implements GenericLifecycleObserver {
     private final Object mWrapped;
     private final CallbackInfo mInfo;
-    @SuppressWarnings("WeakerAccess")
-    static final Map<Class, CallbackInfo> sInfoCache = new HashMap<>();
 
     ReflectiveGenericLifecycleObserver(Object wrapped) {
         mWrapped = wrapped;
-        mInfo = getInfo(mWrapped.getClass());
+        mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());
     }
 
     @Override
     public void onStateChanged(LifecycleOwner source, Event event) {
-        invokeCallbacks(mInfo, source, event);
+        mInfo.invokeCallbacks(source, event, mWrapped);
     }
-
-    private void invokeMethodsForEvent(List<MethodReference> handlers, LifecycleOwner source,
-            Event event) {
-        if (handlers != null) {
-            for (int i = handlers.size() - 1; i >= 0; i--) {
-                MethodReference reference = handlers.get(i);
-                invokeCallback(reference, source, event);
-            }
-        }
-    }
-
-    @SuppressWarnings("ConstantConditions")
-    private void invokeCallbacks(CallbackInfo info, LifecycleOwner source, Event event) {
-        invokeMethodsForEvent(info.mEventToHandlers.get(event), source, event);
-        invokeMethodsForEvent(info.mEventToHandlers.get(Event.ON_ANY), source, event);
-    }
-
-    private void invokeCallback(MethodReference reference, LifecycleOwner source, Event event) {
-        //noinspection TryWithIdenticalCatches
-        try {
-            switch (reference.mCallType) {
-                case CALL_TYPE_NO_ARG:
-                    reference.mMethod.invoke(mWrapped);
-                    break;
-                case CALL_TYPE_PROVIDER:
-                    reference.mMethod.invoke(mWrapped, source);
-                    break;
-                case CALL_TYPE_PROVIDER_WITH_EVENT:
-                    reference.mMethod.invoke(mWrapped, source, event);
-                    break;
-            }
-        } catch (InvocationTargetException e) {
-            throw new RuntimeException("Failed to call observer method", e.getCause());
-        } catch (IllegalAccessException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private static CallbackInfo getInfo(Class klass) {
-        CallbackInfo existing = sInfoCache.get(klass);
-        if (existing != null) {
-            return existing;
-        }
-        existing = createInfo(klass);
-        return existing;
-    }
-
-    private static void verifyAndPutHandler(Map<MethodReference, Event> handlers,
-            MethodReference newHandler, Event newEvent, Class klass) {
-        Event event = handlers.get(newHandler);
-        if (event != null && newEvent != event) {
-            Method method = newHandler.mMethod;
-            throw new IllegalArgumentException(
-                    "Method " + method.getName() + " in " + klass.getName()
-                            + " already declared with different @OnLifecycleEvent value: previous"
-                            + " value " + event + ", new value " + newEvent);
-        }
-        if (event == null) {
-            handlers.put(newHandler, newEvent);
-        }
-    }
-
-    private static CallbackInfo createInfo(Class klass) {
-        Class superclass = klass.getSuperclass();
-        Map<MethodReference, Event> handlerToEvent = new HashMap<>();
-        if (superclass != null) {
-            CallbackInfo superInfo = getInfo(superclass);
-            if (superInfo != null) {
-                handlerToEvent.putAll(superInfo.mHandlerToEvent);
-            }
-        }
-
-        Method[] methods = klass.getDeclaredMethods();
-
-        Class[] interfaces = klass.getInterfaces();
-        for (Class intrfc : interfaces) {
-            for (Entry<MethodReference, Event> entry : getInfo(intrfc).mHandlerToEvent.entrySet()) {
-                verifyAndPutHandler(handlerToEvent, entry.getKey(), entry.getValue(), klass);
-            }
-        }
-
-        for (Method method : methods) {
-            OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class);
-            if (annotation == null) {
-                continue;
-            }
-            Class<?>[] params = method.getParameterTypes();
-            int callType = CALL_TYPE_NO_ARG;
-            if (params.length > 0) {
-                callType = CALL_TYPE_PROVIDER;
-                if (!params[0].isAssignableFrom(LifecycleOwner.class)) {
-                    throw new IllegalArgumentException(
-                            "invalid parameter type. Must be one and instanceof LifecycleOwner");
-                }
-            }
-            Event event = annotation.value();
-
-            if (params.length > 1) {
-                callType = CALL_TYPE_PROVIDER_WITH_EVENT;
-                if (!params[1].isAssignableFrom(Event.class)) {
-                    throw new IllegalArgumentException(
-                            "invalid parameter type. second arg must be an event");
-                }
-                if (event != Event.ON_ANY) {
-                    throw new IllegalArgumentException(
-                            "Second arg is supported only for ON_ANY value");
-                }
-            }
-            if (params.length > 2) {
-                throw new IllegalArgumentException("cannot have more than 2 params");
-            }
-            MethodReference methodReference = new MethodReference(callType, method);
-            verifyAndPutHandler(handlerToEvent, methodReference, event, klass);
-        }
-        CallbackInfo info = new CallbackInfo(handlerToEvent);
-        sInfoCache.put(klass, info);
-        return info;
-    }
-
-    @SuppressWarnings("WeakerAccess")
-    static class CallbackInfo {
-        final Map<Event, List<MethodReference>> mEventToHandlers;
-        final Map<MethodReference, Event> mHandlerToEvent;
-
-        CallbackInfo(Map<MethodReference, Event> handlerToEvent) {
-            mHandlerToEvent = handlerToEvent;
-            mEventToHandlers = new HashMap<>();
-            for (Entry<MethodReference, Event> entry : handlerToEvent.entrySet()) {
-                Event event = entry.getValue();
-                List<MethodReference> methodReferences = mEventToHandlers.get(event);
-                if (methodReferences == null) {
-                    methodReferences = new ArrayList<>();
-                    mEventToHandlers.put(event, methodReferences);
-                }
-                methodReferences.add(entry.getKey());
-            }
-        }
-    }
-
-    @SuppressWarnings("WeakerAccess")
-    static class MethodReference {
-        final int mCallType;
-        final Method mMethod;
-
-        MethodReference(int callType, Method method) {
-            mCallType = callType;
-            mMethod = method;
-            mMethod.setAccessible(true);
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) {
-                return true;
-            }
-            if (o == null || getClass() != o.getClass()) {
-                return false;
-            }
-
-            MethodReference that = (MethodReference) o;
-            return mCallType == that.mCallType && mMethod.getName().equals(that.mMethod.getName());
-        }
-
-        @Override
-        public int hashCode() {
-            return 31 * mCallType + mMethod.getName().hashCode();
-        }
-    }
-
-    private static final int CALL_TYPE_NO_ARG = 0;
-    private static final int CALL_TYPE_PROVIDER = 1;
-    private static final int CALL_TYPE_PROVIDER_WITH_EVENT = 2;
 }
diff --git a/lifecycle/common/src/main/java/android/arch/lifecycle/SingleGeneratedAdapterObserver.java b/lifecycle/common/src/main/java/android/arch/lifecycle/SingleGeneratedAdapterObserver.java
new file mode 100644
index 0000000..d176a3a
--- /dev/null
+++ b/lifecycle/common/src/main/java/android/arch/lifecycle/SingleGeneratedAdapterObserver.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle;
+
+import android.support.annotation.RestrictTo;
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class SingleGeneratedAdapterObserver implements GenericLifecycleObserver {
+
+    private final GeneratedAdapter mGeneratedAdapter;
+
+    SingleGeneratedAdapterObserver(GeneratedAdapter generatedAdapter) {
+        mGeneratedAdapter = generatedAdapter;
+    }
+
+    @Override
+    public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
+        mGeneratedAdapter.callMethods(source, event, false, null);
+        mGeneratedAdapter.callMethods(source, event, true, null);
+    }
+}
diff --git a/lifecycle/common/src/test/java/android/arch/lifecycle/LifecyclingTest.java b/lifecycle/common/src/test/java/android/arch/lifecycle/LifecyclingTest.java
new file mode 100644
index 0000000..70ce84c
--- /dev/null
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/LifecyclingTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import android.arch.lifecycle.observers.DerivedSequence1;
+import android.arch.lifecycle.observers.DerivedSequence2;
+import android.arch.lifecycle.observers.DerivedWithNewMethods;
+import android.arch.lifecycle.observers.DerivedWithNoNewMethods;
+import android.arch.lifecycle.observers.DerivedWithOverridenMethodsWithLfAnnotation;
+import android.arch.lifecycle.observers.InterfaceImpl1;
+import android.arch.lifecycle.observers.InterfaceImpl2;
+import android.arch.lifecycle.observers.InterfaceImpl3;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class LifecyclingTest {
+
+    @Test
+    public void testDerivedWithNewLfMethodsNoGeneratedAdapter() {
+        GenericLifecycleObserver callback = Lifecycling.getCallback(new DerivedWithNewMethods());
+        assertThat(callback, instanceOf(ReflectiveGenericLifecycleObserver.class));
+    }
+
+    @Test
+    public void testDerivedWithNoNewLfMethodsNoGeneratedAdapter() {
+        GenericLifecycleObserver callback = Lifecycling.getCallback(new DerivedWithNoNewMethods());
+        assertThat(callback, instanceOf(SingleGeneratedAdapterObserver.class));
+    }
+
+    @Test
+    public void testDerivedWithOverridenMethodsNoGeneratedAdapter() {
+        GenericLifecycleObserver callback = Lifecycling.getCallback(
+                new DerivedWithOverridenMethodsWithLfAnnotation());
+        // that is not effective but...
+        assertThat(callback, instanceOf(ReflectiveGenericLifecycleObserver.class));
+    }
+
+    @Test
+    public void testInterfaceImpl1NoGeneratedAdapter() {
+        GenericLifecycleObserver callback = Lifecycling.getCallback(new InterfaceImpl1());
+        assertThat(callback, instanceOf(SingleGeneratedAdapterObserver.class));
+    }
+
+    @Test
+    public void testInterfaceImpl2NoGeneratedAdapter() {
+        GenericLifecycleObserver callback = Lifecycling.getCallback(new InterfaceImpl2());
+        assertThat(callback, instanceOf(CompositeGeneratedAdaptersObserver.class));
+    }
+
+    @Test
+    public void testInterfaceImpl3NoGeneratedAdapter() {
+        GenericLifecycleObserver callback = Lifecycling.getCallback(new InterfaceImpl3());
+        assertThat(callback, instanceOf(CompositeGeneratedAdaptersObserver.class));
+    }
+
+    @Test
+    public void testDerivedSequence() {
+        GenericLifecycleObserver callback2 = Lifecycling.getCallback(new DerivedSequence2());
+        assertThat(callback2, instanceOf(ReflectiveGenericLifecycleObserver.class));
+        GenericLifecycleObserver callback1 = Lifecycling.getCallback(new DerivedSequence1());
+        assertThat(callback1, instanceOf(SingleGeneratedAdapterObserver.class));
+    }
+}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Base.java
similarity index 66%
copy from paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
copy to lifecycle/common/src/test/java/android/arch/lifecycle/observers/Base.java
index 5318d38..08919d4 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Base.java
@@ -14,12 +14,15 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package android.arch.lifecycle.observers;
 
-import java.util.Arrays;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LifecycleObserver;
+import android.arch.lifecycle.OnLifecycleEvent;
 
-public class StringPagedList extends NullPaddedList<String> {
-    public StringPagedList(int leadingNulls, int trailingNulls, String... items) {
-        super(leadingNulls, Arrays.asList(items), trailingNulls);
+public class Base implements LifecycleObserver {
+
+    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
+    public void onCreate() {
     }
 }
diff --git a/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Base_LifecycleAdapter.java b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Base_LifecycleAdapter.java
new file mode 100644
index 0000000..4218b96
--- /dev/null
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Base_LifecycleAdapter.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle.observers;
+
+import android.arch.lifecycle.GeneratedAdapter;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
+
+public class Base_LifecycleAdapter implements GeneratedAdapter {
+
+    public Base_LifecycleAdapter(Base base) {
+    }
+
+    @Override
+    public void callMethods(LifecycleOwner source, Lifecycle.Event event, boolean onAny,
+            MethodCallsLogger logger) {
+
+    }
+}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedSequence1.java
similarity index 69%
copy from paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
copy to lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedSequence1.java
index 5318d38..9db37f1 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedSequence1.java
@@ -14,12 +14,10 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package android.arch.lifecycle.observers;
 
-import java.util.Arrays;
+public class DerivedSequence1 extends Base {
 
-public class StringPagedList extends NullPaddedList<String> {
-    public StringPagedList(int leadingNulls, int trailingNulls, String... items) {
-        super(leadingNulls, Arrays.asList(items), trailingNulls);
+    public void something() {
     }
 }
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedSequence2.java
similarity index 69%
copy from paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
copy to lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedSequence2.java
index 5318d38..f2ef943 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedSequence2.java
@@ -14,12 +14,15 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package android.arch.lifecycle.observers;
 
-import java.util.Arrays;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.OnLifecycleEvent;
 
-public class StringPagedList extends NullPaddedList<String> {
-    public StringPagedList(int leadingNulls, int trailingNulls, String... items) {
-        super(leadingNulls, Arrays.asList(items), trailingNulls);
+public class DerivedSequence2 extends DerivedSequence1 {
+
+    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
+    void onStop() {
+
     }
 }
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedWithNewMethods.java
similarity index 69%
copy from paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
copy to lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedWithNewMethods.java
index 5318d38..b1eaef0 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedWithNewMethods.java
@@ -14,12 +14,15 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package android.arch.lifecycle.observers;
 
-import java.util.Arrays;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.OnLifecycleEvent;
 
-public class StringPagedList extends NullPaddedList<String> {
-    public StringPagedList(int leadingNulls, int trailingNulls, String... items) {
-        super(leadingNulls, Arrays.asList(items), trailingNulls);
+public class DerivedWithNewMethods extends Base {
+
+    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
+    void onStop() {
+
     }
 }
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedWithNoNewMethods.java
similarity index 69%
rename from paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
rename to lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedWithNoNewMethods.java
index 5318d38..cb1afb8 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedWithNoNewMethods.java
@@ -14,12 +14,7 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package android.arch.lifecycle.observers;
 
-import java.util.Arrays;
-
-public class StringPagedList extends NullPaddedList<String> {
-    public StringPagedList(int leadingNulls, int trailingNulls, String... items) {
-        super(leadingNulls, Arrays.asList(items), trailingNulls);
-    }
+public class DerivedWithNoNewMethods extends Base {
 }
diff --git a/paging/common/src/test/java/android/arch/paging/User.java b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedWithOverridenMethodsWithLfAnnotation.java
similarity index 67%
copy from paging/common/src/test/java/android/arch/paging/User.java
copy to lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedWithOverridenMethodsWithLfAnnotation.java
index a6d965a..40c7c9a 100644
--- a/paging/common/src/test/java/android/arch/paging/User.java
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/DerivedWithOverridenMethodsWithLfAnnotation.java
@@ -14,19 +14,16 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package android.arch.lifecycle.observers;
 
-public class User {
-    public final String name;
-    public final String info;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.OnLifecycleEvent;
 
-    public User(String name, String info) {
-        this.name = name;
-        this.info = info;
-    }
+public class DerivedWithOverridenMethodsWithLfAnnotation extends Base {
 
+    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
     @Override
-    public String toString() {
-        return name;
+    public void onCreate() {
+        super.onCreate();
     }
 }
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Interface1.java
similarity index 66%
copy from paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
copy to lifecycle/common/src/test/java/android/arch/lifecycle/observers/Interface1.java
index 5318d38..e193de9 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Interface1.java
@@ -14,12 +14,14 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package android.arch.lifecycle.observers;
 
-import java.util.Arrays;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LifecycleObserver;
+import android.arch.lifecycle.OnLifecycleEvent;
 
-public class StringPagedList extends NullPaddedList<String> {
-    public StringPagedList(int leadingNulls, int trailingNulls, String... items) {
-        super(leadingNulls, Arrays.asList(items), trailingNulls);
-    }
+public interface Interface1 extends LifecycleObserver {
+
+    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
+    void onCreate();
 }
diff --git a/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Interface1_LifecycleAdapter.java b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Interface1_LifecycleAdapter.java
new file mode 100644
index 0000000..c597b1c
--- /dev/null
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Interface1_LifecycleAdapter.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle.observers;
+
+import android.arch.lifecycle.GeneratedAdapter;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
+
+public class Interface1_LifecycleAdapter implements GeneratedAdapter {
+
+    public Interface1_LifecycleAdapter(Interface1 base) {
+    }
+
+    @Override
+    public void callMethods(LifecycleOwner source, Lifecycle.Event event, boolean onAny,
+            MethodCallsLogger logger) {
+
+    }
+}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Interface2.java
similarity index 61%
copy from paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
copy to lifecycle/common/src/test/java/android/arch/lifecycle/observers/Interface2.java
index 5318d38..1056fcb 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Interface2.java
@@ -14,12 +14,17 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package android.arch.lifecycle.observers;
 
-import java.util.Arrays;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LifecycleObserver;
+import android.arch.lifecycle.OnLifecycleEvent;
 
-public class StringPagedList extends NullPaddedList<String> {
-    public StringPagedList(int leadingNulls, int trailingNulls, String... items) {
-        super(leadingNulls, Arrays.asList(items), trailingNulls);
-    }
+public interface Interface2 extends LifecycleObserver {
+
+    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
+    void onCreate();
+
+    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
+    void onDestroy();
 }
diff --git a/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Interface2_LifecycleAdapter.java b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Interface2_LifecycleAdapter.java
new file mode 100644
index 0000000..b05b41a
--- /dev/null
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/Interface2_LifecycleAdapter.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle.observers;
+
+import android.arch.lifecycle.GeneratedAdapter;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
+
+public class Interface2_LifecycleAdapter implements GeneratedAdapter {
+
+    public Interface2_LifecycleAdapter(Interface2 base) {
+    }
+
+    @Override
+    public void callMethods(LifecycleOwner source, Lifecycle.Event event, boolean onAny,
+            MethodCallsLogger logger) {
+
+    }
+}
diff --git a/paging/common/src/test/java/android/arch/paging/User.java b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/InterfaceImpl1.java
similarity index 70%
copy from paging/common/src/test/java/android/arch/paging/User.java
copy to lifecycle/common/src/test/java/android/arch/lifecycle/observers/InterfaceImpl1.java
index a6d965a..2f03393 100644
--- a/paging/common/src/test/java/android/arch/paging/User.java
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/InterfaceImpl1.java
@@ -14,19 +14,10 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package android.arch.lifecycle.observers;
 
-public class User {
-    public final String name;
-    public final String info;
-
-    public User(String name, String info) {
-        this.name = name;
-        this.info = info;
-    }
-
+public class InterfaceImpl1 implements Interface1 {
     @Override
-    public String toString() {
-        return name;
+    public void onCreate() {
     }
 }
diff --git a/paging/common/src/test/java/android/arch/paging/User.java b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/InterfaceImpl2.java
similarity index 71%
rename from paging/common/src/test/java/android/arch/paging/User.java
rename to lifecycle/common/src/test/java/android/arch/lifecycle/observers/InterfaceImpl2.java
index a6d965a..eef8ce4 100644
--- a/paging/common/src/test/java/android/arch/paging/User.java
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/InterfaceImpl2.java
@@ -14,19 +14,15 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package android.arch.lifecycle.observers;
 
-public class User {
-    public final String name;
-    public final String info;
-
-    public User(String name, String info) {
-        this.name = name;
-        this.info = info;
+public class InterfaceImpl2 implements Interface1, Interface2 {
+    @Override
+    public void onCreate() {
     }
 
     @Override
-    public String toString() {
-        return name;
+    public void onDestroy() {
+
     }
 }
diff --git a/paging/common/src/test/java/android/arch/paging/User.java b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/InterfaceImpl3.java
similarity index 70%
copy from paging/common/src/test/java/android/arch/paging/User.java
copy to lifecycle/common/src/test/java/android/arch/lifecycle/observers/InterfaceImpl3.java
index a6d965a..8f31808 100644
--- a/paging/common/src/test/java/android/arch/paging/User.java
+++ b/lifecycle/common/src/test/java/android/arch/lifecycle/observers/InterfaceImpl3.java
@@ -14,19 +14,10 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package android.arch.lifecycle.observers;
 
-public class User {
-    public final String name;
-    public final String info;
-
-    public User(String name, String info) {
-        this.name = name;
-        this.info = info;
-    }
-
+public class InterfaceImpl3 extends Base implements Interface1 {
     @Override
-    public String toString() {
-        return name;
+    public void onCreate() {
     }
 }
diff --git a/lifecycle/compiler/build.gradle b/lifecycle/compiler/build.gradle
index 44bf15d..e784f80 100644
--- a/lifecycle/compiler/build.gradle
+++ b/lifecycle/compiler/build.gradle
@@ -26,6 +26,19 @@
 version = LibraryVersions.LIFECYCLES_EXT.toString()
 createKotlinCheckstyle(project)
 
+// we actually need to compile :lifecycle:common, but compileJava is easier
+task compileTestLibrarySource(type: JavaCompile, dependsOn: compileJava) {
+    source "src/tests/test-data/lib/src"
+    classpath = project.compileJava.classpath
+    destinationDir = new File(project.buildDir, 'test-data/lib/classes')
+}
+
+task jarTestLibrarySource(type: Jar, dependsOn: compileTestLibrarySource) {
+    from compileTestLibrarySource.destinationDir
+    archiveName = "test-library.jar"
+    destinationDir = file("src/tests/test-data/lib/")
+}
+
 supportLibrary {
     name 'Android Lifecycles Compiler'
     publish true
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/ErrorMessages.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/ErrorMessages.kt
index 8dac863..2f300e7 100644
--- a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/ErrorMessages.kt
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/ErrorMessages.kt
@@ -16,6 +16,9 @@
 
 package android.arch.lifecycle
 
+import android.arch.lifecycle.model.EventMethod
+import javax.lang.model.element.TypeElement
+
 object ErrorMessages {
     const val TOO_MANY_ARGS = "callback method cannot have more than 2 parameters"
     const val TOO_MANY_ARGS_NOT_ON_ANY = "only callback annotated with ON_ANY " +
@@ -34,4 +37,9 @@
             "Parent of OnLifecycleEvent should be a class or interface"
     const val INVALID_ANNOTATED_ELEMENT = "OnLifecycleEvent can only be added to methods"
 
+    fun failedToGenerateAdapter(type: TypeElement, failureReason: EventMethod) =
+            """
+             Failed to generate an Adapter for $type, because it needs to be able to access to
+             package private method ${failureReason.method.name()} from ${failureReason.type}
+            """.trim()
 }
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/elements_ext.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/elements_ext.kt
index eedb3af..ed20c54 100644
--- a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/elements_ext.kt
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/elements_ext.kt
@@ -21,6 +21,8 @@
 import javax.lang.model.element.ExecutableElement
 import javax.lang.model.element.Modifier
 import javax.lang.model.element.PackageElement
+import javax.lang.model.element.TypeElement
+import javax.lang.model.util.ElementFilter
 
 fun Element.getPackage(): PackageElement = MoreElements.getPackage(this)
 
@@ -33,3 +35,12 @@
 }
 
 fun ExecutableElement.isProtected() = modifiers.contains(Modifier.PROTECTED)
+
+fun TypeElement.methods(): List<ExecutableElement> = ElementFilter.methodsIn(enclosedElements)
+
+private const val SYNTHETIC =  "__synthetic_"
+
+fun syntheticName(method: ExecutableElement) = "$SYNTHETIC${method.simpleName}"
+
+fun isSyntheticMethod(method: ExecutableElement) = method.name().startsWith(SYNTHETIC)
+
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/input_collector.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/input_collector.kt
index 5183df5..843ac4e 100644
--- a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/input_collector.kt
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/input_collector.kt
@@ -17,7 +17,9 @@
 package android.arch.lifecycle
 
 import android.arch.lifecycle.model.EventMethod
+import android.arch.lifecycle.model.InputModel
 import android.arch.lifecycle.model.LifecycleObserverInfo
+import android.arch.lifecycle.model.getAdapterName
 import com.google.auto.common.MoreElements
 import com.google.auto.common.MoreTypes
 import javax.annotation.processing.ProcessingEnvironment
@@ -28,32 +30,85 @@
 import javax.lang.model.element.Modifier
 import javax.lang.model.element.TypeElement
 import javax.lang.model.element.VariableElement
+import javax.lang.model.type.TypeMirror
+import javax.lang.model.util.Elements
+import javax.lang.model.util.Types
 import javax.tools.Diagnostic
 
 fun collectAndVerifyInput(processingEnv: ProcessingEnvironment,
-                          roundEnv: RoundEnvironment): Map<TypeElement, LifecycleObserverInfo> {
+                          roundEnv: RoundEnvironment): InputModel {
     val validator = Validator(processingEnv)
-
-    return roundEnv.getElementsAnnotatedWith(OnLifecycleEvent::class.java).map { elem ->
+    val worldCollector = ObserversCollector(processingEnv)
+    val roots = roundEnv.getElementsAnnotatedWith(OnLifecycleEvent::class.java).map { elem ->
         if (elem.kind != ElementKind.METHOD) {
             validator.printErrorMessage(ErrorMessages.INVALID_ANNOTATED_ELEMENT, elem)
             null
         } else {
             val enclosingElement = elem.enclosingElement
-            val onState = elem.getAnnotation(OnLifecycleEvent::class.java)
-            val method = MoreElements.asExecutable(elem)
-            if (validator.validateClass(enclosingElement)
-                    && validator.validateMethod(method, onState.value)) {
-                EventMethod(method, onState, MoreElements.asType(enclosingElement))
+            if (validator.validateClass(enclosingElement)) {
+                MoreElements.asType(enclosingElement)
             } else {
                 null
             }
         }
-    }
-            .filterNotNull()
-            .groupBy { MoreElements.asType(it.method.enclosingElement) }
-            .mapValues { entry -> LifecycleObserverInfo(entry.key, entry.value) }
+    }.filterNotNull().toSet()
+    roots.forEach { worldCollector.collect(it) }
+    val observersInfo = worldCollector.observers
+    val generatedAdapters = worldCollector.observers.keys
+            .mapNotNull { type ->
+                worldCollector.generatedAdapterInfoFor(type)?.let { type to it }
+            }.toMap()
+    return InputModel(roots, observersInfo, generatedAdapters)
+}
 
+class ObserversCollector(processingEnv: ProcessingEnvironment) {
+    val typeUtils: Types = processingEnv.typeUtils
+    val elementUtils: Elements = processingEnv.elementUtils
+    val lifecycleObserverTypeMirror: TypeMirror =
+            elementUtils.getTypeElement(LifecycleObserver::class.java.canonicalName).asType()
+    val validator = Validator(processingEnv)
+    val observers: MutableMap<TypeElement, LifecycleObserverInfo> = mutableMapOf()
+
+    fun collect(type: TypeElement): LifecycleObserverInfo? {
+        if (type in observers) {
+            return observers[type]
+        }
+        val parents = (listOf(type.superclass) + type.interfaces)
+                .filter { typeUtils.isAssignable(it, lifecycleObserverTypeMirror) }
+                .filterNot { typeUtils.isSameType(it, lifecycleObserverTypeMirror) }
+                .map { collect(MoreTypes.asTypeElement(it)) }
+                .filterNotNull()
+        val info = createObserverInfo(type, parents)
+        if (info != null) {
+            observers[type] = info
+        }
+        return info
+    }
+
+    fun generatedAdapterInfoFor(type: TypeElement): List<ExecutableElement>? {
+        val packageName = if (type.getPackageQName().isEmpty()) "" else "${type.getPackageQName()}."
+        val adapterType = elementUtils.getTypeElement(packageName + getAdapterName(type))
+        return adapterType?.methods()
+                ?.filter { executable -> isSyntheticMethod(executable) }
+    }
+
+    private fun createObserverInfo(typeElement: TypeElement,
+                                   parents: List<LifecycleObserverInfo>): LifecycleObserverInfo? {
+        if (!validator.validateClass(typeElement)) {
+            return null
+        }
+        val methods = typeElement.methods().filter { executable ->
+            MoreElements.isAnnotationPresent(executable, OnLifecycleEvent::class.java)
+        }.map { executable ->
+            val onState = executable.getAnnotation(OnLifecycleEvent::class.java)
+            if (validator.validateMethod(executable, onState.value)) {
+                EventMethod(executable, onState, typeElement)
+            } else {
+                null
+            }
+        }.filterNotNull()
+        return LifecycleObserverInfo(typeElement, methods, parents)
+    }
 }
 
 class Validator(val processingEnv: ProcessingEnvironment) {
@@ -100,7 +155,7 @@
     }
 
     fun validateClass(classElement: Element): Boolean {
-        if (classElement.kind != ElementKind.CLASS && classElement.kind != ElementKind.INTERFACE) {
+        if (!MoreElements.isType(classElement)) {
             printErrorMessage(ErrorMessages.INVALID_ENCLOSING_ELEMENT, classElement)
             return false
         }
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/AdapterClass.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/AdapterClass.kt
index 1e76fa8..bd7759a 100644
--- a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/AdapterClass.kt
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/AdapterClass.kt
@@ -16,9 +16,19 @@
 
 package android.arch.lifecycle.model
 
+import android.arch.lifecycle.Lifecycling
+import android.arch.lifecycle.getPackage
 import javax.lang.model.element.ExecutableElement
 import javax.lang.model.element.TypeElement
 
 data class AdapterClass(val type: TypeElement,
                         val calls: List<EventMethodCall>,
-                        val syntheticMethods: Set<ExecutableElement>)
\ No newline at end of file
+                        val syntheticMethods: Set<ExecutableElement>)
+
+fun getAdapterName(type: TypeElement): String {
+    val packageElement = type.getPackage()
+    val qName = type.qualifiedName.toString()
+    val partialName = if (packageElement.isUnnamed) qName else qName.substring(
+            packageElement.qualifiedName.toString().length + 1)
+    return Lifecycling.getAdapterName(partialName)
+}
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/InputModel.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/InputModel.kt
new file mode 100644
index 0000000..c1e5d2b
--- /dev/null
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/InputModel.kt
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle.model
+
+import android.arch.lifecycle.name
+import android.arch.lifecycle.syntheticName
+import javax.lang.model.element.ExecutableElement
+import javax.lang.model.element.TypeElement
+
+data class InputModel(
+        // all java files with lifecycle annotations excluding classes from classpath
+        private val rootTypes: Set<TypeElement>,
+        // info about all lifecycle observers including classes from classpath
+        val observersInfo: Map<TypeElement, LifecycleObserverInfo>,
+        // info about generated adapters from class path
+        val generatedAdapters: Map<TypeElement, List<ExecutableElement>>) {
+
+    /**
+     *  Root class is class defined in currently processed module, not in classpath
+     */
+    fun isRootType(type: TypeElement) = type in rootTypes
+
+    fun hasSyntheticAccessorFor(eventMethod: EventMethod): Boolean {
+        val syntheticMethods = generatedAdapters[eventMethod.type] ?: return false
+        return syntheticMethods.any { executable ->
+            executable.name() == syntheticName(eventMethod.method)
+                    // same number + receiver object
+                    && (eventMethod.method.parameters.size + 1) == executable.parameters.size
+        }
+    }
+}
\ No newline at end of file
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/LifecycleObserverInfo.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/LifecycleObserverInfo.kt
index d8bc364..1477cbf 100644
--- a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/LifecycleObserverInfo.kt
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/model/LifecycleObserverInfo.kt
@@ -20,4 +20,5 @@
 
 data class LifecycleObserverInfo(
         val type: TypeElement,
-        val methods: List<EventMethod>)
\ No newline at end of file
+        val methods: List<EventMethod>,
+        val parents: List<LifecycleObserverInfo> = listOf())
\ No newline at end of file
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/transformation.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/transformation.kt
index 66fabf7..4b93472 100644
--- a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/transformation.kt
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/transformation.kt
@@ -19,40 +19,13 @@
 import android.arch.lifecycle.model.AdapterClass
 import android.arch.lifecycle.model.EventMethod
 import android.arch.lifecycle.model.EventMethodCall
+import android.arch.lifecycle.model.InputModel
 import android.arch.lifecycle.model.LifecycleObserverInfo
-import com.google.auto.common.MoreTypes
 import com.google.common.collect.HashMultimap
-import java.util.LinkedList
 import javax.annotation.processing.ProcessingEnvironment
 import javax.lang.model.element.TypeElement
-import javax.lang.model.type.NoType
-import javax.lang.model.type.TypeMirror
 import javax.tools.Diagnostic
 
-
-private fun superObservers(world: Map<TypeElement, LifecycleObserverInfo>,
-                           observer: LifecycleObserverInfo): List<LifecycleObserverInfo> {
-    val stack = LinkedList<TypeMirror>()
-    stack += observer.type.interfaces.reversed()
-    stack += observer.type.superclass
-    val result = mutableListOf<LifecycleObserverInfo>()
-    while (stack.isNotEmpty()) {
-        val typeMirror = stack.removeLast()
-        if (typeMirror is NoType) {
-            continue
-        }
-        val type = MoreTypes.asTypeElement(typeMirror)
-        val currentObserver = world[type]
-        if (currentObserver != null) {
-            result.add(currentObserver)
-        } else {
-            stack += type.interfaces.reversed()
-            stack += type.superclass
-        }
-    }
-    return result
-}
-
 private fun mergeAndVerifyMethods(processingEnv: ProcessingEnvironment,
                                   type: TypeElement,
                                   classMethods: List<EventMethod>,
@@ -80,22 +53,21 @@
 fun flattenObservers(processingEnv: ProcessingEnvironment,
                      world: Map<TypeElement, LifecycleObserverInfo>): List<LifecycleObserverInfo> {
     val flattened: MutableMap<LifecycleObserverInfo, LifecycleObserverInfo> = mutableMapOf()
-    val superObservers = world.mapValues { superObservers(world, it.value) }
 
     fun traverse(observer: LifecycleObserverInfo) {
         if (observer in flattened) {
             return
         }
-        val observers = superObservers[observer.type]!!
-        if (observers.isEmpty()) {
+        if (observer.parents.isEmpty()) {
             flattened[observer] = observer
             return
         }
-        observers.filter { it !in flattened }.forEach(::traverse)
-        val methods = observers
+        observer.parents.forEach(::traverse)
+        val methods = observer.parents
                 .map(flattened::get)
                 .fold(emptyList<EventMethod>()) { list, parentObserver ->
-                    mergeAndVerifyMethods(processingEnv, observer.type, parentObserver!!.methods, list)
+                    mergeAndVerifyMethods(processingEnv, observer.type,
+                            parentObserver!!.methods, list)
                 }
 
         flattened[observer] = LifecycleObserverInfo(observer.type,
@@ -106,29 +78,66 @@
     return flattened.values.toList()
 }
 
-fun transformToOutput(processingEnv: ProcessingEnvironment,
-                      world: Map<TypeElement, LifecycleObserverInfo>): List<AdapterClass> {
-    val flatObservers = flattenObservers(processingEnv, world)
-    val syntheticMethods = HashMultimap.create<TypeElement, EventMethodCall>()
-    val adapterCalls = flatObservers.map { (type, methods) ->
-        val calls = methods.map { eventMethod ->
-            val executable = eventMethod.method
-            if (type.getPackageQName() != eventMethod.packageName()
-                    && (executable.isPackagePrivate() || executable.isProtected())) {
-                EventMethodCall(eventMethod, eventMethod.type)
-            } else {
-                EventMethodCall(eventMethod)
-            }
-        }
-        calls.filter { it.syntheticAccess != null }.forEach { eventMethod ->
-            syntheticMethods.put(eventMethod.method.type, eventMethod)
-        }
-        type to calls
-    }.toMap()
+private fun needsSyntheticAccess(type: TypeElement, eventMethod: EventMethod): Boolean {
+    val executable = eventMethod.method
+    return type.getPackageQName() != eventMethod.packageName()
+            && (executable.isPackagePrivate() || executable.isProtected())
+}
 
-    return adapterCalls.map { (type, calls) ->
-        val methods = syntheticMethods.get(type) ?: setOf()
-        val synthetic = methods.map { eventMethod -> eventMethod!!.method.method }.toSet()
-        AdapterClass(type, calls, synthetic)
+private fun validateMethod(processingEnv: ProcessingEnvironment,
+                           world: InputModel, type: TypeElement,
+                           eventMethod: EventMethod): Boolean {
+    if (!needsSyntheticAccess(type, eventMethod)) {
+        // no synthetic calls - no problems
+        return true
     }
+
+    if (world.isRootType(eventMethod.type)) {
+        // we will generate adapters for them, so we can generate all accessors
+        return true
+    }
+
+    if (world.hasSyntheticAccessorFor(eventMethod)) {
+        // previously generated adapter already has synthetic
+        return true
+    }
+
+    processingEnv.messager.printMessage(Diagnostic.Kind.WARNING,
+            ErrorMessages.failedToGenerateAdapter(type, eventMethod), type)
+    return false
+}
+
+fun transformToOutput(processingEnv: ProcessingEnvironment,
+                      world: InputModel): List<AdapterClass> {
+    val flatObservers = flattenObservers(processingEnv, world.observersInfo)
+    val syntheticMethods = HashMultimap.create<TypeElement, EventMethodCall>()
+    val adapterCalls = flatObservers
+            // filter out everything that arrived from jars
+            .filter { (type) -> world.isRootType(type) }
+            // filter out if it needs SYNTHETIC access and we can't generate adapter for it
+            .filter { (type, methods) ->
+                methods.all { eventMethod ->
+                    validateMethod(processingEnv, world, type, eventMethod)
+                }
+            }
+            .map { (type, methods) ->
+                val calls = methods.map { eventMethod ->
+                    if (needsSyntheticAccess(type, eventMethod)) {
+                        EventMethodCall(eventMethod, eventMethod.type)
+                    } else {
+                        EventMethodCall(eventMethod)
+                    }
+                }
+                calls.filter { it.syntheticAccess != null }.forEach { eventMethod ->
+                    syntheticMethods.put(eventMethod.method.type, eventMethod)
+                }
+                type to calls
+            }.toMap()
+
+    return adapterCalls
+            .map { (type, calls) ->
+                val methods = syntheticMethods.get(type) ?: emptySet()
+                val synthetic = methods.map { eventMethod -> eventMethod!!.method.method }.toSet()
+                AdapterClass(type, calls, synthetic)
+            }
 }
diff --git a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/writer.kt b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/writer.kt
index 4f12ff4..00549ee 100644
--- a/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/writer.kt
+++ b/lifecycle/compiler/src/main/kotlin/android/arch/lifecycle/writer.kt
@@ -18,6 +18,7 @@
 
 import android.arch.lifecycle.model.AdapterClass
 import android.arch.lifecycle.model.EventMethodCall
+import android.arch.lifecycle.model.getAdapterName
 import com.squareup.javapoet.AnnotationSpec
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.FieldSpec
@@ -36,10 +37,8 @@
     infos.forEach({ writeAdapter(it, processingEnv) })
 }
 
-
 private val GENERATED_PACKAGE = "javax.annotation"
 private val GENERATED_NAME = "Generated"
-private val LIFECYCLE_OWNER = ClassName.get(LifecycleOwner::class.java)
 private val LIFECYCLE_EVENT = Lifecycle.Event::class.java
 
 private val T = "\$T"
@@ -47,32 +46,42 @@
 private val L = "\$L"
 private val S = "\$S"
 
-private fun writeAdapter(adapter: AdapterClass, processingEnv: ProcessingEnvironment) {
-    val ownerParam = ParameterSpec.builder(LIFECYCLE_OWNER, "owner").build()
-    val eventParam = ParameterSpec.builder(ClassName.get(LIFECYCLE_EVENT), "event").build()
-    val receiverName = "mReceiver"
-    val receiverField = FieldSpec.builder(ClassName.get(adapter.type), receiverName,
-            Modifier.FINAL).build()
+private val OWNER_PARAM: ParameterSpec = ParameterSpec.builder(
+        ClassName.get(LifecycleOwner::class.java), "owner").build()
+private val EVENT_PARAM: ParameterSpec = ParameterSpec.builder(
+        ClassName.get(LIFECYCLE_EVENT), "event").build()
+private val ON_ANY_PARAM: ParameterSpec = ParameterSpec.builder(TypeName.BOOLEAN, "onAny").build()
 
-    val dispatchMethodBuilder = MethodSpec.methodBuilder("onStateChanged")
+private val METHODS_LOGGER: ParameterSpec = ParameterSpec.builder(
+        ClassName.get(MethodCallsLogger::class.java), "logger").build()
+
+private const val HAS_LOGGER_VAR = "hasLogger"
+
+private fun writeAdapter(adapter: AdapterClass, processingEnv: ProcessingEnvironment) {
+    val receiverField: FieldSpec = FieldSpec.builder(ClassName.get(adapter.type), "mReceiver",
+            Modifier.FINAL).build()
+    val dispatchMethodBuilder = MethodSpec.methodBuilder("callMethods")
             .returns(TypeName.VOID)
-            .addParameter(ownerParam)
-            .addParameter(eventParam)
+            .addParameter(OWNER_PARAM)
+            .addParameter(EVENT_PARAM)
+            .addParameter(ON_ANY_PARAM)
+            .addParameter(METHODS_LOGGER)
             .addModifiers(Modifier.PUBLIC)
             .addAnnotation(Override::class.java)
     val dispatchMethod = dispatchMethodBuilder.apply {
-        adapter.calls
-                .groupBy { (eventMethod) -> eventMethod.onLifecycleEvent.value }
-                .forEach { entry ->
-                    val event = entry.key
-                    val calls = entry.value
-                    if (event == Lifecycle.Event.ON_ANY) {
-                        writeMethodCalls(eventParam, calls, ownerParam, receiverField)
-                    } else {
-                        beginControlFlow("if ($N == $T.$L)", eventParam, LIFECYCLE_EVENT, event)
-                                .writeMethodCalls(eventParam, calls, ownerParam, receiverField)
-                        endControlFlow()
-                    }
+
+        addStatement("boolean $L = $N != null", HAS_LOGGER_VAR, METHODS_LOGGER)
+        val callsByEventType = adapter.calls.groupBy { it.method.onLifecycleEvent.value }
+        beginControlFlow("if ($N)", ON_ANY_PARAM).apply {
+            writeMethodCalls(callsByEventType[Lifecycle.Event.ON_ANY] ?: emptyList(), receiverField)
+        }.endControlFlow()
+
+        callsByEventType
+                .filterKeys { key -> key != Lifecycle.Event.ON_ANY }
+                .forEach { (event, calls) ->
+                    beginControlFlow("if ($N == $T.$L)", EVENT_PARAM, LIFECYCLE_EVENT, event)
+                    writeMethodCalls(calls, receiverField)
+                    endControlFlow()
                 }
     }.build()
 
@@ -86,16 +95,16 @@
                 .addModifiers(Modifier.STATIC)
                 .addParameter(receiverParam)
         if (it.parameters.size >= 1) {
-            method.addParameter(ownerParam)
+            method.addParameter(OWNER_PARAM)
         }
         if (it.parameters.size == 2) {
-            method.addParameter(eventParam)
+            method.addParameter(EVENT_PARAM)
         }
 
         val count = it.parameters.size
         val paramString = generateParamString(count)
         method.addStatement("$N.$L($paramString)", receiverParam, it.name(),
-                *takeParams(count, ownerParam, eventParam))
+                *takeParams(count, OWNER_PARAM, EVENT_PARAM))
         method.build()
     }
 
@@ -107,7 +116,7 @@
     val adapterName = getAdapterName(adapter.type)
     val adapterTypeSpecBuilder = TypeSpec.classBuilder(adapterName)
             .addModifiers(Modifier.PUBLIC)
-            .addSuperinterface(ClassName.get(GenericLifecycleObserver::class.java))
+            .addSuperinterface(ClassName.get(GeneratedAdapter::class.java))
             .addField(receiverField)
             .addMethod(constructor)
             .addMethod(dispatchMethod)
@@ -122,16 +131,16 @@
 }
 
 private fun addGeneratedAnnotationIfAvailable(adapterTypeSpecBuilder: TypeSpec.Builder,
-                                   processingEnv: ProcessingEnvironment) {
+                                              processingEnv: ProcessingEnvironment) {
     val generatedAnnotationAvailable = processingEnv
             .elementUtils
             .getTypeElement(GENERATED_PACKAGE + "." + GENERATED_NAME) != null
     if (generatedAnnotationAvailable) {
         val generatedAnnotationSpec =
                 AnnotationSpec.builder(ClassName.get(GENERATED_PACKAGE, GENERATED_NAME)).addMember(
-                "value",
-                S,
-                LifecycleProcessor::class.java.canonicalName).build()
+                        "value",
+                        S,
+                        LifecycleProcessor::class.java.canonicalName).build()
         adapterTypeSpecBuilder.addAnnotation(generatedAnnotationSpec)
     }
 }
@@ -155,41 +164,35 @@
     out.openWriter().use { it.write(keepRule) }
 }
 
-private fun MethodSpec.Builder.writeMethodCalls(eventParam: ParameterSpec,
-                                                calls: List<EventMethodCall>,
-                                                ownerParam: ParameterSpec,
+private fun MethodSpec.Builder.writeMethodCalls(calls: List<EventMethodCall>,
                                                 receiverField: FieldSpec) {
     calls.forEach { (method, syntheticAccess) ->
         val count = method.method.parameters.size
-        if (syntheticAccess == null) {
-            val paramString = generateParamString(count)
-            addStatement("$N.$L($paramString)", receiverField,
-                    method.method.name(),
-                    *takeParams(count, ownerParam, eventParam))
+        val callType = 1 shl count
+        val methodName = method.method.name()
+        beginControlFlow("if (!$L || $N.approveCall($S, $callType))",
+                HAS_LOGGER_VAR, METHODS_LOGGER, methodName).apply {
 
-        } else {
-            val originalType = syntheticAccess
-            val paramString = generateParamString(count + 1)
-            val className = ClassName.get(originalType.getPackageQName(),
-                    getAdapterName(originalType))
-            addStatement("$T.$L($paramString)", className,
-                    syntheticName(method.method),
-                    *takeParams(count + 1, receiverField, ownerParam,
-                            eventParam))
-        }
+            if (syntheticAccess == null) {
+                val paramString = generateParamString(count)
+                addStatement("$N.$L($paramString)", receiverField,
+                        methodName,
+                        *takeParams(count, OWNER_PARAM, EVENT_PARAM))
+
+            } else {
+                val originalType = syntheticAccess
+                val paramString = generateParamString(count + 1)
+                val className = ClassName.get(originalType.getPackageQName(),
+                        getAdapterName(originalType))
+                addStatement("$T.$L($paramString)", className,
+                        syntheticName(method.method),
+                        *takeParams(count + 1, receiverField, OWNER_PARAM, EVENT_PARAM))
+            }
+        }.endControlFlow()
     }
+    addStatement("return")
 }
 
-private fun syntheticName(method: ExecutableElement) = "__synthetic_" + method.simpleName
-
 private fun takeParams(count: Int, vararg params: Any) = params.take(count).toTypedArray()
 
-private fun generateParamString(count: Int) = (0..(count - 1)).joinToString(",") { N }
-
-private fun getAdapterName(type: TypeElement): String {
-    val packageElement = type.getPackage()
-    val qName = type.qualifiedName.toString()
-    val partialName = if (packageElement.isUnnamed) qName else qName.substring(
-            packageElement.qualifiedName.toString().length + 1)
-    return Lifecycling.getAdapterName(partialName)
-}
+private fun generateParamString(count: Int) = (0 until count).joinToString(",") { N }
\ No newline at end of file
diff --git a/lifecycle/compiler/src/tests/kotlin/android/arch/lifecycle/ValidCasesTest.kt b/lifecycle/compiler/src/tests/kotlin/android/arch/lifecycle/ValidCasesTest.kt
index 247d416..83d69e0 100644
--- a/lifecycle/compiler/src/tests/kotlin/android/arch/lifecycle/ValidCasesTest.kt
+++ b/lifecycle/compiler/src/tests/kotlin/android/arch/lifecycle/ValidCasesTest.kt
@@ -19,9 +19,13 @@
 import android.arch.lifecycle.utils.load
 import android.arch.lifecycle.utils.processClass
 import com.google.testing.compile.CompileTester
+import com.google.testing.compile.JavaSourcesSubject
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
+import java.io.File
+import java.lang.Exception
+import java.net.URLClassLoader
 import javax.tools.StandardLocation
 
 @RunWith(JUnit4::class)
@@ -69,7 +73,7 @@
     }
 
     @Test
-    fun testInterface1(){
+    fun testInterface1() {
         processClass("foo.InterfaceOk1").compilesWithoutError()
     }
 
@@ -112,4 +116,40 @@
             CompileTester.SuccessfulFileClause<T> {
         return generatesFileNamed(StandardLocation.CLASS_OUTPUT, "", "META-INF/proguard/$name")
     }
+
+    @Test
+    fun testJar() {
+        JavaSourcesSubject.assertThat(load("foo.DerivedFromJar", ""))
+                .withClasspathFrom(libraryClassLoader())
+                .processedWith(LifecycleProcessor())
+                .compilesWithoutError().and()
+                .generatesSources(load("foo.DerivedFromJar_LifecycleAdapter", "expected"))
+    }
+
+    @Test
+    fun testExtendFromJarFailToGenerateAdapter() {
+        val compileTester = JavaSourcesSubject.assertThat(load("foo.DerivedFromJar1", ""))
+                .withClasspathFrom(libraryClassLoader())
+                .processedWith(LifecycleProcessor())
+                .compilesWithoutError()
+        compileTester.withWarningContaining("Failed to generate an Adapter for")
+        doesntGenerateClass(compileTester, "test.library", "ObserverNoAdapter_LifecycleAdapter")
+        doesntGenerateClass(compileTester, "foo", "DerivedFromJar1_LifecycleAdapter")
+    }
+
+    // compile-testing has fancy, but not always convenient API
+    private fun doesntGenerateClass(compile: CompileTester.SuccessfulCompilationClause,
+                                    packageName: String, className: String) {
+        try {
+            compile.and().generatesFileNamed(StandardLocation.CLASS_OUTPUT,
+                    packageName, "$className.class")
+            throw Exception("$packageName.$className shouldn't be generated")
+        } catch (e: AssertionError) {
+        }
+    }
+
+    private fun libraryClassLoader(): URLClassLoader {
+        val jarUrl = File("src/tests/test-data/lib/test-library.jar").toURI().toURL()
+        return URLClassLoader(arrayOf(jarUrl), this.javaClass.classLoader)
+    }
 }
diff --git a/lifecycle/compiler/src/tests/test-data/Bar.java b/lifecycle/compiler/src/tests/test-data/Bar.java
index 773948e..cfc41ca 100644
--- a/lifecycle/compiler/src/tests/test-data/Bar.java
+++ b/lifecycle/compiler/src/tests/test-data/Bar.java
@@ -4,10 +4,11 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-public class Bar {
+public class Bar implements LifecycleObserver {
     @OnLifecycleEvent(ON_START)
     public void doOnStart() {
     }
@@ -20,17 +21,17 @@
     public void doOnStop2Args(LifecycleOwner provider) {
     }
 
-    public static class Inner1 {
+    public static class Inner1 implements LifecycleObserver {
         @OnLifecycleEvent(ON_START)
         public void doOnStart() {
         }
 
-        public static class Inner2 {
+        public static class Inner2 implements LifecycleObserver {
             @OnLifecycleEvent(ON_START)
             public void doOnStart() {
             }
 
-            public static class Inner3 {
+            public static class Inner3 implements LifecycleObserver {
                 @OnLifecycleEvent(ON_START)
                 public void doOnStart() {
                 }
diff --git a/lifecycle/compiler/src/tests/test-data/DerivedFromJar.java b/lifecycle/compiler/src/tests/test-data/DerivedFromJar.java
new file mode 100644
index 0000000..d503903
--- /dev/null
+++ b/lifecycle/compiler/src/tests/test-data/DerivedFromJar.java
@@ -0,0 +1,12 @@
+package foo;
+
+import static android.arch.lifecycle.Lifecycle.Event.ON_START;
+
+import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.OnLifecycleEvent;
+
+public class DerivedFromJar extends test.library.LibraryBaseObserver {
+    @OnLifecycleEvent(ON_START)
+    public void doAnother() {
+    }
+}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java b/lifecycle/compiler/src/tests/test-data/DerivedFromJar1.java
similarity index 66%
copy from paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
copy to lifecycle/compiler/src/tests/test-data/DerivedFromJar1.java
index 5318d38..efcfaff 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
+++ b/lifecycle/compiler/src/tests/test-data/DerivedFromJar1.java
@@ -14,12 +14,15 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package foo;
 
-import java.util.Arrays;
+import static android.arch.lifecycle.Lifecycle.Event.ON_START;
 
-public class StringPagedList extends NullPaddedList<String> {
-    public StringPagedList(int leadingNulls, int trailingNulls, String... items) {
-        super(leadingNulls, Arrays.asList(items), trailingNulls);
+import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.OnLifecycleEvent;
+
+public class DerivedFromJar1 extends test.library.PPObserverNoAdapter {
+    @OnLifecycleEvent(ON_START)
+    public void doAnother() {
     }
 }
diff --git a/lifecycle/compiler/src/tests/test-data/DifferentPackagesBase1.java b/lifecycle/compiler/src/tests/test-data/DifferentPackagesBase1.java
index cc9d5d5..fb0966d 100644
--- a/lifecycle/compiler/src/tests/test-data/DifferentPackagesBase1.java
+++ b/lifecycle/compiler/src/tests/test-data/DifferentPackagesBase1.java
@@ -19,10 +19,11 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-public class DifferentPackagesBase1 {
+public class DifferentPackagesBase1 implements LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     void onStop(LifecycleOwner provider){}
 }
diff --git a/lifecycle/compiler/src/tests/test-data/DifferentPackagesBase2.java b/lifecycle/compiler/src/tests/test-data/DifferentPackagesBase2.java
index e31921a..1c3ea72 100644
--- a/lifecycle/compiler/src/tests/test-data/DifferentPackagesBase2.java
+++ b/lifecycle/compiler/src/tests/test-data/DifferentPackagesBase2.java
@@ -19,10 +19,11 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-class DifferentPackagesPreBase2 {
+class DifferentPackagesPreBase2 implements LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     void onStop(LifecycleOwner provider){}
 }
diff --git a/lifecycle/compiler/src/tests/test-data/InheritanceOk1.java b/lifecycle/compiler/src/tests/test-data/InheritanceOk1.java
index 79c2151..889c463 100644
--- a/lifecycle/compiler/src/tests/test-data/InheritanceOk1.java
+++ b/lifecycle/compiler/src/tests/test-data/InheritanceOk1.java
@@ -19,10 +19,11 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-class Base1 {
+class Base1 implements LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     public void onStop(LifecycleOwner provider) {
     }
@@ -43,7 +44,7 @@
     }
 }
 
-class Base2 {
+class Base2 implements LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     public void onStop(LifecycleOwner provider) {
     }
diff --git a/lifecycle/compiler/src/tests/test-data/InheritanceOk2.java b/lifecycle/compiler/src/tests/test-data/InheritanceOk2.java
index 31f0a41..bb00cca 100644
--- a/lifecycle/compiler/src/tests/test-data/InheritanceOk2.java
+++ b/lifecycle/compiler/src/tests/test-data/InheritanceOk2.java
@@ -3,10 +3,11 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-class InheritanceOk2Base {
+class InheritanceOk2Base implements LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     public void onStop(LifecycleOwner provider) {
     }
diff --git a/lifecycle/compiler/src/tests/test-data/InheritanceOk3.java b/lifecycle/compiler/src/tests/test-data/InheritanceOk3.java
index 50c4623..5a3c91d 100644
--- a/lifecycle/compiler/src/tests/test-data/InheritanceOk3.java
+++ b/lifecycle/compiler/src/tests/test-data/InheritanceOk3.java
@@ -19,10 +19,11 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-class InheritanceOk3Base {
+class InheritanceOk3Base implements LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     public void onStop(LifecycleOwner provider) {
     }
diff --git a/lifecycle/compiler/src/tests/test-data/InterfaceOk1.java b/lifecycle/compiler/src/tests/test-data/InterfaceOk1.java
index 3584f6d..8450302 100644
--- a/lifecycle/compiler/src/tests/test-data/InterfaceOk1.java
+++ b/lifecycle/compiler/src/tests/test-data/InterfaceOk1.java
@@ -17,10 +17,11 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-interface InterfaceOk1 {
+interface InterfaceOk1 extends LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     void onStop(LifecycleOwner provider);
 }
diff --git a/lifecycle/compiler/src/tests/test-data/InterfaceOk2.java b/lifecycle/compiler/src/tests/test-data/InterfaceOk2.java
index 58688d3..fee5b10 100644
--- a/lifecycle/compiler/src/tests/test-data/InterfaceOk2.java
+++ b/lifecycle/compiler/src/tests/test-data/InterfaceOk2.java
@@ -19,16 +19,17 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-class InterfaceOk2Base {
+class InterfaceOk2Base implements LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     public void onStop1(LifecycleOwner provider) {
     }
 }
 
-interface InterfaceOk2Interface {
+interface InterfaceOk2Interface extends LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     void onStop2(LifecycleOwner provider);
 }
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidClassModifier.java b/lifecycle/compiler/src/tests/test-data/InvalidClassModifier.java
index 4c30bb6..919bb8c 100644
--- a/lifecycle/compiler/src/tests/test-data/InvalidClassModifier.java
+++ b/lifecycle/compiler/src/tests/test-data/InvalidClassModifier.java
@@ -19,10 +19,11 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.OnLifecycleEvent;
 
 public class InvalidClassModifier {
-    private static class Inner {
+    private static class Inner implements LifecycleObserver {
         @OnLifecycleEvent(ON_STOP)
         private void onStop() {
         }
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidFirstArg1.java b/lifecycle/compiler/src/tests/test-data/InvalidFirstArg1.java
index 26bfc23..b028443 100644
--- a/lifecycle/compiler/src/tests/test-data/InvalidFirstArg1.java
+++ b/lifecycle/compiler/src/tests/test-data/InvalidFirstArg1.java
@@ -3,9 +3,10 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-public class InvalidFirstArg1 {
+public class InvalidFirstArg1 implements LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     public void onStop(Event event) {
     }
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidFirstArg2.java b/lifecycle/compiler/src/tests/test-data/InvalidFirstArg2.java
index 459c316..d9937ac 100644
--- a/lifecycle/compiler/src/tests/test-data/InvalidFirstArg2.java
+++ b/lifecycle/compiler/src/tests/test-data/InvalidFirstArg2.java
@@ -3,9 +3,10 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_ANY;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-public class InvalidFirstArg2 {
+public class InvalidFirstArg2 implements LifecycleObserver {
     @OnLifecycleEvent(ON_ANY)
     public void onStop(Event e2, Event event) {
     }
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidInheritance1.java b/lifecycle/compiler/src/tests/test-data/InvalidInheritance1.java
index 69f6bb2..d8f0f62 100644
--- a/lifecycle/compiler/src/tests/test-data/InvalidInheritance1.java
+++ b/lifecycle/compiler/src/tests/test-data/InvalidInheritance1.java
@@ -19,9 +19,10 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_START;
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-class Base {
+class Base implements LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     void foo() {
     }
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidInheritance2.java b/lifecycle/compiler/src/tests/test-data/InvalidInheritance2.java
index b714e47..b63ad44 100644
--- a/lifecycle/compiler/src/tests/test-data/InvalidInheritance2.java
+++ b/lifecycle/compiler/src/tests/test-data/InvalidInheritance2.java
@@ -19,10 +19,10 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_START;
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
-import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-interface Base {
+interface Base extends LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     void foo();
 }
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidMethodModifier.java b/lifecycle/compiler/src/tests/test-data/InvalidMethodModifier.java
index 6540333..5eed7b8 100644
--- a/lifecycle/compiler/src/tests/test-data/InvalidMethodModifier.java
+++ b/lifecycle/compiler/src/tests/test-data/InvalidMethodModifier.java
@@ -19,9 +19,10 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-public class InvalidMethodModifier {
+public class InvalidMethodModifier implements LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     private void onStop() {
     }
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidSecondArg.java b/lifecycle/compiler/src/tests/test-data/InvalidSecondArg.java
index e98d915..60ad464 100644
--- a/lifecycle/compiler/src/tests/test-data/InvalidSecondArg.java
+++ b/lifecycle/compiler/src/tests/test-data/InvalidSecondArg.java
@@ -2,10 +2,11 @@
 
 import static android.arch.lifecycle.Lifecycle.Event.ON_ANY;
 
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-public class InvalidSecondArg {
+public class InvalidSecondArg implements LifecycleObserver {
     @OnLifecycleEvent(ON_ANY)
     public void onStop(LifecycleOwner provider, Object lastEvent) {
     }
diff --git a/lifecycle/compiler/src/tests/test-data/NoPackageOk.java b/lifecycle/compiler/src/tests/test-data/NoPackageOk.java
index a00283d..e7a84ef 100644
--- a/lifecycle/compiler/src/tests/test-data/NoPackageOk.java
+++ b/lifecycle/compiler/src/tests/test-data/NoPackageOk.java
@@ -17,10 +17,11 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-class NoPackageOk {
+class NoPackageOk implements LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     void onStop(LifecycleOwner provider){}
 }
diff --git a/lifecycle/compiler/src/tests/test-data/OnAnyMethod.java b/lifecycle/compiler/src/tests/test-data/OnAnyMethod.java
index f03f1cd..8761774 100644
--- a/lifecycle/compiler/src/tests/test-data/OnAnyMethod.java
+++ b/lifecycle/compiler/src/tests/test-data/OnAnyMethod.java
@@ -20,10 +20,11 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-public class OnAnyMethod {
+public class OnAnyMethod implements LifecycleObserver {
 
     @OnLifecycleEvent(ON_STOP)
     void onStop(LifecycleOwner provider){}
@@ -31,7 +32,6 @@
     @OnLifecycleEvent(ON_ANY)
     void any(LifecycleOwner provider){}
 
-
     @OnLifecycleEvent(ON_ANY)
     void any(LifecycleOwner provider, Event event){}
 }
diff --git a/lifecycle/compiler/src/tests/test-data/TooManyArgs1.java b/lifecycle/compiler/src/tests/test-data/TooManyArgs1.java
index 0d65098..cdcff60 100644
--- a/lifecycle/compiler/src/tests/test-data/TooManyArgs1.java
+++ b/lifecycle/compiler/src/tests/test-data/TooManyArgs1.java
@@ -3,10 +3,11 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_ANY;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-public class TooManyArgs1 {
+public class TooManyArgs1 implements LifecycleObserver {
     @OnLifecycleEvent(ON_ANY)
     public void onAny(LifecycleOwner provider, Event event, int x) {
     }
diff --git a/lifecycle/compiler/src/tests/test-data/TooManyArgs2.java b/lifecycle/compiler/src/tests/test-data/TooManyArgs2.java
index f332d0b..b38d906 100644
--- a/lifecycle/compiler/src/tests/test-data/TooManyArgs2.java
+++ b/lifecycle/compiler/src/tests/test-data/TooManyArgs2.java
@@ -3,10 +3,11 @@
 import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
 import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
 
-public class TooManyArgs2 {
+public class TooManyArgs2 implements LifecycleObserver {
     @OnLifecycleEvent(ON_STOP)
     public void onStop(LifecycleOwner provider, Event event) {
     }
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DerivedFromJar1_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/DerivedFromJar1_LifecycleAdapter.java
new file mode 100644
index 0000000..2ff2db2
--- /dev/null
+++ b/lifecycle/compiler/src/tests/test-data/expected/DerivedFromJar1_LifecycleAdapter.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package foo;
+
+import android.arch.lifecycle.GeneratedAdapter;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
+import java.lang.Override;
+import javax.annotation.Generated;
+
+@Generated("android.arch.lifecycle.LifecycleProcessor")
+public class DerivedFromJar1_LifecycleAdapter implements GeneratedAdapter {
+    final DerivedFromJar1 mReceiver;
+
+    DerivedFromJar_LifecycleAdapter(DerivedFromJar1 receiver) {
+        this.mReceiver = receiver;
+    }
+
+    @Override
+    public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+            MethodCallsLogger logger) {
+        boolean hasLogger = logger != null;
+        if (onAny) {
+            return;
+        }
+        if (event == Lifecycle.Event.ON_STOP) {
+            if (!hasLogger || logger.approveCall("doOnStop", 1)) {
+                mReceiver.doOnStop();
+            }
+            return;
+        }
+        if (event == Lifecycle.Event.ON_START) {
+            if (!hasLogger || logger.approveCall("doAnother", 1)) {
+                mReceiver.doAnother();
+            }
+            return;
+        }
+    }
+}
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DerivedFromJar_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/DerivedFromJar_LifecycleAdapter.java
new file mode 100644
index 0000000..191499d
--- /dev/null
+++ b/lifecycle/compiler/src/tests/test-data/expected/DerivedFromJar_LifecycleAdapter.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package foo;
+
+import android.arch.lifecycle.GeneratedAdapter;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
+import java.lang.Override;
+import javax.annotation.Generated;
+import test.library.LibraryBaseObserver_LifecycleAdapter;
+
+@Generated("android.arch.lifecycle.LifecycleProcessor")
+public class DerivedFromJar_LifecycleAdapter implements GeneratedAdapter {
+  final DerivedFromJar mReceiver;
+
+  DerivedFromJar_LifecycleAdapter(DerivedFromJar receiver) {
+    this.mReceiver = receiver;
+  }
+
+  @Override
+  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+          MethodCallsLogger logger) {
+    boolean hasLogger = logger != null;
+    if (onAny) {
+      return;
+    }
+    if (event == Lifecycle.Event.ON_START) {
+      if (!hasLogger || logger.approveCall("doOnStart", 1)) {
+        mReceiver.doOnStart();
+      }
+      if (!hasLogger || logger.approveCall("doAnother", 1)) {
+        mReceiver.doAnother();
+      }
+      return;
+    }
+    if (event == Lifecycle.Event.ON_PAUSE) {
+      if (!hasLogger || logger.approveCall("doOnPause", 2)) {
+        LibraryBaseObserver_LifecycleAdapter.__synthetic_doOnPause(mReceiver,owner);
+      }
+      return;
+    }
+  }
+}
\ No newline at end of file
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase1_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase1_LifecycleAdapter.java
index 834805a..9b9c9ea 100644
--- a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase1_LifecycleAdapter.java
+++ b/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase1_LifecycleAdapter.java
@@ -16,14 +16,15 @@
 
 package foo;
 
-import android.arch.lifecycle.GenericLifecycleObserver;
+import android.arch.lifecycle.GeneratedAdapter;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
 import java.lang.Override;
 import javax.annotation.Generated;
 
 @Generated("android.arch.lifecycle.LifecycleProcessor")
-public class DifferentPackagesBase1_LifecycleAdapter implements GenericLifecycleObserver {
+public class DifferentPackagesBase1_LifecycleAdapter implements GeneratedAdapter {
   final DifferentPackagesBase1 mReceiver;
 
   DifferentPackagesBase1_LifecycleAdapter(DifferentPackagesBase1 receiver) {
@@ -31,9 +32,17 @@
   }
 
   @Override
-  public void onStateChanged(LifecycleOwner owner, Lifecycle.Event event) {
+  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+      MethodCallsLogger logger) {
+    boolean hasLogger = logger != null;
+    if (onAny) {
+      return;
+    }
     if (event == Lifecycle.Event.ON_STOP) {
-      mReceiver.onStop(owner);
+      if (!hasLogger || logger.approveCall("onStop", 2)) {
+        mReceiver.onStop(owner);
+      }
+      return;
     }
   }
 
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase2_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase2_LifecycleAdapter.java
index 355d14e..d98b5e4 100644
--- a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase2_LifecycleAdapter.java
+++ b/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase2_LifecycleAdapter.java
@@ -16,14 +16,15 @@
 
 package foo;
 
-import android.arch.lifecycle.GenericLifecycleObserver;
+import android.arch.lifecycle.GeneratedAdapter;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
 import java.lang.Override;
 import javax.annotation.Generated;
 
 @Generated("android.arch.lifecycle.LifecycleProcessor")
-public class DifferentPackagesBase2_LifecycleAdapter implements GenericLifecycleObserver {
+public class DifferentPackagesBase2_LifecycleAdapter implements GeneratedAdapter {
   final DifferentPackagesBase2 mReceiver;
 
   DifferentPackagesBase2_LifecycleAdapter(DifferentPackagesBase2 receiver) {
@@ -31,9 +32,17 @@
   }
 
   @Override
-  public void onStateChanged(LifecycleOwner owner, Lifecycle.Event event) {
+  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+      MethodCallsLogger logger) {
+    boolean hasLogger = logger != null;
+    if (onAny) {
+      return;
+    }
     if (event == Lifecycle.Event.ON_STOP) {
-      mReceiver.onStop(owner);
+      if (!hasLogger || logger.approveCall("onStop", 2)) {
+        mReceiver.onStop(owner);
+      }
+      return;
     }
   }
 }
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived1_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived1_LifecycleAdapter.java
index 835fe52..4ff134f 100644
--- a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived1_LifecycleAdapter.java
+++ b/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived1_LifecycleAdapter.java
@@ -16,15 +16,16 @@
 
 package bar;
 
-import android.arch.lifecycle.GenericLifecycleObserver;
+import android.arch.lifecycle.GeneratedAdapter;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
 import foo.DifferentPackagesBase1_LifecycleAdapter;
 import java.lang.Override;
 import javax.annotation.Generated;
 
 @Generated("android.arch.lifecycle.LifecycleProcessor")
-public class DifferentPackagesDerived1_LifecycleAdapter implements GenericLifecycleObserver {
+public class DifferentPackagesDerived1_LifecycleAdapter implements GeneratedAdapter {
   final DifferentPackagesDerived1 mReceiver;
 
   DifferentPackagesDerived1_LifecycleAdapter(DifferentPackagesDerived1 receiver) {
@@ -32,10 +33,20 @@
   }
 
   @Override
-  public void onStateChanged(LifecycleOwner owner, Lifecycle.Event event) {
+  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+      MethodCallsLogger logger) {
+    boolean hasLogger = logger != null;
+    if (onAny) {
+      return;
+    }
     if (event == Lifecycle.Event.ON_STOP) {
-      DifferentPackagesBase1_LifecycleAdapter.__synthetic_onStop(mReceiver,owner);
-      mReceiver.onStop2(owner);
+      if (!hasLogger || logger.approveCall("onStop", 2)) {
+        DifferentPackagesBase1_LifecycleAdapter.__synthetic_onStop(mReceiver,owner);
+      }
+      if (!hasLogger || logger.approveCall("onStop2", 2)) {
+        mReceiver.onStop2(owner);
+      }
+      return;
     }
   }
 }
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived2_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived2_LifecycleAdapter.java
index f697460..4132f95 100644
--- a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived2_LifecycleAdapter.java
+++ b/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived2_LifecycleAdapter.java
@@ -16,14 +16,15 @@
 
 package bar;
 
-import android.arch.lifecycle.GenericLifecycleObserver;
+import android.arch.lifecycle.GeneratedAdapter;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
 import java.lang.Override;
 import javax.annotation.Generated;
 
 @Generated("android.arch.lifecycle.LifecycleProcessor")
-public class DifferentPackagesDerived2_LifecycleAdapter implements GenericLifecycleObserver {
+public class DifferentPackagesDerived2_LifecycleAdapter implements GeneratedAdapter {
   final DifferentPackagesDerived2 mReceiver;
 
   DifferentPackagesDerived2_LifecycleAdapter(DifferentPackagesDerived2 receiver) {
@@ -31,10 +32,20 @@
   }
 
   @Override
-  public void onStateChanged(LifecycleOwner owner, Lifecycle.Event event) {
+  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+      MethodCallsLogger logger) {
+    boolean hasLogger = logger != null;
+    if (onAny) {
+      return;
+    }
     if (event == Lifecycle.Event.ON_STOP) {
-      mReceiver.onStop(owner);
-      mReceiver.onStop2(owner);
+      if (!hasLogger || logger.approveCall("onStop", 2)) {
+        mReceiver.onStop(owner);
+      }
+      if (!hasLogger || logger.approveCall("onStop2", 2)) {
+        mReceiver.onStop2(owner);
+      }
+      return;
     }
   }
 }
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Base_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Base_LifecycleAdapter.java
index 953d351..2013e46 100644
--- a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Base_LifecycleAdapter.java
+++ b/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Base_LifecycleAdapter.java
@@ -16,14 +16,15 @@
 
 package foo;
 
-import android.arch.lifecycle.GenericLifecycleObserver;
+import android.arch.lifecycle.GeneratedAdapter;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
 import java.lang.Override;
 import javax.annotation.Generated;
 
 @Generated("android.arch.lifecycle.LifecycleProcessor")
-public class InheritanceOk2Base_LifecycleAdapter implements GenericLifecycleObserver {
+public class InheritanceOk2Base_LifecycleAdapter implements GeneratedAdapter {
   final InheritanceOk2Base mReceiver;
 
   InheritanceOk2Base_LifecycleAdapter(InheritanceOk2Base receiver) {
@@ -31,9 +32,17 @@
   }
 
   @Override
-  public void onStateChanged(LifecycleOwner owner, Lifecycle.Event event) {
+  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+      MethodCallsLogger logger) {
+    boolean hasLogger = logger != null;
+    if (onAny) {
+      return;
+    }
     if (event == Lifecycle.Event.ON_STOP) {
-      mReceiver.onStop(owner);
+      if (!hasLogger || logger.approveCall("onStop", 2)) {
+        mReceiver.onStop(owner);
+      }
+      return;
     }
   }
 }
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Derived_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Derived_LifecycleAdapter.java
index a1d8a0b..62a631f 100644
--- a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Derived_LifecycleAdapter.java
+++ b/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Derived_LifecycleAdapter.java
@@ -16,14 +16,15 @@
 
 package foo;
 
-import android.arch.lifecycle.GenericLifecycleObserver;
+import android.arch.lifecycle.GeneratedAdapter;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
 import java.lang.Override;
 import javax.annotation.Generated;
 
 @Generated("android.arch.lifecycle.LifecycleProcessor")
-public class InheritanceOk2Derived_LifecycleAdapter implements GenericLifecycleObserver {
+public class InheritanceOk2Derived_LifecycleAdapter implements GeneratedAdapter {
   final InheritanceOk2Derived mReceiver;
 
   InheritanceOk2Derived_LifecycleAdapter(InheritanceOk2Derived receiver) {
@@ -31,10 +32,20 @@
   }
 
   @Override
-  public void onStateChanged(LifecycleOwner owner, Lifecycle.Event event) {
+  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+      MethodCallsLogger logger) {
+    boolean hasLogger = logger != null;
+    if (onAny) {
+      return;
+    }
     if (event == Lifecycle.Event.ON_STOP) {
-      mReceiver.onStop(owner);
-      mReceiver.onStop2(owner);
+      if (!hasLogger || logger.approveCall("onStop", 2)) {
+        mReceiver.onStop(owner);
+      }
+      if (!hasLogger || logger.approveCall("onStop2", 2)) {
+        mReceiver.onStop2(owner);
+      }
+      return;
     }
   }
 }
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Base_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Base_LifecycleAdapter.java
index 41cf958..4b545d9 100644
--- a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Base_LifecycleAdapter.java
+++ b/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Base_LifecycleAdapter.java
@@ -16,14 +16,15 @@
 
 package foo;
 
-import android.arch.lifecycle.GenericLifecycleObserver;
+import android.arch.lifecycle.GeneratedAdapter;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
 import java.lang.Override;
 import javax.annotation.Generated;
 
 @Generated("android.arch.lifecycle.LifecycleProcessor")
-public class InheritanceOk3Base_LifecycleAdapter implements GenericLifecycleObserver {
+public class InheritanceOk3Base_LifecycleAdapter implements GeneratedAdapter {
   final InheritanceOk3Base mReceiver;
 
   InheritanceOk3Base_LifecycleAdapter(InheritanceOk3Base receiver) {
@@ -31,9 +32,17 @@
   }
 
   @Override
-  public void onStateChanged(LifecycleOwner owner, Lifecycle.Event event) {
+  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+      MethodCallsLogger logger) {
+    boolean hasLogger = logger != null;
+    if (onAny) {
+      return;
+    }
     if (event == Lifecycle.Event.ON_STOP) {
-      mReceiver.onStop(owner);
+      if (!hasLogger || logger.approveCall("onStop", 2)) {
+        mReceiver.onStop(owner);
+      }
+      return;
     }
   }
 }
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Derived_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Derived_LifecycleAdapter.java
index 74e7aa5..643617c 100644
--- a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Derived_LifecycleAdapter.java
+++ b/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Derived_LifecycleAdapter.java
@@ -16,14 +16,15 @@
 
 package foo;
 
-import android.arch.lifecycle.GenericLifecycleObserver;
+import android.arch.lifecycle.GeneratedAdapter;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
 import java.lang.Override;
 import javax.annotation.Generated;
 
 @Generated("android.arch.lifecycle.LifecycleProcessor")
-public class InheritanceOk3Derived_LifecycleAdapter implements GenericLifecycleObserver {
+public class InheritanceOk3Derived_LifecycleAdapter implements GeneratedAdapter {
   final InheritanceOk3Derived mReceiver;
 
   InheritanceOk3Derived_LifecycleAdapter(InheritanceOk3Derived receiver) {
@@ -31,9 +32,17 @@
   }
 
   @Override
-  public void onStateChanged(LifecycleOwner owner, Lifecycle.Event event) {
+  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+      MethodCallsLogger logger) {
+    boolean hasLogger = logger != null;
+    if (onAny) {
+      return;
+    }
     if (event == Lifecycle.Event.ON_STOP) {
-      mReceiver.onStop(owner);
+      if (!hasLogger || logger.approveCall("onStop", 2)) {
+        mReceiver.onStop(owner);
+      }
+      return;
     }
   }
 }
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Base_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Base_LifecycleAdapter.java
index ab9ff21..59aa5a2 100644
--- a/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Base_LifecycleAdapter.java
+++ b/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Base_LifecycleAdapter.java
@@ -16,14 +16,15 @@
 
 package foo;
 
-import android.arch.lifecycle.GenericLifecycleObserver;
+import android.arch.lifecycle.GeneratedAdapter;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
 import java.lang.Override;
 import javax.annotation.Generated;
 
 @Generated("android.arch.lifecycle.LifecycleProcessor")
-public class InterfaceOk2Base_LifecycleAdapter implements GenericLifecycleObserver {
+public class InterfaceOk2Base_LifecycleAdapter implements GeneratedAdapter {
   final InterfaceOk2Base mReceiver;
 
   InterfaceOk2Base_LifecycleAdapter(InterfaceOk2Base receiver) {
@@ -31,9 +32,17 @@
   }
 
   @Override
-  public void onStateChanged(LifecycleOwner owner, Lifecycle.Event event) {
+  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+      MethodCallsLogger logger) {
+    boolean hasLogger = logger != null;
+    if (onAny) {
+      return;
+    }
     if (event == Lifecycle.Event.ON_STOP) {
-      mReceiver.onStop1(owner);
+      if (!hasLogger || logger.approveCall("onStop1", 2)) {
+        mReceiver.onStop1(owner);
+      }
+      return;
     }
   }
 }
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Derived_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Derived_LifecycleAdapter.java
index 288e47e..e04dec6 100644
--- a/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Derived_LifecycleAdapter.java
+++ b/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Derived_LifecycleAdapter.java
@@ -16,14 +16,15 @@
 
 package foo;
 
-import android.arch.lifecycle.GenericLifecycleObserver;
+import android.arch.lifecycle.GeneratedAdapter;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
 import java.lang.Override;
 import javax.annotation.Generated;
 
 @Generated("android.arch.lifecycle.LifecycleProcessor")
-public class InterfaceOk2Derived_LifecycleAdapter implements GenericLifecycleObserver {
+public class InterfaceOk2Derived_LifecycleAdapter implements GeneratedAdapter {
   final InterfaceOk2Derived mReceiver;
 
   InterfaceOk2Derived_LifecycleAdapter(InterfaceOk2Derived receiver) {
@@ -31,11 +32,23 @@
   }
 
   @Override
-  public void onStateChanged(LifecycleOwner owner, Lifecycle.Event event) {
+  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+      MethodCallsLogger logger) {
+    boolean hasLogger = logger != null;
+    if (onAny) {
+      return;
+    }
     if (event == Lifecycle.Event.ON_STOP) {
-      mReceiver.onStop1(owner);
-      mReceiver.onStop2(owner);
-      mReceiver.onStop3(owner);
+      if (!hasLogger || logger.approveCall("onStop1", 2)) {
+        mReceiver.onStop1(owner);
+      }
+      if (!hasLogger || logger.approveCall("onStop2", 2)) {
+        mReceiver.onStop2(owner);
+      }
+      if (!hasLogger || logger.approveCall("onStop3", 2)) {
+        mReceiver.onStop3(owner);
+      }
+      return;
     }
   }
 }
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Interface_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Interface_LifecycleAdapter.java
index 2cfba33..268f68b 100644
--- a/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Interface_LifecycleAdapter.java
+++ b/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Interface_LifecycleAdapter.java
@@ -16,14 +16,15 @@
 
 package foo;
 
-import android.arch.lifecycle.GenericLifecycleObserver;
+import android.arch.lifecycle.GeneratedAdapter;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
 import java.lang.Override;
 import javax.annotation.Generated;
 
 @Generated("android.arch.lifecycle.LifecycleProcessor")
-public class InterfaceOk2Interface_LifecycleAdapter implements GenericLifecycleObserver {
+public class InterfaceOk2Interface_LifecycleAdapter implements GeneratedAdapter {
   final InterfaceOk2Interface mReceiver;
 
   InterfaceOk2Interface_LifecycleAdapter(InterfaceOk2Interface receiver) {
@@ -31,9 +32,17 @@
   }
 
   @Override
-  public void onStateChanged(LifecycleOwner owner, Lifecycle.Event event) {
+  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+      MethodCallsLogger logger) {
+    boolean hasLogger = logger != null;
+    if (onAny) {
+      return;
+    }
     if (event == Lifecycle.Event.ON_STOP) {
-      mReceiver.onStop2(owner);
+      if (!hasLogger || logger.approveCall("onStop2", 2)) {
+        mReceiver.onStop2(owner);
+      }
+      return;
     }
   }
 }
diff --git a/lifecycle/compiler/src/tests/test-data/expected/ObserverNoAdapter_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/ObserverNoAdapter_LifecycleAdapter.java
new file mode 100644
index 0000000..c2dc1b6
--- /dev/null
+++ b/lifecycle/compiler/src/tests/test-data/expected/ObserverNoAdapter_LifecycleAdapter.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package test.library;
+
+import android.arch.lifecycle.GeneratedAdapter;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
+import java.lang.Override;
+import javax.annotation.Generated;
+
+@Generated("android.arch.lifecycle.LifecycleProcessor")
+public class ObserverNoAdapter_LifecycleAdapter implements GeneratedAdapter {
+    final ObserverNoAdapter mReceiver;
+
+    ObserverNoAdapter_LifecycleAdapter(ObserverNoAdapter receiver) {
+        this.mReceiver = receiver;
+    }
+
+    @Override
+    public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+            MethodCallsLogger logger) {
+        boolean hasLogger = logger != null;
+        if (onAny) {
+            return;
+        }
+        if (event == Lifecycle.Event.ON_STOP) {
+            if (!hasLogger || logger.approveCall("doOnStop", 1)) {
+                mReceiver.doOnStop();
+            }
+            return;
+        }
+    }
+}
diff --git a/lifecycle/compiler/src/tests/test-data/expected/OnAnyMethod_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/expected/OnAnyMethod_LifecycleAdapter.java
index 3e0b958..ba7ccc1 100644
--- a/lifecycle/compiler/src/tests/test-data/expected/OnAnyMethod_LifecycleAdapter.java
+++ b/lifecycle/compiler/src/tests/test-data/expected/OnAnyMethod_LifecycleAdapter.java
@@ -16,14 +16,15 @@
 
 package foo;
 
-import android.arch.lifecycle.GenericLifecycleObserver;
+import android.arch.lifecycle.GeneratedAdapter;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.MethodCallsLogger;
 import java.lang.Override;
 import javax.annotation.Generated;
 
 @Generated("android.arch.lifecycle.LifecycleProcessor")
-public class OnAnyMethod_LifecycleAdapter implements GenericLifecycleObserver {
+public class OnAnyMethod_LifecycleAdapter implements GeneratedAdapter {
   final OnAnyMethod mReceiver;
 
   OnAnyMethod_LifecycleAdapter(OnAnyMethod receiver) {
@@ -31,11 +32,23 @@
   }
 
   @Override
-  public void onStateChanged(LifecycleOwner owner, Lifecycle.Event event) {
-    if (event == Lifecycle.Event.ON_STOP) {
-      mReceiver.onStop(owner);
+  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
+      MethodCallsLogger logger) {
+    boolean hasLogger = logger != null;
+    if (onAny) {
+      if (!hasLogger || logger.approveCall("any", 2)) {
+        mReceiver.any(owner);
+      }
+      if (!hasLogger || logger.approveCall("any", 4)) {
+        mReceiver.any(owner,event);
+      }
+      return;
     }
-    mReceiver.any(owner);
-    mReceiver.any(owner,event);
+    if (event == Lifecycle.Event.ON_STOP) {
+      if (!hasLogger || logger.approveCall("onStop", 2)) {
+        mReceiver.onStop(owner);
+      }
+      return;
+    }
   }
 }
diff --git a/lifecycle/compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver.java b/lifecycle/compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver.java
new file mode 100644
index 0000000..c3e83e7
--- /dev/null
+++ b/lifecycle/compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package test.library;
+
+import static android.arch.lifecycle.Lifecycle.Event.ON_START;
+import static android.arch.lifecycle.Lifecycle.Event.ON_PAUSE;
+
+import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.OnLifecycleEvent;
+
+public class LibraryBaseObserver implements LifecycleObserver {
+    @OnLifecycleEvent(ON_START)
+    public void doOnStart() {
+    }
+
+    @OnLifecycleEvent(ON_PAUSE)
+    protected void doOnPause(LifecycleOwner owner) {
+    }
+}
diff --git a/lifecycle/compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver_LifecycleAdapter.java b/lifecycle/compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver_LifecycleAdapter.java
new file mode 100644
index 0000000..ea7e631
--- /dev/null
+++ b/lifecycle/compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver_LifecycleAdapter.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package test.library;
+
+import android.arch.lifecycle.GenericLifecycleObserver;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LifecycleOwner;
+import java.lang.Override;
+import javax.annotation.Generated;
+
+@Generated("android.arch.lifecycle.LifecycleProcessor")
+public class LibraryBaseObserver_LifecycleAdapter implements GenericLifecycleObserver {
+    final LibraryBaseObserver mReceiver;
+
+    LibraryBaseObserver_LifecycleAdapter(LibraryBaseObserver receiver) {
+        this.mReceiver = receiver;
+    }
+
+    @Override
+    public void onStateChanged(LifecycleOwner owner, Lifecycle.Event event) {
+        // fake adapter
+    }
+
+    public static void __synthetic_doOnPause(LibraryBaseObserver receiver, LifecycleOwner owner) {
+        receiver.doOnPause(owner);
+    }
+}
diff --git a/paging/common/src/test/java/android/arch/paging/User.java b/lifecycle/compiler/src/tests/test-data/lib/src/test/library/ObserverNoAdapter.java
similarity index 61%
copy from paging/common/src/test/java/android/arch/paging/User.java
copy to lifecycle/compiler/src/tests/test-data/lib/src/test/library/ObserverNoAdapter.java
index a6d965a..ea000f7 100644
--- a/paging/common/src/test/java/android/arch/paging/User.java
+++ b/lifecycle/compiler/src/tests/test-data/lib/src/test/library/ObserverNoAdapter.java
@@ -14,19 +14,17 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package test.library;
 
-public class User {
-    public final String name;
-    public final String info;
+import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
 
-    public User(String name, String info) {
-        this.name = name;
-        this.info = info;
-    }
+import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.OnLifecycleEvent;
 
-    @Override
-    public String toString() {
-        return name;
+public class ObserverNoAdapter implements LifecycleObserver {
+    @OnLifecycleEvent(ON_STOP)
+    public void doOnStop() {
     }
 }
diff --git a/lifecycle/compiler/src/tests/test-data/lib/src/test/library/PPObserverNoAdapter.java b/lifecycle/compiler/src/tests/test-data/lib/src/test/library/PPObserverNoAdapter.java
new file mode 100644
index 0000000..06e10b5
--- /dev/null
+++ b/lifecycle/compiler/src/tests/test-data/lib/src/test/library/PPObserverNoAdapter.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package test.library;
+
+import static android.arch.lifecycle.Lifecycle.Event.ON_START;
+import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
+
+import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.OnLifecycleEvent;
+
+public class PPObserverNoAdapter implements LifecycleObserver {
+    @OnLifecycleEvent(ON_START)
+    protected void doOnStart() {
+    }
+
+    @OnLifecycleEvent(ON_STOP)
+    protected void doOnStop() {
+    }
+}
diff --git a/lifecycle/compiler/src/tests/test-data/lib/src/test/library/PPObserverWithAdapter.java b/lifecycle/compiler/src/tests/test-data/lib/src/test/library/PPObserverWithAdapter.java
new file mode 100644
index 0000000..25a9b5d
--- /dev/null
+++ b/lifecycle/compiler/src/tests/test-data/lib/src/test/library/PPObserverWithAdapter.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package test.library;
+
+import static android.arch.lifecycle.Lifecycle.Event.ON_START;
+import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
+
+import android.arch.lifecycle.Lifecycle.Event;
+import android.arch.lifecycle.LifecycleObserver;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.OnLifecycleEvent;
+
+public class PPObserverWithAdapter implements LifecycleObserver {
+    @OnLifecycleEvent(ON_START)
+    protected void doOnStart() {
+    }
+
+    @OnLifecycleEvent(ON_STOP)
+    protected void doOnStop() {
+    }
+}
diff --git a/lifecycle/compiler/src/tests/test-data/lib/test-library.jar b/lifecycle/compiler/src/tests/test-data/lib/test-library.jar
new file mode 100644
index 0000000..cd9ac8b
--- /dev/null
+++ b/lifecycle/compiler/src/tests/test-data/lib/test-library.jar
Binary files differ
diff --git a/lifecycle/extensions/build.gradle b/lifecycle/extensions/build.gradle
index 241e99a..79be36c 100644
--- a/lifecycle/extensions/build.gradle
+++ b/lifecycle/extensions/build.gradle
@@ -39,13 +39,11 @@
     }
 }
 dependencies {
-    compile project(":lifecycle:common")
     compile project(":lifecycle:runtime")
     compile project(":arch:common")
     compile project(":arch:runtime")
     compile libs.support.fragments, libs.support_exclude_config
-
-    annotationProcessor project(":lifecycle:compiler")
+    compile project(":lifecycle:common")
 
     testCompile project(":arch:core-testing")
     testCompile libs.junit
diff --git a/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/FragmentOperationsLifecycleTest.java b/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/FragmentOperationsLifecycleTest.java
index be062cb..3e61277 100644
--- a/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/FragmentOperationsLifecycleTest.java
+++ b/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/FragmentOperationsLifecycleTest.java
@@ -34,6 +34,7 @@
 import android.support.test.filters.MediumTest;
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 
 import org.junit.Rule;
@@ -55,7 +56,7 @@
     @UiThreadTest
     public void addRemoveFragment() {
         EmptyActivity activity = mActivityTestRule.getActivity();
-        LifecycleFragment fragment = new LifecycleFragment();
+        Fragment fragment = new Fragment();
         FragmentManager fm = activity.getSupportFragmentManager();
         fm.beginTransaction().add(fragment, "tag").commitNow();
         CollectingObserver observer = observeAndCollectIn(fragment);
@@ -70,7 +71,7 @@
     @UiThreadTest
     public void fragmentInBackstack() {
         EmptyActivity activity = mActivityTestRule.getActivity();
-        LifecycleFragment fragment1 = new LifecycleFragment();
+        Fragment fragment1 = new Fragment();
         FragmentManager fm = activity.getSupportFragmentManager();
         fm.beginTransaction().add(R.id.fragment_container, fragment1, "tag").addToBackStack(null)
                 .commit();
@@ -78,7 +79,7 @@
         CollectingObserver observer1 = observeAndCollectIn(fragment1);
         assertThat(observer1.getEventsAndReset(), is(asList(ON_CREATE, ON_START, ON_RESUME)));
 
-        LifecycleFragment fragment2 = new LifecycleFragment();
+        Fragment fragment2 = new Fragment();
         fm.beginTransaction().replace(R.id.fragment_container, fragment2).addToBackStack(null)
                 .commit();
         fm.executePendingTransactions();
@@ -95,7 +96,7 @@
         assertThat(observer1.getEventsAndReset(), is(asList(ON_PAUSE, ON_STOP, ON_DESTROY)));
     }
 
-    private static CollectingObserver observeAndCollectIn(LifecycleFragment fragment) {
+    private static CollectingObserver observeAndCollectIn(Fragment fragment) {
         CollectingObserver observer = new CollectingObserver();
         fragment.getLifecycle().addObserver(observer);
         return observer;
diff --git a/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/ViewModelTest.java b/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/ViewModelTest.java
index 98ce027..03ebdf3 100644
--- a/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/ViewModelTest.java
+++ b/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/ViewModelTest.java
@@ -32,6 +32,7 @@
 import android.support.test.filters.MediumTest;
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.FragmentManager;
 
@@ -120,7 +121,7 @@
             void onResume() {
                 try {
                     final FragmentManager manager = activity.getSupportFragmentManager();
-                    LifecycleFragment fragment = new LifecycleFragment();
+                    Fragment fragment = new Fragment();
                     manager.beginTransaction().add(fragment, "temp").commitNow();
                     ViewModel1 vm = ViewModelProviders.of(fragment).get(ViewModel1.class);
                     assertThat(vm.mCleared, is(false));
diff --git a/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/activity/EmptyActivity.java b/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/activity/EmptyActivity.java
index 017fff4..c32c898 100644
--- a/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/activity/EmptyActivity.java
+++ b/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/activity/EmptyActivity.java
@@ -16,13 +16,12 @@
 
 package android.arch.lifecycle.activity;
 
+import android.arch.lifecycle.extensions.test.R;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
+import android.support.v4.app.FragmentActivity;
 
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.extensions.test.R;
-
-public class EmptyActivity extends LifecycleActivity {
+public class EmptyActivity extends FragmentActivity {
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
diff --git a/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/activity/FragmentLifecycleActivity.java b/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/activity/FragmentLifecycleActivity.java
index f4485e8..2eb1cc2 100644
--- a/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/activity/FragmentLifecycleActivity.java
+++ b/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/activity/FragmentLifecycleActivity.java
@@ -17,7 +17,6 @@
 package android.arch.lifecycle.activity;
 
 import android.arch.lifecycle.Lifecycle;
-import android.arch.lifecycle.LifecycleFragment;
 import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
@@ -26,6 +25,7 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
 import android.support.v7.app.AppCompatActivity;
 
 import java.util.ArrayList;
@@ -70,9 +70,9 @@
         mLoggedEvents.clear();
     }
 
-    public static class MainFragment extends LifecycleFragment {
+    public static class MainFragment extends Fragment {
         @Nullable
-        LifecycleFragment mNestedFragment;
+        Fragment mNestedFragment;
 
         @Override
         public void onCreate(@Nullable Bundle savedInstanceState) {
@@ -85,7 +85,7 @@
         }
     }
 
-    public static class NestedFragment extends LifecycleFragment {
+    public static class NestedFragment extends Fragment {
     }
 
     public static Intent intentFor(Context context, boolean nested) {
@@ -98,7 +98,8 @@
         mObservedOwner = provider;
         provider.getLifecycle().addObserver(new LifecycleObserver() {
             @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
-            public void anyEvent(LifecycleOwner owner, Lifecycle.Event event) {
+            public void anyEvent(@SuppressWarnings("unused") LifecycleOwner owner,
+                    Lifecycle.Event event) {
                 mLoggedEvents.add(event);
             }
         });
diff --git a/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/viewmodeltest/ViewModelActivity.java b/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/viewmodeltest/ViewModelActivity.java
index 5ef9f16..1f9f100 100644
--- a/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/viewmodeltest/ViewModelActivity.java
+++ b/lifecycle/extensions/src/androidTest/java/android/arch/lifecycle/viewmodeltest/ViewModelActivity.java
@@ -16,15 +16,14 @@
 
 package android.arch.lifecycle.viewmodeltest;
 
+import android.arch.lifecycle.ViewModelProviders;
 import android.arch.lifecycle.extensions.test.R;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
 
-import android.arch.lifecycle.LifecycleActivity;
-import android.arch.lifecycle.LifecycleFragment;
-import android.arch.lifecycle.ViewModelProviders;
-
-public class ViewModelActivity extends LifecycleActivity {
+public class ViewModelActivity extends FragmentActivity {
     public static final String KEY_FRAGMENT_MODEL = "fragment-model";
     public static final String KEY_ACTIVITY_MODEL = "activity-model";
     public static final String FRAGMENT_TAG_1 = "f1";
@@ -47,7 +46,7 @@
         defaultActivityModel = ViewModelProviders.of(this).get(TestViewModel.class);
     }
 
-    public static class ViewModelFragment extends LifecycleFragment {
+    public static class ViewModelFragment extends Fragment {
         public TestViewModel fragmentModel;
         public TestViewModel activityModel;
         public TestViewModel defaultActivityModel;
diff --git a/lifecycle/extensions/src/main/AndroidManifest.xml b/lifecycle/extensions/src/main/AndroidManifest.xml
index f7698eb..f8a5c48 100644
--- a/lifecycle/extensions/src/main/AndroidManifest.xml
+++ b/lifecycle/extensions/src/main/AndroidManifest.xml
@@ -20,6 +20,6 @@
         <provider android:authorities="${applicationId}.lifecycle-trojan"
             android:multiprocess="true"
             android:exported="false"
-            android:name="android.arch.lifecycle.LifecycleRuntimeTrojanProvider"/>
+            android:name="android.arch.lifecycle.ProcessLifecycleOwnerInitializer"/>
     </application>
 </manifest>
diff --git a/lifecycle/extensions/src/main/java/android/arch/lifecycle/AndroidViewModel.java b/lifecycle/extensions/src/main/java/android/arch/lifecycle/AndroidViewModel.java
index 2c7e173..106b2ef 100644
--- a/lifecycle/extensions/src/main/java/android/arch/lifecycle/AndroidViewModel.java
+++ b/lifecycle/extensions/src/main/java/android/arch/lifecycle/AndroidViewModel.java
@@ -16,7 +16,9 @@
 
 package android.arch.lifecycle;
 
+import android.annotation.SuppressLint;
 import android.app.Application;
+import android.support.annotation.NonNull;
 
 /**
  * Application context aware {@link ViewModel}.
@@ -25,16 +27,19 @@
  * <p>
  */
 public class AndroidViewModel extends ViewModel {
+    @SuppressLint("StaticFieldLeak")
     private Application mApplication;
 
-    public AndroidViewModel(Application application) {
+    public AndroidViewModel(@NonNull Application application) {
         mApplication = application;
     }
 
     /**
      * Return the application.
      */
+    @NonNull
     public <T extends Application> T getApplication() {
+        //noinspection unchecked
         return (T) mApplication;
     }
 }
diff --git a/lifecycle/extensions/src/main/java/android/arch/lifecycle/ComputableLiveData.java b/lifecycle/extensions/src/main/java/android/arch/lifecycle/ComputableLiveData.java
index fe18243..1ddcb1a 100644
--- a/lifecycle/extensions/src/main/java/android/arch/lifecycle/ComputableLiveData.java
+++ b/lifecycle/extensions/src/main/java/android/arch/lifecycle/ComputableLiveData.java
@@ -16,7 +16,7 @@
 
 package android.arch.lifecycle;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.support.annotation.MainThread;
 import android.support.annotation.NonNull;
 import android.support.annotation.RestrictTo;
@@ -53,7 +53,7 @@
             @Override
             protected void onActive() {
                 // TODO if we make this class public, we should accept an executor
-                AppToolkitTaskExecutor.getInstance().executeOnDiskIO(mRefreshRunnable);
+                ArchTaskExecutor.getInstance().executeOnDiskIO(mRefreshRunnable);
             }
         };
     }
@@ -115,7 +115,7 @@
             if (mInvalid.compareAndSet(false, true)) {
                 if (isActive) {
                     // TODO if we make this class public, we should accept an executor.
-                    AppToolkitTaskExecutor.getInstance().executeOnDiskIO(mRefreshRunnable);
+                    ArchTaskExecutor.getInstance().executeOnDiskIO(mRefreshRunnable);
                 }
             }
         }
@@ -127,7 +127,7 @@
      * When there are active observers, this will trigger a call to {@link #compute()}.
      */
     public void invalidate() {
-        AppToolkitTaskExecutor.getInstance().executeOnMainThread(mInvalidationRunnable);
+        ArchTaskExecutor.getInstance().executeOnMainThread(mInvalidationRunnable);
     }
 
     @SuppressWarnings("WeakerAccess")
diff --git a/lifecycle/extensions/src/main/java/android/arch/lifecycle/LiveData.java b/lifecycle/extensions/src/main/java/android/arch/lifecycle/LiveData.java
index 99d859c..5b09c32 100644
--- a/lifecycle/extensions/src/main/java/android/arch/lifecycle/LiveData.java
+++ b/lifecycle/extensions/src/main/java/android/arch/lifecycle/LiveData.java
@@ -19,10 +19,11 @@
 import static android.arch.lifecycle.Lifecycle.State.DESTROYED;
 import static android.arch.lifecycle.Lifecycle.State.STARTED;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.core.internal.SafeIterableMap;
 import android.arch.lifecycle.Lifecycle.State;
 import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
 import java.util.Iterator;
@@ -53,7 +54,7 @@
  * but can also be used for sharing data between different modules in your application
  * in a decoupled fashion.
  *
- * @param <T> The type of data hold by this instance
+ * @param <T> The type of data held by this instance
  * @see ViewModel
  */
 @SuppressWarnings({"WeakerAccess", "unused"})
@@ -119,6 +120,7 @@
         // the observer moved to an active state, if we've not received that event, we better not
         // notify for a more predictable notification order.
         if (!isActiveState(observer.owner.getLifecycle().getCurrentState())) {
+            observer.activeStateChanged(false);
             return;
         }
         if (observer.lastVersion >= mVersion) {
@@ -182,7 +184,7 @@
      * @param observer The observer that will receive the events
      */
     @MainThread
-    public void observe(LifecycleOwner owner, Observer<T> observer) {
+    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
         if (owner.getLifecycle().getCurrentState() == DESTROYED) {
             // ignore
             return;
@@ -197,7 +199,6 @@
             return;
         }
         owner.getLifecycle().addObserver(wrapper);
-        wrapper.activeStateChanged(isActiveState(owner.getLifecycle().getCurrentState()));
     }
 
     /**
@@ -215,7 +216,7 @@
      * @param observer The observer that will receive the events
      */
     @MainThread
-    public void observeForever(Observer<T> observer) {
+    public void observeForever(@NonNull Observer<T> observer) {
         observe(ALWAYS_ON, observer);
     }
 
@@ -225,7 +226,7 @@
      * @param observer The Observer to receive events.
      */
     @MainThread
-    public void removeObserver(final Observer<T> observer) {
+    public void removeObserver(@NonNull final Observer<T> observer) {
         assertMainThread("removeObserver");
         LifecycleBoundObserver removed = mObservers.remove(observer);
         if (removed == null) {
@@ -241,7 +242,7 @@
      * @param owner The {@code LifecycleOwner} scope for the observers to be removed.
      */
     @MainThread
-    public void removeObservers(final LifecycleOwner owner) {
+    public void removeObservers(@NonNull final LifecycleOwner owner) {
         assertMainThread("removeObservers");
         for (Map.Entry<Observer<T>, LifecycleBoundObserver> entry : mObservers) {
             if (entry.getValue().owner == owner) {
@@ -274,7 +275,7 @@
         if (!postTask) {
             return;
         }
-        AppToolkitTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
+        ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
     }
 
     /**
@@ -355,7 +356,7 @@
         return mActiveCount > 0;
     }
 
-    class LifecycleBoundObserver implements LifecycleObserver {
+    class LifecycleBoundObserver implements GenericLifecycleObserver {
         public final LifecycleOwner owner;
         public final Observer<T> observer;
         public boolean active;
@@ -366,9 +367,8 @@
             this.observer = observer;
         }
 
-        @SuppressWarnings("unused")
-        @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
-        void onStateChange() {
+        @Override
+        public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
             if (owner.getLifecycle().getCurrentState() == DESTROYED) {
                 removeObserver(observer);
                 return;
@@ -376,7 +376,6 @@
             // immediately set active state, so we'd never dispatch anything to inactive
             // owner
             activeStateChanged(isActiveState(owner.getLifecycle().getCurrentState()));
-
         }
 
         void activeStateChanged(boolean newActive) {
@@ -403,7 +402,7 @@
     }
 
     private void assertMainThread(String methodName) {
-        if (!AppToolkitTaskExecutor.getInstance().isMainThread()) {
+        if (!ArchTaskExecutor.getInstance().isMainThread()) {
             throw new IllegalStateException("Cannot invoke " + methodName + " on a background"
                     + " thread");
         }
diff --git a/lifecycle/extensions/src/main/java/android/arch/lifecycle/MediatorLiveData.java b/lifecycle/extensions/src/main/java/android/arch/lifecycle/MediatorLiveData.java
index 672b3a3..5864739 100644
--- a/lifecycle/extensions/src/main/java/android/arch/lifecycle/MediatorLiveData.java
+++ b/lifecycle/extensions/src/main/java/android/arch/lifecycle/MediatorLiveData.java
@@ -19,16 +19,49 @@
 import android.arch.core.internal.SafeIterableMap;
 import android.support.annotation.CallSuper;
 import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
 import java.util.Map;
 
 /**
- * {@link LiveData} subclass which may observer other {@code LiveData} objects and react on
+ * {@link LiveData} subclass which may observe other {@code LiveData} objects and react on
  * {@code OnChanged} events from them.
  * <p>
  * This class correctly propagates its active/inactive states down to source {@code LiveData}
  * objects.
+ * <p>
+ * Consider the following scenario: we have 2 instances of {@code LiveData}, let's name them
+ * {@code liveData1} and {@code liveData2}, and we want to merge their emissions in one object:
+ * {@code liveDataMerger}. Then, {@code liveData1} and {@code liveData2} will become sources for
+ * the {@code MediatorLiveData liveDataMerger} and every time {@code onChanged} callback
+ * is called for either of them, we set a new value in {@code liveDataMerger}.
+ *
+ * <pre>
+ * LiveData<Integer> liveData1 = ...;
+ * LiveData<Integer> liveData2 = ...;
+ *
+ * MediatorLiveData<Integer> liveDataMerger = new MediatorLiveData<>();
+ * liveDataMerger.addSource(liveData1, value -> liveDataMerger.setValue(value));
+ * liveDataMerger.addSource(liveData2, value -> liveDataMerger.setValue(value));
+ * </pre>
+ * <p>
+ * Let's consider that we only want 10 values emitted by {@code liveData1}, to be
+ * merged in the {@code liveDataMerger}. Then, after 10 values, we can stop listening to {@code
+ * liveData1} and remove it as a source.
+ * <pre>
+ * liveDataMerger.addSource(liveData1, new Observer<Integer>() {
+ *      private int count = 1;
+ *
+ *      {@literal @}Override public void onChanged(@Nullable Integer s) {
+ *          count++;
+ *          liveDataMerger.setValue(s);
+ *          if (count > 10) {
+ *              liveDataMerger.removeSource(liveData1);
+ *          }
+ *      }
+ * });
+ * </pre>
  *
  * @param <T> The type of data hold by this instance
  */
@@ -49,7 +82,7 @@
      * @param <S>       The type of data hold by {@code source} LiveData
      */
     @MainThread
-    public <S> void addSource(LiveData<S> source, Observer<S> onChanged) {
+    public <S> void addSource(@NonNull LiveData<S> source, @NonNull Observer<S> onChanged) {
         Source<S> e = new Source<>(source, onChanged);
         Source<?> existing = mSources.putIfAbsent(source, e);
         if (existing != null && existing.mObserver != onChanged) {
@@ -71,7 +104,7 @@
      * @param <S>      the type of data hold by {@code source} LiveData
      */
     @MainThread
-    public <S> void removeSource(LiveData<S> toRemote) {
+    public <S> void removeSource(@NonNull LiveData<S> toRemote) {
         Source<?> source = mSources.remove(toRemote);
         if (source != null) {
             source.unplug();
diff --git a/lifecycle/extensions/src/main/java/android/arch/lifecycle/ProcessLifecycleOwner.java b/lifecycle/extensions/src/main/java/android/arch/lifecycle/ProcessLifecycleOwner.java
index e2a1256..74ea97f 100644
--- a/lifecycle/extensions/src/main/java/android/arch/lifecycle/ProcessLifecycleOwner.java
+++ b/lifecycle/extensions/src/main/java/android/arch/lifecycle/ProcessLifecycleOwner.java
@@ -22,6 +22,7 @@
 import android.content.Context;
 import android.os.Bundle;
 import android.os.Handler;
+import android.support.annotation.NonNull;
 import android.support.annotation.VisibleForTesting;
 
 /**
@@ -156,7 +157,7 @@
         app.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() {
             @Override
             public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
-                ReportFragment  .get(activity).setProcessListener(mInitializationListener);
+                ReportFragment.get(activity).setProcessListener(mInitializationListener);
             }
 
             @Override
@@ -171,6 +172,7 @@
         });
     }
 
+    @NonNull
     @Override
     public Lifecycle getLifecycle() {
         return mRegistry;
diff --git a/lifecycle/extensions/src/main/java/android/arch/lifecycle/LifecycleRuntimeTrojanProvider.java b/lifecycle/extensions/src/main/java/android/arch/lifecycle/ProcessLifecycleOwnerInitializer.java
similarity index 95%
rename from lifecycle/extensions/src/main/java/android/arch/lifecycle/LifecycleRuntimeTrojanProvider.java
rename to lifecycle/extensions/src/main/java/android/arch/lifecycle/ProcessLifecycleOwnerInitializer.java
index ac278c0..6cf80d2 100644
--- a/lifecycle/extensions/src/main/java/android/arch/lifecycle/LifecycleRuntimeTrojanProvider.java
+++ b/lifecycle/extensions/src/main/java/android/arch/lifecycle/ProcessLifecycleOwnerInitializer.java
@@ -29,7 +29,7 @@
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class LifecycleRuntimeTrojanProvider extends ContentProvider {
+public class ProcessLifecycleOwnerInitializer extends ContentProvider {
     @Override
     public boolean onCreate() {
         LifecycleDispatcher.init(getContext());
diff --git a/lifecycle/extensions/src/main/java/android/arch/lifecycle/Transformations.java b/lifecycle/extensions/src/main/java/android/arch/lifecycle/Transformations.java
index c316563..c735f8b 100644
--- a/lifecycle/extensions/src/main/java/android/arch/lifecycle/Transformations.java
+++ b/lifecycle/extensions/src/main/java/android/arch/lifecycle/Transformations.java
@@ -18,10 +18,17 @@
 
 import android.arch.core.util.Function;
 import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
 /**
  * Transformations for a {@link LiveData} class.
+ * <p>
+ * You can use transformation methods to carry information across the observer's lifecycle. The
+ * transformations aren't calculated unless an observer is observing the returned LiveData object.
+ * <p>
+ * Because the transformations are calculated lazily, lifecycle-related behavior is implicitly
+ * passed down without requiring additional explicit calls or dependencies.
  */
 @SuppressWarnings("WeakerAccess")
 public class Transformations {
@@ -34,6 +41,18 @@
      * LiveData and returns LiveData, which emits resulting values.
      * <p>
      * The given function {@code func} will be executed on the main thread.
+     * <p>
+     * Suppose that you have a LiveData, named {@code userLiveData}, that contains user data and you
+     * need to display the user name, created by concatenating the first and the last
+     * name of the user. You can define a function that handles the name creation, that will be
+     * applied to every value emitted by {@code useLiveData}.
+     *
+     * <pre>
+     * LiveData<User> userLiveData = ...;
+     * LiveData<String> userName = Transformations.map(userLiveData, user -> {
+     *      return user.firstName + " " + user.lastName
+     * });
+     * </pre>
      *
      * @param source a {@code LiveData} to listen to
      * @param func   a function to apply
@@ -42,7 +61,8 @@
      * @return a LiveData which emits resulting values
      */
     @MainThread
-    public static <X, Y> LiveData<Y> map(LiveData<X> source, final Function<X, Y> func) {
+    public static <X, Y> LiveData<Y> map(@NonNull LiveData<X> source,
+            @NonNull final Function<X, Y> func) {
         final MediatorLiveData<Y> result = new MediatorLiveData<>();
         result.addSource(source, new Observer<X>() {
             @Override
@@ -63,17 +83,47 @@
      * <p>
      * If the given function returns null, then {@code swLiveData} is not "backed" by any other
      * LiveData.
+     *
      * <p>
      * The given function {@code func} will be executed on the main thread.
      *
+     * <p>
+     * Consider the case where you have a LiveData containing a user id. Every time there's a new
+     * user id emitted, you want to trigger a request to get the user object corresponding to that
+     * id, from a repository that also returns a LiveData.
+     * <p>
+     * The {@code userIdLiveData} is the trigger and the LiveData returned by the {@code
+     * repository.getUserById} is the "backing" LiveData.
+     * <p>
+     * In a scenario where the repository contains User(1, "Jane") and User(2, "John"), when the
+     * userIdLiveData value is set to "1", the {@code switchMap} will call {@code getUser(1)},
+     * that will return a LiveData containing the value User(1, "Jane"). So now, the userLiveData
+     * will emit User(1, "Jane"). When the user in the repository gets updated to User(1, "Sarah"),
+     * the {@code userLiveData} gets automatically notified and will emit User(1, "Sarah").
+     * <p>
+     * When the {@code setUserId} method is called with userId = "2", the value of the {@code
+     * userIdLiveData} changes and automatically triggers a request for getting the user with id
+     * "2" from the repository. So, the {@code userLiveData} emits User(2, "John"). The LiveData
+     * returned by {@code repository.getUserById(1)} is removed as a source.
+     *
+     * <pre>
+     * MutableLiveData<String> userIdLiveData = ...;
+     * LiveData<User> userLiveData = Transformations.switchMap(userIdLiveData, id ->
+     *     repository.getUserById(id));
+     *
+     * void setUserId(String userId) {
+     *      this.userIdLiveData.setValue(userId);
+     * }
+     * </pre>
+     *
      * @param trigger a {@code LiveData} to listen to
      * @param func    a function which creates "backing" LiveData
      * @param <X>     a type of {@code source} LiveData
      * @param <Y>     a type of resulting LiveData
      */
     @MainThread
-    public static <X, Y> LiveData<Y> switchMap(LiveData<X> trigger,
-            final Function<X, LiveData<Y>> func) {
+    public static <X, Y> LiveData<Y> switchMap(@NonNull LiveData<X> trigger,
+            @NonNull final Function<X, LiveData<Y>> func) {
         final MediatorLiveData<Y> result = new MediatorLiveData<>();
         result.addSource(trigger, new Observer<X>() {
             LiveData<Y> mSource;
diff --git a/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelProvider.java b/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelProvider.java
index 7ef591f..29cbab8 100644
--- a/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelProvider.java
+++ b/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelProvider.java
@@ -43,7 +43,8 @@
          * @param <T>        The type parameter for the ViewModel.
          * @return a newly created ViewModel
          */
-        <T extends ViewModel> T create(Class<T> modelClass);
+        @NonNull
+        <T extends ViewModel> T create(@NonNull Class<T> modelClass);
     }
 
     private final Factory mFactory;
@@ -70,7 +71,7 @@
      * @param factory factory a {@code Factory} which will be used to instantiate
      *                new {@code ViewModels}
      */
-    public ViewModelProvider(ViewModelStore store, Factory factory) {
+    public ViewModelProvider(@NonNull ViewModelStore store, @NonNull Factory factory) {
         mFactory = factory;
         this.mViewModelStore = store;
     }
@@ -88,7 +89,8 @@
      * @param <T>        The type parameter for the ViewModel.
      * @return A ViewModel that is an instance of the given type {@code T}.
      */
-    public <T extends ViewModel> T get(Class<T> modelClass) {
+    @NonNull
+    public <T extends ViewModel> T get(@NonNull Class<T> modelClass) {
         String canonicalName = modelClass.getCanonicalName();
         if (canonicalName == null) {
             throw new IllegalArgumentException("Local and anonymous classes can not be ViewModels");
@@ -136,8 +138,9 @@
      */
     public static class NewInstanceFactory implements Factory {
 
+        @NonNull
         @Override
-        public <T extends ViewModel> T create(Class<T> modelClass) {
+        public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
             //noinspection TryWithIdenticalCatches
             try {
                 return modelClass.newInstance();
diff --git a/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelProviders.java b/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelProviders.java
index f64365b..b4b20aa 100644
--- a/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelProviders.java
+++ b/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelProviders.java
@@ -17,6 +17,7 @@
 package android.arch.lifecycle;
 
 import android.annotation.SuppressLint;
+import android.app.Activity;
 import android.app.Application;
 import android.arch.lifecycle.ViewModelProvider.Factory;
 import android.support.annotation.MainThread;
@@ -40,6 +41,23 @@
         }
     }
 
+    private static Application checkApplication(Activity activity) {
+        Application application = activity.getApplication();
+        if (application == null) {
+            throw new IllegalStateException("Your activity/fragment is not yet attached to "
+                    + "Application. You can't request ViewModel before onCreate call.");
+        }
+        return application;
+    }
+
+    private static Activity checkActivity(Fragment fragment) {
+        Activity activity = fragment.getActivity();
+        if (activity == null) {
+            throw new IllegalStateException("Can't create ViewModelProvider for detached fragment");
+        }
+        return activity;
+    }
+
     /**
      * Creates a {@link ViewModelProvider}, which retains ViewModels while a scope of given
      * {@code fragment} is alive. More detailed explanation is in {@link ViewModel}.
@@ -51,12 +69,7 @@
      */
     @MainThread
     public static ViewModelProvider of(@NonNull Fragment fragment) {
-        FragmentActivity activity = fragment.getActivity();
-        if (activity == null) {
-            throw new IllegalArgumentException(
-                    "Can't create ViewModelProvider for detached fragment");
-        }
-        initializeFactoryIfNeeded(activity.getApplication());
+        initializeFactoryIfNeeded(checkApplication(checkActivity(fragment)));
         return new ViewModelProvider(ViewModelStores.of(fragment), sDefaultFactory);
     }
 
@@ -71,7 +84,7 @@
      */
     @MainThread
     public static ViewModelProvider of(@NonNull FragmentActivity activity) {
-        initializeFactoryIfNeeded(activity.getApplication());
+        initializeFactoryIfNeeded(checkApplication(activity));
         return new ViewModelProvider(ViewModelStores.of(activity), sDefaultFactory);
     }
 
@@ -87,6 +100,7 @@
      */
     @MainThread
     public static ViewModelProvider of(@NonNull Fragment fragment, @NonNull Factory factory) {
+        checkApplication(checkActivity(fragment));
         return new ViewModelProvider(ViewModelStores.of(fragment), factory);
     }
 
@@ -103,6 +117,7 @@
     @MainThread
     public static ViewModelProvider of(@NonNull FragmentActivity activity,
             @NonNull Factory factory) {
+        checkApplication(activity);
         return new ViewModelProvider(ViewModelStores.of(activity), factory);
     }
 
@@ -124,8 +139,9 @@
             mApplication = application;
         }
 
+        @NonNull
         @Override
-        public <T extends ViewModel> T create(Class<T> modelClass) {
+        public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
             if (AndroidViewModel.class.isAssignableFrom(modelClass)) {
                 //noinspection TryWithIdenticalCatches
                 try {
diff --git a/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelStoreOwner.java b/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelStoreOwner.java
index 5058305..e26fa32 100644
--- a/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelStoreOwner.java
+++ b/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelStoreOwner.java
@@ -16,6 +16,8 @@
 
 package android.arch.lifecycle;
 
+import android.support.annotation.NonNull;
+
 /**
  * A scope that owns {@link ViewModelStore}.
  * <p>
@@ -30,5 +32,6 @@
      *
      * @return a {@code ViewModelStore}
      */
+    @NonNull
     ViewModelStore getViewModelStore();
 }
diff --git a/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelStores.java b/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelStores.java
index 8c17dd9..d7d769d 100644
--- a/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelStores.java
+++ b/lifecycle/extensions/src/main/java/android/arch/lifecycle/ViewModelStores.java
@@ -19,6 +19,7 @@
 import static android.arch.lifecycle.HolderFragment.holderFragmentFor;
 
 import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentActivity;
 
@@ -38,7 +39,7 @@
      * @return a {@code ViewModelStore}
      */
     @MainThread
-    public static ViewModelStore of(FragmentActivity activity) {
+    public static ViewModelStore of(@NonNull FragmentActivity activity) {
         return holderFragmentFor(activity).getViewModelStore();
     }
 
@@ -49,7 +50,7 @@
      * @return a {@code ViewModelStore}
      */
     @MainThread
-    public static ViewModelStore of(Fragment fragment) {
+    public static ViewModelStore of(@NonNull Fragment fragment) {
         return holderFragmentFor(fragment).getViewModelStore();
     }
 }
diff --git a/lifecycle/extensions/src/test/java/android/arch/lifecycle/ComputableLiveDataTest.java b/lifecycle/extensions/src/test/java/android/arch/lifecycle/ComputableLiveDataTest.java
index 0a3fbed..eb89d8d 100644
--- a/lifecycle/extensions/src/test/java/android/arch/lifecycle/ComputableLiveDataTest.java
+++ b/lifecycle/extensions/src/test/java/android/arch/lifecycle/ComputableLiveDataTest.java
@@ -27,7 +27,7 @@
 import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.verify;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.core.executor.TaskExecutor;
 import android.arch.core.executor.TaskExecutorWithFakeMainThread;
 import android.arch.lifecycle.util.InstantTaskExecutor;
@@ -58,12 +58,12 @@
     @Before
     public void swapExecutorDelegate() {
         mTaskExecutor = spy(new InstantTaskExecutor());
-        AppToolkitTaskExecutor.getInstance().setDelegate(mTaskExecutor);
+        ArchTaskExecutor.getInstance().setDelegate(mTaskExecutor);
     }
 
     @After
     public void removeExecutorDelegate() {
-        AppToolkitTaskExecutor.getInstance().setDelegate(null);
+        ArchTaskExecutor.getInstance().setDelegate(null);
     }
 
     @Test
@@ -76,7 +76,7 @@
     @Test
     public void noConcurrentCompute() throws InterruptedException {
         TaskExecutorWithFakeMainThread executor = new TaskExecutorWithFakeMainThread(2);
-        AppToolkitTaskExecutor.getInstance().setDelegate(executor);
+        ArchTaskExecutor.getInstance().setDelegate(executor);
         try {
             // # of compute calls
             final Semaphore computeCounter = new Semaphore(0);
@@ -121,7 +121,7 @@
             // assert no other results arrive
             verify(observer, never()).onChanged(anyInt());
         } finally {
-            AppToolkitTaskExecutor.getInstance().setDelegate(null);
+            ArchTaskExecutor.getInstance().setDelegate(null);
         }
     }
 
diff --git a/lifecycle/extensions/src/test/java/android/arch/lifecycle/LiveDataTest.java b/lifecycle/extensions/src/test/java/android/arch/lifecycle/LiveDataTest.java
index ed2a35d..647d5d7 100644
--- a/lifecycle/extensions/src/test/java/android/arch/lifecycle/LiveDataTest.java
+++ b/lifecycle/extensions/src/test/java/android/arch/lifecycle/LiveDataTest.java
@@ -36,42 +36,57 @@
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.lifecycle.util.InstantTaskExecutor;
 import android.support.annotation.Nullable;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.InOrder;
 import org.mockito.Mockito;
 
 @SuppressWarnings({"unchecked"})
+@RunWith(JUnit4.class)
 public class LiveDataTest {
     private PublicLiveData<String> mLiveData;
     private LifecycleOwner mOwner;
+    private LifecycleOwner mOwner2;
     private LifecycleRegistry mRegistry;
+    private LifecycleRegistry mRegistry2;
     private MethodExec mActiveObserversChanged;
     private boolean mInObserver;
 
     @Before
     public void init() {
         mLiveData = new PublicLiveData<>();
-        mOwner = mock(LifecycleOwner.class);
-        mRegistry = new LifecycleRegistry(mOwner);
-        when(mOwner.getLifecycle()).thenReturn(mRegistry);
+
         mActiveObserversChanged = mock(MethodExec.class);
         mLiveData.activeObserversChanged = mActiveObserversChanged;
+
+        mOwner = mock(LifecycleOwner.class);
+
+        mRegistry = new LifecycleRegistry(mOwner);
+        when(mOwner.getLifecycle()).thenReturn(mRegistry);
+
+        mOwner2 = mock(LifecycleOwner.class);
+
+        mRegistry2 = new LifecycleRegistry(mOwner2);
+        when(mOwner2.getLifecycle()).thenReturn(mRegistry2);
+
         mInObserver = false;
     }
 
     @Before
     public void swapExecutorDelegate() {
-        AppToolkitTaskExecutor.getInstance().setDelegate(new InstantTaskExecutor());
+        ArchTaskExecutor.getInstance().setDelegate(new InstantTaskExecutor());
     }
 
     @After
     public void removeExecutorDelegate() {
-        AppToolkitTaskExecutor.getInstance().setDelegate(null);
+        ArchTaskExecutor.getInstance().setDelegate(null);
     }
 
     @Test
@@ -155,14 +170,11 @@
     @Test
     public void testAddSameObserverIn2LifecycleOwners() {
         Observer<String> observer = (Observer<String>) mock(Observer.class);
-        LifecycleOwner owner2 = mock(LifecycleOwner.class);
-        LifecycleRegistry registry2 = new LifecycleRegistry(owner2);
-        when(owner2.getLifecycle()).thenReturn(registry2);
 
         mLiveData.observe(mOwner, observer);
         Throwable throwable = null;
         try {
-            mLiveData.observe(owner2, observer);
+            mLiveData.observe(mOwner2, observer);
         } catch (Throwable t) {
             throwable = t;
         }
@@ -418,6 +430,244 @@
         verify(mActiveObserversChanged, never()).onCall(anyBoolean());
     }
 
+    @Test
+    public void testRemoveDuringAddition() {
+        mRegistry.handleLifecycleEvent(ON_START);
+        mLiveData.setValue("bla");
+        mLiveData.observeForever(new Observer<String>() {
+            @Override
+            public void onChanged(@Nullable String s) {
+                mLiveData.removeObserver(this);
+            }
+        });
+        assertThat(mLiveData.hasActiveObservers(), is(false));
+        InOrder inOrder = Mockito.inOrder(mActiveObserversChanged);
+        inOrder.verify(mActiveObserversChanged).onCall(true);
+        inOrder.verify(mActiveObserversChanged).onCall(false);
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    @Test
+    public void testRemoveDuringBringingUpToState() {
+        mLiveData.setValue("bla");
+        mLiveData.observeForever(new Observer<String>() {
+            @Override
+            public void onChanged(@Nullable String s) {
+                mLiveData.removeObserver(this);
+            }
+        });
+        mRegistry.handleLifecycleEvent(ON_RESUME);
+        assertThat(mLiveData.hasActiveObservers(), is(false));
+        InOrder inOrder = Mockito.inOrder(mActiveObserversChanged);
+        inOrder.verify(mActiveObserversChanged).onCall(true);
+        inOrder.verify(mActiveObserversChanged).onCall(false);
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    @Test
+    public void setValue_neverActive_observerOnChangedNotCalled() {
+        Observer<String> observer = (Observer<String>) mock(Observer.class);
+        mLiveData.observe(mOwner, observer);
+
+        mLiveData.setValue("1");
+
+        verify(observer, never()).onChanged(anyString());
+    }
+
+    @Test
+    public void setValue_twoObserversTwoStartedOwners_onChangedCalledOnBoth() {
+        Observer<String> observer1 = mock(Observer.class);
+        Observer<String> observer2 = mock(Observer.class);
+
+        mLiveData.observe(mOwner, observer1);
+        mLiveData.observe(mOwner2, observer2);
+
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+        mRegistry2.handleLifecycleEvent(Lifecycle.Event.ON_START);
+
+        mLiveData.setValue("1");
+
+        verify(observer1).onChanged("1");
+        verify(observer2).onChanged("1");
+    }
+
+    @Test
+    public void setValue_twoObserversOneStartedOwner_onChangedCalledOnOneCorrectObserver() {
+        Observer<String> observer1 = mock(Observer.class);
+        Observer<String> observer2 = mock(Observer.class);
+
+        mLiveData.observe(mOwner, observer1);
+        mLiveData.observe(mOwner2, observer2);
+
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+
+        mLiveData.setValue("1");
+
+        verify(observer1).onChanged("1");
+        verify(observer2, never()).onChanged(anyString());
+    }
+
+    @Test
+    public void setValue_twoObserversBothStartedAfterSetValue_onChangedCalledOnBoth() {
+        Observer<String> observer1 = mock(Observer.class);
+        Observer<String> observer2 = mock(Observer.class);
+
+        mLiveData.observe(mOwner, observer1);
+        mLiveData.observe(mOwner2, observer2);
+
+        mLiveData.setValue("1");
+
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+        mRegistry2.handleLifecycleEvent(Lifecycle.Event.ON_START);
+
+        verify(observer1).onChanged("1");
+        verify(observer1).onChanged("1");
+    }
+
+    @Test
+    public void setValue_twoObserversOneStartedAfterSetValue_onChangedCalledOnCorrectObserver() {
+        Observer<String> observer1 = mock(Observer.class);
+        Observer<String> observer2 = mock(Observer.class);
+
+        mLiveData.observe(mOwner, observer1);
+        mLiveData.observe(mOwner2, observer2);
+
+        mLiveData.setValue("1");
+
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+
+        verify(observer1).onChanged("1");
+        verify(observer2, never()).onChanged(anyString());
+    }
+
+    @Test
+    public void setValue_twoObserversOneStarted_liveDataBecomesActive() {
+        Observer<String> observer1 = mock(Observer.class);
+        Observer<String> observer2 = mock(Observer.class);
+
+        mLiveData.observe(mOwner, observer1);
+        mLiveData.observe(mOwner2, observer2);
+
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+
+        verify(mActiveObserversChanged).onCall(true);
+    }
+
+    @Test
+    public void setValue_twoObserversOneStopped_liveDataStaysActive() {
+        Observer<String> observer1 = mock(Observer.class);
+        Observer<String> observer2 = mock(Observer.class);
+
+        mLiveData.observe(mOwner, observer1);
+        mLiveData.observe(mOwner2, observer2);
+
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+        mRegistry2.handleLifecycleEvent(Lifecycle.Event.ON_START);
+
+        verify(mActiveObserversChanged).onCall(true);
+
+        reset(mActiveObserversChanged);
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        verify(mActiveObserversChanged, never()).onCall(anyBoolean());
+    }
+
+    /**
+     * Verifies that if a lifecycle's state changes without an event, and changes to something that
+     * LiveData would become inactive in response to, LiveData will detect the change upon new data
+     * being set and become inactive.  Also verifies that once the lifecycle enters into a state
+     * that LiveData should become active to, that it does indeed become active.
+     */
+    @Test
+    public void liveDataActiveStateIsManagedCorrectlyWithoutEvent_oneObserver() {
+        Observer<String> observer = (Observer<String>) mock(Observer.class);
+        mLiveData.observe(mOwner, observer);
+
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+
+        // Marking state as CREATED should call onInactive.
+        reset(mActiveObserversChanged);
+        mRegistry.markState(Lifecycle.State.CREATED);
+        verify(mActiveObserversChanged).onCall(false);
+        reset(mActiveObserversChanged);
+
+        // Setting a new value should trigger LiveData to realize the Lifecycle it is observing
+        // is in a state where the LiveData should be inactive, so the LiveData will call onInactive
+        // and the Observer shouldn't be affected.
+        mLiveData.setValue("1");
+
+        // state is already CREATED so should not call again
+        verify(mActiveObserversChanged, never()).onCall(anyBoolean());
+        verify(observer, never()).onChanged(anyString());
+
+        // Sanity check.  Because we've only marked the state as CREATED, sending ON_START
+        // should re-dispatch events.
+        reset(mActiveObserversChanged);
+        reset(observer);
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+        verify(mActiveObserversChanged).onCall(true);
+        verify(observer).onChanged("1");
+    }
+
+    /**
+     *  This test verifies that LiveData will detect changes in LifecycleState that would make it
+     *  inactive upon the setting of new data, but only if all of the Lifecycles it's observing
+     *  are all in those states.  It also makes sure that once it is inactive, that it will become
+     *  active again once one of the lifecycles it's observing moves to an appropriate state.
+     */
+    @Test
+    public void liveDataActiveStateIsManagedCorrectlyWithoutEvent_twoObservers() {
+        Observer<String> observer1 = mock(Observer.class);
+        Observer<String> observer2 = mock(Observer.class);
+
+        mLiveData.observe(mOwner, observer1);
+        mLiveData.observe(mOwner2, observer2);
+
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+        mRegistry2.handleLifecycleEvent(Lifecycle.Event.ON_START);
+
+        // Marking the state to created won't change LiveData to be inactive.
+        reset(mActiveObserversChanged);
+        mRegistry.markState(Lifecycle.State.CREATED);
+        verify(mActiveObserversChanged, never()).onCall(anyBoolean());
+
+        // After setting a value, the LiveData will stay active because there is still a STARTED
+        // lifecycle being observed.  The one Observer associated with the STARTED lifecycle will
+        // also have been called, but the other Observer will not have been called.
+        reset(observer1);
+        reset(observer2);
+        mLiveData.setValue("1");
+        verify(mActiveObserversChanged, never()).onCall(anyBoolean());
+        verify(observer1, never()).onChanged(anyString());
+        verify(observer2).onChanged("1");
+
+        // Now we set the other Lifecycle to be inactive, live data should become inactive.
+        reset(observer1);
+        reset(observer2);
+        mRegistry2.markState(Lifecycle.State.CREATED);
+        verify(mActiveObserversChanged).onCall(false);
+        verify(observer1, never()).onChanged(anyString());
+        verify(observer2, never()).onChanged(anyString());
+
+        // Now we post another value, because both lifecycles are in the Created state, live data
+        // will not dispatch any values
+        reset(mActiveObserversChanged);
+        mLiveData.setValue("2");
+        verify(mActiveObserversChanged, never()).onCall(anyBoolean());
+        verify(observer1, never()).onChanged(anyString());
+        verify(observer2, never()).onChanged(anyString());
+
+        // Now that the first Lifecycle has been moved back to the Resumed state, the LiveData will
+        // be made active and it's associated Observer will be called with the new value, but the
+        // Observer associated with the Lifecycle that is still in the Created state won't be
+        // called.
+        reset(mActiveObserversChanged);
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
+        verify(mActiveObserversChanged).onCall(true);
+        verify(observer1).onChanged("2");
+        verify(observer2, never()).onChanged(anyString());
+    }
+
     @SuppressWarnings("WeakerAccess")
     static class PublicLiveData<T> extends LiveData<T> {
         // cannot spy due to internal calls
diff --git a/lifecycle/extensions/src/test/java/android/arch/lifecycle/MediatorLiveDataTest.java b/lifecycle/extensions/src/test/java/android/arch/lifecycle/MediatorLiveDataTest.java
index 3de3eee..e2eadbe 100644
--- a/lifecycle/extensions/src/test/java/android/arch/lifecycle/MediatorLiveDataTest.java
+++ b/lifecycle/extensions/src/test/java/android/arch/lifecycle/MediatorLiveDataTest.java
@@ -25,7 +25,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.lifecycle.util.InstantTaskExecutor;
 import android.support.annotation.Nullable;
 
@@ -69,7 +69,7 @@
 
     @Before
     public void swapExecutorDelegate() {
-        AppToolkitTaskExecutor.getInstance().setDelegate(new InstantTaskExecutor());
+        ArchTaskExecutor.getInstance().setDelegate(new InstantTaskExecutor());
     }
 
     @Test
diff --git a/lifecycle/extensions/src/test/java/android/arch/lifecycle/TransformationsTest.java b/lifecycle/extensions/src/test/java/android/arch/lifecycle/TransformationsTest.java
index e92ecca..940a3e8 100644
--- a/lifecycle/extensions/src/test/java/android/arch/lifecycle/TransformationsTest.java
+++ b/lifecycle/extensions/src/test/java/android/arch/lifecycle/TransformationsTest.java
@@ -25,7 +25,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.core.util.Function;
 import android.arch.lifecycle.util.InstantTaskExecutor;
 
@@ -42,7 +42,7 @@
 
     @Before
     public void swapExecutorDelegate() {
-        AppToolkitTaskExecutor.getInstance().setDelegate(new InstantTaskExecutor());
+        ArchTaskExecutor.getInstance().setDelegate(new InstantTaskExecutor());
     }
 
     @Before
diff --git a/lifecycle/extensions/src/test/java/android/arch/lifecycle/ViewModelProviderTest.java b/lifecycle/extensions/src/test/java/android/arch/lifecycle/ViewModelProviderTest.java
index 61760fc..8877357 100644
--- a/lifecycle/extensions/src/test/java/android/arch/lifecycle/ViewModelProviderTest.java
+++ b/lifecycle/extensions/src/test/java/android/arch/lifecycle/ViewModelProviderTest.java
@@ -21,6 +21,8 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import android.arch.lifecycle.ViewModelProvider.NewInstanceFactory;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -82,6 +84,18 @@
         assertThat(viewModel, is(provider.get(ViewModel1.class)));
     }
 
+    @Test(expected = IllegalStateException.class)
+    public void testNotAttachedActivity() {
+        // This is similar to call ViewModelProviders.of in Activity's constructor
+        ViewModelProviders.of(new FragmentActivity());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void testNotAttachedFragment() {
+        // This is similar to call ViewModelProviders.of in Activity's constructor
+        ViewModelProviders.of(new Fragment());
+    }
+
     public static class ViewModel1 extends ViewModel {
         boolean mCleared;
 
diff --git a/lifecycle/integration-tests/testapp/build.gradle b/lifecycle/integration-tests/testapp/build.gradle
index dca413b..a1a16cb 100644
--- a/lifecycle/integration-tests/testapp/build.gradle
+++ b/lifecycle/integration-tests/testapp/build.gradle
@@ -65,6 +65,8 @@
         exclude group: 'com.android.support', module: 'support-annotations'
     })
     testCompile libs.junit
+    testCompile libs.mockito_core
+    testAnnotationProcessor project(":lifecycle:compiler")
 }
 createAndroidCheckstyle(project)
 
diff --git a/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/ActivityFullLifecycleTest.java b/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/ActivityFullLifecycleTest.java
index ee4e661..78dd015 100644
--- a/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/ActivityFullLifecycleTest.java
+++ b/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/ActivityFullLifecycleTest.java
@@ -16,48 +16,43 @@
 
 package android.arch.lifecycle;
 
-import static android.arch.lifecycle.Lifecycle.Event.ON_CREATE;
-import static android.arch.lifecycle.Lifecycle.Event.ON_DESTROY;
-import static android.arch.lifecycle.Lifecycle.Event.ON_PAUSE;
-import static android.arch.lifecycle.Lifecycle.Event.ON_RESUME;
-import static android.arch.lifecycle.Lifecycle.Event.ON_START;
-import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
-import static android.arch.lifecycle.testapp.TestEvent.ACTIVITY_CALLBACK;
-import static android.arch.lifecycle.testapp.TestEvent.LIFECYCLE_EVENT;
+import static android.arch.lifecycle.TestUtils.OrderedTuples.CREATE;
+import static android.arch.lifecycle.TestUtils.OrderedTuples.DESTROY;
+import static android.arch.lifecycle.TestUtils.OrderedTuples.PAUSE;
+import static android.arch.lifecycle.TestUtils.OrderedTuples.RESUME;
+import static android.arch.lifecycle.TestUtils.OrderedTuples.START;
+import static android.arch.lifecycle.TestUtils.OrderedTuples.STOP;
+import static android.arch.lifecycle.TestUtils.flatMap;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 
 import android.app.Activity;
 import android.arch.lifecycle.Lifecycle.Event;
-import android.arch.lifecycle.testapp.CollectingActivity;
+import android.arch.lifecycle.testapp.CollectingLifecycleOwner;
+import android.arch.lifecycle.testapp.CollectingSupportActivity;
 import android.arch.lifecycle.testapp.FrameworkLifecycleRegistryActivity;
-import android.arch.lifecycle.testapp.FullLifecycleTestActivity;
-import android.arch.lifecycle.testapp.SupportLifecycleRegistryActivity;
 import android.arch.lifecycle.testapp.TestEvent;
 import android.support.test.filters.SmallTest;
 import android.support.test.rule.ActivityTestRule;
-import android.util.Pair;
+import android.support.v4.util.Pair;
 
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
-import java.util.ArrayList;
 import java.util.List;
 
 @SmallTest
 @RunWith(Parameterized.class)
 public class ActivityFullLifecycleTest {
     @Rule
-    public ActivityTestRule activityTestRule =
-            new ActivityTestRule<>(FullLifecycleTestActivity.class);
+    public final ActivityTestRule<? extends CollectingLifecycleOwner> activityTestRule;
 
     @Parameterized.Parameters
     public static Class[] params() {
-        return new Class[]{FullLifecycleTestActivity.class,
-                SupportLifecycleRegistryActivity.class,
+        return new Class[]{CollectingSupportActivity.class,
                 FrameworkLifecycleRegistryActivity.class};
     }
 
@@ -68,28 +63,13 @@
 
 
     @Test
-    public void testFullLifecycle() throws InterruptedException {
-        Activity activity = activityTestRule.getActivity();
-        List<Pair<TestEvent, Event>> results = ((CollectingActivity) activity)
-                .waitForCollectedEvents();
+    public void testFullLifecycle() throws Throwable {
+        CollectingLifecycleOwner owner = activityTestRule.getActivity();
+        TestUtils.waitTillResumed(owner, activityTestRule);
+        activityTestRule.finishActivity();
 
-        Event[] expectedEvents =
-                new Event[]{ON_CREATE, ON_START, ON_RESUME, ON_PAUSE, ON_STOP, ON_DESTROY};
-
-        List<Pair<TestEvent, Event>> expected = new ArrayList<>();
-        boolean beforeResume = true;
-        for (Event i : expectedEvents) {
-            if (beforeResume) {
-                expected.add(new Pair<>(ACTIVITY_CALLBACK, i));
-                expected.add(new Pair<>(LIFECYCLE_EVENT, i));
-            } else {
-                expected.add(new Pair<>(LIFECYCLE_EVENT, i));
-                expected.add(new Pair<>(ACTIVITY_CALLBACK, i));
-            }
-            if (i == ON_RESUME) {
-                beforeResume = false;
-            }
-        }
-        assertThat(results, is(expected));
+        TestUtils.waitTillDestroyed(owner, activityTestRule);
+        List<Pair<TestEvent, Event>> results = owner.copyCollectedEvents();
+        assertThat(results, is(flatMap(CREATE, START, RESUME, PAUSE, STOP, DESTROY)));
     }
 }
diff --git a/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/FragmentInBackStackLifecycleTest.java b/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/FragmentInBackStackLifecycleTest.java
index 3397f5f..f48f788 100644
--- a/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/FragmentInBackStackLifecycleTest.java
+++ b/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/FragmentInBackStackLifecycleTest.java
@@ -37,6 +37,7 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.FragmentManager;
 
@@ -58,20 +59,20 @@
         final ArrayList<Event> collectedEvents = new ArrayList<>();
         LifecycleObserver collectingObserver = new LifecycleObserver() {
             @OnLifecycleEvent(Event.ON_ANY)
-            void onAny(LifecycleOwner owner, Event event) {
+            void onAny(@SuppressWarnings("unused") LifecycleOwner owner, Event event) {
                 collectedEvents.add(event);
             }
         };
         final FragmentActivity activity = activityTestRule.getActivity();
         activityTestRule.runOnUiThread(() -> {
             FragmentManager fm = activity.getSupportFragmentManager();
-            LifecycleFragment fragment = new LifecycleFragment();
+            Fragment fragment = new Fragment();
             fm.beginTransaction().add(R.id.fragment_container, fragment, "tag").addToBackStack(null)
                     .commit();
             fm.executePendingTransactions();
 
             fragment.getLifecycle().addObserver(collectingObserver);
-            LifecycleFragment fragment2 = new LifecycleFragment();
+            Fragment fragment2 = new Fragment();
             fm.beginTransaction().replace(R.id.fragment_container, fragment2).addToBackStack(null)
                     .commit();
             fm.executePendingTransactions();
@@ -82,12 +83,13 @@
         EmptyActivity newActivity = recreateActivity(activityTestRule.getActivity(),
                 activityTestRule);
 
+        //noinspection ArraysAsListWithZeroOrOneArgument
         assertThat(collectedEvents, is(asList(ON_DESTROY)));
         collectedEvents.clear();
         EmptyActivity lastActivity = recreateActivity(newActivity, activityTestRule);
         activityTestRule.runOnUiThread(() -> {
             FragmentManager fm = lastActivity.getSupportFragmentManager();
-            LifecycleFragment fragment = (LifecycleFragment) fm.findFragmentByTag("tag");
+            Fragment fragment = fm.findFragmentByTag("tag");
             fragment.getLifecycle().addObserver(collectingObserver);
             assertThat(collectedEvents, iterableWithSize(0));
             fm.popBackStackImmediate();
diff --git a/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/LiveDataOnSaveInstanceStateTest.java b/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/LiveDataOnSaveInstanceStateTest.java
new file mode 100644
index 0000000..836cfff
--- /dev/null
+++ b/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/LiveDataOnSaveInstanceStateTest.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import android.app.Instrumentation;
+import android.arch.lifecycle.testapp.CollectingSupportActivity;
+import android.arch.lifecycle.testapp.CollectingSupportFragment;
+import android.arch.lifecycle.testapp.NavigationDialogActivity;
+import android.content.Intent;
+import android.os.Build;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SdkSuppress;
+import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.app.FragmentActivity;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class LiveDataOnSaveInstanceStateTest {
+    @Rule
+    public ActivityTestRule<CollectingSupportActivity> mActivityTestRule =
+            new ActivityTestRule<>(CollectingSupportActivity.class);
+
+    @Test
+    @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.M)
+    public void liveData_partiallyObscuredActivity_maxSdkM() throws Throwable {
+        CollectingSupportActivity activity = mActivityTestRule.getActivity();
+
+        liveData_partiallyObscuredLifecycleOwner_maxSdkM(activity);
+    }
+
+    @Test
+    @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.M)
+    public void liveData_partiallyObscuredActivityWithFragment_maxSdkM() throws Throwable {
+        CollectingSupportActivity activity = mActivityTestRule.getActivity();
+        CollectingSupportFragment fragment = new CollectingSupportFragment();
+        mActivityTestRule.runOnUiThread(() -> activity.replaceFragment(fragment));
+
+        liveData_partiallyObscuredLifecycleOwner_maxSdkM(fragment);
+    }
+
+    @Test
+    @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.M)
+    public void liveData_partiallyObscuredActivityFragmentInFragment_maxSdkM() throws Throwable {
+        CollectingSupportActivity activity = mActivityTestRule.getActivity();
+        CollectingSupportFragment fragment = new CollectingSupportFragment();
+        CollectingSupportFragment fragment2 = new CollectingSupportFragment();
+        mActivityTestRule.runOnUiThread(() -> {
+            activity.replaceFragment(fragment);
+            fragment.replaceFragment(fragment2);
+        });
+
+        liveData_partiallyObscuredLifecycleOwner_maxSdkM(fragment2);
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
+    public void liveData_partiallyObscuredActivity_minSdkN() throws Throwable {
+        CollectingSupportActivity activity = mActivityTestRule.getActivity();
+
+        liveData_partiallyObscuredLifecycleOwner_minSdkN(activity);
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
+    public void liveData_partiallyObscuredActivityWithFragment_minSdkN() throws Throwable {
+        CollectingSupportActivity activity = mActivityTestRule.getActivity();
+        CollectingSupportFragment fragment = new CollectingSupportFragment();
+        mActivityTestRule.runOnUiThread(() -> activity.replaceFragment(fragment));
+
+        liveData_partiallyObscuredLifecycleOwner_minSdkN(fragment);
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
+    public void liveData_partiallyObscuredActivityFragmentInFragment_minSdkN() throws Throwable {
+        CollectingSupportActivity activity = mActivityTestRule.getActivity();
+        CollectingSupportFragment fragment = new CollectingSupportFragment();
+        CollectingSupportFragment fragment2 = new CollectingSupportFragment();
+        mActivityTestRule.runOnUiThread(() -> {
+            activity.replaceFragment(fragment);
+            fragment.replaceFragment(fragment2);
+        });
+
+        liveData_partiallyObscuredLifecycleOwner_minSdkN(fragment2);
+    }
+
+    private void liveData_partiallyObscuredLifecycleOwner_maxSdkM(LifecycleOwner lifecycleOwner)
+            throws Throwable {
+        final AtomicInteger atomicInteger = new AtomicInteger(0);
+        MutableLiveData<Integer> mutableLiveData = new MutableLiveData<>();
+        mActivityTestRule.runOnUiThread(() -> mutableLiveData.setValue(0));
+
+        TestUtils.waitTillResumed(lifecycleOwner, mActivityTestRule);
+
+        mutableLiveData.observe(lifecycleOwner, atomicInteger::set);
+
+        final FragmentActivity dialogActivity = launchDialog();
+
+        TestUtils.waitTillCreated(lifecycleOwner, mActivityTestRule);
+
+        // Change the LiveData value and assert that the observer is not called given that the
+        // lifecycle is in the CREATED state.
+        mActivityTestRule.runOnUiThread(() -> mutableLiveData.setValue(1));
+        assertThat(atomicInteger.get(), is(0));
+
+        // Finish the dialog Activity, wait for the main activity to be resumed, and assert that
+        // the observer's onChanged method is called.
+        mActivityTestRule.runOnUiThread(dialogActivity::finish);
+        TestUtils.waitTillResumed(lifecycleOwner, mActivityTestRule);
+        assertThat(atomicInteger.get(), is(1));
+    }
+
+    private void liveData_partiallyObscuredLifecycleOwner_minSdkN(LifecycleOwner lifecycleOwner)
+            throws Throwable {
+        final AtomicInteger atomicInteger = new AtomicInteger(0);
+        MutableLiveData<Integer> mutableLiveData = new MutableLiveData<>();
+        mActivityTestRule.runOnUiThread(() -> mutableLiveData.setValue(0));
+
+        TestUtils.waitTillResumed(lifecycleOwner, mActivityTestRule);
+
+        mutableLiveData.observe(lifecycleOwner, atomicInteger::set);
+
+        // Launch the NavigationDialogActivity, partially obscuring the activity, and wait for the
+        // lifecycleOwner to hit onPause (or enter the STARTED state).  On API 24 and above, this
+        // onPause should be the last lifecycle method called (and the STARTED state should be the
+        // final resting state).
+        launchDialog();
+        TestUtils.waitTillStarted(lifecycleOwner, mActivityTestRule);
+
+        // Change the LiveData's value and verify that the observer's onChanged method is called
+        // since we are in the STARTED state.
+        mActivityTestRule.runOnUiThread(() -> mutableLiveData.setValue(1));
+        assertThat(atomicInteger.get(), is(1));
+    }
+
+    private FragmentActivity launchDialog() throws Throwable {
+        Instrumentation.ActivityMonitor monitor = new Instrumentation.ActivityMonitor(
+                NavigationDialogActivity.class.getCanonicalName(), null, false);
+        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        instrumentation.addMonitor(monitor);
+
+        FragmentActivity activity = mActivityTestRule.getActivity();
+        // helps with less flaky API 16 tests
+        Intent intent = new Intent(activity, NavigationDialogActivity.class);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
+        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+        activity.startActivity(intent);
+        FragmentActivity fragmentActivity = (FragmentActivity) monitor.waitForActivity();
+        TestUtils.waitTillResumed(fragmentActivity, mActivityTestRule);
+        return fragmentActivity;
+    }
+}
diff --git a/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/PartiallyCoveredActivityTest.java b/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/PartiallyCoveredActivityTest.java
new file mode 100644
index 0000000..07a9dc5
--- /dev/null
+++ b/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/PartiallyCoveredActivityTest.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle;
+
+import static android.arch.lifecycle.Lifecycle.Event.ON_RESUME;
+import static android.arch.lifecycle.Lifecycle.Event.ON_START;
+import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
+import static android.arch.lifecycle.TestUtils.OrderedTuples.CREATE;
+import static android.arch.lifecycle.TestUtils.OrderedTuples.DESTROY;
+import static android.arch.lifecycle.TestUtils.OrderedTuples.PAUSE;
+import static android.arch.lifecycle.TestUtils.OrderedTuples.RESUME;
+import static android.arch.lifecycle.TestUtils.OrderedTuples.START;
+import static android.arch.lifecycle.TestUtils.OrderedTuples.STOP;
+import static android.arch.lifecycle.TestUtils.flatMap;
+import static android.arch.lifecycle.testapp.TestEvent.LIFECYCLE_EVENT;
+import static android.arch.lifecycle.testapp.TestEvent.OWNER_CALLBACK;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.singletonList;
+
+import android.app.Instrumentation;
+import android.arch.lifecycle.testapp.CollectingLifecycleOwner;
+import android.arch.lifecycle.testapp.CollectingSupportActivity;
+import android.arch.lifecycle.testapp.CollectingSupportFragment;
+import android.arch.lifecycle.testapp.NavigationDialogActivity;
+import android.arch.lifecycle.testapp.TestEvent;
+import android.content.Intent;
+import android.os.Build;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.util.Pair;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * Runs tests about the state when an activity is partially covered by another activity. Pre
+ * API 24, framework behavior changes so the test rely on whether state is saved or not and makes
+ * assertions accordingly.
+ */
+@SuppressWarnings("unchecked")
+@RunWith(Parameterized.class)
+@LargeTest
+public class PartiallyCoveredActivityTest {
+    private static final List[] IF_SAVED = new List[]{
+            // when overlaid
+            flatMap(CREATE, START, RESUME, PAUSE,
+                    singletonList(new Pair<>(LIFECYCLE_EVENT, ON_STOP))),
+            // post dialog dismiss
+            asList(new Pair<>(OWNER_CALLBACK, ON_RESUME),
+                    new Pair<>(LIFECYCLE_EVENT, ON_START),
+                    new Pair<>(LIFECYCLE_EVENT, ON_RESUME)),
+            // post finish
+            flatMap(PAUSE, STOP, DESTROY)};
+
+    private static final List[] IF_NOT_SAVED = new List[]{
+            // when overlaid
+            flatMap(CREATE, START, RESUME, PAUSE),
+            // post dialog dismiss
+            flatMap(RESUME),
+            // post finish
+            flatMap(PAUSE, STOP, DESTROY)};
+
+    private static final boolean sShouldSave = Build.VERSION.SDK_INT < Build.VERSION_CODES.N;
+    private static final List<Pair<TestEvent, Lifecycle.Event>>[] EXPECTED =
+            sShouldSave ? IF_SAVED : IF_NOT_SAVED;
+
+    @Rule
+    public ActivityTestRule<CollectingSupportActivity> activityRule =
+            new ActivityTestRule<CollectingSupportActivity>(
+                    CollectingSupportActivity.class) {
+                @Override
+                protected Intent getActivityIntent() {
+                    // helps with less flaky API 16 tests
+                    Intent intent = new Intent(InstrumentationRegistry.getTargetContext(),
+                            CollectingSupportActivity.class);
+                    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
+                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+                    return intent;
+                }
+            };
+    private final boolean mDismissDialog;
+
+    @Parameterized.Parameters(name = "dismissDialog_{0}")
+    public static List<Boolean> dismissDialog() {
+        return asList(true, false);
+    }
+
+    public PartiallyCoveredActivityTest(boolean dismissDialog) {
+        mDismissDialog = dismissDialog;
+    }
+
+    @Test
+    public void coveredWithDialog_activity() throws Throwable {
+        final CollectingSupportActivity activity = activityRule.getActivity();
+        runTest(activity);
+    }
+
+    @Test
+    public void coveredWithDialog_fragment() throws Throwable {
+        CollectingSupportFragment fragment = new CollectingSupportFragment();
+        activityRule.runOnUiThread(() -> activityRule.getActivity().replaceFragment(fragment));
+        runTest(fragment);
+    }
+
+    @Test
+    public void coveredWithDialog_childFragment() throws Throwable {
+        CollectingSupportFragment parentFragment = new CollectingSupportFragment();
+        CollectingSupportFragment childFragment = new CollectingSupportFragment();
+        activityRule.runOnUiThread(() -> {
+            activityRule.getActivity().replaceFragment(parentFragment);
+            parentFragment.replaceFragment(childFragment);
+        });
+        runTest(childFragment);
+    }
+
+    private void runTest(CollectingLifecycleOwner owner) throws Throwable {
+        TestUtils.waitTillResumed(owner, activityRule);
+        FragmentActivity dialog = launchDialog();
+        assertStateSaving();
+        waitForIdle();
+        assertThat(owner.copyCollectedEvents(), is(EXPECTED[0]));
+        List<Pair<TestEvent, Lifecycle.Event>> expected;
+        if (mDismissDialog) {
+            dialog.finish();
+            TestUtils.waitTillResumed(activityRule.getActivity(), activityRule);
+            assertThat(owner.copyCollectedEvents(), is(flatMap(EXPECTED[0], EXPECTED[1])));
+            expected = flatMap(EXPECTED[0], EXPECTED[1], EXPECTED[2]);
+        } else {
+            expected = flatMap(CREATE, START, RESUME, PAUSE, STOP, DESTROY);
+        }
+        CollectingSupportActivity activity = activityRule.getActivity();
+        activityRule.finishActivity();
+        TestUtils.waitTillDestroyed(activity, activityRule);
+        assertThat(owner.copyCollectedEvents(), is(expected));
+    }
+
+    // test sanity
+    private void assertStateSaving() throws ExecutionException, InterruptedException {
+        final CollectingSupportActivity activity = activityRule.getActivity();
+        if (sShouldSave) {
+            // state should be saved. wait for it to be saved
+            assertThat("test sanity",
+                    activity.waitForStateSave(20), is(true));
+            assertThat("test sanity", activity.getSupportFragmentManager()
+                    .isStateSaved(), is(true));
+        } else {
+            // should should not be saved
+            assertThat("test sanity", activity.getSupportFragmentManager()
+                    .isStateSaved(), is(false));
+        }
+    }
+
+    private void waitForIdle() {
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+    }
+
+    private FragmentActivity launchDialog() throws Throwable {
+        Instrumentation.ActivityMonitor monitor = new Instrumentation.ActivityMonitor(
+                NavigationDialogActivity.class.getCanonicalName(), null, false);
+        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        instrumentation.addMonitor(monitor);
+
+        FragmentActivity activity = activityRule.getActivity();
+
+        Intent intent = new Intent(activity, NavigationDialogActivity.class);
+        // disabling animations helps with less flaky API 16 tests
+        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
+        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+        activity.startActivity(intent);
+        FragmentActivity fragmentActivity = (FragmentActivity) monitor.waitForActivity();
+        TestUtils.waitTillResumed(fragmentActivity, activityRule);
+        return fragmentActivity;
+    }
+}
diff --git a/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/ProcessOwnerTest.java b/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/ProcessOwnerTest.java
index e80e11c..77baf94 100644
--- a/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/ProcessOwnerTest.java
+++ b/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/ProcessOwnerTest.java
@@ -31,12 +31,14 @@
 import android.arch.lifecycle.testapp.NavigationDialogActivity;
 import android.arch.lifecycle.testapp.NavigationTestActivityFirst;
 import android.arch.lifecycle.testapp.NavigationTestActivitySecond;
+import android.arch.lifecycle.testapp.NonSupportActivity;
 import android.content.Context;
 import android.content.Intent;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.app.FragmentActivity;
 
 import org.junit.After;
 import org.junit.Rule;
@@ -78,7 +80,7 @@
 
     @Test
     public void testNavigation() throws Throwable {
-        LifecycleActivity firstActivity = setupObserverOnResume();
+        FragmentActivity firstActivity = setupObserverOnResume();
         Instrumentation.ActivityMonitor monitor = new Instrumentation.ActivityMonitor(
                 NavigationTestActivitySecond.class.getCanonicalName(), null, false);
         Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
@@ -88,15 +90,31 @@
         firstActivity.finish();
         firstActivity.startActivity(intent);
 
-        LifecycleActivity secondActivity = (LifecycleActivity) monitor.waitForActivity();
+        FragmentActivity secondActivity = (FragmentActivity) monitor.waitForActivity();
+        assertThat("Failed to navigate", secondActivity, notNullValue());
+        checkProcessObserverSilent(secondActivity);
+    }
+
+    @Test
+    public void testNavigationToNonSupport() throws Throwable {
+        FragmentActivity firstActivity = setupObserverOnResume();
+        Instrumentation.ActivityMonitor monitor = new Instrumentation.ActivityMonitor(
+                NonSupportActivity.class.getCanonicalName(), null, false);
+        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        instrumentation.addMonitor(monitor);
+
+        Intent intent = new Intent(firstActivity, NonSupportActivity.class);
+        firstActivity.finish();
+        firstActivity.startActivity(intent);
+        NonSupportActivity secondActivity = (NonSupportActivity) monitor.waitForActivity();
         assertThat("Failed to navigate", secondActivity, notNullValue());
         checkProcessObserverSilent(secondActivity);
     }
 
     @Test
     public void testRecreation() throws Throwable {
-        LifecycleActivity activity = setupObserverOnResume();
-        LifecycleActivity recreated = TestUtils.recreateActivity(activity, activityTestRule);
+        FragmentActivity activity = setupObserverOnResume();
+        FragmentActivity recreated = TestUtils.recreateActivity(activity, activityTestRule);
         assertThat("Failed to recreate", recreated, notNullValue());
         checkProcessObserverSilent(recreated);
     }
@@ -112,14 +130,15 @@
 
         NavigationTestActivityFirst activity = activityTestRule.getActivity();
         activity.startActivity(new Intent(activity, NavigationDialogActivity.class));
-        LifecycleActivity dialogActivity = (LifecycleActivity) monitor.waitForActivity();
+        FragmentActivity dialogActivity = (FragmentActivity) monitor.waitForActivity();
         checkProcessObserverSilent(dialogActivity);
 
         List<Event> events = Collections.synchronizedList(new ArrayList<>());
 
         LifecycleObserver collectingObserver = new LifecycleObserver() {
             @OnLifecycleEvent(Event.ON_ANY)
-            public void onStateChanged(LifecycleOwner provider, Event event) {
+            public void onStateChanged(@SuppressWarnings("unused") LifecycleOwner provider,
+                    Event event) {
                 events.add(event);
             }
         };
@@ -138,8 +157,8 @@
         dialogActivity.finish();
     }
 
-    private LifecycleActivity setupObserverOnResume() throws Throwable {
-        LifecycleActivity firstActivity = activityTestRule.getActivity();
+    private FragmentActivity setupObserverOnResume() throws Throwable {
+        FragmentActivity firstActivity = activityTestRule.getActivity();
         waitTillResumed(firstActivity, activityTestRule);
         addProcessObserver(mObserver);
         mObserver.mChangedState = false;
@@ -156,10 +175,17 @@
                 ProcessLifecycleOwner.get().getLifecycle().removeObserver(observer));
     }
 
-    private void checkProcessObserverSilent(LifecycleActivity activity) throws Throwable {
+    private void checkProcessObserverSilent(FragmentActivity activity) throws Throwable {
         waitTillResumed(activity, activityTestRule);
         assertThat(mObserver.mChangedState, is(false));
         activityTestRule.runOnUiThread(() ->
                 ProcessLifecycleOwner.get().getLifecycle().removeObserver(mObserver));
     }
+
+    private void checkProcessObserverSilent(NonSupportActivity activity) throws Throwable {
+        assertThat(activity.awaitResumedState(), is(true));
+        assertThat(mObserver.mChangedState, is(false));
+        activityTestRule.runOnUiThread(() ->
+                ProcessLifecycleOwner.get().getLifecycle().removeObserver(mObserver));
+    }
 }
diff --git a/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/TestUtils.java b/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/TestUtils.java
index c5a520f..f7f9bbe 100644
--- a/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/TestUtils.java
+++ b/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/TestUtils.java
@@ -16,22 +16,42 @@
 
 package android.arch.lifecycle;
 
+import static android.arch.lifecycle.Lifecycle.Event.ON_CREATE;
+import static android.arch.lifecycle.Lifecycle.Event.ON_DESTROY;
+import static android.arch.lifecycle.Lifecycle.Event.ON_PAUSE;
+import static android.arch.lifecycle.Lifecycle.Event.ON_RESUME;
+import static android.arch.lifecycle.Lifecycle.Event.ON_START;
+import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
+import static android.arch.lifecycle.Lifecycle.State.CREATED;
+import static android.arch.lifecycle.Lifecycle.State.DESTROYED;
 import static android.arch.lifecycle.Lifecycle.State.RESUMED;
+import static android.arch.lifecycle.Lifecycle.State.STARTED;
+import static android.arch.lifecycle.testapp.TestEvent.LIFECYCLE_EVENT;
+import static android.arch.lifecycle.testapp.TestEvent.OWNER_CALLBACK;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
 
 import android.app.Activity;
 import android.app.Instrumentation;
 import android.app.Instrumentation.ActivityMonitor;
+import android.arch.lifecycle.testapp.TestEvent;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.rule.ActivityTestRule;
+import android.support.v4.util.Pair;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
-public class TestUtils {
+class TestUtils {
 
     private static final long TIMEOUT_MS = 2000;
 
     @SuppressWarnings("unchecked")
-    public static <T extends Activity> T recreateActivity(final T activity, ActivityTestRule rule)
+    static <T extends Activity> T recreateActivity(final T activity, ActivityTestRule rule)
             throws Throwable {
         ActivityMonitor monitor = new ActivityMonitor(
                 activity.getClass().getCanonicalName(), null, false);
@@ -60,23 +80,88 @@
         return result;
     }
 
-    static void waitTillResumed(final LifecycleActivity a, ActivityTestRule<?> activityRule)
+    static void waitTillCreated(final LifecycleOwner owner, ActivityTestRule<?> activityRule)
+            throws Throwable {
+        waitTillState(owner, activityRule, CREATED);
+    }
+
+    static void waitTillStarted(final LifecycleOwner owner, ActivityTestRule<?> activityRule)
+            throws Throwable {
+        waitTillState(owner, activityRule, STARTED);
+    }
+
+    static void waitTillResumed(final LifecycleOwner owner, ActivityTestRule<?> activityRule)
+            throws Throwable {
+        waitTillState(owner, activityRule, RESUMED);
+    }
+
+    static void waitTillDestroyed(final LifecycleOwner owner, ActivityTestRule<?> activityRule)
+            throws Throwable {
+        waitTillState(owner, activityRule, DESTROYED);
+    }
+
+    static void waitTillState(final LifecycleOwner owner, ActivityTestRule<?> activityRule,
+            Lifecycle.State state)
             throws Throwable {
         final CountDownLatch latch = new CountDownLatch(1);
         activityRule.runOnUiThread(() -> {
-            Lifecycle.State currentState = a.getLifecycle().getCurrentState();
-            if (currentState == RESUMED) {
+            Lifecycle.State currentState = owner.getLifecycle().getCurrentState();
+            if (currentState == state) {
                 latch.countDown();
+            } else {
+                owner.getLifecycle().addObserver(new LifecycleObserver() {
+                    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
+                    public void onStateChanged(LifecycleOwner provider) {
+                        if (provider.getLifecycle().getCurrentState() == state) {
+                            latch.countDown();
+                            provider.getLifecycle().removeObserver(this);
+                        }
+                    }
+                });
             }
-            a.getLifecycle().addObserver(new LifecycleObserver() {
-                @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
-                public void onStateChanged(LifecycleOwner provider) {
-                    latch.countDown();
-                    provider.getLifecycle().removeObserver(this);
-                }
-            });
         });
-        latch.await();
+        boolean latchResult = latch.await(1, TimeUnit.MINUTES);
+        assertThat("expected " + state + " never happened. Current state:"
+                        + owner.getLifecycle().getCurrentState(), latchResult, is(true));
+
+        // wait for another loop to ensure all observers are called
+        activityRule.runOnUiThread(() -> {
+            // do nothing
+        });
     }
 
+    @SafeVarargs
+    static <T> List<T> flatMap(List<T>... items) {
+        ArrayList<T> result = new ArrayList<>();
+        for (List<T> item : items) {
+            result.addAll(item);
+        }
+        return result;
+    }
+
+    /**
+     * Event tuples of {@link TestEvent} and {@link Lifecycle.Event}
+     * in the order they should arrive.
+     */
+    @SuppressWarnings("unchecked")
+    static class OrderedTuples {
+        static final List<Pair<TestEvent, Lifecycle.Event>> CREATE =
+                Arrays.asList(new Pair(OWNER_CALLBACK, ON_CREATE),
+                        new Pair(LIFECYCLE_EVENT, ON_CREATE));
+        static final List<Pair<TestEvent, Lifecycle.Event>> START =
+                Arrays.asList(new Pair(OWNER_CALLBACK, ON_START),
+                        new Pair(LIFECYCLE_EVENT, ON_START));
+        static final List<Pair<TestEvent, Lifecycle.Event>> RESUME =
+                Arrays.asList(new Pair(OWNER_CALLBACK, ON_RESUME),
+                        new Pair(LIFECYCLE_EVENT, ON_RESUME));
+        static final List<Pair<TestEvent, Lifecycle.Event>> PAUSE =
+                Arrays.asList(new Pair(LIFECYCLE_EVENT, ON_PAUSE),
+                        new Pair(OWNER_CALLBACK, ON_PAUSE));
+        static final List<Pair<TestEvent, Lifecycle.Event>> STOP =
+                Arrays.asList(new Pair(LIFECYCLE_EVENT, ON_STOP),
+                        new Pair(OWNER_CALLBACK, ON_STOP));
+        static final List<Pair<TestEvent, Lifecycle.Event>> DESTROY =
+                Arrays.asList(new Pair(LIFECYCLE_EVENT, ON_DESTROY),
+                        new Pair(OWNER_CALLBACK, ON_DESTROY));
+    }
 }
diff --git a/lifecycle/integration-tests/testapp/src/main/AndroidManifest.xml b/lifecycle/integration-tests/testapp/src/main/AndroidManifest.xml
index bf88f97..5e1d0a0 100644
--- a/lifecycle/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/lifecycle/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -15,12 +15,6 @@
 
     <application android:allowBackup="true" android:label="Test App" android:supportsRtl="true"
         tools:ignore="AllowBackup,GoogleAppIndexingWarning,MissingApplicationIcon">
-        <activity android:name="android.arch.lifecycle.testapp.MainActivity">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
 
         <activity android:name="android.arch.lifecycle.testapp.LifecycleTestActivity">
             <intent-filter>
@@ -28,13 +22,7 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <activity android:name="android.arch.lifecycle.testapp.FullLifecycleTestActivity">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-        <activity android:name="android.arch.lifecycle.testapp.SupportLifecycleRegistryActivity">
+        <activity android:name="android.arch.lifecycle.testapp.CollectingSupportActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
@@ -71,5 +59,6 @@
         <activity android:name=".NavigationDialogActivity"
             android:launchMode="singleTask"
             android:theme="@android:style/Theme.DeviceDefault.Dialog" />
+        <activity android:name=".NonSupportActivity"/>
     </application>
 </manifest>
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/CollectingActivity.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/CollectingLifecycleOwner.java
similarity index 76%
rename from lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/CollectingActivity.java
rename to lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/CollectingLifecycleOwner.java
index 6e243b6..4213cab 100644
--- a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/CollectingActivity.java
+++ b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/CollectingLifecycleOwner.java
@@ -17,21 +17,20 @@
 package android.arch.lifecycle.testapp;
 
 import android.arch.lifecycle.Lifecycle;
-import android.util.Pair;
+import android.arch.lifecycle.LifecycleOwner;
+import android.support.v4.util.Pair;
 
 import java.util.List;
 
 /**
  * For activities that collect their events.
  */
-public interface CollectingActivity {
-    long TIMEOUT = 5;
-
+public interface CollectingLifecycleOwner extends LifecycleOwner {
     /**
-     * Return collected events
+     * Return a copy of currently collected events
      *
      * @return The list of collected events.
      * @throws InterruptedException
      */
-    List<Pair<TestEvent, Lifecycle.Event>> waitForCollectedEvents() throws InterruptedException;
+    List<Pair<TestEvent, Lifecycle.Event>> copyCollectedEvents();
 }
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/CollectingSupportActivity.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/CollectingSupportActivity.java
new file mode 100644
index 0000000..f38d422
--- /dev/null
+++ b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/CollectingSupportActivity.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle.testapp;
+
+import static android.arch.lifecycle.testapp.TestEvent.OWNER_CALLBACK;
+
+import android.arch.lifecycle.Lifecycle.Event;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.util.Pair;
+import android.widget.FrameLayout;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * LifecycleRegistryOwner that extends FragmentActivity.
+ */
+public class CollectingSupportActivity extends FragmentActivity implements
+        CollectingLifecycleOwner {
+
+    private final List<Pair<TestEvent, Event>> mCollectedEvents = new ArrayList<>();
+    private TestObserver mTestObserver = new TestObserver(mCollectedEvents);
+    private CountDownLatch mSavedStateLatch = new CountDownLatch(1);
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        FrameLayout layout = new FrameLayout(this);
+        layout.setId(R.id.fragment_container);
+        setContentView(layout);
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Event.ON_CREATE));
+        getLifecycle().addObserver(mTestObserver);
+    }
+
+    /**
+     * replaces the main content fragment w/ the given fragment.
+     */
+    public void replaceFragment(Fragment fragment) {
+        getSupportFragmentManager()
+                .beginTransaction()
+                .add(R.id.fragment_container, fragment)
+                .commitNow();
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Event.ON_START));
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Event.ON_RESUME));
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Event.ON_DESTROY));
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Event.ON_STOP));
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Event.ON_PAUSE));
+        // helps with less flaky API 16 tests.
+        overridePendingTransition(0, 0);
+    }
+
+    @Override
+    public List<Pair<TestEvent, Event>> copyCollectedEvents() {
+        return new ArrayList<>(mCollectedEvents);
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        mSavedStateLatch.countDown();
+    }
+
+    /**
+     * Waits for onSaveInstanceState to be called.
+     */
+    public boolean waitForStateSave(@SuppressWarnings("SameParameterValue") int seconds)
+            throws InterruptedException {
+        return mSavedStateLatch.await(seconds, TimeUnit.SECONDS);
+    }
+}
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/CollectingSupportFragment.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/CollectingSupportFragment.java
new file mode 100644
index 0000000..9bbbe16
--- /dev/null
+++ b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/CollectingSupportFragment.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.arch.lifecycle.testapp;
+
+import static android.arch.lifecycle.testapp.TestEvent.OWNER_CALLBACK;
+
+import android.annotation.SuppressLint;
+import android.arch.lifecycle.Lifecycle;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v4.util.Pair;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A support fragment that collects all of its events.
+ */
+@SuppressLint("ValidFragment")
+public class CollectingSupportFragment extends Fragment implements CollectingLifecycleOwner {
+    private final List<Pair<TestEvent, Lifecycle.Event>> mCollectedEvents =
+            new ArrayList<>();
+    private TestObserver mTestObserver = new TestObserver(mCollectedEvents);
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Lifecycle.Event.ON_CREATE));
+        getLifecycle().addObserver(mTestObserver);
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+            @Nullable Bundle savedInstanceState) {
+        //noinspection ConstantConditions
+        FrameLayout layout = new FrameLayout(container.getContext());
+        layout.setId(R.id.child_fragment_container);
+        return layout;
+    }
+
+    /**
+     * Runs a replace fragment transaction with 'fragment' on this Fragment.
+     */
+    public void replaceFragment(Fragment fragment) {
+        getChildFragmentManager()
+                .beginTransaction()
+                .add(R.id.child_fragment_container, fragment)
+                .commitNow();
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Lifecycle.Event.ON_START));
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Lifecycle.Event.ON_RESUME));
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Lifecycle.Event.ON_DESTROY));
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Lifecycle.Event.ON_STOP));
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Lifecycle.Event.ON_PAUSE));
+    }
+
+    @Override
+    public List<Pair<TestEvent, Lifecycle.Event>> copyCollectedEvents() {
+        return new ArrayList<>(mCollectedEvents);
+    }
+}
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/FrameworkLifecycleRegistryActivity.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/FrameworkLifecycleRegistryActivity.java
index d8f4fb3..cdf577c 100644
--- a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/FrameworkLifecycleRegistryActivity.java
+++ b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/FrameworkLifecycleRegistryActivity.java
@@ -16,27 +16,29 @@
 
 package android.arch.lifecycle.testapp;
 
-import static android.arch.lifecycle.testapp.TestEvent.ACTIVITY_CALLBACK;
+import static android.arch.lifecycle.testapp.TestEvent.OWNER_CALLBACK;
 
 import android.app.Activity;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleRegistry;
 import android.arch.lifecycle.LifecycleRegistryOwner;
 import android.os.Bundle;
-import android.util.Pair;
+import android.support.annotation.NonNull;
+import android.support.v4.util.Pair;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
 
 /**
  * LifecycleRegistryOwner that extends framework activity.
  */
+@SuppressWarnings("deprecation")
 public class FrameworkLifecycleRegistryActivity extends Activity implements
-        LifecycleRegistryOwner, CollectingActivity {
+        LifecycleRegistryOwner, CollectingLifecycleOwner {
     private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
 
+    @NonNull
     @Override
     public LifecycleRegistry getLifecycle() {
         return mLifecycleRegistry;
@@ -49,49 +51,43 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Lifecycle.Event.ON_CREATE));
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Lifecycle.Event.ON_CREATE));
         getLifecycle().addObserver(mTestObserver);
     }
 
     @Override
     protected void onStart() {
         super.onStart();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Lifecycle.Event.ON_START));
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Lifecycle.Event.ON_START));
     }
 
     @Override
     protected void onResume() {
         super.onResume();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Lifecycle.Event.ON_RESUME));
-        finish();
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Lifecycle.Event.ON_RESUME));
     }
 
     @Override
     protected void onDestroy() {
         super.onDestroy();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Lifecycle.Event.ON_DESTROY));
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Lifecycle.Event.ON_DESTROY));
         mLatch.countDown();
     }
 
     @Override
     protected void onStop() {
         super.onStop();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Lifecycle.Event.ON_STOP));
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Lifecycle.Event.ON_STOP));
     }
 
     @Override
     protected void onPause() {
         super.onPause();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Lifecycle.Event.ON_PAUSE));
+        mCollectedEvents.add(new Pair<>(OWNER_CALLBACK, Lifecycle.Event.ON_PAUSE));
     }
 
-    /**
-     * awaits for all events and returns them.
-     */
     @Override
-    public List<Pair<TestEvent, Lifecycle.Event>> waitForCollectedEvents()
-            throws InterruptedException {
-        mLatch.await(TIMEOUT, TimeUnit.SECONDS);
-        return mCollectedEvents;
+    public List<Pair<TestEvent, Lifecycle.Event>> copyCollectedEvents() {
+        return new ArrayList<>(mCollectedEvents);
     }
 }
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/FullLifecycleTestActivity.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/FullLifecycleTestActivity.java
deleted file mode 100644
index 5972b16..0000000
--- a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/FullLifecycleTestActivity.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.lifecycle.testapp;
-
-import static android.arch.lifecycle.testapp.TestEvent.ACTIVITY_CALLBACK;
-
-import android.arch.lifecycle.Lifecycle;
-import android.arch.lifecycle.LifecycleActivity;
-import android.os.Bundle;
-import android.util.Pair;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Activity for testing full lifecycle
- */
-public class FullLifecycleTestActivity extends LifecycleActivity implements CollectingActivity {
-
-    private List<Pair<TestEvent, Lifecycle.Event>> mCollectedEvents = new ArrayList<>();
-    private TestObserver mTestObserver = new TestObserver(mCollectedEvents);
-    private CountDownLatch mLatch = new CountDownLatch(1);
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Lifecycle.Event.ON_CREATE));
-        getLifecycle().addObserver(mTestObserver);
-    }
-
-    @Override
-    protected void onStart() {
-        super.onStart();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Lifecycle.Event.ON_START));
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Lifecycle.Event.ON_RESUME));
-        finish();
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Lifecycle.Event.ON_DESTROY));
-        mLatch.countDown();
-    }
-
-    @Override
-    protected void onStop() {
-        super.onStop();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Lifecycle.Event.ON_STOP));
-    }
-
-    @Override
-    protected void onPause() {
-        super.onPause();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Lifecycle.Event.ON_PAUSE));
-    }
-
-    /**
-     * awaits for all events and returns them.
-     */
-    @Override
-    public List<Pair<TestEvent, Lifecycle.Event>> waitForCollectedEvents()
-            throws InterruptedException {
-        mLatch.await(TIMEOUT, TimeUnit.SECONDS);
-        return mCollectedEvents;
-    }
-}
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/LifecycleTestActivity.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/LifecycleTestActivity.java
index 093ec7f..cf07aee 100644
--- a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/LifecycleTestActivity.java
+++ b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/LifecycleTestActivity.java
@@ -16,13 +16,13 @@
 
 package android.arch.lifecycle.testapp;
 
-import android.arch.lifecycle.LifecycleActivity;
 import android.os.Bundle;
+import android.support.v4.app.FragmentActivity;
 
 /**
  * Activity for testing events by themselves
  */
-public class LifecycleTestActivity extends LifecycleActivity {
+public class LifecycleTestActivity extends FragmentActivity {
 
     /**
      * identifies that
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/MainActivity.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/MainActivity.java
deleted file mode 100644
index b9d5914..0000000
--- a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/MainActivity.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.lifecycle.testapp;
-
-import android.os.Bundle;
-import android.support.v4.app.FragmentActivity;
-
-/**
- * Simple test activity
- */
-public class MainActivity extends FragmentActivity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity);
-    }
-}
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NavigationDialogActivity.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NavigationDialogActivity.java
index 709bd8d..7d53528 100644
--- a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NavigationDialogActivity.java
+++ b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NavigationDialogActivity.java
@@ -16,10 +16,16 @@
 
 package android.arch.lifecycle.testapp;
 
-import android.arch.lifecycle.LifecycleActivity;
+import android.support.v4.app.FragmentActivity;
 
 /**
  *  an activity with Dialog theme.
  */
-public class NavigationDialogActivity extends LifecycleActivity {
+public class NavigationDialogActivity extends FragmentActivity {
+    @Override
+    protected void onPause() {
+        super.onPause();
+        // helps with less flaky API 16 tests
+        overridePendingTransition(0, 0);
+    }
 }
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NavigationTestActivityFirst.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NavigationTestActivityFirst.java
index f1847c9..69fd478 100644
--- a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NavigationTestActivityFirst.java
+++ b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NavigationTestActivityFirst.java
@@ -16,10 +16,10 @@
 
 package android.arch.lifecycle.testapp;
 
-import android.arch.lifecycle.LifecycleActivity;
+import android.support.v4.app.FragmentActivity;
 
 /**
  * Activity for ProcessOwnerTest
  */
-public class NavigationTestActivityFirst extends LifecycleActivity {
+public class NavigationTestActivityFirst extends FragmentActivity {
 }
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NavigationTestActivitySecond.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NavigationTestActivitySecond.java
index 221e927..0f9a4c9 100644
--- a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NavigationTestActivitySecond.java
+++ b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NavigationTestActivitySecond.java
@@ -16,10 +16,10 @@
 
 package android.arch.lifecycle.testapp;
 
-import android.arch.lifecycle.LifecycleActivity;
+import android.support.v4.app.FragmentActivity;
 
 /**
  * Activity for ProcessOwnerTest
  */
-public class NavigationTestActivitySecond extends LifecycleActivity {
+public class NavigationTestActivitySecond extends FragmentActivity {
 }
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NonSupportActivity.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NonSupportActivity.java
new file mode 100644
index 0000000..835d846
--- /dev/null
+++ b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/NonSupportActivity.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle.testapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Activity which doesn't extend FragmentActivity, to test ProcessLifecycleOwner because it
+ * should work anyway.
+ */
+public class NonSupportActivity extends Activity {
+
+    private static final int TIMEOUT = 1; //secs
+    private final Lock mLock = new ReentrantLock();
+    private Condition mIsResumedCondition = mLock.newCondition();
+    private boolean mIsResumed = false;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mLock.lock();
+        try {
+            mIsResumed = true;
+            mIsResumedCondition.signalAll();
+        } finally {
+            mLock.unlock();
+        }
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mLock.lock();
+        try {
+            mIsResumed = false;
+        } finally {
+            mLock.unlock();
+        }
+    }
+
+    /**
+     *  awaits resumed state
+     * @return
+     * @throws InterruptedException
+     */
+    public boolean awaitResumedState() throws InterruptedException {
+        mLock.lock();
+        try {
+            while (!mIsResumed) {
+                if (!mIsResumedCondition.await(TIMEOUT, TimeUnit.SECONDS)) {
+                    return false;
+                }
+            }
+            return true;
+        } finally {
+            mLock.unlock();
+        }
+    }
+}
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/SimpleAppLifecycleTestActivity.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/SimpleAppLifecycleTestActivity.java
index 6d61c5e..77bd99f 100644
--- a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/SimpleAppLifecycleTestActivity.java
+++ b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/SimpleAppLifecycleTestActivity.java
@@ -17,12 +17,12 @@
 package android.arch.lifecycle.testapp;
 
 import android.arch.lifecycle.Lifecycle;
-import android.arch.lifecycle.LifecycleActivity;
 import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
 import android.arch.lifecycle.ProcessLifecycleOwner;
 import android.os.Bundle;
+import android.support.v4.app.FragmentActivity;
 import android.util.Pair;
 
 import java.util.ArrayList;
@@ -33,7 +33,7 @@
 /**
  * Activity for SimpleAppFullLifecycleTest
  */
-public class SimpleAppLifecycleTestActivity extends LifecycleActivity {
+public class SimpleAppLifecycleTestActivity extends FragmentActivity {
 
     public enum TestEventType {
         PROCESS_EVENT,
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/SupportLifecycleRegistryActivity.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/SupportLifecycleRegistryActivity.java
deleted file mode 100644
index c46c6d3..0000000
--- a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/SupportLifecycleRegistryActivity.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.lifecycle.testapp;
-
-import static android.arch.lifecycle.testapp.TestEvent.ACTIVITY_CALLBACK;
-
-import android.arch.lifecycle.Lifecycle.Event;
-import android.arch.lifecycle.LifecycleRegistry;
-import android.arch.lifecycle.LifecycleRegistryOwner;
-import android.os.Bundle;
-import android.support.v4.app.FragmentActivity;
-import android.util.Pair;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * LifecycleRegistryOwner that extends FragmentActivity.
- */
-public class SupportLifecycleRegistryActivity extends FragmentActivity implements
-        LifecycleRegistryOwner, CollectingActivity {
-    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
-    @Override
-    public LifecycleRegistry getLifecycle() {
-        return mLifecycleRegistry;
-    }
-
-    private List<Pair<TestEvent, Event>> mCollectedEvents = new ArrayList<>();
-    private TestObserver mTestObserver = new TestObserver(mCollectedEvents);
-    private CountDownLatch mLatch = new CountDownLatch(1);
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Event.ON_CREATE));
-        getLifecycle().addObserver(mTestObserver);
-    }
-
-    @Override
-    protected void onStart() {
-        super.onStart();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Event.ON_START));
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Event.ON_RESUME));
-        finish();
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Event.ON_DESTROY));
-        mLatch.countDown();
-    }
-
-    @Override
-    protected void onStop() {
-        super.onStop();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Event.ON_STOP));
-    }
-
-    @Override
-    protected void onPause() {
-        super.onPause();
-        mCollectedEvents.add(new Pair<>(ACTIVITY_CALLBACK, Event.ON_PAUSE));
-    }
-
-    /**
-     * awaits for all events and returns them.
-     */
-    @Override
-    public List<Pair<TestEvent, Event>> waitForCollectedEvents() throws InterruptedException {
-        mLatch.await(TIMEOUT, TimeUnit.SECONDS);
-        return mCollectedEvents;
-    }
-}
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/TestEvent.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/TestEvent.java
index 0929f84..788045a 100644
--- a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/TestEvent.java
+++ b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/TestEvent.java
@@ -17,6 +17,6 @@
 package android.arch.lifecycle.testapp;
 
 public enum TestEvent {
-    ACTIVITY_CALLBACK,
-    LIFECYCLE_EVENT
+    OWNER_CALLBACK,
+    LIFECYCLE_EVENT,
 }
diff --git a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/TestObserver.java b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/TestObserver.java
index c611239..00b8e16 100644
--- a/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/TestObserver.java
+++ b/lifecycle/integration-tests/testapp/src/main/java/android/arch/lifecycle/testapp/TestObserver.java
@@ -28,7 +28,7 @@
 import android.arch.lifecycle.LifecycleObserver;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.OnLifecycleEvent;
-import android.util.Pair;
+import android.support.v4.util.Pair;
 
 import java.util.List;
 
diff --git a/lifecycle/integration-tests/testapp/src/main/res/layout/activity.xml b/lifecycle/integration-tests/testapp/src/main/res/layout/activity.xml
deleted file mode 100644
index a4e9513..0000000
--- a/lifecycle/integration-tests/testapp/src/main/res/layout/activity.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.
-  -->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-    <FrameLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:id="@+id/root">
-        <fragment
-            android:id="@+id/main_fragment"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:tag="fragment_tag"
-            android:name="android.arch.lifecycle.testapp.UsualFragment"
-            tools:context="android.arch.lifecycle.testapp.MainActivity">
-        </fragment>
-    </FrameLayout>
-</FrameLayout>
diff --git a/lifecycle/integration-tests/testapp/src/main/res/layout/fragment.xml b/lifecycle/integration-tests/testapp/src/main/res/layout/fragment.xml
new file mode 100644
index 0000000..a977ceb
--- /dev/null
+++ b/lifecycle/integration-tests/testapp/src/main/res/layout/fragment.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/fragmentFrameLayout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+</FrameLayout>
diff --git a/lifecycle/integration-tests/testapp/src/main/res/values/values.xml b/lifecycle/integration-tests/testapp/src/main/res/values/values.xml
new file mode 100644
index 0000000..5041a76
--- /dev/null
+++ b/lifecycle/integration-tests/testapp/src/main/res/values/values.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<resources>
+    <item name="child_fragment_container" type="id"/>
+</resources>
diff --git a/lifecycle/integration-tests/testapp/src/test/java/android/arch/lifecycle/GeneratedAdaptersTest.java b/lifecycle/integration-tests/testapp/src/test/java/android/arch/lifecycle/GeneratedAdaptersTest.java
new file mode 100644
index 0000000..2abb511
--- /dev/null
+++ b/lifecycle/integration-tests/testapp/src/test/java/android/arch/lifecycle/GeneratedAdaptersTest.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle;
+
+import static android.arch.lifecycle.Lifecycle.Event.ON_ANY;
+import static android.arch.lifecycle.Lifecycle.Event.ON_RESUME;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.singletonList;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(JUnit4.class)
+public class GeneratedAdaptersTest {
+
+    private LifecycleOwner mOwner;
+    @SuppressWarnings("FieldCanBeLocal")
+    private Lifecycle mLifecycle;
+
+    @Before
+    public void initMocks() {
+        mOwner = mock(LifecycleOwner.class);
+        mLifecycle = mock(Lifecycle.class);
+        when(mOwner.getLifecycle()).thenReturn(mLifecycle);
+    }
+
+    static class SimpleObserver implements LifecycleObserver {
+        List<String> mLog;
+
+        SimpleObserver(List<String> log) {
+            mLog = log;
+        }
+
+        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
+        void onCreate() {
+            mLog.add("onCreate");
+        }
+    }
+
+    @Test
+    public void testSimpleSingleGeneratedAdapter() {
+        List<String>  actual = new ArrayList<>();
+        GenericLifecycleObserver callback = Lifecycling.getCallback(new SimpleObserver(actual));
+        callback.onStateChanged(mOwner, Lifecycle.Event.ON_CREATE);
+        assertThat(callback, instanceOf(SingleGeneratedAdapterObserver.class));
+        assertThat(actual, is(singletonList("onCreate")));
+    }
+
+    static class TestObserver implements LifecycleObserver {
+        List<String> mLog;
+
+        TestObserver(List<String> log) {
+            mLog = log;
+        }
+
+        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
+        void onCreate() {
+            mLog.add("onCreate");
+        }
+
+        @OnLifecycleEvent(ON_ANY)
+        void onAny() {
+            mLog.add("onAny");
+        }
+    }
+
+    @Test
+    public void testOnAny() {
+        List<String>  actual = new ArrayList<>();
+        GenericLifecycleObserver callback = Lifecycling.getCallback(new TestObserver(actual));
+        callback.onStateChanged(mOwner, Lifecycle.Event.ON_CREATE);
+        assertThat(callback, instanceOf(SingleGeneratedAdapterObserver.class));
+        assertThat(actual, is(asList("onCreate", "onAny")));
+    }
+
+    interface OnPauses extends LifecycleObserver {
+        @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
+        void onPause();
+
+        @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
+        void onPause(LifecycleOwner owner);
+    }
+
+    interface OnPauseResume extends LifecycleObserver {
+        @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
+        void onPause();
+
+        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
+        void onResume();
+    }
+
+    class Impl1 implements OnPauses, OnPauseResume {
+
+        List<String> mLog;
+
+        Impl1(List<String> log) {
+            mLog = log;
+        }
+
+        @Override
+        public void onPause() {
+            mLog.add("onPause_0");
+        }
+
+        @Override
+        public void onResume() {
+            mLog.add("onResume");
+        }
+
+        @Override
+        public void onPause(LifecycleOwner owner) {
+            mLog.add("onPause_1");
+        }
+    }
+
+    @Test
+    public void testClashingInterfaces() {
+        List<String>  actual = new ArrayList<>();
+        GenericLifecycleObserver callback = Lifecycling.getCallback(new Impl1(actual));
+        callback.onStateChanged(mOwner, Lifecycle.Event.ON_PAUSE);
+        assertThat(callback, instanceOf(CompositeGeneratedAdaptersObserver.class));
+        assertThat(actual, is(asList("onPause_0", "onPause_1")));
+        actual.clear();
+        callback.onStateChanged(mOwner, Lifecycle.Event.ON_RESUME);
+        assertThat(actual, is(singletonList("onResume")));
+    }
+
+    class Base implements LifecycleObserver {
+
+        List<String> mLog;
+
+        Base(List<String> log) {
+            mLog = log;
+        }
+
+        @OnLifecycleEvent(ON_ANY)
+        void onAny() {
+            mLog.add("onAny_0");
+        }
+
+        @OnLifecycleEvent(ON_ANY)
+        void onAny(LifecycleOwner owner) {
+            mLog.add("onAny_1");
+        }
+
+        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
+        void onResume() {
+            mLog.add("onResume");
+        }
+    }
+
+    interface OnAny extends LifecycleObserver {
+        @OnLifecycleEvent(ON_ANY)
+        void onAny();
+
+        @OnLifecycleEvent(ON_ANY)
+        void onAny(LifecycleOwner owner, Lifecycle.Event event);
+    }
+
+    class Derived extends Base implements OnAny {
+        Derived(List<String> log) {
+            super(log);
+        }
+
+        @Override
+        public void onAny() {
+            super.onAny();
+        }
+
+        @Override
+        public void onAny(LifecycleOwner owner, Lifecycle.Event event) {
+            mLog.add("onAny_2");
+            assertThat(event, is(ON_RESUME));
+        }
+    }
+
+    @Test
+    public void testClashingClassAndInterface() {
+        List<String>  actual = new ArrayList<>();
+        GenericLifecycleObserver callback = Lifecycling.getCallback(new Derived(actual));
+        callback.onStateChanged(mOwner, Lifecycle.Event.ON_RESUME);
+        assertThat(callback, instanceOf(CompositeGeneratedAdaptersObserver.class));
+        assertThat(actual, is(asList("onResume", "onAny_0", "onAny_1", "onAny_2")));
+    }
+
+}
diff --git a/lifecycle/reactivestreams/src/main/AndroidManifest.xml b/lifecycle/reactivestreams/src/main/AndroidManifest.xml
index c7b09a2..2210041 100644
--- a/lifecycle/reactivestreams/src/main/AndroidManifest.xml
+++ b/lifecycle/reactivestreams/src/main/AndroidManifest.xml
@@ -16,8 +16,4 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.lifecycle.reactivestreams">
-    <application>
-        <meta-data android:name="android.arch.lifecycle.reactivestreams.VERSION"
-                   android:value="${version}" />
-    </application>
 </manifest>
diff --git a/lifecycle/reactivestreams/src/main/java/android/arch/lifecycle/LiveDataReactiveStreams.java b/lifecycle/reactivestreams/src/main/java/android/arch/lifecycle/LiveDataReactiveStreams.java
index 0be0149..2b25bc9 100644
--- a/lifecycle/reactivestreams/src/main/java/android/arch/lifecycle/LiveDataReactiveStreams.java
+++ b/lifecycle/reactivestreams/src/main/java/android/arch/lifecycle/LiveDataReactiveStreams.java
@@ -16,7 +16,8 @@
 
 package android.arch.lifecycle;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
 import org.reactivestreams.Publisher;
@@ -85,7 +86,7 @@
                         if (n < 0 || mCanceled) {
                             return;
                         }
-                        AppToolkitTaskExecutor.getInstance().executeOnMainThread(new Runnable() {
+                        ArchTaskExecutor.getInstance().executeOnMainThread(new Runnable() {
                             @Override
                             public void run() {
                                 if (mCanceled) {
@@ -110,7 +111,7 @@
                         if (mCanceled) {
                             return;
                         }
-                        AppToolkitTaskExecutor.getInstance().executeOnMainThread(new Runnable() {
+                        ArchTaskExecutor.getInstance().executeOnMainThread(new Runnable() {
                             @Override
                             public void run() {
                                 if (mCanceled) {
@@ -133,40 +134,101 @@
 
     /**
      * Creates an Observable {@link LiveData} stream from a ReactiveStreams publisher.
+     *
+     * <p>
+     * When the LiveData becomes active, it subscribes to the emissions from the Publisher.
+     *
+     * <p>
+     * When the LiveData becomes inactive, the subscription is cleared.
+     * LiveData holds the last value emitted by the Publisher when the LiveData was active.
+     * <p>
+     * Therefore, in the case of a hot RxJava Observable, when a new LiveData {@link Observer} is
+     * added, it will automatically notify with the last value held in LiveData,
+     * which might not be the last value emitted by the Publisher.
+     *
+     * @param <T> The type of data hold by this instance.
      */
     public static <T> LiveData<T> fromPublisher(final Publisher<T> publisher) {
-        MutableLiveData<T> liveData = new MutableLiveData<>();
-        // Since we don't have a way to directly observe cancels, weakly hold the live data.
-        final WeakReference<MutableLiveData<T>> liveDataRef = new WeakReference<>(liveData);
-
-        publisher.subscribe(new Subscriber<T>() {
-            @Override
-            public void onSubscribe(Subscription s) {
-                // Don't worry about backpressure. If the stream is too noisy then backpressure can
-                // be handled upstream.
-                s.request(Long.MAX_VALUE);
-            }
-
-            @Override
-            public void onNext(final T t) {
-                final LiveData<T> liveData = liveDataRef.get();
-                if (liveData != null) {
-                    liveData.postValue(t);
-                }
-            }
-
-            @Override
-            public void onError(Throwable t) {
-                // Errors should be handled upstream, so propagate as a crash.
-                throw new RuntimeException(t);
-            }
-
-            @Override
-            public void onComplete() {
-            }
-        });
-
-        return liveData;
+        return new PublisherLiveData<>(publisher);
     }
 
+    /**
+     * Defines a {@link LiveData} object that wraps a {@link Publisher}.
+     *
+     * <p>
+     * When the LiveData becomes active, it subscribes to the emissions from the Publisher.
+     *
+     * <p>
+     * When the LiveData becomes inactive, the subscription is cleared.
+     * LiveData holds the last value emitted by the Publisher when the LiveData was active.
+     * <p>
+     * Therefore, in the case of a hot RxJava Observable, when a new LiveData {@link Observer} is
+     * added, it will automatically notify with the last value held in LiveData,
+     * which might not be the last value emitted by the Publisher.
+     *
+     * @param <T> The type of data hold by this instance.
+     */
+    private static class PublisherLiveData<T> extends LiveData<T> {
+        private WeakReference<Subscription> mSubscriptionRef;
+        private final Publisher mPublisher;
+        private final Object mLock = new Object();
+
+        PublisherLiveData(@NonNull final Publisher publisher) {
+            mPublisher = publisher;
+        }
+
+        @Override
+        protected void onActive() {
+            super.onActive();
+
+            mPublisher.subscribe(new Subscriber<T>() {
+                @Override
+                public void onSubscribe(Subscription s) {
+                    // Don't worry about backpressure. If the stream is too noisy then
+                    // backpressure can be handled upstream.
+                    synchronized (mLock) {
+                        s.request(Long.MAX_VALUE);
+                        mSubscriptionRef = new WeakReference<>(s);
+                    }
+                }
+
+                @Override
+                public void onNext(final T t) {
+                    postValue(t);
+                }
+
+                @Override
+                public void onError(Throwable t) {
+                    synchronized (mLock) {
+                        mSubscriptionRef = null;
+                    }
+                    // Errors should be handled upstream, so propagate as a crash.
+                    throw new RuntimeException(t);
+                }
+
+                @Override
+                public void onComplete() {
+                    synchronized (mLock) {
+                        mSubscriptionRef = null;
+                    }
+                }
+            });
+
+        }
+
+        @Override
+        protected void onInactive() {
+            super.onInactive();
+            synchronized (mLock) {
+                WeakReference<Subscription> subscriptionRef = mSubscriptionRef;
+                if (subscriptionRef != null) {
+                    Subscription subscription = subscriptionRef.get();
+                    if (subscription != null) {
+                        subscription.cancel();
+                    }
+                    mSubscriptionRef = null;
+                }
+            }
+        }
+    }
 }
diff --git a/lifecycle/reactivestreams/src/test/java/android/arch/lifecycle/LiveDataReactiveStreamsTest.java b/lifecycle/reactivestreams/src/test/java/android/arch/lifecycle/LiveDataReactiveStreamsTest.java
index 87fba27..7278847 100644
--- a/lifecycle/reactivestreams/src/test/java/android/arch/lifecycle/LiveDataReactiveStreamsTest.java
+++ b/lifecycle/reactivestreams/src/test/java/android/arch/lifecycle/LiveDataReactiveStreamsTest.java
@@ -16,12 +16,10 @@
 
 package android.arch.lifecycle;
 
-import static android.arch.lifecycle.Lifecycle.State.RESUMED;
-
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.core.executor.TaskExecutor;
 import android.support.annotation.Nullable;
 import android.support.test.filters.SmallTest;
@@ -47,28 +45,7 @@
 
 @SmallTest
 public class LiveDataReactiveStreamsTest {
-    private static final Lifecycle sLifecycle = new Lifecycle() {
-        @Override
-        public void addObserver(LifecycleObserver observer) {
-        }
-
-        @Override
-        public void removeObserver(LifecycleObserver observer) {
-        }
-
-        @Override
-        public State getCurrentState() {
-            return RESUMED;
-        }
-    };
-    private static final LifecycleOwner S_LIFECYCLE_OWNER = new LifecycleOwner() {
-
-        @Override
-        public Lifecycle getLifecycle() {
-            return sLifecycle;
-        }
-
-    };
+    private LifecycleOwner mLifecycleOwner;
 
     private final List<String> mLiveDataOutput = new ArrayList<>();
     private final Observer<String> mObserver = new Observer<String>() {
@@ -85,8 +62,19 @@
 
     @Before
     public void init() {
+        mLifecycleOwner = new LifecycleOwner() {
+            LifecycleRegistry mRegistry = new LifecycleRegistry(this);
+            {
+                mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
+            }
+
+            @Override
+            public Lifecycle getLifecycle() {
+                return mRegistry;
+            }
+        };
         mTestThread = Thread.currentThread();
-        AppToolkitTaskExecutor.getInstance().setDelegate(new TaskExecutor() {
+        ArchTaskExecutor.getInstance().setDelegate(new TaskExecutor() {
 
             @Override
             public void executeOnDiskIO(Runnable runnable) {
@@ -109,7 +97,7 @@
 
     @After
     public void removeExecutorDelegate() {
-        AppToolkitTaskExecutor.getInstance().setDelegate(null);
+        ArchTaskExecutor.getInstance().setDelegate(null);
     }
 
     @Test
@@ -117,7 +105,7 @@
         PublishProcessor<String> processor = PublishProcessor.create();
         LiveData<String> liveData = LiveDataReactiveStreams.fromPublisher(processor);
 
-        liveData.observe(S_LIFECYCLE_OWNER, mObserver);
+        liveData.observe(mLifecycleOwner, mObserver);
 
         processor.onNext("foo");
         processor.onNext("bar");
@@ -132,13 +120,13 @@
         PublishProcessor<String> processor = PublishProcessor.create();
         LiveData<String> liveData = LiveDataReactiveStreams.fromPublisher(processor);
 
-        liveData.observe(S_LIFECYCLE_OWNER, mObserver);
+        liveData.observe(mLifecycleOwner, mObserver);
 
         processor.onNext("foo");
         processor.onNext("bar");
 
         // The second mObserver should only get the newest value and any later values.
-        liveData.observe(S_LIFECYCLE_OWNER, new Observer<String>() {
+        liveData.observe(mLifecycleOwner, new Observer<String>() {
             @Override
             public void onChanged(@Nullable String s) {
                 output2.add(s);
@@ -152,12 +140,44 @@
     }
 
     @Test
+    public void convertsFromPublisherAfterInactive() {
+        PublishProcessor<String> processor = PublishProcessor.create();
+        LiveData<String> liveData = LiveDataReactiveStreams.fromPublisher(processor);
+
+        liveData.observe(mLifecycleOwner, mObserver);
+        processor.onNext("foo");
+        liveData.removeObserver(mObserver);
+        processor.onNext("bar");
+
+        liveData.observe(mLifecycleOwner, mObserver);
+        processor.onNext("baz");
+
+        assertThat(mLiveDataOutput, is(Arrays.asList("foo", "foo", "baz")));
+    }
+
+    @Test
+    public void convertsFromPublisherManagesSubcriptions() {
+        PublishProcessor<String> processor = PublishProcessor.create();
+        LiveData<String> liveData = LiveDataReactiveStreams.fromPublisher(processor);
+
+        assertThat(processor.hasSubscribers(), is(false));
+        liveData.observe(mLifecycleOwner, mObserver);
+
+        // once the live data is active, there's a subscriber
+        assertThat(processor.hasSubscribers(), is(true));
+
+        liveData.removeObserver(mObserver);
+        // once the live data is inactive, the subscriber is removed
+        assertThat(processor.hasSubscribers(), is(false));
+    }
+
+    @Test
     public void convertsFromAsyncPublisher() {
         Flowable<String> input = Flowable.just("foo")
                 .concatWith(Flowable.just("bar", "baz").observeOn(sBackgroundScheduler));
         LiveData<String> liveData = LiveDataReactiveStreams.fromPublisher(input);
 
-        liveData.observe(S_LIFECYCLE_OWNER, mObserver);
+        liveData.observe(mLifecycleOwner, mObserver);
 
         assertThat(mLiveDataOutput, is(Collections.singletonList("foo")));
         sBackgroundScheduler.triggerActions();
@@ -170,7 +190,7 @@
         liveData.setValue("foo");
         assertThat(liveData.getValue(), is("foo"));
 
-        Flowable.fromPublisher(LiveDataReactiveStreams.toPublisher(S_LIFECYCLE_OWNER, liveData))
+        Flowable.fromPublisher(LiveDataReactiveStreams.toPublisher(mLifecycleOwner, liveData))
                 .subscribe(mOutputProcessor);
 
         liveData.setValue("bar");
@@ -188,7 +208,7 @@
         assertThat(liveData.getValue(), is("foo"));
 
         Disposable disposable = Flowable
-                .fromPublisher(LiveDataReactiveStreams.toPublisher(S_LIFECYCLE_OWNER, liveData))
+                .fromPublisher(LiveDataReactiveStreams.toPublisher(mLifecycleOwner, liveData))
                 .subscribe(new Consumer<String>() {
                     @Override
                     public void accept(String s) throws Exception {
@@ -216,7 +236,7 @@
 
         final AsyncSubject<Subscription> subscriptionSubject = AsyncSubject.create();
 
-        Flowable.fromPublisher(LiveDataReactiveStreams.toPublisher(S_LIFECYCLE_OWNER, liveData))
+        Flowable.fromPublisher(LiveDataReactiveStreams.toPublisher(mLifecycleOwner, liveData))
                 .subscribe(new Subscriber<String>() {
                     @Override
                     public void onSubscribe(Subscription s) {
@@ -275,7 +295,7 @@
     public void convertsToPublisherWithAsyncData() {
         MutableLiveData<String> liveData = new MutableLiveData<>();
 
-        Flowable.fromPublisher(LiveDataReactiveStreams.toPublisher(S_LIFECYCLE_OWNER, liveData))
+        Flowable.fromPublisher(LiveDataReactiveStreams.toPublisher(mLifecycleOwner, liveData))
                 .observeOn(sBackgroundScheduler)
                 .subscribe(mOutputProcessor);
 
diff --git a/lifecycle/runtime/build.gradle b/lifecycle/runtime/build.gradle
index 7678e95..111429c 100644
--- a/lifecycle/runtime/build.gradle
+++ b/lifecycle/runtime/build.gradle
@@ -32,6 +32,9 @@
 
     testCompile libs.junit
     testCompile libs.mockito_core
+
+    androidTestImplementation libs.junit
+    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
 }
 
 createAndroidCheckstyle(project)
diff --git a/lifecycle/runtime/proguard-rules.pro b/lifecycle/runtime/proguard-rules.pro
index 25f3e87..5e61405 100644
--- a/lifecycle/runtime/proguard-rules.pro
+++ b/lifecycle/runtime/proguard-rules.pro
@@ -7,7 +7,7 @@
 -keep class * implements android.arch.lifecycle.LifecycleObserver {
 }
 
--keep class * implements android.arch.lifecycle.GenericLifecycleObserver {
+-keep class * implements android.arch.lifecycle.GeneratedAdapter {
     <init>(...);
 }
 
diff --git a/lifecycle/runtime/src/androidTest/java/android/arch/lifecycle/MissingClassTest.java b/lifecycle/runtime/src/androidTest/java/android/arch/lifecycle/MissingClassTest.java
new file mode 100644
index 0000000..81a0756
--- /dev/null
+++ b/lifecycle/runtime/src/androidTest/java/android/arch/lifecycle/MissingClassTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.lifecycle;
+
+import android.app.PictureInPictureParams;
+import android.os.Build;
+import android.support.test.filters.SdkSuppress;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SdkSuppress(maxSdkVersion = Build.VERSION_CODES.N_MR1)
+@SmallTest
+public class MissingClassTest {
+    public static class ObserverWithMissingClasses {
+        @SuppressWarnings("unused")
+        public void newApiMethod(PictureInPictureParams params) {}
+
+        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
+        public void onResume() {}
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testMissingApi() {
+        new ReflectiveGenericLifecycleObserver(new ObserverWithMissingClasses());
+    }
+}
diff --git a/lifecycle/runtime/src/main/AndroidManifest.xml b/lifecycle/runtime/src/main/AndroidManifest.xml
index 5641eac..274a076 100644
--- a/lifecycle/runtime/src/main/AndroidManifest.xml
+++ b/lifecycle/runtime/src/main/AndroidManifest.xml
@@ -17,8 +17,4 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.lifecycle">
-    <application>
-        <meta-data android:name="android.arch.lifecycle.VERSION"
-                   android:value="${version}" />
-    </application>
 </manifest>
diff --git a/lifecycle/runtime/src/main/java/android/arch/lifecycle/LifecycleRegistry.java b/lifecycle/runtime/src/main/java/android/arch/lifecycle/LifecycleRegistry.java
index b83e6b8..bf8aff7 100644
--- a/lifecycle/runtime/src/main/java/android/arch/lifecycle/LifecycleRegistry.java
+++ b/lifecycle/runtime/src/main/java/android/arch/lifecycle/LifecycleRegistry.java
@@ -29,9 +29,12 @@
 import static android.arch.lifecycle.Lifecycle.State.STARTED;
 
 import android.arch.core.internal.FastSafeIterableMap;
+import android.support.annotation.MainThread;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.util.Log;
 
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.Map.Entry;
@@ -44,6 +47,8 @@
  */
 public class LifecycleRegistry extends Lifecycle {
 
+    private static final String LOG_TAG = "LifecycleRegistry";
+
     /**
      * Custom list that keeps observers and can handle removals / additions during traversal.
      *
@@ -59,8 +64,12 @@
     private State mState;
     /**
      * The provider that owns this Lifecycle.
+     * Only WeakReference on LifecycleOwner is kept, so if somebody leaks Lifecycle, they won't leak
+     * the whole Fragment / Activity. However, to leak Lifecycle object isn't great idea neither,
+     * because it keeps strong references on all other listeners, so you'll leak all of them as
+     * well.
      */
-    private final LifecycleOwner mLifecycleOwner;
+    private final WeakReference<LifecycleOwner> mLifecycleOwner;
 
     private int mAddingObserverCounter = 0;
 
@@ -86,19 +95,19 @@
      * @param provider The owner LifecycleOwner
      */
     public LifecycleRegistry(@NonNull LifecycleOwner provider) {
-        mLifecycleOwner = provider;
+        mLifecycleOwner = new WeakReference<>(provider);
         mState = INITIALIZED;
     }
 
     /**
-     * Only marks the current state as the given value. It doesn't dispatch any event to its
-     * listeners.
+     * Moves the Lifecycle to the given state and dispatches necessary events to the observers.
      *
      * @param state new state
      */
     @SuppressWarnings("WeakerAccess")
-    public void markState(State state) {
-        mState = state;
+    @MainThread
+    public void markState(@NonNull State state) {
+        moveToState(state);
     }
 
     /**
@@ -109,8 +118,16 @@
      *
      * @param event The event that was received
      */
-    public void handleLifecycleEvent(Lifecycle.Event event) {
-        mState = getStateAfter(event);
+    public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
+        State next = getStateAfter(event);
+        moveToState(next);
+    }
+
+    private void moveToState(State next) {
+        if (mState == next) {
+            return;
+        }
+        mState = next;
         if (mHandlingEvent || mAddingObserverCounter != 0) {
             mNewEventOccurred = true;
             // we will figure out what to do on upper level.
@@ -140,7 +157,7 @@
     }
 
     @Override
-    public void addObserver(LifecycleObserver observer) {
+    public void addObserver(@NonNull LifecycleObserver observer) {
         State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
         ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
         ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
@@ -148,15 +165,19 @@
         if (previous != null) {
             return;
         }
+        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
+        if (lifecycleOwner == null) {
+            // it is null we should be destroyed. Fallback quickly
+            return;
+        }
 
         boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
-
         State targetState = calculateTargetState(observer);
         mAddingObserverCounter++;
         while ((statefulObserver.mState.compareTo(targetState) < 0
                 && mObserverMap.contains(observer))) {
             pushParentState(statefulObserver.mState);
-            statefulObserver.dispatchEvent(mLifecycleOwner, upEvent(statefulObserver.mState));
+            statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
             popParentState();
             // mState / subling may have been changed recalculate
             targetState = calculateTargetState(observer);
@@ -178,7 +199,7 @@
     }
 
     @Override
-    public void removeObserver(LifecycleObserver observer) {
+    public void removeObserver(@NonNull LifecycleObserver observer) {
         // we consciously decided not to send destruction events here in opposition to addObserver.
         // Our reasons for that:
         // 1. These events haven't yet happened at all. In contrast to events in addObservers, that
@@ -258,7 +279,7 @@
         throw new IllegalArgumentException("Unexpected state value " + state);
     }
 
-    private void forwardPass() {
+    private void forwardPass(LifecycleOwner lifecycleOwner) {
         Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
                 mObserverMap.iteratorWithAdditions();
         while (ascendingIterator.hasNext() && !mNewEventOccurred) {
@@ -267,13 +288,13 @@
             while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
                     && mObserverMap.contains(entry.getKey()))) {
                 pushParentState(observer.mState);
-                observer.dispatchEvent(mLifecycleOwner, upEvent(observer.mState));
+                observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));
                 popParentState();
             }
         }
     }
 
-    private void backwardPass() {
+    private void backwardPass(LifecycleOwner lifecycleOwner) {
         Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
                 mObserverMap.descendingIterator();
         while (descendingIterator.hasNext() && !mNewEventOccurred) {
@@ -283,7 +304,7 @@
                     && mObserverMap.contains(entry.getKey()))) {
                 Event event = downEvent(observer.mState);
                 pushParentState(getStateAfter(event));
-                observer.dispatchEvent(mLifecycleOwner, event);
+                observer.dispatchEvent(lifecycleOwner, event);
                 popParentState();
             }
         }
@@ -292,16 +313,22 @@
     // happens only on the top of stack (never in reentrance),
     // so it doesn't have to take in account parents
     private void sync() {
+        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
+        if (lifecycleOwner == null) {
+            Log.w(LOG_TAG, "LifecycleOwner is garbage collected, you shouldn't try dispatch "
+                    + "new events from it.");
+            return;
+        }
         while (!isSynced()) {
             mNewEventOccurred = false;
             // no need to check eldest for nullability, because isSynced does it for us.
             if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
-                backwardPass();
+                backwardPass(lifecycleOwner);
             }
             Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
             if (!mNewEventOccurred && newest != null
                     && mState.compareTo(newest.getValue().mState) > 0) {
-                forwardPass();
+                forwardPass(lifecycleOwner);
             }
         }
         mNewEventOccurred = false;
diff --git a/lifecycle/runtime/src/main/java/android/arch/lifecycle/LifecycleRegistryOwner.java b/lifecycle/runtime/src/main/java/android/arch/lifecycle/LifecycleRegistryOwner.java
index 38eeb6d..0c67fef 100644
--- a/lifecycle/runtime/src/main/java/android/arch/lifecycle/LifecycleRegistryOwner.java
+++ b/lifecycle/runtime/src/main/java/android/arch/lifecycle/LifecycleRegistryOwner.java
@@ -16,6 +16,8 @@
 
 package android.arch.lifecycle;
 
+import android.support.annotation.NonNull;
+
 /**
  * @deprecated Use {@code android.support.v7.app.AppCompatActivity}
  * which extends {@link LifecycleOwner}, so there are no use cases for this class.
@@ -23,6 +25,7 @@
 @SuppressWarnings({"WeakerAccess", "unused"})
 @Deprecated
 public interface LifecycleRegistryOwner extends LifecycleOwner {
+    @NonNull
     @Override
     LifecycleRegistry getLifecycle();
 }
diff --git a/lifecycle/runtime/src/main/java/android/arch/lifecycle/ReportFragment.java b/lifecycle/runtime/src/main/java/android/arch/lifecycle/ReportFragment.java
index 3e4ece8..16a89ce 100644
--- a/lifecycle/runtime/src/main/java/android/arch/lifecycle/ReportFragment.java
+++ b/lifecycle/runtime/src/main/java/android/arch/lifecycle/ReportFragment.java
@@ -28,7 +28,6 @@
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class ReportFragment extends Fragment {
-
     private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle"
             + ".LifecycleDispatcher.report_fragment_tag";
 
diff --git a/lifecycle/runtime/src/test/java/android/arch/lifecycle/LifecycleRegistryTest.java b/lifecycle/runtime/src/test/java/android/arch/lifecycle/LifecycleRegistryTest.java
index 6506454..2a7bbad 100644
--- a/lifecycle/runtime/src/test/java/android/arch/lifecycle/LifecycleRegistryTest.java
+++ b/lifecycle/runtime/src/test/java/android/arch/lifecycle/LifecycleRegistryTest.java
@@ -566,6 +566,25 @@
         verify(observer).onCreate();
     }
 
+    private static void forceGc() {
+        Runtime.getRuntime().gc();
+        Runtime.getRuntime().runFinalization();
+        Runtime.getRuntime().gc();
+        Runtime.getRuntime().runFinalization();
+    }
+
+    @Test
+    public void goneLifecycleOwner() {
+        fullyInitializeRegistry();
+        mLifecycleOwner = null;
+        forceGc();
+        TestObserver observer = mock(TestObserver.class);
+        mRegistry.addObserver(observer);
+        verify(observer, never()).onCreate();
+        verify(observer, never()).onStart();
+        verify(observer, never()).onResume();
+    }
+
     private void dispatchEvent(Lifecycle.Event event) {
         when(mLifecycle.getCurrentState()).thenReturn(LifecycleRegistry.getStateAfter(event));
         mRegistry.handleLifecycleEvent(event);
diff --git a/media-compat-test-client/OWNERS b/media-compat-test-client/OWNERS
new file mode 100644
index 0000000..5529026
--- /dev/null
+++ b/media-compat-test-client/OWNERS
@@ -0,0 +1,2 @@
+hdmoon@google.com
+sungsoo@google.com
\ No newline at end of file
diff --git a/media-compat-test-lib/OWNERS b/media-compat-test-lib/OWNERS
new file mode 100644
index 0000000..5529026
--- /dev/null
+++ b/media-compat-test-lib/OWNERS
@@ -0,0 +1,2 @@
+hdmoon@google.com
+sungsoo@google.com
\ No newline at end of file
diff --git a/media-compat-test-service/OWNERS b/media-compat-test-service/OWNERS
new file mode 100644
index 0000000..5529026
--- /dev/null
+++ b/media-compat-test-service/OWNERS
@@ -0,0 +1,2 @@
+hdmoon@google.com
+sungsoo@google.com
\ No newline at end of file
diff --git a/media-compat/Android.mk b/media-compat/Android.mk
index 02ed90d..4a4cd02 100644
--- a/media-compat/Android.mk
+++ b/media-compat/Android.mk
@@ -28,7 +28,6 @@
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/java
 LOCAL_SRC_FILES := \
-    $(call all-java-files-under,kitkat) \
     $(call all-java-files-under,api21) \
     $(call all-java-files-under,api22) \
     $(call all-java-files-under,api23) \
diff --git a/media-compat/AndroidManifest.xml b/media-compat/AndroidManifest.xml
index 8a65eba..cd3e5e2 100644
--- a/media-compat/AndroidManifest.xml
+++ b/media-compat/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.mediacompat">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.mediacompat.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/media-compat/OWNERS b/media-compat/OWNERS
new file mode 100644
index 0000000..1cf305a
--- /dev/null
+++ b/media-compat/OWNERS
@@ -0,0 +1,7 @@
+akersten@google.com
+hdmoon@google.com
+insun@google.com
+jaewan@google.com
+jinpark@google.com
+juliacr@google.com
+sungsoo@google.com
\ No newline at end of file
diff --git a/media-compat/api/26.1.0.txt b/media-compat/api/26.1.0.txt
new file mode 100644
index 0000000..d40ad7f
--- /dev/null
+++ b/media-compat/api/26.1.0.txt
@@ -0,0 +1,649 @@
+package android.support.v4.media {
+
+  public class AudioAttributesCompat {
+    method public int getContentType();
+    method public int getFlags();
+    method public int getLegacyStreamType();
+    method public int getUsage();
+    method public int getVolumeControlStream();
+    method public java.lang.Object unwrap();
+    method public static android.support.v4.media.AudioAttributesCompat wrap(java.lang.Object);
+    field public static final int CONTENT_TYPE_MOVIE = 3; // 0x3
+    field public static final int CONTENT_TYPE_MUSIC = 2; // 0x2
+    field public static final int CONTENT_TYPE_SONIFICATION = 4; // 0x4
+    field public static final int CONTENT_TYPE_SPEECH = 1; // 0x1
+    field public static final int CONTENT_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FLAG_AUDIBILITY_ENFORCED = 1; // 0x1
+    field public static final int FLAG_HW_AV_SYNC = 16; // 0x10
+    field public static final int USAGE_ALARM = 4; // 0x4
+    field public static final int USAGE_ASSISTANCE_ACCESSIBILITY = 11; // 0xb
+    field public static final int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12; // 0xc
+    field public static final int USAGE_ASSISTANCE_SONIFICATION = 13; // 0xd
+    field public static final int USAGE_ASSISTANT = 16; // 0x10
+    field public static final int USAGE_GAME = 14; // 0xe
+    field public static final int USAGE_MEDIA = 1; // 0x1
+    field public static final int USAGE_NOTIFICATION = 5; // 0x5
+    field public static final int USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9; // 0x9
+    field public static final int USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8; // 0x8
+    field public static final int USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7; // 0x7
+    field public static final int USAGE_NOTIFICATION_EVENT = 10; // 0xa
+    field public static final int USAGE_NOTIFICATION_RINGTONE = 6; // 0x6
+    field public static final int USAGE_UNKNOWN = 0; // 0x0
+    field public static final int USAGE_VOICE_COMMUNICATION = 2; // 0x2
+    field public static final int USAGE_VOICE_COMMUNICATION_SIGNALLING = 3; // 0x3
+  }
+
+  public static class AudioAttributesCompat.Builder {
+    ctor public AudioAttributesCompat.Builder();
+    ctor public AudioAttributesCompat.Builder(android.support.v4.media.AudioAttributesCompat);
+    method public android.support.v4.media.AudioAttributesCompat build();
+    method public android.support.v4.media.AudioAttributesCompat.Builder setContentType(int);
+    method public android.support.v4.media.AudioAttributesCompat.Builder setFlags(int);
+    method public android.support.v4.media.AudioAttributesCompat.Builder setLegacyStreamType(int);
+    method public android.support.v4.media.AudioAttributesCompat.Builder setUsage(int);
+  }
+
+  public final class MediaBrowserCompat {
+    ctor public MediaBrowserCompat(android.content.Context, android.content.ComponentName, android.support.v4.media.MediaBrowserCompat.ConnectionCallback, android.os.Bundle);
+    method public void connect();
+    method public void disconnect();
+    method public android.os.Bundle getExtras();
+    method public void getItem(java.lang.String, android.support.v4.media.MediaBrowserCompat.ItemCallback);
+    method public java.lang.String getRoot();
+    method public android.content.ComponentName getServiceComponent();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public boolean isConnected();
+    method public void search(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.SearchCallback);
+    method public void sendCustomAction(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.CustomActionCallback);
+    method public void subscribe(java.lang.String, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+    method public void subscribe(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+    method public void unsubscribe(java.lang.String);
+    method public void unsubscribe(java.lang.String, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+    field public static final java.lang.String CUSTOM_ACTION_DOWNLOAD = "android.support.v4.media.action.DOWNLOAD";
+    field public static final java.lang.String CUSTOM_ACTION_REMOVE_DOWNLOADED_FILE = "android.support.v4.media.action.REMOVE_DOWNLOADED_FILE";
+    field public static final java.lang.String EXTRA_DOWNLOAD_PROGRESS = "android.media.browse.extra.DOWNLOAD_PROGRESS";
+    field public static final java.lang.String EXTRA_MEDIA_ID = "android.media.browse.extra.MEDIA_ID";
+    field public static final java.lang.String EXTRA_PAGE = "android.media.browse.extra.PAGE";
+    field public static final java.lang.String EXTRA_PAGE_SIZE = "android.media.browse.extra.PAGE_SIZE";
+  }
+
+  public static class MediaBrowserCompat.ConnectionCallback {
+    ctor public MediaBrowserCompat.ConnectionCallback();
+    method public void onConnected();
+    method public void onConnectionFailed();
+    method public void onConnectionSuspended();
+  }
+
+  public static abstract class MediaBrowserCompat.CustomActionCallback {
+    ctor public MediaBrowserCompat.CustomActionCallback();
+    method public void onError(java.lang.String, android.os.Bundle, android.os.Bundle);
+    method public void onProgressUpdate(java.lang.String, android.os.Bundle, android.os.Bundle);
+    method public void onResult(java.lang.String, android.os.Bundle, android.os.Bundle);
+  }
+
+  public static abstract class MediaBrowserCompat.ItemCallback {
+    ctor public MediaBrowserCompat.ItemCallback();
+    method public void onError(java.lang.String);
+    method public void onItemLoaded(android.support.v4.media.MediaBrowserCompat.MediaItem);
+  }
+
+  public static class MediaBrowserCompat.MediaItem implements android.os.Parcelable {
+    ctor public MediaBrowserCompat.MediaItem(android.support.v4.media.MediaDescriptionCompat, int);
+    method public int describeContents();
+    method public static android.support.v4.media.MediaBrowserCompat.MediaItem fromMediaItem(java.lang.Object);
+    method public static java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem> fromMediaItemList(java.util.List<?>);
+    method public android.support.v4.media.MediaDescriptionCompat getDescription();
+    method public int getFlags();
+    method public java.lang.String getMediaId();
+    method public boolean isBrowsable();
+    method public boolean isPlayable();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaBrowserCompat.MediaItem> CREATOR;
+    field public static final int FLAG_BROWSABLE = 1; // 0x1
+    field public static final int FLAG_PLAYABLE = 2; // 0x2
+  }
+
+  public static abstract class MediaBrowserCompat.SearchCallback {
+    ctor public MediaBrowserCompat.SearchCallback();
+    method public void onError(java.lang.String, android.os.Bundle);
+    method public void onSearchResult(java.lang.String, android.os.Bundle, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+  }
+
+  public static abstract class MediaBrowserCompat.SubscriptionCallback {
+    ctor public MediaBrowserCompat.SubscriptionCallback();
+    method public void onChildrenLoaded(java.lang.String, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+    method public void onChildrenLoaded(java.lang.String, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>, android.os.Bundle);
+    method public void onError(java.lang.String);
+    method public void onError(java.lang.String, android.os.Bundle);
+  }
+
+  public abstract class MediaBrowserServiceCompat extends android.app.Service {
+    ctor public MediaBrowserServiceCompat();
+    method public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public final android.os.Bundle getBrowserRootHints();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public void notifyChildrenChanged(java.lang.String);
+    method public void notifyChildrenChanged(java.lang.String, android.os.Bundle);
+    method public android.os.IBinder onBind(android.content.Intent);
+    method public void onCustomAction(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserServiceCompat.Result<android.os.Bundle>);
+    method public abstract android.support.v4.media.MediaBrowserServiceCompat.BrowserRoot onGetRoot(java.lang.String, int, android.os.Bundle);
+    method public abstract void onLoadChildren(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>);
+    method public void onLoadChildren(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>, android.os.Bundle);
+    method public void onLoadItem(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+    method public void onSearch(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>);
+    method public void setSessionToken(android.support.v4.media.session.MediaSessionCompat.Token);
+    field public static final java.lang.String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
+  }
+
+  public static final class MediaBrowserServiceCompat.BrowserRoot {
+    ctor public MediaBrowserServiceCompat.BrowserRoot(java.lang.String, android.os.Bundle);
+    method public android.os.Bundle getExtras();
+    method public java.lang.String getRootId();
+    field public static final java.lang.String EXTRA_OFFLINE = "android.service.media.extra.OFFLINE";
+    field public static final java.lang.String EXTRA_RECENT = "android.service.media.extra.RECENT";
+    field public static final java.lang.String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED";
+    field public static final deprecated java.lang.String EXTRA_SUGGESTION_KEYWORDS = "android.service.media.extra.SUGGESTION_KEYWORDS";
+  }
+
+  public static class MediaBrowserServiceCompat.Result<T> {
+    method public void detach();
+    method public void sendError(android.os.Bundle);
+    method public void sendProgressUpdate(android.os.Bundle);
+    method public void sendResult(T);
+  }
+
+  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 long BT_FOLDER_TYPE_ALBUMS = 2L; // 0x2L
+    field public static final long BT_FOLDER_TYPE_ARTISTS = 3L; // 0x3L
+    field public static final long BT_FOLDER_TYPE_GENRES = 4L; // 0x4L
+    field public static final long BT_FOLDER_TYPE_MIXED = 0L; // 0x0L
+    field public static final long BT_FOLDER_TYPE_PLAYLISTS = 5L; // 0x5L
+    field public static final long BT_FOLDER_TYPE_TITLES = 1L; // 0x1L
+    field public static final long BT_FOLDER_TYPE_YEARS = 6L; // 0x6L
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat> CREATOR;
+    field public static final java.lang.String EXTRA_BT_FOLDER_TYPE = "android.media.extra.BT_FOLDER_TYPE";
+    field public static final java.lang.String EXTRA_DOWNLOAD_STATUS = "android.media.extra.DOWNLOAD_STATUS";
+    field public static final long STATUS_DOWNLOADED = 2L; // 0x2L
+    field public static final long STATUS_DOWNLOADING = 1L; // 0x1L
+    field public static final long STATUS_NOT_DOWNLOADED = 0L; // 0x0L
+  }
+
+  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_ADVERTISEMENT = "android.media.metadata.ADVERTISEMENT";
+    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_BT_FOLDER_TYPE = "android.media.metadata.BT_FOLDER_TYPE";
+    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_DOWNLOAD_STATUS = "android.media.metadata.DOWNLOAD_STATUS";
+    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_MEDIA_URI = "android.media.metadata.MEDIA_URI";
+    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 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.app {
+
+  public class NotificationCompat {
+  }
+
+  public static class NotificationCompat.DecoratedMediaCustomViewStyle extends android.support.v4.media.app.NotificationCompat.MediaStyle {
+    ctor public NotificationCompat.DecoratedMediaCustomViewStyle();
+  }
+
+  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 static android.support.v4.media.session.MediaSessionCompat.Token getMediaSession(android.app.Notification);
+    method public android.support.v4.media.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
+    method public android.support.v4.media.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
+    method public android.support.v4.media.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
+    method public android.support.v4.media.app.NotificationCompat.MediaStyle setShowCancelButton(boolean);
+  }
+
+}
+
+package android.support.v4.media.session {
+
+  public class MediaButtonReceiver extends android.content.BroadcastReceiver {
+    ctor public MediaButtonReceiver();
+    method public static android.app.PendingIntent buildMediaButtonPendingIntent(android.content.Context, long);
+    method public static android.app.PendingIntent buildMediaButtonPendingIntent(android.content.Context, android.content.ComponentName, long);
+    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 addQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public void addQueueItem(android.support.v4.media.MediaDescriptionCompat, int);
+    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 static android.support.v4.media.session.MediaControllerCompat getMediaController(android.app.Activity);
+    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 int getRepeatMode();
+    method public android.app.PendingIntent getSessionActivity();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public int getShuffleMode();
+    method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
+    method public boolean isCaptioningEnabled();
+    method public deprecated boolean isShuffleModeEnabled();
+    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 removeQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public deprecated void removeQueueItemAt(int);
+    method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
+    method public static void setMediaController(android.app.Activity, android.support.v4.media.session.MediaControllerCompat);
+    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 onCaptioningEnabledChanged(boolean);
+    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 onRepeatModeChanged(int);
+    method public void onSessionDestroyed();
+    method public void onSessionEvent(java.lang.String, android.os.Bundle);
+    method public deprecated void onShuffleModeChanged(boolean);
+    method public void onShuffleModeChanged(int);
+  }
+
+  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 prepare();
+    method public abstract void prepareFromMediaId(java.lang.String, android.os.Bundle);
+    method public abstract void prepareFromSearch(java.lang.String, android.os.Bundle);
+    method public abstract void prepareFromUri(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 setCaptioningEnabled(boolean);
+    method public abstract void setRating(android.support.v4.media.RatingCompat);
+    method public abstract void setRating(android.support.v4.media.RatingCompat, android.os.Bundle);
+    method public abstract void setRepeatMode(int);
+    method public abstract void setShuffleMode(int);
+    method public abstract deprecated void setShuffleModeEnabled(boolean);
+    method public abstract void skipToNext();
+    method public abstract void skipToPrevious();
+    method public abstract void skipToQueueItem(long);
+    method public abstract void stop();
+    field public static final java.lang.String EXTRA_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
+  }
+
+  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 static android.support.v4.media.session.MediaSessionCompat fromMediaSession(android.content.Context, java.lang.Object);
+    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 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 setCaptioningEnabled(boolean);
+    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 setRepeatMode(int);
+    method public void setSessionActivity(android.app.PendingIntent);
+    method public void setShuffleMode(int);
+    method public deprecated void setShuffleModeEnabled(boolean);
+    field public static final java.lang.String ACTION_FLAG_AS_INAPPROPRIATE = "android.support.v4.media.session.action.FLAG_AS_INAPPROPRIATE";
+    field public static final java.lang.String ACTION_FOLLOW = "android.support.v4.media.session.action.FOLLOW";
+    field public static final java.lang.String ACTION_SKIP_AD = "android.support.v4.media.session.action.SKIP_AD";
+    field public static final java.lang.String ACTION_UNFOLLOW = "android.support.v4.media.session.action.UNFOLLOW";
+    field public static final java.lang.String ARGUMENT_MEDIA_ATTRIBUTE = "android.support.v4.media.session.ARGUMENT_MEDIA_ATTRIBUTE";
+    field public static final java.lang.String ARGUMENT_MEDIA_ATTRIBUTE_VALUE = "android.support.v4.media.session.ARGUMENT_MEDIA_ATTRIBUTE_VALUE";
+    field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
+    field public static final int FLAG_HANDLES_QUEUE_COMMANDS = 4; // 0x4
+    field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
+    field public static final int MEDIA_ATTRIBUTE_ALBUM = 1; // 0x1
+    field public static final int MEDIA_ATTRIBUTE_ARTIST = 0; // 0x0
+    field public static final int MEDIA_ATTRIBUTE_PLAYLIST = 2; // 0x2
+  }
+
+  public static abstract class MediaSessionCompat.Callback {
+    ctor public MediaSessionCompat.Callback();
+    method public void onAddQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public void onAddQueueItem(android.support.v4.media.MediaDescriptionCompat, int);
+    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 onPrepare();
+    method public void onPrepareFromMediaId(java.lang.String, android.os.Bundle);
+    method public void onPrepareFromSearch(java.lang.String, android.os.Bundle);
+    method public void onPrepareFromUri(android.net.Uri, android.os.Bundle);
+    method public void onRemoveQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public deprecated void onRemoveQueueItemAt(int);
+    method public void onRewind();
+    method public void onSeekTo(long);
+    method public void onSetCaptioningEnabled(boolean);
+    method public void onSetRating(android.support.v4.media.RatingCompat);
+    method public void onSetRating(android.support.v4.media.RatingCompat, android.os.Bundle);
+    method public void onSetRepeatMode(int);
+    method public void onSetShuffleMode(int);
+    method public deprecated void onSetShuffleModeEnabled(boolean);
+    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 static android.support.v4.media.session.MediaSessionCompat.QueueItem fromQueueItem(java.lang.Object);
+    method public static java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> fromQueueItemList(java.util.List<?>);
+    method public android.support.v4.media.MediaDescriptionCompat getDescription();
+    method public long getQueueId();
+    method public java.lang.Object getQueueItem();
+    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 int getErrorCode();
+    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 static int toKeyCode(long);
+    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_PREPARE = 16384L; // 0x4000L
+    field public static final long ACTION_PREPARE_FROM_MEDIA_ID = 32768L; // 0x8000L
+    field public static final long ACTION_PREPARE_FROM_SEARCH = 65536L; // 0x10000L
+    field public static final long ACTION_PREPARE_FROM_URI = 131072L; // 0x20000L
+    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_CAPTIONING_ENABLED = 1048576L; // 0x100000L
+    field public static final long ACTION_SET_RATING = 128L; // 0x80L
+    field public static final long ACTION_SET_REPEAT_MODE = 262144L; // 0x40000L
+    field public static final long ACTION_SET_SHUFFLE_MODE_ENABLED = 524288L; // 0x80000L
+    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 int ERROR_CODE_ACTION_ABORTED = 10; // 0xa
+    field public static final int ERROR_CODE_APP_ERROR = 1; // 0x1
+    field public static final int ERROR_CODE_AUTHENTICATION_EXPIRED = 3; // 0x3
+    field public static final int ERROR_CODE_CONCURRENT_STREAM_LIMIT = 5; // 0x5
+    field public static final int ERROR_CODE_CONTENT_ALREADY_PLAYING = 8; // 0x8
+    field public static final int ERROR_CODE_END_OF_QUEUE = 11; // 0xb
+    field public static final int ERROR_CODE_NOT_AVAILABLE_IN_REGION = 7; // 0x7
+    field public static final int ERROR_CODE_NOT_SUPPORTED = 2; // 0x2
+    field public static final int ERROR_CODE_PARENTAL_CONTROL_RESTRICTED = 6; // 0x6
+    field public static final int ERROR_CODE_PREMIUM_ACCOUNT_REQUIRED = 4; // 0x4
+    field public static final int ERROR_CODE_SKIP_LIMIT_REACHED = 9; // 0x9
+    field public static final int ERROR_CODE_UNKNOWN_ERROR = 0; // 0x0
+    field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
+    field public static final int REPEAT_MODE_ALL = 2; // 0x2
+    field public static final int REPEAT_MODE_GROUP = 3; // 0x3
+    field public static final int REPEAT_MODE_NONE = 0; // 0x0
+    field public static final int REPEAT_MODE_ONE = 1; // 0x1
+    field public static final int SHUFFLE_MODE_ALL = 1; // 0x1
+    field public static final int SHUFFLE_MODE_GROUP = 2; // 0x2
+    field public static final int SHUFFLE_MODE_NONE = 0; // 0x0
+    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 deprecated android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(java.lang.CharSequence);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(int, 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);
+  }
+
+}
+
diff --git a/media-compat/api/27.0.0.txt b/media-compat/api/27.0.0.txt
new file mode 100644
index 0000000..b53de68
--- /dev/null
+++ b/media-compat/api/27.0.0.txt
@@ -0,0 +1,649 @@
+package android.support.v4.media {
+
+  public class AudioAttributesCompat {
+    method public int getContentType();
+    method public int getFlags();
+    method public int getLegacyStreamType();
+    method public int getUsage();
+    method public int getVolumeControlStream();
+    method public java.lang.Object unwrap();
+    method public static android.support.v4.media.AudioAttributesCompat wrap(java.lang.Object);
+    field public static final int CONTENT_TYPE_MOVIE = 3; // 0x3
+    field public static final int CONTENT_TYPE_MUSIC = 2; // 0x2
+    field public static final int CONTENT_TYPE_SONIFICATION = 4; // 0x4
+    field public static final int CONTENT_TYPE_SPEECH = 1; // 0x1
+    field public static final int CONTENT_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FLAG_AUDIBILITY_ENFORCED = 1; // 0x1
+    field public static final int FLAG_HW_AV_SYNC = 16; // 0x10
+    field public static final int USAGE_ALARM = 4; // 0x4
+    field public static final int USAGE_ASSISTANCE_ACCESSIBILITY = 11; // 0xb
+    field public static final int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12; // 0xc
+    field public static final int USAGE_ASSISTANCE_SONIFICATION = 13; // 0xd
+    field public static final int USAGE_ASSISTANT = 16; // 0x10
+    field public static final int USAGE_GAME = 14; // 0xe
+    field public static final int USAGE_MEDIA = 1; // 0x1
+    field public static final int USAGE_NOTIFICATION = 5; // 0x5
+    field public static final int USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9; // 0x9
+    field public static final int USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8; // 0x8
+    field public static final int USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7; // 0x7
+    field public static final int USAGE_NOTIFICATION_EVENT = 10; // 0xa
+    field public static final int USAGE_NOTIFICATION_RINGTONE = 6; // 0x6
+    field public static final int USAGE_UNKNOWN = 0; // 0x0
+    field public static final int USAGE_VOICE_COMMUNICATION = 2; // 0x2
+    field public static final int USAGE_VOICE_COMMUNICATION_SIGNALLING = 3; // 0x3
+  }
+
+  public static class AudioAttributesCompat.Builder {
+    ctor public AudioAttributesCompat.Builder();
+    ctor public AudioAttributesCompat.Builder(android.support.v4.media.AudioAttributesCompat);
+    method public android.support.v4.media.AudioAttributesCompat build();
+    method public android.support.v4.media.AudioAttributesCompat.Builder setContentType(int);
+    method public android.support.v4.media.AudioAttributesCompat.Builder setFlags(int);
+    method public android.support.v4.media.AudioAttributesCompat.Builder setLegacyStreamType(int);
+    method public android.support.v4.media.AudioAttributesCompat.Builder setUsage(int);
+  }
+
+  public final class MediaBrowserCompat {
+    ctor public MediaBrowserCompat(android.content.Context, android.content.ComponentName, android.support.v4.media.MediaBrowserCompat.ConnectionCallback, android.os.Bundle);
+    method public void connect();
+    method public void disconnect();
+    method public android.os.Bundle getExtras();
+    method public void getItem(java.lang.String, android.support.v4.media.MediaBrowserCompat.ItemCallback);
+    method public java.lang.String getRoot();
+    method public android.content.ComponentName getServiceComponent();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public boolean isConnected();
+    method public void search(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.SearchCallback);
+    method public void sendCustomAction(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.CustomActionCallback);
+    method public void subscribe(java.lang.String, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+    method public void subscribe(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+    method public void unsubscribe(java.lang.String);
+    method public void unsubscribe(java.lang.String, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+    field public static final java.lang.String CUSTOM_ACTION_DOWNLOAD = "android.support.v4.media.action.DOWNLOAD";
+    field public static final java.lang.String CUSTOM_ACTION_REMOVE_DOWNLOADED_FILE = "android.support.v4.media.action.REMOVE_DOWNLOADED_FILE";
+    field public static final java.lang.String EXTRA_DOWNLOAD_PROGRESS = "android.media.browse.extra.DOWNLOAD_PROGRESS";
+    field public static final java.lang.String EXTRA_MEDIA_ID = "android.media.browse.extra.MEDIA_ID";
+    field public static final java.lang.String EXTRA_PAGE = "android.media.browse.extra.PAGE";
+    field public static final java.lang.String EXTRA_PAGE_SIZE = "android.media.browse.extra.PAGE_SIZE";
+  }
+
+  public static class MediaBrowserCompat.ConnectionCallback {
+    ctor public MediaBrowserCompat.ConnectionCallback();
+    method public void onConnected();
+    method public void onConnectionFailed();
+    method public void onConnectionSuspended();
+  }
+
+  public static abstract class MediaBrowserCompat.CustomActionCallback {
+    ctor public MediaBrowserCompat.CustomActionCallback();
+    method public void onError(java.lang.String, android.os.Bundle, android.os.Bundle);
+    method public void onProgressUpdate(java.lang.String, android.os.Bundle, android.os.Bundle);
+    method public void onResult(java.lang.String, android.os.Bundle, android.os.Bundle);
+  }
+
+  public static abstract class MediaBrowserCompat.ItemCallback {
+    ctor public MediaBrowserCompat.ItemCallback();
+    method public void onError(java.lang.String);
+    method public void onItemLoaded(android.support.v4.media.MediaBrowserCompat.MediaItem);
+  }
+
+  public static class MediaBrowserCompat.MediaItem implements android.os.Parcelable {
+    ctor public MediaBrowserCompat.MediaItem(android.support.v4.media.MediaDescriptionCompat, int);
+    method public int describeContents();
+    method public static android.support.v4.media.MediaBrowserCompat.MediaItem fromMediaItem(java.lang.Object);
+    method public static java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem> fromMediaItemList(java.util.List<?>);
+    method public android.support.v4.media.MediaDescriptionCompat getDescription();
+    method public int getFlags();
+    method public java.lang.String getMediaId();
+    method public boolean isBrowsable();
+    method public boolean isPlayable();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaBrowserCompat.MediaItem> CREATOR;
+    field public static final int FLAG_BROWSABLE = 1; // 0x1
+    field public static final int FLAG_PLAYABLE = 2; // 0x2
+  }
+
+  public static abstract class MediaBrowserCompat.SearchCallback {
+    ctor public MediaBrowserCompat.SearchCallback();
+    method public void onError(java.lang.String, android.os.Bundle);
+    method public void onSearchResult(java.lang.String, android.os.Bundle, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+  }
+
+  public static abstract class MediaBrowserCompat.SubscriptionCallback {
+    ctor public MediaBrowserCompat.SubscriptionCallback();
+    method public void onChildrenLoaded(java.lang.String, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+    method public void onChildrenLoaded(java.lang.String, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>, android.os.Bundle);
+    method public void onError(java.lang.String);
+    method public void onError(java.lang.String, android.os.Bundle);
+  }
+
+  public abstract class MediaBrowserServiceCompat extends android.app.Service {
+    ctor public MediaBrowserServiceCompat();
+    method public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public final android.os.Bundle getBrowserRootHints();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public void notifyChildrenChanged(java.lang.String);
+    method public void notifyChildrenChanged(java.lang.String, android.os.Bundle);
+    method public android.os.IBinder onBind(android.content.Intent);
+    method public void onCustomAction(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserServiceCompat.Result<android.os.Bundle>);
+    method public abstract android.support.v4.media.MediaBrowserServiceCompat.BrowserRoot onGetRoot(java.lang.String, int, android.os.Bundle);
+    method public abstract void onLoadChildren(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>);
+    method public void onLoadChildren(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>, android.os.Bundle);
+    method public void onLoadItem(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+    method public void onSearch(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>);
+    method public void setSessionToken(android.support.v4.media.session.MediaSessionCompat.Token);
+    field public static final java.lang.String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
+  }
+
+  public static final class MediaBrowserServiceCompat.BrowserRoot {
+    ctor public MediaBrowserServiceCompat.BrowserRoot(java.lang.String, android.os.Bundle);
+    method public android.os.Bundle getExtras();
+    method public java.lang.String getRootId();
+    field public static final java.lang.String EXTRA_OFFLINE = "android.service.media.extra.OFFLINE";
+    field public static final java.lang.String EXTRA_RECENT = "android.service.media.extra.RECENT";
+    field public static final java.lang.String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED";
+    field public static final deprecated java.lang.String EXTRA_SUGGESTION_KEYWORDS = "android.service.media.extra.SUGGESTION_KEYWORDS";
+  }
+
+  public static class MediaBrowserServiceCompat.Result<T> {
+    method public void detach();
+    method public void sendError(android.os.Bundle);
+    method public void sendProgressUpdate(android.os.Bundle);
+    method public void sendResult(T);
+  }
+
+  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 long BT_FOLDER_TYPE_ALBUMS = 2L; // 0x2L
+    field public static final long BT_FOLDER_TYPE_ARTISTS = 3L; // 0x3L
+    field public static final long BT_FOLDER_TYPE_GENRES = 4L; // 0x4L
+    field public static final long BT_FOLDER_TYPE_MIXED = 0L; // 0x0L
+    field public static final long BT_FOLDER_TYPE_PLAYLISTS = 5L; // 0x5L
+    field public static final long BT_FOLDER_TYPE_TITLES = 1L; // 0x1L
+    field public static final long BT_FOLDER_TYPE_YEARS = 6L; // 0x6L
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat> CREATOR;
+    field public static final java.lang.String EXTRA_BT_FOLDER_TYPE = "android.media.extra.BT_FOLDER_TYPE";
+    field public static final java.lang.String EXTRA_DOWNLOAD_STATUS = "android.media.extra.DOWNLOAD_STATUS";
+    field public static final long STATUS_DOWNLOADED = 2L; // 0x2L
+    field public static final long STATUS_DOWNLOADING = 1L; // 0x1L
+    field public static final long STATUS_NOT_DOWNLOADED = 0L; // 0x0L
+  }
+
+  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_ADVERTISEMENT = "android.media.metadata.ADVERTISEMENT";
+    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_BT_FOLDER_TYPE = "android.media.metadata.BT_FOLDER_TYPE";
+    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_DOWNLOAD_STATUS = "android.media.metadata.DOWNLOAD_STATUS";
+    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_MEDIA_URI = "android.media.metadata.MEDIA_URI";
+    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 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.app {
+
+  public class NotificationCompat {
+  }
+
+  public static class NotificationCompat.DecoratedMediaCustomViewStyle extends android.support.v4.media.app.NotificationCompat.MediaStyle {
+    ctor public NotificationCompat.DecoratedMediaCustomViewStyle();
+  }
+
+  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 static android.support.v4.media.session.MediaSessionCompat.Token getMediaSession(android.app.Notification);
+    method public android.support.v4.media.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
+    method public android.support.v4.media.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
+    method public android.support.v4.media.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
+    method public android.support.v4.media.app.NotificationCompat.MediaStyle setShowCancelButton(boolean);
+  }
+
+}
+
+package android.support.v4.media.session {
+
+  public class MediaButtonReceiver extends android.content.BroadcastReceiver {
+    ctor public MediaButtonReceiver();
+    method public static android.app.PendingIntent buildMediaButtonPendingIntent(android.content.Context, long);
+    method public static android.app.PendingIntent buildMediaButtonPendingIntent(android.content.Context, android.content.ComponentName, long);
+    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 addQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public void addQueueItem(android.support.v4.media.MediaDescriptionCompat, int);
+    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 static android.support.v4.media.session.MediaControllerCompat getMediaController(android.app.Activity);
+    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 int getRepeatMode();
+    method public android.app.PendingIntent getSessionActivity();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public int getShuffleMode();
+    method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
+    method public boolean isCaptioningEnabled();
+    method public boolean isSessionReady();
+    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 removeQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public deprecated void removeQueueItemAt(int);
+    method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
+    method public static void setMediaController(android.app.Activity, android.support.v4.media.session.MediaControllerCompat);
+    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 onCaptioningEnabledChanged(boolean);
+    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 onRepeatModeChanged(int);
+    method public void onSessionDestroyed();
+    method public void onSessionEvent(java.lang.String, android.os.Bundle);
+    method public void onSessionReady();
+    method public void onShuffleModeChanged(int);
+  }
+
+  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 prepare();
+    method public abstract void prepareFromMediaId(java.lang.String, android.os.Bundle);
+    method public abstract void prepareFromSearch(java.lang.String, android.os.Bundle);
+    method public abstract void prepareFromUri(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 setCaptioningEnabled(boolean);
+    method public abstract void setRating(android.support.v4.media.RatingCompat);
+    method public abstract void setRating(android.support.v4.media.RatingCompat, android.os.Bundle);
+    method public abstract void setRepeatMode(int);
+    method public abstract void setShuffleMode(int);
+    method public abstract void skipToNext();
+    method public abstract void skipToPrevious();
+    method public abstract void skipToQueueItem(long);
+    method public abstract void stop();
+    field public static final java.lang.String EXTRA_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
+  }
+
+  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 static android.support.v4.media.session.MediaSessionCompat fromMediaSession(android.content.Context, java.lang.Object);
+    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 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 setCaptioningEnabled(boolean);
+    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 setRepeatMode(int);
+    method public void setSessionActivity(android.app.PendingIntent);
+    method public void setShuffleMode(int);
+    field public static final java.lang.String ACTION_FLAG_AS_INAPPROPRIATE = "android.support.v4.media.session.action.FLAG_AS_INAPPROPRIATE";
+    field public static final java.lang.String ACTION_FOLLOW = "android.support.v4.media.session.action.FOLLOW";
+    field public static final java.lang.String ACTION_SKIP_AD = "android.support.v4.media.session.action.SKIP_AD";
+    field public static final java.lang.String ACTION_UNFOLLOW = "android.support.v4.media.session.action.UNFOLLOW";
+    field public static final java.lang.String ARGUMENT_MEDIA_ATTRIBUTE = "android.support.v4.media.session.ARGUMENT_MEDIA_ATTRIBUTE";
+    field public static final java.lang.String ARGUMENT_MEDIA_ATTRIBUTE_VALUE = "android.support.v4.media.session.ARGUMENT_MEDIA_ATTRIBUTE_VALUE";
+    field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
+    field public static final int FLAG_HANDLES_QUEUE_COMMANDS = 4; // 0x4
+    field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
+    field public static final int MEDIA_ATTRIBUTE_ALBUM = 1; // 0x1
+    field public static final int MEDIA_ATTRIBUTE_ARTIST = 0; // 0x0
+    field public static final int MEDIA_ATTRIBUTE_PLAYLIST = 2; // 0x2
+  }
+
+  public static abstract class MediaSessionCompat.Callback {
+    ctor public MediaSessionCompat.Callback();
+    method public void onAddQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public void onAddQueueItem(android.support.v4.media.MediaDescriptionCompat, int);
+    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 onPrepare();
+    method public void onPrepareFromMediaId(java.lang.String, android.os.Bundle);
+    method public void onPrepareFromSearch(java.lang.String, android.os.Bundle);
+    method public void onPrepareFromUri(android.net.Uri, android.os.Bundle);
+    method public void onRemoveQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public deprecated void onRemoveQueueItemAt(int);
+    method public void onRewind();
+    method public void onSeekTo(long);
+    method public void onSetCaptioningEnabled(boolean);
+    method public void onSetRating(android.support.v4.media.RatingCompat);
+    method public void onSetRating(android.support.v4.media.RatingCompat, android.os.Bundle);
+    method public void onSetRepeatMode(int);
+    method public void onSetShuffleMode(int);
+    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 static android.support.v4.media.session.MediaSessionCompat.QueueItem fromQueueItem(java.lang.Object);
+    method public static java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> fromQueueItemList(java.util.List<?>);
+    method public android.support.v4.media.MediaDescriptionCompat getDescription();
+    method public long getQueueId();
+    method public java.lang.Object getQueueItem();
+    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 int getErrorCode();
+    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 static int toKeyCode(long);
+    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_PREPARE = 16384L; // 0x4000L
+    field public static final long ACTION_PREPARE_FROM_MEDIA_ID = 32768L; // 0x8000L
+    field public static final long ACTION_PREPARE_FROM_SEARCH = 65536L; // 0x10000L
+    field public static final long ACTION_PREPARE_FROM_URI = 131072L; // 0x20000L
+    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_CAPTIONING_ENABLED = 1048576L; // 0x100000L
+    field public static final long ACTION_SET_RATING = 128L; // 0x80L
+    field public static final long ACTION_SET_REPEAT_MODE = 262144L; // 0x40000L
+    field public static final long ACTION_SET_SHUFFLE_MODE = 2097152L; // 0x200000L
+    field public static final deprecated long ACTION_SET_SHUFFLE_MODE_ENABLED = 524288L; // 0x80000L
+    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 int ERROR_CODE_ACTION_ABORTED = 10; // 0xa
+    field public static final int ERROR_CODE_APP_ERROR = 1; // 0x1
+    field public static final int ERROR_CODE_AUTHENTICATION_EXPIRED = 3; // 0x3
+    field public static final int ERROR_CODE_CONCURRENT_STREAM_LIMIT = 5; // 0x5
+    field public static final int ERROR_CODE_CONTENT_ALREADY_PLAYING = 8; // 0x8
+    field public static final int ERROR_CODE_END_OF_QUEUE = 11; // 0xb
+    field public static final int ERROR_CODE_NOT_AVAILABLE_IN_REGION = 7; // 0x7
+    field public static final int ERROR_CODE_NOT_SUPPORTED = 2; // 0x2
+    field public static final int ERROR_CODE_PARENTAL_CONTROL_RESTRICTED = 6; // 0x6
+    field public static final int ERROR_CODE_PREMIUM_ACCOUNT_REQUIRED = 4; // 0x4
+    field public static final int ERROR_CODE_SKIP_LIMIT_REACHED = 9; // 0x9
+    field public static final int ERROR_CODE_UNKNOWN_ERROR = 0; // 0x0
+    field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
+    field public static final int REPEAT_MODE_ALL = 2; // 0x2
+    field public static final int REPEAT_MODE_GROUP = 3; // 0x3
+    field public static final int REPEAT_MODE_INVALID = -1; // 0xffffffff
+    field public static final int REPEAT_MODE_NONE = 0; // 0x0
+    field public static final int REPEAT_MODE_ONE = 1; // 0x1
+    field public static final int SHUFFLE_MODE_ALL = 1; // 0x1
+    field public static final int SHUFFLE_MODE_GROUP = 2; // 0x2
+    field public static final int SHUFFLE_MODE_INVALID = -1; // 0xffffffff
+    field public static final int SHUFFLE_MODE_NONE = 0; // 0x0
+    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 deprecated android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(java.lang.CharSequence);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(int, 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);
+  }
+
+}
+
diff --git a/media-compat/api/current.txt b/media-compat/api/current.txt
index e804e1e..b53de68 100644
--- a/media-compat/api/current.txt
+++ b/media-compat/api/current.txt
@@ -357,7 +357,6 @@
     method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
     method public boolean isCaptioningEnabled();
     method public boolean isSessionReady();
-    method public deprecated boolean isShuffleModeEnabled();
     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 removeQueueItem(android.support.v4.media.MediaDescriptionCompat);
@@ -382,7 +381,6 @@
     method public void onSessionDestroyed();
     method public void onSessionEvent(java.lang.String, android.os.Bundle);
     method public void onSessionReady();
-    method public deprecated void onShuffleModeChanged(boolean);
     method public void onShuffleModeChanged(int);
   }
 
@@ -416,7 +414,6 @@
     method public abstract void setRating(android.support.v4.media.RatingCompat, android.os.Bundle);
     method public abstract void setRepeatMode(int);
     method public abstract void setShuffleMode(int);
-    method public abstract deprecated void setShuffleModeEnabled(boolean);
     method public abstract void skipToNext();
     method public abstract void skipToPrevious();
     method public abstract void skipToQueueItem(long);
@@ -454,7 +451,6 @@
     method public void setRepeatMode(int);
     method public void setSessionActivity(android.app.PendingIntent);
     method public void setShuffleMode(int);
-    method public deprecated void setShuffleModeEnabled(boolean);
     field public static final java.lang.String ACTION_FLAG_AS_INAPPROPRIATE = "android.support.v4.media.session.action.FLAG_AS_INAPPROPRIATE";
     field public static final java.lang.String ACTION_FOLLOW = "android.support.v4.media.session.action.FOLLOW";
     field public static final java.lang.String ACTION_SKIP_AD = "android.support.v4.media.session.action.SKIP_AD";
@@ -495,7 +491,6 @@
     method public void onSetRating(android.support.v4.media.RatingCompat, android.os.Bundle);
     method public void onSetRepeatMode(int);
     method public void onSetShuffleMode(int);
-    method public deprecated void onSetShuffleModeEnabled(boolean);
     method public void onSkipToNext();
     method public void onSkipToPrevious();
     method public void onSkipToQueueItem(long);
diff --git a/media-compat/build.gradle b/media-compat/build.gradle
index 2ea2483..c504996 100644
--- a/media-compat/build.gradle
+++ b/media-compat/build.gradle
@@ -18,8 +18,6 @@
 
     sourceSets {
         main.java.srcDirs = [
-                'jellybean-mr2',
-                'kitkat',
                 'api21',
                 'api22',
                 'api23',
diff --git a/media-compat/java/android/support/v4/media/RatingCompat.java b/media-compat/java/android/support/v4/media/RatingCompat.java
index b538cac..e70243f 100644
--- a/media-compat/java/android/support/v4/media/RatingCompat.java
+++ b/media-compat/java/android/support/v4/media/RatingCompat.java
@@ -18,6 +18,7 @@
 
 import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
+import android.media.Rating;
 import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -326,25 +327,25 @@
      */
     public static RatingCompat fromRating(Object ratingObj) {
         if (ratingObj != null && Build.VERSION.SDK_INT >= 19) {
-            final int ratingStyle = RatingCompatKitkat.getRatingStyle(ratingObj);
+            final int ratingStyle = ((Rating) ratingObj).getRatingStyle();
             final RatingCompat rating;
-            if (RatingCompatKitkat.isRated(ratingObj)) {
+            if (((Rating) ratingObj).isRated()) {
                 switch (ratingStyle) {
                     case RATING_HEART:
-                        rating = newHeartRating(RatingCompatKitkat.hasHeart(ratingObj));
+                        rating = newHeartRating(((Rating) ratingObj).hasHeart());
                         break;
                     case RATING_THUMB_UP_DOWN:
-                        rating = newThumbRating(RatingCompatKitkat.isThumbUp(ratingObj));
+                        rating = newThumbRating(((Rating) ratingObj).isThumbUp());
                         break;
                     case RATING_3_STARS:
                     case RATING_4_STARS:
                     case RATING_5_STARS:
                         rating = newStarRating(ratingStyle,
-                                RatingCompatKitkat.getStarRating(ratingObj));
+                                ((Rating) ratingObj).getStarRating());
                         break;
                     case RATING_PERCENTAGE:
                         rating = newPercentageRating(
-                                RatingCompatKitkat.getPercentRating(ratingObj));
+                                ((Rating) ratingObj).getPercentRating());
                         break;
                     default:
                         return null;
@@ -372,25 +373,25 @@
             if (isRated()) {
                 switch (mRatingStyle) {
                     case RATING_HEART:
-                        mRatingObj = RatingCompatKitkat.newHeartRating(hasHeart());
+                        mRatingObj = Rating.newHeartRating(hasHeart());
                         break;
                     case RATING_THUMB_UP_DOWN:
-                        mRatingObj = RatingCompatKitkat.newThumbRating(isThumbUp());
+                        mRatingObj = Rating.newThumbRating(isThumbUp());
                         break;
                     case RATING_3_STARS:
                     case RATING_4_STARS:
                     case RATING_5_STARS:
-                        mRatingObj = RatingCompatKitkat.newStarRating(mRatingStyle,
+                        mRatingObj = Rating.newStarRating(mRatingStyle,
                                 getStarRating());
                         break;
                     case RATING_PERCENTAGE:
-                        mRatingObj = RatingCompatKitkat.newPercentageRating(getPercentRating());
+                        mRatingObj = Rating.newPercentageRating(getPercentRating());
                         break;
                     default:
                         return null;
                 }
             } else {
-                mRatingObj = RatingCompatKitkat.newUnratedRating(mRatingStyle);
+                mRatingObj = Rating.newUnratedRating(mRatingStyle);
             }
         }
         return mRatingObj;
diff --git a/media-compat/java/android/support/v4/media/session/IMediaControllerCallback.aidl b/media-compat/java/android/support/v4/media/session/IMediaControllerCallback.aidl
index aeadff6..6777a3f 100644
--- a/media-compat/java/android/support/v4/media/session/IMediaControllerCallback.aidl
+++ b/media-compat/java/android/support/v4/media/session/IMediaControllerCallback.aidl
@@ -38,7 +38,7 @@
     void onExtrasChanged(in Bundle extras);
     void onVolumeInfoChanged(in ParcelableVolumeInfo info);
     void onRepeatModeChanged(int repeatMode);
-    void onShuffleModeChangedDeprecated(boolean enabled);
+    void onShuffleModeChangedRemoved(boolean enabled);
     void onCaptioningEnabledChanged(boolean enabled);
     void onShuffleModeChanged(int shuffleMode);
     void onSessionReady();
diff --git a/media-compat/java/android/support/v4/media/session/IMediaSession.aidl b/media-compat/java/android/support/v4/media/session/IMediaSession.aidl
index 3926ac2..56c04ac 100644
--- a/media-compat/java/android/support/v4/media/session/IMediaSession.aidl
+++ b/media-compat/java/android/support/v4/media/session/IMediaSession.aidl
@@ -55,7 +55,7 @@
     int getRatingType() = 31;
     boolean isCaptioningEnabled() = 44;
     int getRepeatMode() = 36;
-    boolean isShuffleModeEnabledDeprecated() = 37;
+    boolean isShuffleModeEnabledRemoved() = 37;
     int getShuffleMode() = 46;
     void addQueueItem(in MediaDescriptionCompat description) = 40;
     void addQueueItemAt(in MediaDescriptionCompat description, int index) = 41;
@@ -83,7 +83,7 @@
     void rateWithExtras(in RatingCompat rating, in Bundle extras) = 50;
     void setCaptioningEnabled(boolean enabled) = 45;
     void setRepeatMode(int repeatMode) = 38;
-    void setShuffleModeEnabledDeprecated(boolean shuffleMode) = 39;
+    void setShuffleModeEnabledRemoved(boolean shuffleMode) = 39;
     void setShuffleMode(int shuffleMode) = 47;
     void sendCustomAction(String action, in Bundle args) = 25;
 }
diff --git a/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java b/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java
index cea4771..2509cd4 100644
--- a/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java
+++ b/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java
@@ -70,7 +70,7 @@
  * <li>{@link #getPlaybackState()}.{@link PlaybackStateCompat#getExtras() getExtras()}</li>
  * <li>{@link #isCaptioningEnabled()}</li>
  * <li>{@link #getRepeatMode()}</li>
- * <li>{@link #isShuffleModeEnabled()}</li>
+ * <li>{@link #getShuffleMode()}</li>
  * </ul></p>
  *
  * <div class="special reference">
@@ -439,18 +439,6 @@
     }
 
     /**
-     * Returns whether the shuffle mode is enabled for this session.
-     *
-     * @return {@code true} if the shuffle mode is enabled, {@code false} if it is disabled, not
-     *         set, or the session is not ready.
-     * @deprecated Use {@link #getShuffleMode} instead.
-     */
-    @Deprecated
-    public boolean isShuffleModeEnabled() {
-        return mImpl.isShuffleModeEnabled();
-    }
-
-    /**
      * Gets the shuffle mode for this session.
      *
      * @return The latest shuffle mode set to the session, or
@@ -760,16 +748,6 @@
         /**
          * Override to handle changes to the shuffle mode.
          *
-         * @param enabled {@code true} if the shuffle mode is enabled, {@code false} otherwise.
-         * @deprecated Use {@link #onShuffleModeChanged(int)} instead.
-         */
-        @Deprecated
-        public void onShuffleModeChanged(boolean enabled) {
-        }
-
-        /**
-         * Override to handle changes to the shuffle mode.
-         *
          * @param shuffleMode The shuffle mode. Must be one of the followings:
          *                    {@link PlaybackStateCompat#SHUFFLE_MODE_NONE},
          *                    {@link PlaybackStateCompat#SHUFFLE_MODE_ALL},
@@ -963,12 +941,8 @@
             }
 
             @Override
-            public void onShuffleModeChangedDeprecated(boolean enabled) throws RemoteException {
-                MediaControllerCompat.Callback callback = mCallback.get();
-                if (callback != null) {
-                    callback.postToHandler(
-                            MessageHandler.MSG_UPDATE_SHUFFLE_MODE_DEPRECATED, enabled, null);
-                }
+            public void onShuffleModeChangedRemoved(boolean enabled) throws RemoteException {
+                // Do nothing.
             }
 
             @Override
@@ -1020,7 +994,6 @@
             private static final int MSG_UPDATE_EXTRAS = 7;
             private static final int MSG_DESTROYED = 8;
             private static final int MSG_UPDATE_REPEAT_MODE = 9;
-            private static final int MSG_UPDATE_SHUFFLE_MODE_DEPRECATED = 10;
             private static final int MSG_UPDATE_CAPTIONING_ENABLED = 11;
             private static final int MSG_UPDATE_SHUFFLE_MODE = 12;
             private static final int MSG_SESSION_READY = 13;
@@ -1058,9 +1031,6 @@
                     case MSG_UPDATE_REPEAT_MODE:
                         onRepeatModeChanged((int) msg.obj);
                         break;
-                    case MSG_UPDATE_SHUFFLE_MODE_DEPRECATED:
-                        onShuffleModeChanged((boolean) msg.obj);
-                        break;
                     case MSG_UPDATE_SHUFFLE_MODE:
                         onShuffleModeChanged((int) msg.obj);
                         break;
@@ -1264,15 +1234,6 @@
         /**
          * Sets the shuffle mode for this session.
          *
-         * @param enabled {@code true} to enable the shuffle mode, {@code false} to disable.
-         * @deprecated Use {@link #setShuffleMode} instead.
-         */
-        @Deprecated
-        public abstract void setShuffleModeEnabled(boolean enabled);
-
-        /**
-         * Sets the shuffle mode for this session.
-         *
          * @param shuffleMode The shuffle mode. Must be one of the followings:
          *                    {@link PlaybackStateCompat#SHUFFLE_MODE_NONE},
          *                    {@link PlaybackStateCompat#SHUFFLE_MODE_ALL},
@@ -1414,7 +1375,6 @@
         int getRatingType();
         boolean isCaptioningEnabled();
         int getRepeatMode();
-        boolean isShuffleModeEnabled();
         int getShuffleMode();
         long getFlags();
         PlaybackInfo getPlaybackInfo();
@@ -1610,16 +1570,6 @@
         }
 
         @Override
-        public boolean isShuffleModeEnabled() {
-            try {
-                return mBinder.isShuffleModeEnabledDeprecated();
-            } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in isShuffleModeEnabled.", e);
-            }
-            return false;
-        }
-
-        @Override
         public int getShuffleMode() {
             try {
                 return mBinder.getShuffleMode();
@@ -1899,15 +1849,6 @@
         }
 
         @Override
-        public void setShuffleModeEnabled(boolean enabled) {
-            try {
-                mBinder.setShuffleModeEnabledDeprecated(enabled);
-            } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in setShuffleModeEnabled.", e);
-            }
-        }
-
-        @Override
         public void setShuffleMode(@PlaybackStateCompat.ShuffleMode int shuffleMode) {
             try {
                 mBinder.setShuffleMode(shuffleMode);
@@ -2122,18 +2063,6 @@
         }
 
         @Override
-        public boolean isShuffleModeEnabled() {
-            if (mExtraBinder != null) {
-                try {
-                    return mExtraBinder.isShuffleModeEnabledDeprecated();
-                } catch (RemoteException e) {
-                    Log.e(TAG, "Dead object in isShuffleModeEnabled.", e);
-                }
-            }
-            return false;
-        }
-
-        @Override
         public int getShuffleMode() {
             if (mExtraBinder != null) {
                 try {
@@ -2391,13 +2320,6 @@
         }
 
         @Override
-        public void setShuffleModeEnabled(boolean enabled) {
-            Bundle bundle = new Bundle();
-            bundle.putBoolean(MediaSessionCompat.ACTION_ARGUMENT_SHUFFLE_MODE_ENABLED, enabled);
-            sendCustomAction(MediaSessionCompat.ACTION_SET_SHUFFLE_MODE_ENABLED, bundle);
-        }
-
-        @Override
         public void setShuffleMode(@PlaybackStateCompat.ShuffleMode int shuffleMode) {
             Bundle bundle = new Bundle();
             bundle.putInt(MediaSessionCompat.ACTION_ARGUMENT_SHUFFLE_MODE, shuffleMode);
diff --git a/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java b/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java
index ea5beda..8b91413 100644
--- a/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java
+++ b/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java
@@ -259,12 +259,6 @@
             "android.support.v4.media.session.action.SET_REPEAT_MODE";
 
     /**
-     * Custom action to invoke setShuffleModeEnabled() for the forward compatibility.
-     */
-    static final String ACTION_SET_SHUFFLE_MODE_ENABLED =
-            "android.support.v4.media.session.action.SET_SHUFFLE_MODE_ENABLED";
-
-    /**
      * Custom action to invoke setShuffleMode() for the forward compatibility.
      */
     static final String ACTION_SET_SHUFFLE_MODE =
@@ -321,13 +315,6 @@
             "android.support.v4.media.session.action.ARGUMENT_REPEAT_MODE";
 
     /**
-     * Argument for use with {@link #ACTION_SET_SHUFFLE_MODE_ENABLED} indicating that shuffle mode
-     * is enabled.
-     */
-    static final String ACTION_ARGUMENT_SHUFFLE_MODE_ENABLED =
-            "android.support.v4.media.session.action.ARGUMENT_SHUFFLE_MODE_ENABLED";
-
-    /**
      * Argument for use with {@link #ACTION_SET_SHUFFLE_MODE} indicating shuffle mode.
      */
     static final String ACTION_ARGUMENT_SHUFFLE_MODE =
@@ -704,20 +691,6 @@
     /**
      * Sets the shuffle mode for this session.
      * <p>
-     * Note that if this method is not called before,
-     * {@link MediaControllerCompat#isShuffleModeEnabled} will return {@code false}.
-     *
-     * @param enabled {@code true} to enable the shuffle mode, {@code false} to disable.
-     * @deprecated Use {@link #setShuffleMode} instead.
-     */
-    @Deprecated
-    public void setShuffleModeEnabled(boolean enabled) {
-        mImpl.setShuffleModeEnabled(enabled);
-    }
-
-    /**
-     * Sets the shuffle mode for this session.
-     * <p>
      * Note that if this method is not called before, {@link MediaControllerCompat#getShuffleMode}
      * will return {@link PlaybackStateCompat#SHUFFLE_MODE_NONE}.
      *
@@ -1134,20 +1107,6 @@
         /**
          * Override to handle the setting of the shuffle mode.
          * <p>
-         * You should call {@link #setShuffleModeEnabled} before the end of this method in order to
-         * notify the change to the {@link MediaControllerCompat}, or
-         * {@link MediaControllerCompat#isShuffleModeEnabled} could return an invalid value.
-         *
-         * @param enabled true when the shuffle mode is enabled, false otherwise.
-         * @deprecated Use {@link #onSetShuffleMode} instead.
-         */
-        @Deprecated
-        public void onSetShuffleModeEnabled(boolean enabled) {
-        }
-
-        /**
-         * Override to handle the setting of the shuffle mode.
-         * <p>
          * You should call {@link #setShuffleMode} before the end of this method in order to
          * notify the change to the {@link MediaControllerCompat}, or
          * {@link MediaControllerCompat#getShuffleMode} could return an invalid value.
@@ -1386,9 +1345,6 @@
                 } else if (action.equals(ACTION_SET_REPEAT_MODE)) {
                     int repeatMode = extras.getInt(ACTION_ARGUMENT_REPEAT_MODE);
                     Callback.this.onSetRepeatMode(repeatMode);
-                } else if (action.equals(ACTION_SET_SHUFFLE_MODE_ENABLED)) {
-                    boolean enabled = extras.getBoolean(ACTION_ARGUMENT_SHUFFLE_MODE_ENABLED);
-                    Callback.this.onSetShuffleModeEnabled(enabled);
                 } else if (action.equals(ACTION_SET_SHUFFLE_MODE)) {
                     int shuffleMode = extras.getInt(ACTION_ARGUMENT_SHUFFLE_MODE);
                     Callback.this.onSetShuffleMode(shuffleMode);
@@ -1797,7 +1753,6 @@
         void setRatingType(@RatingCompat.Style int type);
         void setCaptioningEnabled(boolean enabled);
         void setRepeatMode(@PlaybackStateCompat.RepeatMode int repeatMode);
-        void setShuffleModeEnabled(boolean enabled);
         void setShuffleMode(@PlaybackStateCompat.ShuffleMode int shuffleMode);
         void setExtras(Bundle extras);
 
@@ -1844,7 +1799,6 @@
         boolean mCaptioningEnabled;
         @PlaybackStateCompat.RepeatMode int mRepeatMode;
         @PlaybackStateCompat.ShuffleMode int mShuffleMode;
-        boolean mShuffleModeEnabled;
         Bundle mExtras;
 
         int mVolumeType;
@@ -2254,14 +2208,6 @@
         }
 
         @Override
-        public void setShuffleModeEnabled(boolean enabled) {
-            if (mShuffleModeEnabled != enabled) {
-                mShuffleModeEnabled = enabled;
-                sendShuffleModeEnabled(enabled);
-            }
-        }
-
-        @Override
         public void setShuffleMode(@PlaybackStateCompat.ShuffleMode int shuffleMode) {
             if (mShuffleMode != shuffleMode) {
                 mShuffleMode = shuffleMode;
@@ -2460,18 +2406,6 @@
             mControllerCallbacks.finishBroadcast();
         }
 
-        private void sendShuffleModeEnabled(boolean enabled) {
-            int size = mControllerCallbacks.beginBroadcast();
-            for (int i = size - 1; i >= 0; i--) {
-                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
-                try {
-                    cb.onShuffleModeChangedDeprecated(enabled);
-                } catch (RemoteException e) {
-                }
-            }
-            mControllerCallbacks.finishBroadcast();
-        }
-
         private void sendShuffleMode(int shuffleMode) {
             int size = mControllerCallbacks.beginBroadcast();
             for (int i = size - 1; i >= 0; i--) {
@@ -2695,8 +2629,8 @@
             }
 
             @Override
-            public void setShuffleModeEnabledDeprecated(boolean enabled) throws RemoteException {
-                postToHandler(MessageHandler.MSG_SET_SHUFFLE_MODE_ENABLED, enabled);
+            public void setShuffleModeEnabledRemoved(boolean enabled) throws RemoteException {
+                // Do nothing.
             }
 
             @Override
@@ -2783,8 +2717,8 @@
             }
 
             @Override
-            public boolean isShuffleModeEnabledDeprecated() {
-                return mShuffleModeEnabled;
+            public boolean isShuffleModeEnabledRemoved() {
+                return false;
             }
 
             @Override
@@ -2837,7 +2771,6 @@
             private static final int MSG_MEDIA_BUTTON = 21;
             private static final int MSG_SET_VOLUME = 22;
             private static final int MSG_SET_REPEAT_MODE = 23;
-            private static final int MSG_SET_SHUFFLE_MODE_ENABLED = 24;
             private static final int MSG_ADD_QUEUE_ITEM = 25;
             private static final int MSG_ADD_QUEUE_ITEM_AT = 26;
             private static final int MSG_REMOVE_QUEUE_ITEM = 27;
@@ -2978,9 +2911,6 @@
                     case MSG_SET_REPEAT_MODE:
                         cb.onSetRepeatMode(msg.arg1);
                         break;
-                    case MSG_SET_SHUFFLE_MODE_ENABLED:
-                        cb.onSetShuffleModeEnabled((boolean) msg.obj);
-                        break;
                     case MSG_SET_SHUFFLE_MODE:
                         cb.onSetShuffleMode(msg.arg1);
                         break;
@@ -3206,7 +3136,6 @@
         @RatingCompat.Style int mRatingType;
         boolean mCaptioningEnabled;
         @PlaybackStateCompat.RepeatMode int mRepeatMode;
-        boolean mShuffleModeEnabled;
         @PlaybackStateCompat.ShuffleMode int mShuffleMode;
 
         public MediaSessionImplApi21(Context context, String tag) {
@@ -3381,22 +3310,6 @@
         }
 
         @Override
-        public void setShuffleModeEnabled(boolean enabled) {
-            if (mShuffleModeEnabled != enabled) {
-                mShuffleModeEnabled = enabled;
-                int size = mExtraControllerCallbacks.beginBroadcast();
-                for (int i = size - 1; i >= 0; i--) {
-                    IMediaControllerCallback cb = mExtraControllerCallbacks.getBroadcastItem(i);
-                    try {
-                        cb.onShuffleModeChangedDeprecated(enabled);
-                    } catch (RemoteException e) {
-                    }
-                }
-                mExtraControllerCallbacks.finishBroadcast();
-            }
-        }
-
-        @Override
         public void setShuffleMode(@PlaybackStateCompat.ShuffleMode int shuffleMode) {
             if (mShuffleMode != shuffleMode) {
                 mShuffleMode = shuffleMode;
@@ -3625,9 +3538,8 @@
             }
 
             @Override
-            public void setShuffleModeEnabledDeprecated(boolean enabled) throws RemoteException {
-                // Will not be called.
-                throw new AssertionError();
+            public void setShuffleModeEnabledRemoved(boolean enabled) throws RemoteException {
+                // Do nothing.
             }
 
             @Override
@@ -3713,8 +3625,8 @@
             }
 
             @Override
-            public boolean isShuffleModeEnabledDeprecated() {
-                return mShuffleModeEnabled;
+            public boolean isShuffleModeEnabledRemoved() {
+                return false;
             }
 
             @Override
diff --git a/media-compat/java/android/support/v4/media/session/PlaybackStateCompat.java b/media-compat/java/android/support/v4/media/session/PlaybackStateCompat.java
index eee09c5..d7634b0 100644
--- a/media-compat/java/android/support/v4/media/session/PlaybackStateCompat.java
+++ b/media-compat/java/android/support/v4/media/session/PlaybackStateCompat.java
@@ -202,6 +202,7 @@
      * @see Builder#setActions(long)
      * @deprecated Use {@link #ACTION_SET_SHUFFLE_MODE} instead.
      */
+    @Deprecated
     public static final long ACTION_SET_SHUFFLE_MODE_ENABLED = 1 << 19;
 
     /**
diff --git a/media-compat/kitkat/android/support/v4/media/RatingCompatKitkat.java b/media-compat/kitkat/android/support/v4/media/RatingCompatKitkat.java
deleted file mode 100644
index 1d3fa50..0000000
--- a/media-compat/kitkat/android/support/v4/media/RatingCompatKitkat.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v4.media;
-
-import android.media.Rating;
-import android.support.annotation.RequiresApi;
-
-@RequiresApi(19)
-class RatingCompatKitkat {
-    public static Object newUnratedRating(int ratingStyle) {
-        return Rating.newUnratedRating(ratingStyle);
-    }
-
-    public static Object newHeartRating(boolean hasHeart) {
-        return Rating.newHeartRating(hasHeart);
-    }
-
-    public static Object newThumbRating(boolean thumbIsUp) {
-        return Rating.newThumbRating(thumbIsUp);
-    }
-
-    public static Object newStarRating(int starRatingStyle, float starRating) {
-        return Rating.newStarRating(starRatingStyle, starRating);
-    }
-
-    public static Object newPercentageRating(float percent) {
-        return Rating.newPercentageRating(percent);
-    }
-
-    public static boolean isRated(Object ratingObj) {
-        return ((Rating)ratingObj).isRated();
-    }
-
-    public static int getRatingStyle(Object ratingObj) {
-        return ((Rating)ratingObj).getRatingStyle();
-    }
-
-    public static boolean hasHeart(Object ratingObj) {
-        return ((Rating)ratingObj).hasHeart();
-    }
-
-    public static boolean isThumbUp(Object ratingObj) {
-        return ((Rating)ratingObj).isThumbUp();
-    }
-
-    public static float getStarRating(Object ratingObj) {
-        return ((Rating)ratingObj).getStarRating();
-    }
-
-    public static float getPercentRating(Object ratingObj) {
-        return ((Rating)ratingObj).getPercentRating();
-    }
-}
diff --git a/media-compat/tests/src/android/support/v4/media/session/MediaControllerCompatTest.java b/media-compat/tests/src/android/support/v4/media/session/MediaControllerCompatTest.java
index 41784b7..53d7e47 100644
--- a/media-compat/tests/src/android/support/v4/media/session/MediaControllerCompatTest.java
+++ b/media-compat/tests/src/android/support/v4/media/session/MediaControllerCompatTest.java
@@ -396,12 +396,6 @@
             assertEquals(repeatMode, mCallback.mRepeatMode);
 
             mCallback.reset();
-            controls.setShuffleModeEnabled(ENABLED);
-            mWaitLock.wait(TIME_OUT_MS);
-            assertTrue(mCallback.mOnSetShuffleModeEnabledCalled);
-            assertEquals(ENABLED, mCallback.mShuffleModeEnabled);
-
-            mCallback.reset();
             controls.setShuffleMode(PlaybackStateCompat.SHUFFLE_MODE_ALL);
             mWaitLock.wait(TIME_OUT_MS);
             assertTrue(mCallback.mOnSetShuffleModeCalled);
@@ -475,7 +469,6 @@
         private ResultReceiver mCommandCallback;
         private boolean mCaptioningEnabled;
         private int mRepeatMode;
-        private boolean mShuffleModeEnabled;
         private int mShuffleMode;
         private int mQueueIndex;
         private MediaDescriptionCompat mQueueDescription;
@@ -502,7 +495,6 @@
         private boolean mOnPrepareFromUriCalled;
         private boolean mOnSetCaptioningEnabledCalled;
         private boolean mOnSetRepeatModeCalled;
-        private boolean mOnSetShuffleModeEnabledCalled;
         private boolean mOnSetShuffleModeCalled;
         private boolean mOnAddQueueItemCalled;
         private boolean mOnAddQueueItemAtCalled;
@@ -520,7 +512,6 @@
             mCommand = null;
             mCommandCallback = null;
             mCaptioningEnabled = false;
-            mShuffleModeEnabled = false;
             mRepeatMode = PlaybackStateCompat.REPEAT_MODE_NONE;
             mShuffleMode = PlaybackStateCompat.SHUFFLE_MODE_NONE;
             mQueueIndex = -1;
@@ -547,7 +538,6 @@
             mOnPrepareFromUriCalled = false;
             mOnSetCaptioningEnabledCalled = false;
             mOnSetRepeatModeCalled = false;
-            mOnSetShuffleModeEnabledCalled = false;
             mOnSetShuffleModeCalled = false;
             mOnAddQueueItemCalled = false;
             mOnAddQueueItemAtCalled = false;
@@ -794,15 +784,6 @@
         }
 
         @Override
-        public void onSetShuffleModeEnabled(boolean enabled) {
-            synchronized (mWaitLock) {
-                mOnSetShuffleModeEnabledCalled = true;
-                mShuffleModeEnabled = enabled;
-                mWaitLock.notify();
-            }
-        }
-
-        @Override
         public void onSetShuffleMode(int shuffleMode) {
             synchronized (mWaitLock) {
                 mOnSetShuffleModeCalled = true;
diff --git a/media-compat/tests/src/android/support/v4/media/session/MediaSessionCompatTest.java b/media-compat/tests/src/android/support/v4/media/session/MediaSessionCompatTest.java
index b44a085..2cda242 100644
--- a/media-compat/tests/src/android/support/v4/media/session/MediaSessionCompatTest.java
+++ b/media-compat/tests/src/android/support/v4/media/session/MediaSessionCompatTest.java
@@ -446,25 +446,6 @@
     }
 
     /**
-     * Tests {@link MediaSessionCompat#setShuffleModeEnabled}.
-     */
-    @Test
-    @SmallTest
-    public void testSetShuffleModeEnabled() throws Exception {
-        final boolean shuffleModeEnabled = true;
-        MediaControllerCompat controller = mSession.getController();
-        controller.registerCallback(mCallback, mHandler);
-        synchronized (mWaitLock) {
-            mCallback.resetLocked();
-            mSession.setShuffleModeEnabled(shuffleModeEnabled);
-            mWaitLock.wait(TIME_OUT_MS);
-            assertTrue(mCallback.mOnShuffleModeChangedDeprecatedCalled);
-            assertEquals(shuffleModeEnabled, mCallback.mShuffleModeEnabled);
-            assertEquals(shuffleModeEnabled, controller.isShuffleModeEnabled());
-        }
-    }
-
-    /**
      * Tests {@link MediaSessionCompat#setShuffleMode}.
      */
     @Test
@@ -837,7 +818,6 @@
         private volatile boolean mOnSessionEventCalled;
         private volatile boolean mOnCaptioningEnabledChangedCalled;
         private volatile boolean mOnRepeatModeChangedCalled;
-        private volatile boolean mOnShuffleModeChangedDeprecatedCalled;
         private volatile boolean mOnShuffleModeChangedCalled;
 
         private volatile PlaybackStateCompat mPlaybackState;
@@ -849,7 +829,6 @@
         private volatile MediaControllerCompat.PlaybackInfo mPlaybackInfo;
         private volatile boolean mCaptioningEnabled;
         private volatile int mRepeatMode;
-        private volatile boolean mShuffleModeEnabled;
         private volatile int mShuffleMode;
 
         public void resetLocked() {
@@ -862,7 +841,6 @@
             mOnSessionDestroyedCalled = false;
             mOnSessionEventCalled = false;
             mOnRepeatModeChangedCalled = false;
-            mOnShuffleModeChangedDeprecatedCalled = false;
             mOnShuffleModeChangedCalled = false;
 
             mPlaybackState = null;
@@ -873,7 +851,6 @@
             mPlaybackInfo = null;
             mCaptioningEnabled = false;
             mRepeatMode = PlaybackStateCompat.REPEAT_MODE_NONE;
-            mShuffleModeEnabled = false;
             mShuffleMode = PlaybackStateCompat.SHUFFLE_MODE_NONE;
         }
 
@@ -968,15 +945,6 @@
         }
 
         @Override
-        public void onShuffleModeChanged(boolean enabled) {
-            synchronized (mWaitLock) {
-                mOnShuffleModeChangedDeprecatedCalled = true;
-                mShuffleModeEnabled = enabled;
-                mWaitLock.notify();
-            }
-        }
-
-        @Override
         public void onShuffleModeChanged(int shuffleMode) {
             synchronized (mWaitLock) {
                 mOnShuffleModeChangedCalled = true;
diff --git a/paging/OWNERS b/paging/OWNERS
new file mode 100644
index 0000000..bd5d7e4
--- /dev/null
+++ b/paging/OWNERS
@@ -0,0 +1 @@
+ccraik@google.com
\ No newline at end of file
diff --git a/paging/common/src/main/java/android/arch/paging/BoundedDataSource.java b/paging/common/src/main/java/android/arch/paging/BoundedDataSource.java
index 664ab16..0656490 100644
--- a/paging/common/src/main/java/android/arch/paging/BoundedDataSource.java
+++ b/paging/common/src/main/java/android/arch/paging/BoundedDataSource.java
@@ -21,7 +21,6 @@
 import android.support.annotation.WorkerThread;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
 /**
@@ -75,7 +74,6 @@
             if (result.size() != loadSize) {
                 throw new IllegalStateException("invalid number of items returned.");
             }
-            Collections.reverse(result);
         }
         return result;
     }
diff --git a/paging/common/src/main/java/android/arch/paging/ContiguousDataSource.java b/paging/common/src/main/java/android/arch/paging/ContiguousDataSource.java
index 9ff1117..414c4ff 100644
--- a/paging/common/src/main/java/android/arch/paging/ContiguousDataSource.java
+++ b/paging/common/src/main/java/android/arch/paging/ContiguousDataSource.java
@@ -18,100 +18,59 @@
 
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-import android.support.annotation.WorkerThread;
 
 import java.util.List;
 
-/** @hide */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public abstract class ContiguousDataSource<Key, Value> extends DataSource<Key, Value> {
-    /**
-     * Number of items that this DataSource can provide in total, or COUNT_UNDEFINED.
-     *
-     * @return number of items that this DataSource can provide in total, or COUNT_UNDEFINED
-     * if difficult or undesired to compute.
-     */
-    public int countItems() {
-        return COUNT_UNDEFINED;
-    }
-
+abstract class ContiguousDataSource<Key, Value> extends DataSource<Key, Value> {
     @Override
     boolean isContiguous() {
         return true;
     }
 
-    @WorkerThread
-    @Nullable
-    public abstract NullPaddedList<Value> loadInitial(
-            Key key, int initialLoadSize, boolean enablePlaceholders);
+    abstract void loadInitial(Key key, int initialLoadSize, boolean enablePlaceholders,
+            @NonNull PageResult.Receiver<Key, Value> receiver);
+
+    void loadAfter(int currentEndIndex, @NonNull Value currentEndItem, int pageSize,
+            @NonNull PageResult.Receiver<Key, Value> receiver) {
+        if (!isInvalid()) {
+            List<Value> list = loadAfterImpl(currentEndIndex, currentEndItem, pageSize);
+
+            if (list != null && !isInvalid()) {
+                receiver.postOnPageResult(new PageResult<>(
+                        PageResult.APPEND, new Page<Key, Value>(list), 0, 0, 0));
+                return;
+            }
+        }
+        receiver.postOnPageResult(new PageResult<Key, Value>(PageResult.APPEND));
+    }
+
+    void loadBefore(int currentBeginIndex, @NonNull Value currentBeginItem, int pageSize,
+            @NonNull PageResult.Receiver<Key, Value> receiver) {
+        if (!isInvalid()) {
+            List<Value> list = loadBeforeImpl(currentBeginIndex, currentBeginItem, pageSize);
+
+            if (list != null && !isInvalid()) {
+                receiver.postOnPageResult(new PageResult<>(
+                        PageResult.PREPEND, new Page<Key, Value>(list), 0, 0, 0));
+                return;
+            }
+        }
+        receiver.postOnPageResult(new PageResult<Key, Value>(PageResult.PREPEND));
+    }
 
     /**
-     * Load data after the given position / item.
+     * Get the key from either the position, or item, or null if position/item invalid.
      * <p>
-     * It's valid to return a different list size than the page size, if it's easier for this data
-     * source. It is generally safer to increase number loaded than reduce.
-     *
-     * @param currentEndIndex Load items after this index, starting with currentEndIndex + 1.
-     * @param currentEndItem  Load items after this item, can be used for precise querying based on
-     *                        item contents.
-     * @param pageSize        Suggested number of items to load.
-     * @return List of items, starting at position currentEndIndex + 1. Null if the data source is
-     * no longer valid, and should not be queried again.
+     * Position may not match passed item's position - if trying to query the key from a position
+     * that isn't yet loaded, a fallback item (last loaded item accessed) will be passed.
      */
-    @WorkerThread
-    @Nullable
-    public final List<Value> loadAfter(int currentEndIndex,
-            @NonNull Value currentEndItem, int pageSize) {
-        if (isInvalid()) {
-            return null;
-        }
-        List<Value> list = loadAfterImpl(currentEndIndex, currentEndItem, pageSize);
-        if (isInvalid()) {
-            return null;
-        }
-        return list;
-    }
+    abstract Key getKey(int position, Value item);
 
     @Nullable
     abstract List<Value> loadAfterImpl(int currentEndIndex,
             @NonNull Value currentEndItem, int pageSize);
 
-    /**
-     * Load data before the given position / item.
-     * <p>
-     * It's valid to return a different list size than the page size, if it's easier for this data
-     * source. It is generally safer to increase number loaded than reduce.
-     *
-     * @param currentBeginIndex Load items before this index, starting with currentBeginIndex - 1.
-     * @param currentBeginItem  Load items after this item, can be used for precise querying based
-     *                          on item contents.
-     * @param pageSize          Suggested number of items to load.
-     * @return List of items, in descending order, starting at position currentBeginIndex - 1.
-     */
-    @WorkerThread
-    @Nullable
-    public final List<Value> loadBefore(int currentBeginIndex,
-            @NonNull Value currentBeginItem, int pageSize) {
-        if (isInvalid()) {
-            return null;
-        }
-        List<Value> list = loadBeforeImpl(currentBeginIndex, currentBeginItem, pageSize);
-        if (isInvalid()) {
-            return null;
-        }
-        return list;
-
-    }
-
     @Nullable
     abstract List<Value> loadBeforeImpl(int currentBeginIndex,
             @NonNull Value currentBeginItem, int pageSize);
-
-    /**
-     * Get the key from either the position, or item. Position may not match passed item's position,
-     * if trying to query the key from a position that isn't yet loaded, so a fallback item must be
-     * used.
-     */
-    abstract Key getKey(int position, Value item);
 }
diff --git a/paging/common/src/main/java/android/arch/paging/ContiguousPagedList.java b/paging/common/src/main/java/android/arch/paging/ContiguousPagedList.java
index d8907c3..cdff391 100644
--- a/paging/common/src/main/java/android/arch/paging/ContiguousPagedList.java
+++ b/paging/common/src/main/java/android/arch/paging/ContiguousPagedList.java
@@ -16,101 +16,151 @@
 
 package android.arch.paging;
 
+import android.support.annotation.AnyThread;
 import android.support.annotation.MainThread;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-import android.support.annotation.WorkerThread;
 
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
 import java.util.concurrent.Executor;
-import java.util.concurrent.atomic.AtomicBoolean;
 
-/** @hide */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-class ContiguousPagedList<T> extends NullPaddedList<T> {
-
-    private final ContiguousDataSource<?, T> mDataSource;
-    private final Executor mMainThreadExecutor;
-    private final Executor mBackgroundThreadExecutor;
-    private final Config mConfig;
-
+class ContiguousPagedList<K, V> extends PagedList<V> implements PagedStorage.Callback {
+    private final ContiguousDataSource<K, V> mDataSource;
     private boolean mPrependWorkerRunning = false;
     private boolean mAppendWorkerRunning = false;
 
     private int mPrependItemsRequested = 0;
     private int mAppendItemsRequested = 0;
 
-    private int mLastLoad = 0;
-    private T mLastItem = null;
+    @SuppressWarnings("unchecked")
+    private final PagedStorage<K, V> mKeyedStorage = (PagedStorage<K, V>) mStorage;
 
-    private AtomicBoolean mDetached = new AtomicBoolean(false);
+    private final PageResult.Receiver<K, V> mReceiver = new PageResult.Receiver<K, V>() {
+        @AnyThread
+        @Override
+        public void postOnPageResult(@NonNull final PageResult<K, V> pageResult) {
+            // NOTE: if we're already on main thread, this can delay page receive by a frame
+            mMainThreadExecutor.execute(new Runnable() {
+                @Override
+                public void run() {
+                    onPageResult(pageResult);
+                }
+            });
+        }
 
-    private ArrayList<WeakReference<Callback>> mCallbacks = new ArrayList<>();
+        // Creation thread for initial synchronous load, otherwise main thread
+        // Safe to access main thread only state - no other thread has reference during construction
+        @AnyThread
+        @Override
+        public void onPageResult(@NonNull PageResult<K, V> pageResult) {
+            if (pageResult.page == null) {
+                detach();
+                return;
+            }
 
-    @WorkerThread
-    <K> ContiguousPagedList(@NonNull ContiguousDataSource<K, T> dataSource,
+            if (isDetached()) {
+                // No op, have detached
+                return;
+            }
+
+            Page<K, V> page = pageResult.page;
+            if (pageResult.type == PageResult.INIT) {
+                mKeyedStorage.init(pageResult.leadingNulls, page, pageResult.trailingNulls,
+                        pageResult.positionOffset, ContiguousPagedList.this);
+                notifyInserted(0, mKeyedStorage.size());
+            } else if (pageResult.type == PageResult.APPEND) {
+                mKeyedStorage.appendPage(page, ContiguousPagedList.this);
+            } else if (pageResult.type == PageResult.PREPEND) {
+                mKeyedStorage.prependPage(page, ContiguousPagedList.this);
+            }
+
+            if (mBoundaryCallback != null) {
+                boolean deferEmpty = mStorage.size() == 0;
+                boolean deferBegin = !deferEmpty
+                        && pageResult.type == PageResult.PREPEND
+                        && pageResult.page.items.size() == 0;
+                boolean deferEnd = !deferEmpty
+                        && pageResult.type == PageResult.APPEND
+                        && pageResult.page.items.size() == 0;
+                deferBoundaryCallbacks(deferEmpty, deferBegin, deferEnd);
+            }
+        }
+    };
+
+    ContiguousPagedList(
+            @NonNull ContiguousDataSource<K, V> dataSource,
             @NonNull Executor mainThreadExecutor,
             @NonNull Executor backgroundThreadExecutor,
-            Config config,
-            @Nullable K key) {
-        super();
-
+            @Nullable BoundaryCallback<V> boundaryCallback,
+            @NonNull Config config,
+            final @Nullable K key) {
+        super(new PagedStorage<K, V>(), mainThreadExecutor, backgroundThreadExecutor,
+                boundaryCallback, config);
         mDataSource = dataSource;
-        mMainThreadExecutor = mainThreadExecutor;
-        mBackgroundThreadExecutor = backgroundThreadExecutor;
-        mConfig = config;
-        NullPaddedList<T> initialState = dataSource.loadInitial(
-                key, config.mInitialLoadSizeHint, config.mEnablePlaceholders);
 
-        if (initialState != null) {
-            mPositionOffset = initialState.getPositionOffset();
+        // blocking init just triggers the initial load on the construction thread -
+        // Could still be posted with callback, if desired.
+        mDataSource.loadInitial(key,
+                mConfig.initialLoadSizeHint,
+                mConfig.enablePlaceholders,
+                mReceiver);
+    }
 
-            mLeadingNullCount = initialState.getLeadingNullCount();
-            mList = new ArrayList<>(initialState.mList);
-            mTrailingNullCount = initialState.getTrailingNullCount();
+    @MainThread
+    @Override
+    void dispatchUpdatesSinceSnapshot(
+            @NonNull PagedList<V> pagedListSnapshot, @NonNull Callback callback) {
 
-            if (initialState.getLeadingNullCount() == 0
-                    && initialState.getTrailingNullCount() == 0
-                    && config.mPrefetchDistance < 1) {
-                throw new IllegalArgumentException("Null padding is required to support the 0"
-                        + " prefetch case - require either null items or prefetching to fetch"
-                        + " beyond initial load.");
-            }
+        final PagedStorage<?, V> snapshot = pagedListSnapshot.mStorage;
 
-            if (initialState.size() != 0) {
-                mLastLoad = mLeadingNullCount + mList.size() / 2;
-                mLastItem = mList.get(mList.size() / 2);
-            }
-        } else {
-            mList = new ArrayList<>();
-            detach();
+        final int newlyAppended = mStorage.getNumberAppended() - snapshot.getNumberAppended();
+        final int newlyPrepended = mStorage.getNumberPrepended() - snapshot.getNumberPrepended();
+
+        final int previousTrailing = snapshot.getTrailingNullCount();
+        final int previousLeading = snapshot.getLeadingNullCount();
+
+        // Validate that the snapshot looks like a previous version of this list - if it's not,
+        // we can't be sure we'll dispatch callbacks safely
+        if (newlyAppended < 0
+                || newlyPrepended < 0
+                || mStorage.getTrailingNullCount() != Math.max(previousTrailing - newlyAppended, 0)
+                || mStorage.getLeadingNullCount() != Math.max(previousLeading - newlyPrepended, 0)
+                || (mStorage.getStorageCount()
+                        != snapshot.getStorageCount() + newlyAppended + newlyPrepended)) {
+            throw new IllegalArgumentException("Invalid snapshot provided - doesn't appear"
+                    + " to be a snapshot of this PagedList");
         }
-        if (mList.size() == 0) {
-            // Empty initial state, so don't try and fetch data.
-            mPrependWorkerRunning = true;
-            mAppendWorkerRunning = true;
+
+        if (newlyAppended != 0) {
+            final int changedCount = Math.min(previousTrailing, newlyAppended);
+            final int addedCount = newlyAppended - changedCount;
+
+            final int endPosition = snapshot.getLeadingNullCount() + snapshot.getStorageCount();
+            if (changedCount != 0) {
+                callback.onChanged(endPosition, changedCount);
+            }
+            if (addedCount != 0) {
+                callback.onInserted(endPosition + changedCount, addedCount);
+            }
+        }
+        if (newlyPrepended != 0) {
+            final int changedCount = Math.min(previousLeading, newlyPrepended);
+            final int addedCount = newlyPrepended - changedCount;
+
+            if (changedCount != 0) {
+                callback.onChanged(previousLeading, changedCount);
+            }
+            if (addedCount != 0) {
+                callback.onInserted(0, addedCount);
+            }
         }
     }
 
+    @MainThread
     @Override
-    public T get(int index) {
-        T item = super.get(index);
-        if (item != null) {
-            mLastItem = item;
-        }
-        return item;
-    }
-
-    @Override
-    public void loadAround(int index) {
-        mLastLoad = index + mPositionOffset;
-
-        int prependItems = mConfig.mPrefetchDistance - (index - mLeadingNullCount);
-        int appendItems = index + mConfig.mPrefetchDistance - (mLeadingNullCount + mList.size());
+    protected void loadAroundInternal(int index) {
+        int prependItems = mConfig.prefetchDistance - (index - mStorage.getLeadingNullCount());
+        int appendItems = index + mConfig.prefetchDistance
+                - (mStorage.getLeadingNullCount() + mStorage.getStorageCount());
 
         mPrependItemsRequested = Math.max(prependItems, mPrependItemsRequested);
         if (mPrependItemsRequested > 0) {
@@ -123,21 +173,6 @@
         }
     }
 
-    @Override
-    public int getLoadedCount() {
-        return mList.size();
-    }
-
-    @Override
-    public int getLeadingNullCount() {
-        return mLeadingNullCount;
-    }
-
-    @Override
-    public int getTrailingNullCount() {
-        return mTrailingNullCount;
-    }
-
     @MainThread
     private void schedulePrepend() {
         if (mPrependWorkerRunning) {
@@ -145,29 +180,17 @@
         }
         mPrependWorkerRunning = true;
 
-        final int position = mLeadingNullCount + mPositionOffset;
-        final T item = mList.get(0);
+        final int position = mStorage.getLeadingNullCount() + mStorage.getPositionOffset();
+
+        // safe to access first item here - mStorage can't be empty if we're prepending
+        final V item = mStorage.getFirstLoadedItem();
         mBackgroundThreadExecutor.execute(new Runnable() {
             @Override
             public void run() {
-                if (mDetached.get()) {
+                if (isDetached()) {
                     return;
                 }
-
-                final List<T> data = mDataSource.loadBefore(position, item, mConfig.mPageSize);
-                if (data != null) {
-                    mMainThreadExecutor.execute(new Runnable() {
-                        @Override
-                        public void run() {
-                            if (mDetached.get()) {
-                                return;
-                            }
-                            prependImpl(data);
-                        }
-                    });
-                } else {
-                    detach();
-                }
+                mDataSource.loadBefore(position, item, mConfig.pageSize, mReceiver);
             }
         });
     }
@@ -179,56 +202,44 @@
         }
         mAppendWorkerRunning = true;
 
-        final int position = mLeadingNullCount + mList.size() - 1 + mPositionOffset;
-        final T item = mList.get(mList.size() - 1);
+        final int position = mStorage.getLeadingNullCount()
+                + mStorage.getStorageCount() - 1 + mStorage.getPositionOffset();
+
+        // safe to access first item here - mStorage can't be empty if we're appending
+        final V item = mStorage.getLastLoadedItem();
         mBackgroundThreadExecutor.execute(new Runnable() {
             @Override
             public void run() {
-                if (mDetached.get()) {
+                if (isDetached()) {
                     return;
                 }
-
-                final List<T> data = mDataSource.loadAfter(position, item, mConfig.mPageSize);
-                if (data != null) {
-                    mMainThreadExecutor.execute(new Runnable() {
-                        @Override
-                        public void run() {
-                            if (mDetached.get()) {
-                                return;
-                            }
-                            appendImpl(data);
-                        }
-                    });
-                } else {
-                    detach();
-                }
+                mDataSource.loadAfter(position, item, mConfig.pageSize, mReceiver);
             }
         });
     }
 
+    @Override
+    boolean isContiguous() {
+        return true;
+    }
+
+    @Nullable
+    @Override
+    public Object getLastKey() {
+        return mDataSource.getKey(mLastLoad, mLastItem);
+    }
+
     @MainThread
-    private void prependImpl(List<T> before) {
-        final int count = before.size();
-        if (count == 0) {
-            // Nothing returned from source, stop loading in this direction
-            return;
-        }
+    @Override
+    public void onInitialized(int count) {
+        notifyInserted(0, count);
+    }
 
-        Collections.reverse(before);
-        mList.addAll(0, before);
-
-        final int changedCount = Math.min(mLeadingNullCount, count);
-        final int addedCount = count - changedCount;
-
-        if (changedCount != 0) {
-            mLeadingNullCount -= changedCount;
-        }
-        mPositionOffset -= addedCount;
-        mNumberPrepended += count;
-
-
-        // only try to post more work after fully prepended (with offsets / null counts updated)
-        mPrependItemsRequested -= count;
+    @MainThread
+    @Override
+    public void onPagePrepended(int leadingNulls, int changedCount, int addedCount) {
+        // consider whether to post more work, now that a page is fully prepended
+        mPrependItemsRequested = mPrependItemsRequested - changedCount - addedCount;
         mPrependWorkerRunning = false;
         if (mPrependItemsRequested > 0) {
             // not done prepending, keep going
@@ -236,39 +247,18 @@
         }
 
         // finally dispatch callbacks, after prepend may have already been scheduled
-        for (WeakReference<Callback> weakRef : mCallbacks) {
-            Callback callback = weakRef.get();
-            if (callback != null) {
-                if (changedCount != 0) {
-                    callback.onChanged(mLeadingNullCount, changedCount);
-                }
-                if (addedCount != 0) {
-                    callback.onInserted(0, addedCount);
-                }
-            }
-        }
+        notifyChanged(leadingNulls, changedCount);
+        notifyInserted(0, addedCount);
+
+        offsetBoundaryAccessIndices(addedCount);
     }
 
     @MainThread
-    private void appendImpl(List<T> after) {
-        final int count = after.size();
-        if (count == 0) {
-            // Nothing returned from source, stop loading in this direction
-            return;
-        }
+    @Override
+    public void onPageAppended(int endPosition, int changedCount, int addedCount) {
+        // consider whether to post more work, now that a page is fully appended
 
-        mList.addAll(after);
-
-        final int changedCount = Math.min(mTrailingNullCount, count);
-        final int addedCount = count - changedCount;
-
-        if (changedCount != 0) {
-            mTrailingNullCount -= changedCount;
-        }
-        mNumberAppended += count;
-
-        // only try to post more work after fully appended (with null counts updated)
-        mAppendItemsRequested -= count;
+        mAppendItemsRequested = mAppendItemsRequested - changedCount - addedCount;
         mAppendWorkerRunning = false;
         if (mAppendItemsRequested > 0) {
             // not done appending, keep going
@@ -276,100 +266,19 @@
         }
 
         // finally dispatch callbacks, after append may have already been scheduled
-        for (WeakReference<Callback> weakRef : mCallbacks) {
-            Callback callback = weakRef.get();
-            if (callback != null) {
-                final int endPosition = mLeadingNullCount + mList.size() - count;
-                if (changedCount != 0) {
-                    callback.onChanged(endPosition, changedCount);
-                }
-                if (addedCount != 0) {
-                    callback.onInserted(endPosition + changedCount, addedCount);
-                }
-            }
-        }
+        notifyChanged(endPosition, changedCount);
+        notifyInserted(endPosition + changedCount, addedCount);
     }
 
+    @MainThread
     @Override
-    public boolean isImmutable() {
-        // TODO: return true if had nulls, and now getLoadedCount() == size(). Is that safe?
-        // Currently we don't prevent DataSources from returning more items than their null counts
-        return isDetached();
+    public void onPagePlaceholderInserted(int pageIndex) {
+        throw new IllegalStateException("Tiled callback on ContiguousPagedList");
     }
 
+    @MainThread
     @Override
-    public void addWeakCallback(@Nullable PagedList<T> previousSnapshot,
-            @NonNull Callback callback) {
-        NullPaddedList<T> snapshot = (NullPaddedList<T>) previousSnapshot;
-        if (snapshot != this && snapshot != null) {
-            final int newlyAppended = mNumberAppended - snapshot.getNumberAppended();
-            final int newlyPrepended = mNumberPrepended - snapshot.getNumberPrepended();
-
-            final int previousTrailing = snapshot.getTrailingNullCount();
-            final int previousLeading = snapshot.getLeadingNullCount();
-
-            // Validate that the snapshot looks like a previous version of this list - if it's not,
-            // we can't be sure we'll dispatch callbacks safely
-            if (newlyAppended < 0
-                    || newlyPrepended < 0
-                    || mTrailingNullCount != Math.max(previousTrailing - newlyAppended, 0)
-                    || mLeadingNullCount != Math.max(previousLeading - newlyPrepended, 0)
-                    || snapshot.getLoadedCount() + newlyAppended + newlyPrepended != mList.size()) {
-                throw new IllegalArgumentException("Invalid snapshot provided - doesn't appear"
-                        + " to be a snapshot of this list");
-            }
-
-            if (newlyAppended != 0) {
-                final int changedCount = Math.min(previousTrailing, newlyAppended);
-                final int addedCount = newlyAppended - changedCount;
-
-                final int endPosition =
-                        snapshot.getLeadingNullCount() + snapshot.getLoadedCount();
-                if (changedCount != 0) {
-                    callback.onChanged(endPosition, changedCount);
-                }
-                if (addedCount != 0) {
-                    callback.onInserted(endPosition + changedCount, addedCount);
-                }
-            }
-            if (newlyPrepended != 0) {
-                final int changedCount = Math.min(previousLeading, newlyPrepended);
-                final int addedCount = newlyPrepended - changedCount;
-
-                if (changedCount != 0) {
-                    callback.onChanged(previousLeading, changedCount);
-                }
-                if (addedCount != 0) {
-                    callback.onInserted(0, addedCount);
-                }
-            }
-        }
-        mCallbacks.add(new WeakReference<>(callback));
-    }
-
-    @Override
-    public void removeWeakCallback(@NonNull Callback callback) {
-        for (int i = mCallbacks.size() - 1; i >= 0; i--) {
-            Callback currentCallback = mCallbacks.get(i).get();
-            if (currentCallback == null || currentCallback == callback) {
-                mCallbacks.remove(i);
-            }
-        }
-    }
-
-    @Override
-    public boolean isDetached() {
-        return mDetached.get();
-    }
-
-    @SuppressWarnings("WeakerAccess")
-    public void detach() {
-        mDetached.set(true);
-    }
-
-    @Nullable
-    @Override
-    public Object getLastKey() {
-        return mDataSource.getKey(mLastLoad, mLastItem);
+    public void onPageInserted(int start, int count) {
+        throw new IllegalStateException("Tiled callback on ContiguousPagedList");
     }
 }
diff --git a/paging/common/src/main/java/android/arch/paging/DataSource.java b/paging/common/src/main/java/android/arch/paging/DataSource.java
index 48fbec5..ff44521 100644
--- a/paging/common/src/main/java/android/arch/paging/DataSource.java
+++ b/paging/common/src/main/java/android/arch/paging/DataSource.java
@@ -17,6 +17,7 @@
 package android.arch.paging;
 
 import android.support.annotation.AnyThread;
+import android.support.annotation.NonNull;
 import android.support.annotation.WorkerThread;
 
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -47,6 +48,10 @@
 @SuppressWarnings("unused") // suppress warning to remove Key/Value, needed for subclass type safety
 public abstract class DataSource<Key, Value> {
 
+    public interface Factory<Key, Value> {
+        DataSource<Key, Value> create();
+    }
+
     // Since we currently rely on implementation details of two implementations,
     // prevent external subclassing, except through exposed subclasses
     DataSource() {
@@ -60,15 +65,6 @@
     public static int COUNT_UNDEFINED = -1;
 
     /**
-     * Number of items that this DataSource can provide in total, or {@link #COUNT_UNDEFINED}.
-     *
-     * @return number of items that this DataSource can provide in total, or
-     * {@link #COUNT_UNDEFINED} if expensive or undesired to compute.
-     */
-    @WorkerThread
-    public abstract int countItems();
-
-    /**
      * Returns true if the data source guaranteed to produce a contiguous set of items,
      * never producing gaps.
      */
@@ -111,7 +107,7 @@
      */
     @AnyThread
     @SuppressWarnings("WeakerAccess")
-    public void addInvalidatedCallback(InvalidatedCallback onInvalidatedCallback) {
+    public void addInvalidatedCallback(@NonNull InvalidatedCallback onInvalidatedCallback) {
         mOnInvalidatedCallbacks.add(onInvalidatedCallback);
     }
 
@@ -122,7 +118,7 @@
      */
     @AnyThread
     @SuppressWarnings("WeakerAccess")
-    public void removeInvalidatedCallback(InvalidatedCallback onInvalidatedCallback) {
+    public void removeInvalidatedCallback(@NonNull InvalidatedCallback onInvalidatedCallback) {
         mOnInvalidatedCallbacks.remove(onInvalidatedCallback);
     }
 
diff --git a/paging/common/src/main/java/android/arch/paging/KeyedDataSource.java b/paging/common/src/main/java/android/arch/paging/KeyedDataSource.java
index 3109f64..3214a4e 100644
--- a/paging/common/src/main/java/android/arch/paging/KeyedDataSource.java
+++ b/paging/common/src/main/java/android/arch/paging/KeyedDataSource.java
@@ -19,7 +19,6 @@
 import android.support.annotation.AnyThread;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
 import android.support.annotation.WorkerThread;
 
 import java.util.ArrayList;
@@ -55,7 +54,7 @@
  *     {@literal @}SuppressWarnings("FieldCanBeLocal")
  *     private final InvalidationTracker.Observer mObserver;
  *
- *     public OffsetUserQueryDataSource(MyDatabase db) {
+ *     public KeyedUserQueryDataSource(MyDatabase db) {
  *         mDb = db;
  *         mUserDao = db.getUserDao();
  *         mObserver = new InvalidationTracker.Observer("user") {
@@ -86,11 +85,15 @@
  *
  *     {@literal @}Override
  *     public List&lt;User> loadBefore({@literal @}NonNull String userName, int pageSize) {
+ *         // Return items adjacent to 'userName' in reverse order
+ *         // it's valid to return a different-sized list of items than pageSize, if it's easier
  *         return mUserDao.userNameLoadBefore(userName, pageSize);
  *     }
  *
  *     {@literal @}Override
  *     public List&lt;User> loadAfter({@literal @}Nullable String userName, int pageSize) {
+ *         // Return items adjacent to 'userName'
+ *         // it's valid to return a different-sized list of items than pageSize, if it's easier
  *         return mUserDao.userNameLoadAfter(userName, pageSize);
  *     }
  * }</pre>
@@ -99,10 +102,6 @@
  * @param <Value> Type of items being loaded by the DataSource.
  */
 public abstract class KeyedDataSource<Key, Value> extends ContiguousDataSource<Key, Value> {
-    @Override
-    public final int countItems() {
-        return 0; // method not called, can't be overridden
-    }
 
     @Nullable
     @Override
@@ -114,12 +113,43 @@
     @Override
     List<Value> loadBeforeImpl(
             int currentBeginIndex, @NonNull Value currentBeginItem, int pageSize) {
-        return loadBefore(getKey(currentBeginItem), pageSize);
+        List<Value> list = loadBefore(getKey(currentBeginItem), pageSize);
+
+        if (list != null && list.size() > 1) {
+            // TODO: move out of keyed entirely, into the DB DataSource.
+            list = new ArrayList<>(list);
+            Collections.reverse(list);
+        }
+        return list;
     }
 
+
+    @Override
+    void loadInitial(Key key, int initialLoadSize, boolean enablePlaceholders,
+            @NonNull PageResult.Receiver<Key, Value> receiver) {
+
+        PageResult<Key, Value> pageResult =
+                loadInitialInternal(key, initialLoadSize, enablePlaceholders);
+        if (pageResult == null) {
+            // loading failed, return empty page
+            receiver.onPageResult(new PageResult<Key, Value>(PageResult.INIT));
+        } else {
+            receiver.onPageResult(pageResult);
+        }
+    }
+
+    /**
+     * Try initial load, and either return the successful initial load to the receiver,
+     * or null if unsuccessful.
+     */
     @Nullable
-    private NullPaddedList<Value> loadInitialInternal(
+    private PageResult<Key, Value> loadInitialInternal(
             @Nullable Key key, int initialLoadSize, boolean enablePlaceholders) {
+        // check if invalid at beginning, and before returning a valid list
+        if (isInvalid()) {
+            return null;
+        }
+
         List<Value> list;
         if (key == null) {
             // no key, so load initial.
@@ -164,9 +194,14 @@
             }
         }
 
+        final Page<Key, Value> page = new Page<>(list);
+
         if (list.isEmpty()) {
-            // wasn't able to load any items, so publish an unpadded empty list.
-            return new NullPaddedList<>(0, Collections.<Value>emptyList());
+            if (isInvalid()) {
+                return null;
+            }
+            // wasn't able to load any items, but not invalid - return an empty page.
+            return new PageResult<>(PageResult.INIT, page, 0, 0, 0);
         }
 
         int itemsBefore = COUNT_UNDEFINED;
@@ -174,29 +209,21 @@
         if (enablePlaceholders) {
             itemsBefore = countItemsBefore(getKey(list.get(0)));
             itemsAfter = countItemsAfter(getKey(list.get(list.size() - 1)));
-            if (isInvalid()) {
-                return null;
-            }
         }
-        if (itemsBefore == COUNT_UNDEFINED || itemsAfter == COUNT_UNDEFINED) {
-            return new NullPaddedList<>(0, list, 0);
-        } else {
-            return new NullPaddedList<>(itemsBefore, list, itemsAfter);
-        }
-    }
 
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public NullPaddedList<Value> loadInitial(
-            @Nullable Key key, int initialLoadSize, boolean enablePlaceholders) {
         if (isInvalid()) {
             return null;
         }
-        NullPaddedList<Value> list = loadInitialInternal(key, initialLoadSize, enablePlaceholders);
-        if (list == null || isInvalid()) {
-            return null;
+        if (itemsBefore == COUNT_UNDEFINED || itemsAfter == COUNT_UNDEFINED) {
+            itemsBefore = 0;
+            itemsAfter = 0;
         }
-        return list;
+        return new PageResult<>(
+                PageResult.INIT,
+                page,
+                itemsBefore,
+                itemsAfter,
+                0);
     }
 
     /**
@@ -283,10 +310,17 @@
     public abstract List<Value> loadAfter(@NonNull Key currentEndKey, int pageSize);
 
     /**
-     * Load data before the currently loaded content, starting at the provided index.
+     * Load data before the currently loaded content, starting at the provided index,
+     * in reverse-display order.
      * <p>
      * It's valid to return a different list size than the page size, if it's easier for this data
      * source. It is generally safer to increase the number loaded than reduce.
+     * <p class="note"><strong>Note:</strong> Items returned from loadBefore <em>must</em> be in
+     * reverse order from how they will be presented in the list. The first item in the return list
+     * will be prepended immediately before the current beginning of the list. This is so that the
+     * KeyedDataSource may return a different number of items from the requested {@code pageSize} by
+     * shortening or lengthening the return list as it desires.
+     * <p>
      *
      * @param currentBeginKey Load items before this key.
      * @param pageSize         Suggested number of items to load.
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/ListDataSource.java b/paging/common/src/main/java/android/arch/paging/ListDataSource.java
similarity index 87%
rename from paging/runtime/src/androidTest/java/android/arch/paging/ListDataSource.java
rename to paging/common/src/main/java/android/arch/paging/ListDataSource.java
index f3e83d0..d3a171e 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/ListDataSource.java
+++ b/paging/common/src/main/java/android/arch/paging/ListDataSource.java
@@ -16,13 +16,14 @@
 
 package android.arch.paging;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class ListDataSource<T> extends TiledDataSource<T> {
-    private List<T> mList;
+    private final List<T> mList;
 
-    ListDataSource(List<T> data) {
-        mList = data;
+    public ListDataSource(List<T> list) {
+        mList = new ArrayList<>(list);
     }
 
     @Override
diff --git a/paging/common/src/main/java/android/arch/paging/NullPaddedList.java b/paging/common/src/main/java/android/arch/paging/NullPaddedList.java
deleted file mode 100644
index 4300030..0000000
--- a/paging/common/src/main/java/android/arch/paging/NullPaddedList.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.paging;
-
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * NullPaddedList is a simple list, with optional null padding on the beginning and end.
- *
- * @param <Type> The type of the entries in the list.
- *
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class NullPaddedList<Type> extends PagedList<Type> {
-    List<Type> mList;
-    int mTrailingNullCount;
-    int mLeadingNullCount;
-    int mPositionOffset;
-
-    // track the items prepended/appended since the PagedList was initialized
-    int mNumberPrepended;
-    int mNumberAppended;
-
-    NullPaddedList() {
-    }
-
-    @Override
-    public String toString() {
-        return "NullPaddedList " + mLeadingNullCount
-                + ", " + mList.size()
-                + ", " + mTrailingNullCount;
-    }
-
-    /**
-     * Create a static, immutable NullPaddedList with the specified list,
-     *
-     * @param leadingNullCount Number of empty items in advance of the passed list.
-     * @param list List of items.
-     * @param trailingNullCount Number of empty items following the passed list.
-     */
-    NullPaddedList(int leadingNullCount, List<Type> list, int trailingNullCount) {
-        if (leadingNullCount < 0 || trailingNullCount < 0) {
-            throw new IllegalArgumentException("leading/trailing null count must be non-negative");
-        }
-        if (list == null) {
-            throw new IllegalArgumentException("list must be non-null");
-        }
-        mList = list;
-        mLeadingNullCount = leadingNullCount;
-        mTrailingNullCount = trailingNullCount;
-    }
-
-    NullPaddedList(int leadingNullCount, int totalCount, List<Type> list) {
-        if (list == null) {
-            throw new IllegalArgumentException("list must be non-null");
-        }
-
-        int trailingNullCount = totalCount - (leadingNullCount) - list.size();
-
-        mList = list;
-        mLeadingNullCount = leadingNullCount;
-        mTrailingNullCount = trailingNullCount;
-    }
-
-    NullPaddedList(int positionOffset, List<Type> list) {
-        if (list == null) {
-            throw new IllegalArgumentException("list must be non-null");
-        }
-
-        mList = list;
-        mPositionOffset = positionOffset;
-    }
-
-    /**
-     * Create a copy of the passed NullPaddedList.
-     *
-     * @param other Other list to copy.
-     */
-    NullPaddedList(NullPaddedList<Type> other) {
-        mLeadingNullCount = other.getLeadingNullCount();
-        mList = other.isImmutable() ? other.mList : new ArrayList<>(other.mList);
-        mTrailingNullCount = other.getTrailingNullCount();
-
-        mNumberPrepended = other.getNumberPrepended();
-        mNumberAppended = other.getNumberAppended();
-    }
-
-    // --------------- PagedList API ---------------
-
-    @Override
-    public Type get(int index) {
-        if (index < 0 || index >= size()) {
-            throw new IndexOutOfBoundsException();
-        }
-
-        index -= mLeadingNullCount;
-        if (index < 0) {
-            return null;
-        }
-        if (index >= mList.size()) {
-            return null;
-        }
-        return mList.get(index);
-    }
-
-    @Override
-    public void loadAround(int index) {
-        // do nothing - immutable, so no fetching will be done
-    }
-
-    @Override
-    public final int size() {
-        return getLoadedCount() + getLeadingNullCount() + getTrailingNullCount();
-    }
-
-    public boolean isImmutable() {
-        return true;
-    }
-
-    @Override
-    public PagedList<Type> snapshot() {
-        if (isImmutable()) {
-            return this;
-        }
-        return new NullPaddedList<>(this);
-    }
-
-    @Override
-    boolean isContiguous() {
-        return true;
-    }
-
-    @Override
-    public void addWeakCallback(@Nullable PagedList<Type> previousSnapshot,
-            @NonNull Callback callback) {
-        // no op, immutable
-    }
-
-    @Override
-    public void removeWeakCallback(Callback callback) {
-        // no op, immutable
-    }
-
-    // --------------- Contiguous API ---------------
-
-    @Override
-    public int getPositionOffset() {
-        return mPositionOffset;
-    }
-
-    /**
-     * Number of loaded items. This does not account for leading or trailing null padding.
-     *
-     * @return Number of loaded items.
-     */
-    public int getLoadedCount() {
-        return mList.size();
-    }
-
-    /**
-     * Number of empty, unloaded items ahead of the loaded item region.
-     *
-     * @return Number of nulls before the loaded list.
-     */
-    public int getLeadingNullCount() {
-        return mLeadingNullCount;
-    }
-
-    /**
-     * Number of empty, unloaded items behind the loaded item region.
-     *
-     * @return Number of nulls after the loaded list.
-     */
-    public int getTrailingNullCount() {
-        return mTrailingNullCount;
-    }
-
-    int getNumberPrepended() {
-        return mNumberPrepended;
-    }
-
-    int getNumberAppended() {
-        return mNumberAppended;
-    }
-}
diff --git a/paging/common/src/main/java/android/arch/paging/Page.java b/paging/common/src/main/java/android/arch/paging/Page.java
new file mode 100644
index 0000000..e9890ed
--- /dev/null
+++ b/paging/common/src/main/java/android/arch/paging/Page.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.paging;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import java.util.List;
+
+/**
+ * Immutable class representing a page of data loaded from a DataSource.
+ * <p>
+ * Optionally stores before/after keys for cases where they cannot be computed, but the DataSource
+ * can provide them as part of loading a page.
+ * <p>
+ * A page's list must never be modified.
+ */
+class Page<K, V> {
+    @SuppressWarnings("WeakerAccess")
+    @Nullable
+    public final K beforeKey;
+    @NonNull
+    public final List<V> items;
+    @SuppressWarnings("WeakerAccess")
+    @Nullable
+    public K afterKey;
+
+    Page(@NonNull List<V> items) {
+        this(null, items, null);
+    }
+
+    Page(@Nullable K beforeKey, @NonNull List<V> items, @Nullable K afterKey) {
+        this.beforeKey = beforeKey;
+        this.items = items;
+        this.afterKey = afterKey;
+    }
+}
diff --git a/paging/common/src/main/java/android/arch/paging/PageArrayList.java b/paging/common/src/main/java/android/arch/paging/PageArrayList.java
deleted file mode 100644
index b90d055..0000000
--- a/paging/common/src/main/java/android/arch/paging/PageArrayList.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.paging;
-
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/** @hide */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-class PageArrayList<T> extends PagedList<T> {
-    // partial list of pages, doesn't include pages below the lowest accessed, or above the highest
-    final ArrayList<List<T>> mPages;
-
-    // to access page at index N, do mPages.get(N - mPageIndexOffset), but do bounds checking first!
-    int mPageIndexOffset;
-
-    final int mPageSize;
-    final int mCount;
-    final int mMaxPageCount;
-
-    PageArrayList(int pageSize, int count) {
-        mPages = new ArrayList<>();
-        mPageSize = pageSize;
-        mCount = count;
-        mMaxPageCount = (mCount + mPageSize - 1) / mPageSize;
-    }
-
-    private PageArrayList(PageArrayList<T> other) {
-        mPages = other.isImmutable() ? other.mPages : new ArrayList<>(other.mPages);
-        mPageIndexOffset = other.mPageIndexOffset;
-        mPageSize = other.mPageSize;
-        mCount = other.size();
-        mMaxPageCount = other.mMaxPageCount;
-    }
-
-    @Override
-    public T get(int index) {
-        if (index < 0 || index >= mCount) {
-            throw new IllegalArgumentException();
-        }
-
-        int localPageIndex = getLocalPageIndex(index);
-
-        List<T> page = getPage(localPageIndex);
-
-        if (page == null) {
-            // page empty
-            return null;
-        }
-
-        return page.get(index % mPageSize);
-    }
-
-    @Nullable
-    private List<T> getPage(int localPageIndex) {
-        if (localPageIndex < 0 || localPageIndex >= mPages.size()) {
-            // page not present
-            return null;
-        }
-
-        return mPages.get(localPageIndex);
-    }
-
-    private int getLocalPageIndex(int index) {
-        return index / mPageSize - mPageIndexOffset;
-    }
-
-    @Override
-    public void loadAround(int index) {
-        // do nothing - immutable, so no fetching will be done
-    }
-
-    @Override
-    public int size() {
-        return mCount;
-    }
-
-    @Override
-    public boolean isImmutable() {
-        return true;
-    }
-
-    boolean hasPage(int pageIndex) {
-        final int localPageIndex = pageIndex - mPageIndexOffset;
-        List<T> page = getPage(localPageIndex);
-        return page != null && page.size() != 0;
-    }
-
-    @Override
-    public PagedList<T> snapshot() {
-        if (isImmutable()) {
-            return this;
-        }
-        return new PageArrayList<>(this);
-    }
-
-    @Override
-    boolean isContiguous() {
-        return false;
-    }
-
-    @Override
-    public void addWeakCallback(@Nullable PagedList<T> previousSnapshot,
-            @NonNull Callback callback) {
-        // no op, immutable
-    }
-
-    @Override
-    public void removeWeakCallback(Callback callback) {
-        // no op, immutable
-    }
-}
diff --git a/paging/common/src/main/java/android/arch/paging/PageResult.java b/paging/common/src/main/java/android/arch/paging/PageResult.java
new file mode 100644
index 0000000..55d5fb7
--- /dev/null
+++ b/paging/common/src/main/java/android/arch/paging/PageResult.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.paging;
+
+import android.support.annotation.AnyThread;
+import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
+
+class PageResult<K, V> {
+    static final int INIT = 0;
+
+    // contiguous results
+    static final int APPEND = 1;
+    static final int PREPEND = 2;
+
+    // non-contiguous, tile result
+    static final int TILE = 3;
+
+    public final int type;
+    public final Page<K, V> page;
+    @SuppressWarnings("WeakerAccess")
+    public final int leadingNulls;
+    @SuppressWarnings("WeakerAccess")
+    public final int trailingNulls;
+    @SuppressWarnings("WeakerAccess")
+    public final int positionOffset;
+
+    PageResult(int type, Page<K, V> page, int leadingNulls, int trailingNulls, int positionOffset) {
+        this.type = type;
+        this.page = page;
+        this.leadingNulls = leadingNulls;
+        this.trailingNulls = trailingNulls;
+        this.positionOffset = positionOffset;
+    }
+
+    PageResult(int type) {
+        this.type = type;
+        this.page = null;
+        this.leadingNulls = 0;
+        this.trailingNulls = 0;
+        this.positionOffset = 0;
+    }
+
+    interface Receiver<K, V> {
+        @AnyThread
+        void postOnPageResult(@NonNull PageResult<K, V> pageResult);
+        @MainThread
+        void onPageResult(@NonNull PageResult<K, V> pageResult);
+    }
+}
diff --git a/paging/common/src/main/java/android/arch/paging/PagedList.java b/paging/common/src/main/java/android/arch/paging/PagedList.java
index 6a31b68..f18e108 100644
--- a/paging/common/src/main/java/android/arch/paging/PagedList.java
+++ b/paging/common/src/main/java/android/arch/paging/PagedList.java
@@ -16,13 +16,18 @@
 
 package android.arch.paging;
 
+import android.support.annotation.AnyThread;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
 import android.support.annotation.WorkerThread;
 
+import java.lang.ref.WeakReference;
 import java.util.AbstractList;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * Lazy loading list that pages in content from a {@link DataSource}.
@@ -90,9 +95,44 @@
  * @param <T> The type of the entries in the list.
  */
 public abstract class PagedList<T> extends AbstractList<T> {
-    // Since we currently rely on implementation details of two implementations,
-    // prevent external subclassing
-    PagedList() {
+    @NonNull
+    final Executor mMainThreadExecutor;
+    @NonNull
+    final Executor mBackgroundThreadExecutor;
+    @Nullable
+    final BoundaryCallback<T> mBoundaryCallback;
+    @NonNull
+    final Config mConfig;
+    @NonNull
+    final PagedStorage<?, T> mStorage;
+
+    int mLastLoad = 0;
+    T mLastItem = null;
+
+    // if set to true, mBoundaryCallback is non-null, and should
+    // be dispatched when nearby load has occurred
+    private boolean mBoundaryCallbackBeginDeferred = false;
+    private boolean mBoundaryCallbackEndDeferred = false;
+
+    // lowest and highest index accessed by loadAround. Used to
+    // decide when mBoundaryCallback should be dispatched
+    private int mLowestIndexAccessed = Integer.MAX_VALUE;
+    private int mHighestIndexAccessed = Integer.MIN_VALUE;
+
+    private final AtomicBoolean mDetached = new AtomicBoolean(false);
+
+    protected final ArrayList<WeakReference<Callback>> mCallbacks = new ArrayList<>();
+
+    PagedList(@NonNull PagedStorage<?, T> storage,
+            @NonNull Executor mainThreadExecutor,
+            @NonNull Executor backgroundThreadExecutor,
+            @Nullable BoundaryCallback<T> boundaryCallback,
+            @NonNull Config config) {
+        mStorage = storage;
+        mMainThreadExecutor = mainThreadExecutor;
+        mBackgroundThreadExecutor = backgroundThreadExecutor;
+        mBoundaryCallback = boundaryCallback;
+        mConfig = config;
     }
 
     /**
@@ -105,6 +145,7 @@
      *                           Generally, this is the UI/main thread.
      * @param backgroundThreadExecutor Data loading will be done via this executor - should be a
      *                                 background thread.
+     * @param boundaryCallback Optional boundary callback to attach to the list.
      * @param config PagedList Config, which defines how the PagedList will load data.
      * @param <K> Key type that indicates to the DataSource what data to load.
      * @param <T> Type of items to be held and loaded by the PagedList.
@@ -115,9 +156,10 @@
     private static <K, T> PagedList<T> create(@NonNull DataSource<K, T> dataSource,
             @NonNull Executor mainThreadExecutor,
             @NonNull Executor backgroundThreadExecutor,
+            @Nullable BoundaryCallback<T> boundaryCallback,
             @NonNull Config config,
             @Nullable K key) {
-        if (dataSource.isContiguous() || !config.mEnablePlaceholders) {
+        if (dataSource.isContiguous() || !config.enablePlaceholders) {
             if (!dataSource.isContiguous()) {
                 //noinspection unchecked
                 dataSource = (DataSource<K, T>) ((TiledDataSource<T>) dataSource).getAsContiguous();
@@ -126,12 +168,14 @@
             return new ContiguousPagedList<>(contigDataSource,
                     mainThreadExecutor,
                     backgroundThreadExecutor,
+                    boundaryCallback,
                     config,
                     key);
         } else {
             return new TiledPagedList<>((TiledDataSource<T>) dataSource,
                     mainThreadExecutor,
                     backgroundThreadExecutor,
+                    boundaryCallback,
                     config,
                     (key != null) ? (Integer) key : 0);
         }
@@ -162,6 +206,7 @@
         private DataSource<Key, Value> mDataSource;
         private Executor mMainThreadExecutor;
         private Executor mBackgroundThreadExecutor;
+        private BoundaryCallback mBoundaryCallback;
         private Config mConfig;
         private Key mInitialKey;
 
@@ -205,6 +250,14 @@
             return this;
         }
 
+        @NonNull
+        public Builder<Key, Value> setBoundaryCallback(
+                @Nullable BoundaryCallback boundaryCallback) {
+            mBoundaryCallback = boundaryCallback;
+            return this;
+        }
+
+
         /**
          * The Config defining how the PagedList should load from the DataSource.
          *
@@ -260,10 +313,12 @@
                 throw new IllegalArgumentException("Config required");
             }
 
+            //noinspection unchecked
             return PagedList.create(
                     mDataSource,
                     mMainThreadExecutor,
                     mBackgroundThreadExecutor,
+                    mBoundaryCallback,
                     mConfig,
                     mInitialKey);
         }
@@ -280,16 +335,138 @@
      */
     @Override
     @Nullable
-    public abstract T get(int index);
-
+    public T get(int index) {
+        T item = mStorage.get(index);
+        if (item != null) {
+            mLastItem = item;
+        }
+        return item;
+    }
 
     /**
      * Load adjacent items to passed index.
      *
      * @param index Index at which to load.
      */
-    public abstract void loadAround(int index);
+    public void loadAround(int index) {
+        mLastLoad = index + getPositionOffset();
+        loadAroundInternal(index);
 
+        mLowestIndexAccessed = Math.min(mLowestIndexAccessed, index);
+        mHighestIndexAccessed = Math.max(mHighestIndexAccessed, index);
+
+        /*
+         * mLowestIndexAccessed / mHighestIndexAccessed have been updated, so check if we need to
+         * dispatch boundary callbacks. Boundary callbacks are deferred until last items are loaded,
+         * and accesses happen near the boundaries.
+         *
+         * Note: we post here, since RecyclerView may want to add items in response, and this
+         * call occurs in PagedListAdapter bind.
+         */
+        tryDispatchBoundaryCallbacks(true);
+    }
+
+    // Creation thread for initial synchronous load, otherwise main thread
+    // Safe to access main thread only state - no other thread has reference during construction
+    @AnyThread
+    void deferBoundaryCallbacks(final boolean deferEmpty,
+            final boolean deferBegin, final boolean deferEnd) {
+        if (mBoundaryCallback == null) {
+            throw new IllegalStateException("Computing boundary");
+        }
+
+        /*
+         * If lowest/highest haven't been initialized, set them to storage size,
+         * since placeholders must already be computed by this point.
+         *
+         * This is just a minor optimization so that BoundaryCallback callbacks are sent immediately
+         * if the initial load size is smaller than the prefetch window (see
+         * TiledPagedListTest#boundaryCallback_immediate())
+         */
+        if (mLowestIndexAccessed == Integer.MAX_VALUE) {
+            mLowestIndexAccessed = mStorage.size();
+        }
+        if (mHighestIndexAccessed == Integer.MIN_VALUE) {
+            mHighestIndexAccessed = 0;
+        }
+
+        if (deferEmpty || deferBegin || deferEnd) {
+            // Post to the main thread, since we may be on creation thread currently
+            mMainThreadExecutor.execute(new Runnable() {
+                @Override
+                public void run() {
+                    // on is dispatched immediately, since items won't be accessed
+                    //noinspection ConstantConditions
+                    if (deferEmpty) {
+                        mBoundaryCallback.onZeroItemsLoaded();
+                    }
+
+                    // for other callbacks, mark deferred, and only dispatch if loadAround
+                    // has been called near to the position
+                    if (deferBegin) {
+                        mBoundaryCallbackBeginDeferred = true;
+                    }
+                    if (deferEnd) {
+                        mBoundaryCallbackEndDeferred = true;
+                    }
+                    tryDispatchBoundaryCallbacks(false);
+                }
+            });
+        }
+    }
+
+    /**
+     * Call this when mLowest/HighestIndexAccessed are changed, or
+     * mBoundaryCallbackBegin/EndDeferred is set.
+     */
+    private void tryDispatchBoundaryCallbacks(boolean post) {
+        final boolean dispatchBegin = mBoundaryCallbackBeginDeferred
+                && mLowestIndexAccessed <= mConfig.prefetchDistance;
+        final boolean dispatchEnd = mBoundaryCallbackEndDeferred
+                && mHighestIndexAccessed >= size() - mConfig.prefetchDistance;
+
+        if (!dispatchBegin && !dispatchEnd) {
+            return;
+        }
+
+        if (dispatchBegin) {
+            mBoundaryCallbackBeginDeferred = false;
+        }
+        if (dispatchEnd) {
+            mBoundaryCallbackEndDeferred = false;
+        }
+        if (post) {
+            mMainThreadExecutor.execute(new Runnable() {
+                @Override
+                public void run() {
+                    dispatchBoundaryCallbacks(dispatchBegin, dispatchEnd);
+                }
+            });
+        } else {
+            dispatchBoundaryCallbacks(dispatchBegin, dispatchEnd);
+        }
+    }
+
+    private void dispatchBoundaryCallbacks(boolean begin, boolean end) {
+        // safe to deref mBoundaryCallback here, since we only defer if mBoundaryCallback present
+        if (begin) {
+            //noinspection ConstantConditions
+            mBoundaryCallback.onItemAtFrontLoaded(
+                    snapshot(), mStorage.getFirstLoadedItem(), mStorage.size());
+        }
+        if (end) {
+            //noinspection ConstantConditions
+            mBoundaryCallback.onItemAtEndLoaded(
+                    snapshot(), mStorage.getLastLoadedItem(), mStorage.size());
+        }
+    }
+
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    void offsetBoundaryAccessIndices(int offset) {
+        mLowestIndexAccessed += offset;
+        mHighestIndexAccessed += offset;
+    }
 
     /**
      * Returns size of the list, including any not-yet-loaded null padding.
@@ -297,7 +474,9 @@
      * @return Current total size of the list.
      */
     @Override
-    public abstract int size();
+    public int size() {
+        return mStorage.size();
+    }
 
     /**
      * Returns whether the list is immutable. Immutable lists may not become mutable again, and may
@@ -305,19 +484,40 @@
      *
      * @return True if the PagedList is immutable.
      */
-    public abstract boolean isImmutable();
+    @SuppressWarnings("WeakerAccess")
+    public boolean isImmutable() {
+        return isDetached();
+    }
 
     /**
      * Returns an immutable snapshot of the PagedList. If this PagedList is already
      * immutable, it will be returned.
      *
-     * @return Immutable snapshot of PagedList, which may be the PagedList itself.
+     * @return Immutable snapshot of PagedList data.
      */
-    public abstract List<T> snapshot();
+    @SuppressWarnings("WeakerAccess")
+    @NonNull
+    public List<T> snapshot() {
+        if (isImmutable()) {
+            return this;
+        }
+
+        return new SnapshotPagedList<>(this);
+    }
 
     abstract boolean isContiguous();
 
     /**
+     * Return the Config used to construct this PagedList.
+     *
+     * @return the Config of this PagedList
+     */
+    @NonNull
+    public Config getConfig() {
+        return mConfig;
+    }
+
+    /**
      * Return the key for the position passed most recently to {@link #loadAround(int)}.
      * <p>
      * When a PagedList is invalidated, you can pass the key returned by this function to initialize
@@ -328,9 +528,7 @@
      * @return Key of position most recently passed to {@link #loadAround(int)}.
      */
     @Nullable
-    public Object getLastKey() {
-        return null;
-    }
+    public abstract Object getLastKey();
 
     /**
      * True if the PagedList has detached the DataSource it was loading from, and will no longer
@@ -338,8 +536,9 @@
      *
      * @return True if the data source is detached.
      */
+    @SuppressWarnings("WeakerAccess")
     public boolean isDetached() {
-        return true;
+        return mDetached.get();
     }
 
     /**
@@ -349,7 +548,9 @@
      * signal to stop loading. The PagedList will continue to present existing data, but will not
      * initiate new loads.
      */
+    @SuppressWarnings("WeakerAccess")
     public void detach() {
+        mDetached.set(true);
     }
 
     /**
@@ -361,7 +562,7 @@
      * If the DataSource is a {@link KeyedDataSource}, and thus doesn't use positions, returns 0.
      */
     public int getPositionOffset() {
-        return 0;
+        return mStorage.getPositionOffset();
     }
 
     /**
@@ -385,16 +586,69 @@
      * @param callback         Callback to dispatch to.
      * @see #removeWeakCallback(Callback)
      */
-    public abstract void addWeakCallback(@Nullable PagedList<T> previousSnapshot,
-            @NonNull Callback callback);
+    @SuppressWarnings("WeakerAccess")
+    public void addWeakCallback(@Nullable List<T> previousSnapshot, @NonNull Callback callback) {
+        if (previousSnapshot != null && previousSnapshot != this) {
+            PagedList<T> storageSnapshot = (PagedList<T>) previousSnapshot;
+            //noinspection unchecked
+            dispatchUpdatesSinceSnapshot(storageSnapshot, callback);
+        }
 
+        // first, clean up any empty weak refs
+        for (int i = mCallbacks.size() - 1; i >= 0; i--) {
+            Callback currentCallback = mCallbacks.get(i).get();
+            if (currentCallback == null) {
+                mCallbacks.remove(i);
+            }
+        }
+
+        // then add the new one
+        mCallbacks.add(new WeakReference<>(callback));
+    }
     /**
      * Removes a previously added callback.
      *
      * @param callback Callback, previously added.
-     * @see #addWeakCallback(PagedList, Callback)
+     * @see #addWeakCallback(List, Callback)
      */
-    public abstract void removeWeakCallback(Callback callback);
+    @SuppressWarnings("WeakerAccess")
+    public void removeWeakCallback(@NonNull Callback callback) {
+        for (int i = mCallbacks.size() - 1; i >= 0; i--) {
+            Callback currentCallback = mCallbacks.get(i).get();
+            if (currentCallback == null || currentCallback == callback) {
+                // found callback, or empty weak ref
+                mCallbacks.remove(i);
+            }
+        }
+    }
+
+    void notifyInserted(int position, int count) {
+        if (count != 0) {
+            for (int i = mCallbacks.size() - 1; i >= 0; i--) {
+                Callback callback = mCallbacks.get(i).get();
+                if (callback != null) {
+                    callback.onInserted(position, count);
+                }
+            }
+        }
+    }
+
+    void notifyChanged(int position, int count) {
+        if (count != 0) {
+            for (int i = mCallbacks.size() - 1; i >= 0; i--) {
+                Callback callback = mCallbacks.get(i).get();
+
+                if (callback != null) {
+                    callback.onChanged(position, count);
+                }
+            }
+        }
+    }
+
+    abstract void dispatchUpdatesSinceSnapshot(@NonNull PagedList<T> snapshot,
+            @NonNull Callback callback);
+
+    abstract void loadAroundInternal(int index);
 
     /**
      * Callback signaling when content is loaded into the list.
@@ -442,17 +696,41 @@
      * {@link Builder#setPageSize(int)}, which defines number of items loaded at a time}.
      */
     public static class Config {
-        final int mPageSize;
-        final int mPrefetchDistance;
-        final boolean mEnablePlaceholders;
-        final int mInitialLoadSizeHint;
+        /**
+         * Size of each page loaded by the PagedList.
+         */
+        public final int pageSize;
+
+        /**
+         * Prefetch distance which defines how far ahead to load.
+         * <p>
+         * If this value is set to 50, the paged list will attempt to load 50 items in advance of
+         * data that's already been accessed.
+         *
+         * @see PagedList#loadAround(int)
+         */
+        @SuppressWarnings("WeakerAccess")
+        public final int prefetchDistance;
+
+        /**
+         * Defines whether the PagedList may display null placeholders, if the DataSource provides
+         * them.
+         */
+        @SuppressWarnings("WeakerAccess")
+        public final boolean enablePlaceholders;
+
+        /**
+         * Size hint for initial load of PagedList, often larger than a regular page.
+         */
+        @SuppressWarnings("WeakerAccess")
+        public final int initialLoadSizeHint;
 
         private Config(int pageSize, int prefetchDistance,
                 boolean enablePlaceholders, int initialLoadSizeHint) {
-            mPageSize = pageSize;
-            mPrefetchDistance = prefetchDistance;
-            mEnablePlaceholders = enablePlaceholders;
-            mInitialLoadSizeHint = initialLoadSizeHint;
+            this.pageSize = pageSize;
+            this.prefetchDistance = prefetchDistance;
+            this.enablePlaceholders = enablePlaceholders;
+            this.initialLoadSizeHint = initialLoadSizeHint;
         }
 
         /**
@@ -545,10 +823,15 @@
              * Defines how many items to load when first load occurs, if you are using a
              * {@link KeyedDataSource}.
              * <p>
-             * If you are using an {@link TiledDataSource}, this value is currently ignored.
-             * Otherwise, this value will be passed to
-             * {@link KeyedDataSource#loadInitial(int)} to load a (typically) larger amount
-             * of data on first load.
+             * This value is typically larger than page size, so on first load data there's a large
+             * enough range of content loaded to cover small scrolls.
+             * <p>
+             * If used with a {@link TiledDataSource}, this value is rounded to the nearest number
+             * of pages, with a minimum of two pages, and loaded with a single call to
+             * {@link TiledDataSource#loadRange(int, int)}.
+             * <p>
+             * If used with a {@link KeyedDataSource}, this value will be passed to
+             * {@link KeyedDataSource#loadInitial(int)}.
              * <p>
              * If not set, defaults to three times page size.
              *
@@ -588,4 +871,15 @@
             }
         }
     }
+
+    /**
+     * WIP API for load-more-into-local-storage callbacks
+     */
+    public abstract static class BoundaryCallback<T> {
+        public abstract void onZeroItemsLoaded();
+        public abstract void onItemAtFrontLoaded(@NonNull List<T> pagedListSnapshot,
+                @NonNull T itemAtFront, int pagedListSize);
+        public abstract void onItemAtEndLoaded(@NonNull List<T> pagedListSnapshot,
+                @NonNull T itemAtEnd, int pagedListSize);
+    }
 }
diff --git a/paging/common/src/main/java/android/arch/paging/PagedStorage.java b/paging/common/src/main/java/android/arch/paging/PagedStorage.java
new file mode 100644
index 0000000..b857462
--- /dev/null
+++ b/paging/common/src/main/java/android/arch/paging/PagedStorage.java
@@ -0,0 +1,433 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.paging;
+
+import android.support.annotation.NonNull;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+final class PagedStorage<K, V> extends AbstractList<V> {
+    // Always set
+    private int mLeadingNullCount;
+    /**
+     * List of pages in storage.
+     *
+     * Two storage modes:
+     *
+     * Contiguous - all content in mPages is valid and loaded, but may return false from isTiled().
+     *     Safe to access any item in any page.
+     *
+     * Non-contiguous - mPages may have nulls or a placeholder page, isTiled() always returns true.
+     *     mPages may have nulls, or placeholder (empty) pages while content is loading.
+     */
+    private final ArrayList<Page<K, V>> mPages;
+    private int mTrailingNullCount;
+
+    private int mPositionOffset;
+    /**
+     * Number of items represented by {@link #mPages}. If tiling is enabled, unloaded items in
+     * {@link #mPages} may be null, but this value still counts them.
+     */
+    private int mStorageCount;
+
+    // If mPageSize > 0, tiling is enabled, 'mPages' may have gaps, and leadingPages is set
+    private int mPageSize;
+
+    private int mNumberPrepended;
+    private int mNumberAppended;
+
+    // only used in tiling case
+    private Page<K, V> mPlaceholderPage;
+
+    PagedStorage() {
+        mLeadingNullCount = 0;
+        mPages = new ArrayList<>();
+        mTrailingNullCount = 0;
+        mPositionOffset = 0;
+        mStorageCount = 0;
+        mPageSize = 1;
+        mNumberPrepended = 0;
+        mNumberAppended = 0;
+    }
+
+    PagedStorage(int leadingNulls, Page<K, V> page, int trailingNulls) {
+        this();
+        init(leadingNulls, page, trailingNulls, 0);
+    }
+
+    private PagedStorage(PagedStorage<K, V> other) {
+        mLeadingNullCount = other.mLeadingNullCount;
+        mPages = new ArrayList<>(other.mPages);
+        mTrailingNullCount = other.mTrailingNullCount;
+        mPositionOffset = other.mPositionOffset;
+        mStorageCount = other.mStorageCount;
+        mPageSize = other.mPageSize;
+        mNumberPrepended = other.mNumberPrepended;
+        mNumberAppended = other.mNumberAppended;
+
+        // preserve placeholder page so we can locate placeholder pages if needed later
+        mPlaceholderPage = other.mPlaceholderPage;
+    }
+
+    PagedStorage<K, V> snapshot() {
+        return new PagedStorage<>(this);
+    }
+
+    private void init(int leadingNulls, Page<K, V> page, int trailingNulls, int positionOffset) {
+        mLeadingNullCount = leadingNulls;
+        mPages.clear();
+        mPages.add(page);
+        mTrailingNullCount = trailingNulls;
+
+        mPositionOffset = positionOffset;
+        mStorageCount = page.items.size();
+
+        // initialized as tiled. There may be 3 nulls, 2 items, but we still call this tiled
+        // even if it will break if nulls convert.
+        mPageSize = page.items.size();
+
+        mNumberPrepended = 0;
+        mNumberAppended = 0;
+    }
+
+    void init(int leadingNulls, Page<K, V> page, int trailingNulls, int positionOffset,
+            @NonNull Callback callback) {
+        init(leadingNulls, page, trailingNulls, positionOffset);
+        callback.onInitialized(size());
+    }
+
+    @Override
+    public V get(int i) {
+        if (i < 0 || i >= size()) {
+            throw new IndexOutOfBoundsException("Index: " + i + ", Size: " + size());
+        }
+
+        // is it definitely outside 'mPages'?
+        int localIndex = i - mLeadingNullCount;
+        if (localIndex < 0 || localIndex >= mStorageCount) {
+            return null;
+        }
+
+        int localPageIndex;
+        int pageInternalIndex;
+
+        if (isTiled()) {
+            // it's inside mPages, and we're tiled. Jump to correct tile.
+            localPageIndex = localIndex / mPageSize;
+            pageInternalIndex = localIndex % mPageSize;
+        } else {
+            // it's inside mPages, but page sizes aren't regular. Walk to correct tile.
+            // Pages can only be null while tiled, so accessing page count is safe.
+            pageInternalIndex = localIndex;
+            final int localPageCount = mPages.size();
+            for (localPageIndex = 0; localPageIndex < localPageCount; localPageIndex++) {
+                int pageSize = mPages.get(localPageIndex).items.size();
+                if (pageSize > pageInternalIndex) {
+                    // stop, found the page
+                    break;
+                }
+                pageInternalIndex -= pageSize;
+            }
+        }
+
+        Page<?, V> page = mPages.get(localPageIndex);
+        if (page == null || page.items.size() == 0) {
+            // can only occur in tiled case, with untouched inner/placeholder pages
+            return null;
+        }
+        return page.items.get(pageInternalIndex);
+    }
+
+    /**
+     * Returns true if all pages are the same size, except for the last, which may be smaller
+     */
+    boolean isTiled() {
+        return mPageSize > 0;
+    }
+
+    int getLeadingNullCount() {
+        return mLeadingNullCount;
+    }
+
+    int getTrailingNullCount() {
+        return mTrailingNullCount;
+    }
+
+    int getStorageCount() {
+        return mStorageCount;
+    }
+
+    int getNumberAppended() {
+        return mNumberAppended;
+    }
+
+    int getNumberPrepended() {
+        return mNumberPrepended;
+    }
+
+    int getPageCount() {
+        return mPages.size();
+    }
+
+    interface Callback {
+        void onInitialized(int count);
+        void onPagePrepended(int leadingNulls, int changed, int added);
+        void onPageAppended(int endPosition, int changed, int added);
+        void onPagePlaceholderInserted(int pageIndex);
+        void onPageInserted(int start, int count);
+    }
+
+    int getPositionOffset() {
+        return mPositionOffset;
+    }
+
+    @Override
+    public int size() {
+        return mLeadingNullCount + mStorageCount + mTrailingNullCount;
+    }
+
+    int computeLeadingNulls() {
+        int total = mLeadingNullCount;
+        final int pageCount = mPages.size();
+        for (int i = 0; i < pageCount; i++) {
+            Page page = mPages.get(i);
+            if (page != null && page != mPlaceholderPage) {
+                break;
+            }
+            total += mPageSize;
+        }
+        return total;
+    }
+
+    int computeTrailingNulls() {
+        int total = mTrailingNullCount;
+        for (int i = mPages.size() - 1; i >= 0; i--) {
+            Page page = mPages.get(i);
+            if (page != null && page != mPlaceholderPage) {
+                break;
+            }
+            total += mPageSize;
+        }
+        return total;
+    }
+
+    // ---------------- Contiguous API -------------------
+
+    V getFirstLoadedItem() {
+        // safe to access first page's first item here:
+        // If contiguous, mPages can't be empty, can't hold null Pages, and items can't be empty
+        return mPages.get(0).items.get(0);
+    }
+
+    V getLastLoadedItem() {
+        // safe to access last page's last item here:
+        // If contiguous, mPages can't be empty, can't hold null Pages, and items can't be empty
+        Page<K, V> page = mPages.get(mPages.size() - 1);
+        return page.items.get(page.items.size() - 1);
+    }
+
+    public void prependPage(@NonNull Page<K, V> page, @NonNull Callback callback) {
+        final int count = page.items.size();
+        if (count == 0) {
+            // Nothing returned from source, stop loading in this direction
+            return;
+        }
+        if (mPageSize > 0 && count != mPageSize) {
+            if (mPages.size() == 1 && count > mPageSize) {
+                // prepending to a single item - update current page size to that of 'inner' page
+                mPageSize = count;
+            } else {
+                // no longer tiled
+                mPageSize = -1;
+            }
+        }
+
+        mPages.add(0, page);
+        mStorageCount += count;
+
+        final int changedCount = Math.min(mLeadingNullCount, count);
+        final int addedCount = count - changedCount;
+
+        if (changedCount != 0) {
+            mLeadingNullCount -= changedCount;
+        }
+        mPositionOffset -= addedCount;
+        mNumberPrepended += count;
+
+        callback.onPagePrepended(mLeadingNullCount, changedCount, addedCount);
+    }
+
+    public void appendPage(@NonNull Page<K, V> page, @NonNull Callback callback) {
+        final int count = page.items.size();
+        if (count == 0) {
+            // Nothing returned from source, stop loading in this direction
+            return;
+        }
+
+        if (mPageSize > 0) {
+            // if the previous page was smaller than mPageSize,
+            // or if this page is larger than the previous, disable tiling
+            if (mPages.get(mPages.size() - 1).items.size() != mPageSize
+                    || count > mPageSize) {
+                mPageSize = -1;
+            }
+        }
+
+        mPages.add(page);
+        mStorageCount += count;
+
+        final int changedCount = Math.min(mTrailingNullCount, count);
+        final int addedCount = count - changedCount;
+
+        if (changedCount != 0) {
+            mTrailingNullCount -= changedCount;
+        }
+        mNumberAppended += count;
+        callback.onPageAppended(mLeadingNullCount + mStorageCount - count,
+                changedCount, addedCount);
+    }
+
+    // ------------------ Non-Contiguous API (tiling required) ----------------------
+
+    public void insertPage(int position, @NonNull Page<K, V> page, Callback callback) {
+        final int newPageSize = page.items.size();
+        if (newPageSize != mPageSize) {
+            // differing page size is OK in 2 cases, when the page is being added:
+            // 1) to the end (in which case, ignore new smaller size)
+            // 2) only the last page has been added so far (in which case, adopt new bigger size)
+
+            int size = size();
+            boolean addingLastPage = position == (size - size % mPageSize)
+                    && newPageSize < mPageSize;
+            boolean onlyEndPagePresent = mTrailingNullCount == 0 && mPages.size() == 1
+                    && newPageSize > mPageSize;
+
+            // OK only if existing single page, and it's the last one
+            if (!onlyEndPagePresent && !addingLastPage) {
+                throw new IllegalArgumentException("page introduces incorrect tiling");
+            }
+            if (onlyEndPagePresent) {
+                mPageSize = newPageSize;
+            }
+        }
+
+        int pageIndex = position / mPageSize;
+
+        allocatePageRange(pageIndex, pageIndex);
+
+        int localPageIndex = pageIndex - mLeadingNullCount / mPageSize;
+
+        Page<K, V> oldPage = mPages.get(localPageIndex);
+        if (oldPage != null && oldPage != mPlaceholderPage) {
+            throw new IllegalArgumentException(
+                    "Invalid position " + position + ": data already loaded");
+        }
+        mPages.set(localPageIndex, page);
+        callback.onPageInserted(position, page.items.size());
+    }
+
+    private Page<K, V> getPlaceholderPage() {
+        if (mPlaceholderPage == null) {
+            @SuppressWarnings("unchecked")
+            List<V> list = Collections.emptyList();
+            mPlaceholderPage = new Page<>(null, list, null);
+        }
+        return mPlaceholderPage;
+    }
+
+    private void allocatePageRange(final int minimumPage, final int maximumPage) {
+        int leadingNullPages = mLeadingNullCount / mPageSize;
+
+        if (minimumPage < leadingNullPages) {
+            for (int i = 0; i < leadingNullPages - minimumPage; i++) {
+                mPages.add(0, null);
+            }
+            int newStorageAllocated = (leadingNullPages - minimumPage) * mPageSize;
+            mStorageCount += newStorageAllocated;
+            mLeadingNullCount -= newStorageAllocated;
+
+            leadingNullPages = minimumPage;
+        }
+        if (maximumPage >= leadingNullPages + mPages.size()) {
+            int newStorageAllocated = Math.min(mTrailingNullCount,
+                    (maximumPage + 1 - (leadingNullPages + mPages.size())) * mPageSize);
+            for (int i = mPages.size(); i <= maximumPage - leadingNullPages; i++) {
+                mPages.add(mPages.size(), null);
+            }
+            mStorageCount += newStorageAllocated;
+            mTrailingNullCount -= newStorageAllocated;
+        }
+    }
+
+    public void allocatePlaceholders(int index, int prefetchDistance,
+            int pageSize, Callback callback) {
+        if (pageSize != mPageSize) {
+            if (pageSize < mPageSize) {
+                throw new IllegalArgumentException("Page size cannot be reduced");
+            }
+            if (mPages.size() != 1 || mTrailingNullCount != 0) {
+                // not in single, last page allocated case - can't change page size
+                throw new IllegalArgumentException(
+                        "Page size can change only if last page is only one present");
+            }
+            mPageSize = pageSize;
+        }
+
+        final int maxPageCount = (size() + mPageSize - 1) / mPageSize;
+        int minimumPage = Math.max((index - prefetchDistance) / mPageSize, 0);
+        int maximumPage = Math.min((index + prefetchDistance) / mPageSize, maxPageCount - 1);
+
+        allocatePageRange(minimumPage, maximumPage);
+        int leadingNullPages = mLeadingNullCount / mPageSize;
+        for (int pageIndex = minimumPage; pageIndex <= maximumPage; pageIndex++) {
+            int localPageIndex = pageIndex - leadingNullPages;
+            if (mPages.get(localPageIndex) == null) {
+                mPages.set(localPageIndex, getPlaceholderPage());
+                callback.onPagePlaceholderInserted(pageIndex);
+            }
+        }
+    }
+
+    public boolean hasPage(int pageSize, int index) {
+        // NOTE: we pass pageSize here to avoid in case mPageSize
+        // not fully initialized (when last page only one loaded)
+        int leadingNullPages = mLeadingNullCount / pageSize;
+
+        if (index < leadingNullPages || index >= leadingNullPages + mPages.size()) {
+            return false;
+        }
+
+        Page<K, V> page = mPages.get(index - leadingNullPages);
+
+        return page != null && page != mPlaceholderPage;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder ret = new StringBuilder("leading " + mLeadingNullCount
+                + ", storage " + mStorageCount
+                + ", trailing " + getTrailingNullCount());
+
+        for (int i = 0; i < mPages.size(); i++) {
+            ret.append(" ").append(mPages.get(i));
+        }
+        return ret.toString();
+    }
+}
diff --git a/paging/common/src/main/java/android/arch/paging/PositionalDataSource.java b/paging/common/src/main/java/android/arch/paging/PositionalDataSource.java
index deb51e9..fa2932a 100644
--- a/paging/common/src/main/java/android/arch/paging/PositionalDataSource.java
+++ b/paging/common/src/main/java/android/arch/paging/PositionalDataSource.java
@@ -18,7 +18,6 @@
 
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
 import android.support.annotation.WorkerThread;
 
 import java.util.List;
@@ -38,10 +37,19 @@
  * backend or data store doesn't require
  * <p>
  * @param <Value> Value type of items being loaded by the DataSource.
- * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public abstract class PositionalDataSource<Value> extends ContiguousDataSource<Integer, Value> {
+abstract class PositionalDataSource<Value> extends ContiguousDataSource<Integer, Value> {
+
+    /**
+     * Number of items that this DataSource can provide in total, or COUNT_UNDEFINED.
+     *
+     * @return number of items that this DataSource can provide in total, or COUNT_UNDEFINED
+     * if difficult or undesired to compute.
+     */
+    public int countItems() {
+        return COUNT_UNDEFINED;
+    }
+
     @Nullable
     @Override
     List<Value> loadAfterImpl(int currentEndIndex, @NonNull Value currentEndItem, int pageSize) {
@@ -55,22 +63,10 @@
         return loadBefore(currentBeginIndex - 1, pageSize);
     }
 
-
-    /**
-     * Load initial data, starting after the passed position.
-     *
-     * @param position Index just before the data to be loaded.
-     * @param initialLoadSize Suggested number of items to load.
-     * @return List of initial items, representing data starting at position. Null if the
-     *         DataSource is no longer valid, and should not be queried again.
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    @WorkerThread
-    @Nullable
     @Override
-    public NullPaddedList<Value> loadInitial(
-            Integer position, int initialLoadSize, boolean enablePlaceholders) {
+    void loadInitial(Integer position, int initialLoadSize, boolean enablePlaceholders,
+            @NonNull PageResult.Receiver<Integer, Value> receiver) {
+
         final int convertPosition = position == null ? 0 : position;
         final int loadPosition = Math.max(0, (convertPosition - initialLoadSize / 2));
 
@@ -79,11 +75,23 @@
             count = countItems();
         }
         List<Value> data = loadAfter(loadPosition, initialLoadSize);
-        if (count == COUNT_UNDEFINED) {
-            return new NullPaddedList<>(loadPosition, data);
-        } else {
-            return new NullPaddedList<>(loadPosition, count, data);
+
+        if (data == null) {
+            receiver.onPageResult(new PageResult<Integer, Value>(PageResult.INIT));
+            return;
         }
+
+        final boolean uncounted = count == COUNT_UNDEFINED;
+        int leadingNullCount = uncounted ? 0 : loadPosition;
+        int trailingNullCount = uncounted ? 0 : count - leadingNullCount - data.size();
+        int positionOffset = uncounted ? loadPosition : 0;
+
+        receiver.onPageResult(new PageResult<>(
+                PageResult.INIT,
+                new Page<Integer, Value>(data),
+                leadingNullCount,
+                trailingNullCount,
+                positionOffset));
     }
 
     /**
@@ -118,6 +126,9 @@
 
     @Override
     Integer getKey(int position, Value item) {
+        if (position < 0) {
+            return null;
+        }
         return position;
     }
 }
diff --git a/paging/common/src/main/java/android/arch/paging/SnapshotPagedList.java b/paging/common/src/main/java/android/arch/paging/SnapshotPagedList.java
new file mode 100644
index 0000000..6a8a748
--- /dev/null
+++ b/paging/common/src/main/java/android/arch/paging/SnapshotPagedList.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.paging;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+class SnapshotPagedList<T> extends PagedList<T> {
+    private final boolean mContiguous;
+    private final Object mLastKey;
+
+    SnapshotPagedList(@NonNull PagedList<T> pagedList) {
+        super(pagedList.mStorage.snapshot(),
+                pagedList.mMainThreadExecutor,
+                pagedList.mBackgroundThreadExecutor,
+                null,
+                pagedList.mConfig);
+        mContiguous = pagedList.isContiguous();
+        mLastKey = pagedList.getLastKey();
+    }
+
+    @Override
+    public boolean isImmutable() {
+        return true;
+    }
+
+    @Override
+    public boolean isDetached() {
+        return true;
+    }
+
+    @Override
+    boolean isContiguous() {
+        return mContiguous;
+    }
+
+    @Nullable
+    @Override
+    public Object getLastKey() {
+        return mLastKey;
+    }
+
+    @Override
+    void dispatchUpdatesSinceSnapshot(@NonNull PagedList<T> storageSnapshot,
+            @NonNull Callback callback) {
+    }
+
+    @Override
+    void loadAroundInternal(int index) {
+    }
+}
diff --git a/paging/common/src/main/java/android/arch/paging/TiledDataSource.java b/paging/common/src/main/java/android/arch/paging/TiledDataSource.java
index 36be423..0ea9428 100644
--- a/paging/common/src/main/java/android/arch/paging/TiledDataSource.java
+++ b/paging/common/src/main/java/android/arch/paging/TiledDataSource.java
@@ -19,6 +19,7 @@
 import android.support.annotation.Nullable;
 import android.support.annotation.WorkerThread;
 
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -86,13 +87,14 @@
  */
 public abstract class TiledDataSource<Type> extends DataSource<Integer, Type> {
 
+    private int mItemCount;
+
     /**
      * Number of items that this DataSource can provide in total.
      *
      * @return Number of items this DataSource can provide. Must be <code>0</code> or greater.
      */
     @WorkerThread
-    @Override
     public abstract int countItems();
 
     @Override
@@ -118,7 +120,67 @@
     @WorkerThread
     public abstract List<Type> loadRange(int startPosition, int count);
 
-    final List<Type> loadRangeWrapper(int startPosition, int count) {
+    /**
+     * blocking, and splits pages
+     */
+    void loadRangeInitial(int startPosition, int count, int pageSize, int itemCount,
+            PageResult.Receiver<Integer, Type> receiver) {
+        mItemCount = itemCount;
+
+        if (itemCount == 0) {
+            // no data to load, just immediately return empty
+            receiver.onPageResult(new PageResult<>(
+                    PageResult.INIT, new Page<Integer, Type>(Collections.<Type>emptyList()),
+                    0, 0, startPosition));
+            return;
+        }
+
+        List<Type> list = loadRangeWrapper(startPosition, count);
+
+        count = Math.min(count, itemCount - startPosition);
+
+        if (list == null) {
+            // invalid data, pass to receiver
+            receiver.onPageResult(new PageResult<Integer, Type>(
+                    PageResult.INIT, null, 0, 0, startPosition));
+            return;
+        }
+
+        if (list.size() != count) {
+            throw new IllegalStateException("Invalid list, requested size: " + count
+                    + ", returned size: " + list.size());
+        }
+
+        // emit the results as multiple pages
+        int pageCount = (count + (pageSize - 1)) / pageSize;
+        for (int i = 0; i < pageCount; i++) {
+            int beginInclusive = i * pageSize;
+            int endExclusive = Math.min(count, (i + 1) * pageSize);
+
+            Page<Integer, Type> page = new Page<>(list.subList(beginInclusive, endExclusive));
+
+            int leadingNulls = startPosition + beginInclusive;
+            int trailingNulls = itemCount - leadingNulls - page.items.size();
+            receiver.onPageResult(new PageResult<>(
+                    PageResult.INIT, page, leadingNulls, trailingNulls, 0));
+        }
+    }
+
+    void loadRange(int startPosition, int count, PageResult.Receiver<Integer, Type> receiver) {
+        List<Type> list = loadRangeWrapper(startPosition, count);
+
+        Page<Integer, Type> page = null;
+        int trailingNulls = mItemCount - startPosition;
+
+        if (list != null) {
+            page = new Page<Integer, Type>(list);
+            trailingNulls -= list.size();
+        }
+        receiver.postOnPageResult(new PageResult<>(
+                PageResult.TILE, page, startPosition, trailingNulls, 0));
+    }
+
+    private List<Type> loadRangeWrapper(int startPosition, int count) {
         if (isInvalid()) {
             return null;
         }
diff --git a/paging/common/src/main/java/android/arch/paging/TiledPagedList.java b/paging/common/src/main/java/android/arch/paging/TiledPagedList.java
index a2fc064..76bb682 100644
--- a/paging/common/src/main/java/android/arch/paging/TiledPagedList.java
+++ b/paging/common/src/main/java/android/arch/paging/TiledPagedList.java
@@ -16,214 +16,110 @@
 
 package android.arch.paging;
 
+import android.support.annotation.AnyThread;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
 import android.support.annotation.WorkerThread;
 
-import java.lang.ref.WeakReference;
-import java.util.AbstractList;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.concurrent.Executor;
-import java.util.concurrent.atomic.AtomicBoolean;
 
-/** @hide */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-class TiledPagedList<T> extends PageArrayList<T> {
+class TiledPagedList<T> extends PagedList<T>
+        implements PagedStorage.Callback {
 
     private final TiledDataSource<T> mDataSource;
-    private final Executor mMainThreadExecutor;
-    private final Executor mBackgroundThreadExecutor;
-    private final Config mConfig;
 
-    @SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
-    private final List<T> mLoadingPlaceholder = new AbstractList<T>() {
+    @SuppressWarnings("unchecked")
+    private final PagedStorage<Integer, T> mKeyedStorage = (PagedStorage<Integer, T>) mStorage;
+
+    private final PageResult.Receiver<Integer, T> mReceiver =
+            new PageResult.Receiver<Integer, T>() {
+        @AnyThread
         @Override
-        public T get(int i) {
-            return null;
+        public void postOnPageResult(@NonNull final PageResult<Integer, T> pageResult) {
+            // NOTE: if we're already on main thread, this can delay page receive by a frame
+            mMainThreadExecutor.execute(new Runnable() {
+                @Override
+                public void run() {
+                    onPageResult(pageResult);
+                }
+            });
         }
 
+        // Creation thread for initial synchronous load, otherwise main thread
+        // Safe to access main thread only state - no other thread has reference during construction
+        @AnyThread
         @Override
-        public int size() {
-            return 0;
+        public void onPageResult(@NonNull PageResult<Integer, T> pageResult) {
+            if (pageResult.page == null) {
+                detach();
+                return;
+            }
+
+            if (isDetached()) {
+                // No op, have detached
+                return;
+            }
+
+            if (mStorage.getPageCount() == 0) {
+                mKeyedStorage.init(
+                        pageResult.leadingNulls, pageResult.page, pageResult.trailingNulls,
+                        pageResult.positionOffset, TiledPagedList.this);
+            } else {
+                mKeyedStorage.insertPage(pageResult.leadingNulls, pageResult.page,
+                        TiledPagedList.this);
+            }
+
+            if (mBoundaryCallback != null) {
+                boolean deferEmpty = mStorage.size() == 0;
+                boolean deferBegin = !deferEmpty && pageResult.leadingNulls == 0;
+                boolean deferEnd = !deferEmpty && pageResult.trailingNulls == 0;
+                deferBoundaryCallbacks(deferEmpty, deferBegin, deferEnd);
+            }
         }
     };
 
-    private int mLastLoad = -1;
-
-    private AtomicBoolean mDetached = new AtomicBoolean(false);
-
-    private ArrayList<WeakReference<Callback>> mCallbacks = new ArrayList<>();
-
     @WorkerThread
     TiledPagedList(@NonNull TiledDataSource<T> dataSource,
             @NonNull Executor mainThreadExecutor,
             @NonNull Executor backgroundThreadExecutor,
-            Config config,
+            @Nullable BoundaryCallback<T> boundaryCallback,
+            @NonNull Config config,
             int position) {
-        super(config.mPageSize, dataSource.countItems());
-
+        super(new PagedStorage<Integer, T>(), mainThreadExecutor, backgroundThreadExecutor,
+                boundaryCallback, config);
         mDataSource = dataSource;
-        mMainThreadExecutor = mainThreadExecutor;
-        mBackgroundThreadExecutor = backgroundThreadExecutor;
-        mConfig = config;
 
-        position = Math.min(Math.max(0, position), mCount);
+        final int pageSize = mConfig.pageSize;
 
-        int firstPage = position / mPageSize;
-        List<T> firstPageData = dataSource.loadRangeWrapper(firstPage * mPageSize, mPageSize);
-        if (firstPageData != null) {
-            mPageIndexOffset = firstPage;
-            mPages.add(firstPageData);
-            mLastLoad = position;
-        } else {
-            detach();
-            return;
-        }
+        final int itemCount = mDataSource.countItems();
 
-        int secondPage = (position % mPageSize < mPageSize / 2) ? firstPage - 1 : firstPage + 1;
-        if (secondPage < 0 || secondPage > mMaxPageCount) {
-            // no second page to load
-            return;
-        }
-        List<T> secondPageData = dataSource.loadRangeWrapper(secondPage * mPageSize, mPageSize);
-        if (secondPageData != null) {
-            boolean before = secondPage < firstPage;
-            mPages.add(before ? 0 : 1, secondPageData);
-            if (before) {
-                mPageIndexOffset--;
-            }
-            return;
-        }
-        detach();
+        final int firstLoadSize = Math.min(itemCount,
+                (Math.max(mConfig.initialLoadSizeHint / pageSize, 2)) * pageSize);
+        final int firstLoadPosition = computeFirstLoadPosition(
+                position, firstLoadSize, pageSize, itemCount);
+
+        mDataSource.loadRangeInitial(firstLoadPosition, firstLoadSize, pageSize,
+                itemCount, mReceiver);
+    }
+
+    static int computeFirstLoadPosition(int position, int firstLoadSize, int pageSize, int size) {
+        int idealStart = position - firstLoadSize / 2;
+
+        int roundedPageStart = Math.round(idealStart / pageSize) * pageSize;
+
+        // minimum start position is 0
+        roundedPageStart = Math.max(0, roundedPageStart);
+
+        // maximum start pos is that which will encompass end of list
+        int maximumLoadPage = ((size - firstLoadSize + pageSize - 1) / pageSize) * pageSize;
+        roundedPageStart = Math.min(maximumLoadPage, roundedPageStart);
+
+        return roundedPageStart;
     }
 
     @Override
-    public void loadAround(int index) {
-        mLastLoad = index;
-
-        int minimumPage = Math.max((index - mConfig.mPrefetchDistance) / mPageSize, 0);
-        int maximumPage = Math.min((index + mConfig.mPrefetchDistance) / mPageSize,
-                mMaxPageCount - 1);
-
-        if (minimumPage < mPageIndexOffset) {
-            for (int i = 0; i < mPageIndexOffset - minimumPage; i++) {
-                mPages.add(0, null);
-            }
-            mPageIndexOffset = minimumPage;
-        }
-        if (maximumPage >= mPageIndexOffset + mPages.size()) {
-            for (int i = mPages.size(); i <= maximumPage - mPageIndexOffset; i++) {
-                mPages.add(mPages.size(), null);
-            }
-        }
-        for (int i = minimumPage; i <= maximumPage; i++) {
-            scheduleLoadPage(i);
-        }
-    }
-
-    private void scheduleLoadPage(final int pageIndex) {
-        final int localPageIndex = pageIndex - mPageIndexOffset;
-
-        if (mPages.get(localPageIndex) != null) {
-            // page is present in list, and non-null - don't need to load
-            return;
-        }
-        mPages.set(localPageIndex, mLoadingPlaceholder);
-
-        mBackgroundThreadExecutor.execute(new Runnable() {
-            @Override
-            public void run() {
-                if (mDetached.get()) {
-                    return;
-                }
-                final List<T> data = mDataSource.loadRangeWrapper(
-                        pageIndex * mPageSize, mPageSize);
-                if (data != null) {
-                    mMainThreadExecutor.execute(new Runnable() {
-                        @Override
-                        public void run() {
-                            if (mDetached.get()) {
-                                return;
-                            }
-                            loadPageImpl(pageIndex, data);
-                        }
-                    });
-                } else {
-                    detach();
-                }
-            }
-        });
-
-    }
-
-    private void loadPageImpl(int pageIndex, List<T> data) {
-        int localPageIndex = pageIndex - mPageIndexOffset;
-
-        if (mPages.get(localPageIndex) != mLoadingPlaceholder) {
-            throw new IllegalStateException("Data inserted before requested.");
-        }
-        mPages.set(localPageIndex, data);
-        for (WeakReference<Callback> weakRef : mCallbacks) {
-            Callback callback = weakRef.get();
-            if (callback != null) {
-                callback.onChanged(pageIndex * mPageSize, data.size());
-            }
-        }
-    }
-
-    @Override
-    public boolean isImmutable() {
-        // TODO: consider counting loaded pages, return true if mLoadedPages == mMaxPageCount
-        // Note: could at some point want to support growing past max count, or grow dynamically
-        return isDetached();
-    }
-
-    @Override
-    public void addWeakCallback(@Nullable PagedList<T> previousSnapshot,
-            @NonNull Callback callback) {
-        PageArrayList<T> snapshot = (PageArrayList<T>) previousSnapshot;
-        if (snapshot != this && snapshot != null) {
-            // loop through each page and signal the callback for any pages that are present now,
-            // but not in the snapshot.
-            for (int i = 0; i < mPages.size(); i++) {
-                int pageIndex = i + mPageIndexOffset;
-                int pageCount = 0;
-                // count number of consecutive pages that were added since the snapshot...
-                while (pageCount < mPages.size()
-                        && hasPage(pageIndex + pageCount)
-                        && !snapshot.hasPage(pageIndex + pageCount)) {
-                    pageCount++;
-                }
-                // and signal them all at once to the callback
-                if (pageCount > 0) {
-                    callback.onChanged(pageIndex * mPageSize, mPageSize * pageCount);
-                    i += pageCount - 1;
-                }
-            }
-        }
-        mCallbacks.add(new WeakReference<>(callback));
-    }
-
-    @Override
-    public void removeWeakCallback(@NonNull Callback callback) {
-        for (int i = mCallbacks.size() - 1; i >= 0; i--) {
-            Callback currentCallback = mCallbacks.get(i).get();
-            if (currentCallback == null || currentCallback == callback) {
-                mCallbacks.remove(i);
-            }
-        }
-    }
-
-    @Override
-    public boolean isDetached() {
-        return mDetached.get();
-    }
-
-    @Override
-    public void detach() {
-        mDetached.set(true);
+    boolean isContiguous() {
+        return false;
     }
 
     @Nullable
@@ -231,4 +127,72 @@
     public Object getLastKey() {
         return mLastLoad;
     }
+
+    @Override
+    protected void dispatchUpdatesSinceSnapshot(@NonNull PagedList<T> pagedListSnapshot,
+            @NonNull Callback callback) {
+        //noinspection UnnecessaryLocalVariable
+        final PagedStorage<?, T> snapshot = pagedListSnapshot.mStorage;
+
+        // loop through each page and signal the callback for any pages that are present now,
+        // but not in the snapshot.
+        final int pageSize = mConfig.pageSize;
+        final int leadingNullPages = mStorage.getLeadingNullCount() / pageSize;
+        final int pageCount = mStorage.getPageCount();
+        for (int i = 0; i < pageCount; i++) {
+            int pageIndex = i + leadingNullPages;
+            int updatedPages = 0;
+            // count number of consecutive pages that were added since the snapshot...
+            while (updatedPages < mStorage.getPageCount()
+                    && mStorage.hasPage(pageSize, pageIndex + updatedPages)
+                    && !snapshot.hasPage(pageSize, pageIndex + updatedPages)) {
+                updatedPages++;
+            }
+            // and signal them all at once to the callback
+            if (updatedPages > 0) {
+                callback.onChanged(pageIndex * pageSize, pageSize * updatedPages);
+                i += updatedPages - 1;
+            }
+        }
+    }
+
+    @Override
+    protected void loadAroundInternal(int index) {
+        mStorage.allocatePlaceholders(index, mConfig.prefetchDistance, mConfig.pageSize, this);
+    }
+
+    @Override
+    public void onInitialized(int count) {
+        notifyInserted(0, count);
+    }
+
+    @Override
+    public void onPagePrepended(int leadingNulls, int changed, int added) {
+        throw new IllegalStateException("Contiguous callback on TiledPagedList");
+    }
+
+    @Override
+    public void onPageAppended(int endPosition, int changed, int added) {
+        throw new IllegalStateException("Contiguous callback on TiledPagedList");
+    }
+
+    @Override
+    public void onPagePlaceholderInserted(final int pageIndex) {
+        // placeholder means initialize a load
+        mBackgroundThreadExecutor.execute(new Runnable() {
+            @Override
+            public void run() {
+                if (isDetached()) {
+                    return;
+                }
+                final int pageSize = mConfig.pageSize;
+                mDataSource.loadRange(pageIndex * pageSize, pageSize, mReceiver);
+            }
+        });
+    }
+
+    @Override
+    public void onPageInserted(int start, int count) {
+        notifyChanged(start, count);
+    }
 }
diff --git a/paging/common/src/test/java/android/arch/paging/ContiguousPagedListTest.java b/paging/common/src/test/java/android/arch/paging/ContiguousPagedListTest.java
deleted file mode 100644
index ee7ea6a..0000000
--- a/paging/common/src/test/java/android/arch/paging/ContiguousPagedListTest.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.paging;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-
-import android.support.annotation.Nullable;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-@RunWith(Parameterized.class)
-public class ContiguousPagedListTest {
-
-    @Parameterized.Parameters(name = "counted:{0}")
-    public static List<Object[]> parameters() {
-        return Arrays.asList(new Object[][]{{true}, {false}});
-    }
-
-    public ContiguousPagedListTest(boolean counted) {
-        mCounted = counted;
-    }
-
-    private final boolean mCounted;
-    private TestExecutor mMainThread = new TestExecutor();
-    private TestExecutor mBackgroundThread = new TestExecutor();
-
-    private static final ArrayList<Item> ITEMS = new ArrayList<>();
-
-    static {
-        for (int i = 0; i < 100; i++) {
-            ITEMS.add(new Item(i));
-        }
-    }
-
-    @SuppressWarnings("WeakerAccess")
-    private static class Item {
-        private Item(int position) {
-            this.position = position;
-            this.name = "Item " + position;
-        }
-
-        public final int position;
-        public final String name;
-
-        @Override
-        public String toString() {
-            return name;
-        }
-    }
-
-    private class TestSource extends PositionalDataSource<Item> {
-        @Override
-        public int countItems() {
-            if (mCounted) {
-                return ITEMS.size();
-            } else {
-                return COUNT_UNDEFINED;
-            }
-        }
-
-        private List<Item> getClampedRange(int startInc, int endExc, boolean reverse) {
-            startInc = Math.max(0, startInc);
-            endExc = Math.min(ITEMS.size(), endExc);
-            List<Item> list = ITEMS.subList(startInc, endExc);
-            if (reverse) {
-                Collections.reverse(list);
-            }
-            return list;
-        }
-
-        @Nullable
-        @Override
-        public List<Item> loadAfter(int startIndex, int pageSize) {
-            return getClampedRange(startIndex, startIndex + pageSize, false);
-        }
-
-        @Nullable
-        @Override
-        public List<Item> loadBefore(int startIndex, int pageSize) {
-            return getClampedRange(startIndex - pageSize + 1, startIndex + 1, true);
-        }
-    }
-
-    private void verifyRange(int start, int count, NullPaddedList<Item> actual) {
-        if (mCounted) {
-            int expectedLeading = start;
-            int expectedTrailing = ITEMS.size() - start - count;
-            assertEquals(ITEMS.size(), actual.size());
-            assertEquals(ITEMS.size() - expectedLeading - expectedTrailing,
-                    actual.getLoadedCount());
-            assertEquals(expectedLeading, actual.getLeadingNullCount());
-            assertEquals(expectedTrailing, actual.getTrailingNullCount());
-
-            for (int i = 0; i < actual.getLoadedCount(); i++) {
-                assertSame(ITEMS.get(i + start), actual.get(i + start));
-            }
-        } else {
-            assertEquals(count, actual.size());
-            assertEquals(actual.size(), actual.getLoadedCount());
-            assertEquals(0, actual.getLeadingNullCount());
-            assertEquals(0, actual.getTrailingNullCount());
-
-            for (int i = 0; i < actual.getLoadedCount(); i++) {
-                assertSame(ITEMS.get(i + start), actual.get(i));
-            }
-        }
-    }
-
-    private void verifyCallback(PagedList.Callback callback, int countedPosition,
-            int uncountedPosition) {
-        if (mCounted) {
-            verify(callback).onChanged(countedPosition, 20);
-        } else {
-            verify(callback).onInserted(uncountedPosition, 20);
-        }
-    }
-
-    @Test
-    public void initialLoad() {
-        verifyRange(30, 40,
-                new TestSource().loadInitial(50, 40, true));
-
-        verifyRange(0, 10,
-                new TestSource().loadInitial(5, 10, true));
-
-        verifyRange(90, 10,
-                new TestSource().loadInitial(95, 10, true));
-    }
-
-
-    private ContiguousPagedList<Item> createCountedPagedList(
-            PagedList.Config config, int initialPosition) {
-        TestSource source = new TestSource();
-        return new ContiguousPagedList<>(
-                source, mMainThread, mBackgroundThread,
-                config,
-                initialPosition);
-    }
-
-    private ContiguousPagedList<Item> createCountedPagedList(int initialPosition) {
-        return createCountedPagedList(
-                new PagedList.Config.Builder()
-                        .setInitialLoadSizeHint(40)
-                        .setPageSize(20)
-                        .setPrefetchDistance(20)
-                        .build(),
-                initialPosition);
-    }
-
-    @Test
-    public void append() {
-        ContiguousPagedList<Item> pagedList = createCountedPagedList(0);
-        PagedList.Callback callback = mock(PagedList.Callback.class);
-        pagedList.addWeakCallback(null, callback);
-        verifyRange(0, 40, pagedList);
-        verifyZeroInteractions(callback);
-
-        pagedList.loadAround(35);
-        drain();
-
-        verifyRange(0, 60, pagedList);
-        verifyCallback(callback, 40, 40);
-        verifyNoMoreInteractions(callback);
-    }
-
-
-    @Test
-    public void prepend() {
-        ContiguousPagedList<Item> pagedList = createCountedPagedList(80);
-        PagedList.Callback callback = mock(PagedList.Callback.class);
-        pagedList.addWeakCallback(null, callback);
-        verifyRange(60, 40, pagedList);
-        verifyZeroInteractions(callback);
-
-        pagedList.loadAround(mCounted ? 65 : 5);
-        drain();
-
-        verifyRange(40, 60, pagedList);
-        verifyCallback(callback, 40, 0);
-        verifyNoMoreInteractions(callback);
-    }
-
-    @Test
-    public void outwards() {
-        ContiguousPagedList<Item> pagedList = createCountedPagedList(50);
-        PagedList.Callback callback = mock(PagedList.Callback.class);
-        pagedList.addWeakCallback(null, callback);
-        verifyRange(30, 40, pagedList);
-        verifyZeroInteractions(callback);
-
-        pagedList.loadAround(mCounted ? 65 : 35);
-        drain();
-
-        verifyRange(30, 60, pagedList);
-        verifyCallback(callback, 70, 40);
-        verifyNoMoreInteractions(callback);
-
-        pagedList.loadAround(mCounted ? 35 : 5);
-        drain();
-
-        verifyRange(10, 80, pagedList);
-        verifyCallback(callback, 10, 0);
-        verifyNoMoreInteractions(callback);
-    }
-
-    @Test
-    public void multiAppend() {
-        ContiguousPagedList<Item> pagedList = createCountedPagedList(0);
-        PagedList.Callback callback = mock(PagedList.Callback.class);
-        pagedList.addWeakCallback(null, callback);
-        verifyRange(0, 40, pagedList);
-        verifyZeroInteractions(callback);
-
-        pagedList.loadAround(55);
-        drain();
-
-        verifyRange(0, 80, pagedList);
-        verifyCallback(callback, 40, 40);
-        verifyCallback(callback, 60, 60);
-        verifyNoMoreInteractions(callback);
-    }
-
-    @Test
-    public void distantPrefetch() {
-        ContiguousPagedList<Item> pagedList = createCountedPagedList(
-                new PagedList.Config.Builder()
-                        .setInitialLoadSizeHint(10)
-                        .setPageSize(10)
-                        .setPrefetchDistance(30)
-                        .build(),
-                0);
-        PagedList.Callback callback = mock(PagedList.Callback.class);
-        pagedList.addWeakCallback(null, callback);
-        verifyRange(0, 10, pagedList);
-        verifyZeroInteractions(callback);
-
-        pagedList.loadAround(5);
-        drain();
-
-        verifyRange(0, 40, pagedList);
-
-        pagedList.loadAround(6);
-        drain();
-
-        // although our prefetch window moves forward, no new load triggered
-        verifyRange(0, 40, pagedList);
-    }
-
-    @Test
-    public void appendCallbackAddedLate() {
-        ContiguousPagedList<Item> pagedList = createCountedPagedList(0);
-        verifyRange(0, 40, pagedList);
-
-        pagedList.loadAround(35);
-        drain();
-        verifyRange(0, 60, pagedList);
-
-        // snapshot at 60 items
-        NullPaddedList<Item> snapshot = (NullPaddedList<Item>) pagedList.snapshot();
-        verifyRange(0, 60, snapshot);
-
-
-        pagedList.loadAround(55);
-        drain();
-        verifyRange(0, 80, pagedList);
-        verifyRange(0, 60, snapshot);
-
-        PagedList.Callback callback = mock(PagedList.Callback.class);
-        pagedList.addWeakCallback(snapshot, callback);
-        verifyCallback(callback, 60, 60);
-        verifyNoMoreInteractions(callback);
-    }
-
-
-    @Test
-    public void prependCallbackAddedLate() {
-        ContiguousPagedList<Item> pagedList = createCountedPagedList(80);
-        verifyRange(60, 40, pagedList);
-
-        pagedList.loadAround(mCounted ? 65 : 5);
-        drain();
-        verifyRange(40, 60, pagedList);
-
-        // snapshot at 60 items
-        NullPaddedList<Item> snapshot = (NullPaddedList<Item>) pagedList.snapshot();
-        verifyRange(40, 60, snapshot);
-
-
-        pagedList.loadAround(mCounted ? 45 : 5);
-        drain();
-        verifyRange(20, 80, pagedList);
-        verifyRange(40, 60, snapshot);
-
-        PagedList.Callback callback = mock(PagedList.Callback.class);
-        pagedList.addWeakCallback(snapshot, callback);
-        verifyCallback(callback, 40, 0);
-        verifyNoMoreInteractions(callback);
-    }
-
-    private void drain() {
-        boolean executed;
-        do {
-            executed = mBackgroundThread.executeAll();
-            executed |= mMainThread.executeAll();
-        } while (executed);
-    }
-}
diff --git a/paging/common/src/test/java/android/arch/paging/ContiguousPagedListTest.kt b/paging/common/src/test/java/android/arch/paging/ContiguousPagedListTest.kt
new file mode 100644
index 0000000..7331bfe
--- /dev/null
+++ b/paging/common/src/test/java/android/arch/paging/ContiguousPagedListTest.kt
@@ -0,0 +1,395 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.paging
+
+import org.junit.Assert.assertArrayEquals
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+import org.mockito.ArgumentCaptor
+import org.mockito.Mockito.any
+import org.mockito.Mockito.eq
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.Mockito.verifyZeroInteractions
+import java.util.Collections
+
+@RunWith(Parameterized::class)
+class ContiguousPagedListTest(private val mCounted: Boolean) {
+    private val mMainThread = TestExecutor()
+    private val mBackgroundThread = TestExecutor()
+
+    private class Item(position: Int) {
+        val name: String = "Item $position"
+
+        override fun toString(): String {
+            return name
+        }
+    }
+
+    private inner class TestSource(val listData: List<Item> = ITEMS)
+            : PositionalDataSource<Item>() {
+        override fun countItems(): Int {
+            return if (mCounted) {
+                listData.size
+            } else {
+                DataSource.COUNT_UNDEFINED
+            }
+        }
+
+        private fun getClampedRange(startInc: Int, endExc: Int, reverse: Boolean): List<Item> {
+            val list = listData.subList(Math.max(0, startInc), Math.min(listData.size, endExc))
+            if (reverse) {
+                Collections.reverse(list)
+            }
+            return list
+        }
+
+        override fun loadAfter(startIndex: Int, pageSize: Int): List<Item>? {
+            return getClampedRange(startIndex, startIndex + pageSize, false)
+        }
+
+        override fun loadBefore(startIndex: Int, pageSize: Int): List<Item>? {
+            return getClampedRange(startIndex - pageSize + 1, startIndex + 1, true)
+        }
+    }
+
+    private fun verifyRange(start: Int, count: Int, actual: PagedStorage<*, Item>) {
+        if (mCounted) {
+            // assert nulls + content
+            val expected = arrayOfNulls<Item>(ITEMS.size)
+            System.arraycopy(ITEMS.toTypedArray(), start, expected, start, count)
+            assertArrayEquals(expected, actual.toTypedArray())
+
+            val expectedTrailing = ITEMS.size - start - count
+            assertEquals(ITEMS.size, actual.size)
+            assertEquals((ITEMS.size - start - expectedTrailing),
+                    actual.storageCount)
+            assertEquals(start, actual.leadingNullCount)
+            assertEquals(expectedTrailing, actual.trailingNullCount)
+
+        } else {
+            assertEquals(ITEMS.subList(start, start + count), actual)
+
+            assertEquals(count, actual.size)
+            assertEquals(actual.size, actual.storageCount)
+            assertEquals(0, actual.leadingNullCount)
+            assertEquals(0, actual.trailingNullCount)
+        }
+    }
+
+    private fun verifyRange(start: Int, count: Int, actual: PagedList<Item>) {
+        verifyRange(start, count, actual.mStorage)
+    }
+
+    private fun verifyRange(start: Int, count: Int, actual: PageResult<Int, Item>) {
+        if (mCounted) {
+            assertEquals(start, actual.leadingNulls)
+            assertEquals(ITEMS.size - start - count, actual.trailingNulls)
+            assertEquals(0, actual.positionOffset)
+        } else {
+            assertEquals(0, actual.leadingNulls)
+            assertEquals(0, actual.trailingNulls)
+            assertEquals(start, actual.positionOffset)
+        }
+        assertEquals(ITEMS.subList(start, start + count), actual.page.items)
+    }
+
+    private fun verifyInitialLoad(start: Int, count : Int, initialPosition: Int, initialLoadSize: Int) {
+        @Suppress("UNCHECKED_CAST")
+        val receiver = mock(PageResult.Receiver::class.java) as PageResult.Receiver<Int, Item>
+
+        @Suppress("UNCHECKED_CAST")
+        val captor = ArgumentCaptor.forClass(PageResult::class.java)
+                as ArgumentCaptor<PageResult<Int, Item>>
+
+        TestSource().loadInitial(initialPosition, initialLoadSize, true, receiver)
+
+        verify(receiver).onPageResult(captor.capture())
+        verifyNoMoreInteractions(receiver)
+        verifyRange(start, count, captor.value)
+    }
+
+    @Test
+    fun initialLoad() {
+        verifyInitialLoad(30, 40, 50, 40)
+        verifyInitialLoad(0, 10, 5, 10)
+        verifyInitialLoad(90, 10, 95, 10)
+    }
+
+    private fun createCountedPagedList(
+            initialPosition: Int,
+            pageSize: Int = 20,
+            initLoadSize: Int = 40,
+            prefetchDistance: Int = 20,
+            listData: List<Item> = ITEMS,
+            boundaryCallback: PagedList.BoundaryCallback<Item>? = null)
+            : ContiguousPagedList<Int, Item> {
+        return ContiguousPagedList(
+                TestSource(listData), mMainThread, mBackgroundThread, boundaryCallback,
+                PagedList.Config.Builder()
+                        .setInitialLoadSizeHint(initLoadSize)
+                        .setPageSize(pageSize)
+                        .setPrefetchDistance(prefetchDistance)
+                        .build(),
+                initialPosition)
+    }
+
+    @Test
+    fun construct() {
+        val pagedList = createCountedPagedList(0)
+        verifyRange(0, 40, pagedList)
+    }
+
+    private fun verifyCallback(callback: PagedList.Callback, countedPosition: Int,
+            uncountedPosition: Int) {
+        if (mCounted) {
+            verify(callback).onChanged(countedPosition, 20)
+        } else {
+            verify(callback).onInserted(uncountedPosition, 20)
+        }
+    }
+
+    @Test
+    fun append() {
+        val pagedList = createCountedPagedList(0)
+        val callback = mock(PagedList.Callback::class.java)
+        pagedList.addWeakCallback(null, callback)
+        verifyRange(0, 40, pagedList)
+        verifyZeroInteractions(callback)
+
+        pagedList.loadAround(35)
+        drain()
+
+        verifyRange(0, 60, pagedList)
+        verifyCallback(callback, 40, 40)
+        verifyNoMoreInteractions(callback)
+    }
+
+
+    @Test
+    fun prepend() {
+        val pagedList = createCountedPagedList(80)
+        val callback = mock(PagedList.Callback::class.java)
+        pagedList.addWeakCallback(null, callback)
+        verifyRange(60, 40, pagedList)
+        verifyZeroInteractions(callback)
+
+        pagedList.loadAround(if (mCounted) 65 else 5)
+        drain()
+
+        verifyRange(40, 60, pagedList)
+        verifyCallback(callback, 40, 0)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun outwards() {
+        val pagedList = createCountedPagedList(50)
+        val callback = mock(PagedList.Callback::class.java)
+        pagedList.addWeakCallback(null, callback)
+        verifyRange(30, 40, pagedList)
+        verifyZeroInteractions(callback)
+
+        pagedList.loadAround(if (mCounted) 65 else 35)
+        drain()
+
+        verifyRange(30, 60, pagedList)
+        verifyCallback(callback, 70, 40)
+        verifyNoMoreInteractions(callback)
+
+        pagedList.loadAround(if (mCounted) 35 else 5)
+        drain()
+
+        verifyRange(10, 80, pagedList)
+        verifyCallback(callback, 10, 0)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun multiAppend() {
+        val pagedList = createCountedPagedList(0)
+        val callback = mock(PagedList.Callback::class.java)
+        pagedList.addWeakCallback(null, callback)
+        verifyRange(0, 40, pagedList)
+        verifyZeroInteractions(callback)
+
+        pagedList.loadAround(55)
+        drain()
+
+        verifyRange(0, 80, pagedList)
+        verifyCallback(callback, 40, 40)
+        verifyCallback(callback, 60, 60)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun distantPrefetch() {
+        val pagedList = createCountedPagedList(0,
+                initLoadSize = 10, pageSize = 10, prefetchDistance = 30)
+        val callback = mock(PagedList.Callback::class.java)
+        pagedList.addWeakCallback(null, callback)
+        verifyRange(0, 10, pagedList)
+        verifyZeroInteractions(callback)
+
+        pagedList.loadAround(5)
+        drain()
+
+        verifyRange(0, 40, pagedList)
+
+        pagedList.loadAround(6)
+        drain()
+
+        // although our prefetch window moves forward, no new load triggered
+        verifyRange(0, 40, pagedList)
+    }
+
+    @Test
+    fun appendCallbackAddedLate() {
+        val pagedList = createCountedPagedList(0)
+        verifyRange(0, 40, pagedList)
+
+        pagedList.loadAround(35)
+        drain()
+        verifyRange(0, 60, pagedList)
+
+        // snapshot at 60 items
+        val snapshot = pagedList.snapshot() as PagedList<Item>
+        verifyRange(0, 60, snapshot)
+
+        // load more items...
+        pagedList.loadAround(55)
+        drain()
+        verifyRange(0, 80, pagedList)
+        verifyRange(0, 60, snapshot)
+
+        // and verify the snapshot hasn't received them
+        val callback = mock(PagedList.Callback::class.java)
+        pagedList.addWeakCallback(snapshot, callback)
+        verifyCallback(callback, 60, 60)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun prependCallbackAddedLate() {
+        val pagedList = createCountedPagedList(80)
+        verifyRange(60, 40, pagedList)
+
+        pagedList.loadAround(if (mCounted) 65 else 5)
+        drain()
+        verifyRange(40, 60, pagedList)
+
+        // snapshot at 60 items
+        val snapshot = pagedList.snapshot() as PagedList<Item>
+        verifyRange(40, 60, snapshot)
+
+        pagedList.loadAround(if (mCounted) 45 else 5)
+        drain()
+        verifyRange(20, 80, pagedList)
+        verifyRange(40, 60, snapshot)
+
+        val callback = mock(PagedList.Callback::class.java)
+        pagedList.addWeakCallback(snapshot, callback)
+        verifyCallback(callback, 40, 0)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun boundaryCallback_empty() {
+        @Suppress("UNCHECKED_CAST")
+        val boundaryCallback =
+                mock(PagedList.BoundaryCallback::class.java) as PagedList.BoundaryCallback<Item>
+        val pagedList = createCountedPagedList(0,
+                listData = ArrayList(), boundaryCallback = boundaryCallback)
+        assertEquals(0, pagedList.size)
+
+        // nothing yet
+        verifyNoMoreInteractions(boundaryCallback)
+
+        // onZeroItemsLoaded posted, since creation often happens on BG thread
+        drain()
+        verify(boundaryCallback).onZeroItemsLoaded()
+        verifyNoMoreInteractions(boundaryCallback)
+    }
+
+    @Test
+    fun boundaryCallback_delayed() {
+        @Suppress("UNCHECKED_CAST")
+        val boundaryCallback =
+                mock(PagedList.BoundaryCallback::class.java) as PagedList.BoundaryCallback<Item>
+        val pagedList = createCountedPagedList(90,
+                initLoadSize = 20, prefetchDistance = 5, boundaryCallback = boundaryCallback)
+        verifyRange(80, 20, pagedList)
+
+
+        // nothing yet
+        verifyZeroInteractions(boundaryCallback)
+        drain()
+        verifyZeroInteractions(boundaryCallback)
+
+        // loading around last item causes onItemAtEndLoaded
+        pagedList.loadAround(if (mCounted) 99 else 19)
+        drain()
+        verifyRange(80, 20, pagedList)
+        verify(boundaryCallback).onItemAtEndLoaded(
+                any(), eq(ITEMS.last()), eq(if (mCounted) 100 else 20))
+        verifyNoMoreInteractions(boundaryCallback)
+
+
+        // prepending doesn't trigger callback...
+        pagedList.loadAround(if (mCounted) 80 else 0)
+        drain()
+        verifyRange(60, 40, pagedList)
+        verifyZeroInteractions(boundaryCallback)
+
+        // ...load rest of data, still no dispatch...
+        pagedList.loadAround(if (mCounted) 60 else 0)
+        drain()
+        pagedList.loadAround(if (mCounted) 40 else 0)
+        drain()
+        pagedList.loadAround(if (mCounted) 20 else 0)
+        drain()
+        verifyRange(0, 100, pagedList)
+        verifyZeroInteractions(boundaryCallback)
+
+        // ... finally try prepend, see 0 items, which will dispatch front callback
+        pagedList.loadAround(0)
+        drain()
+        verify(boundaryCallback).onItemAtFrontLoaded(any(), eq(ITEMS.first()), eq(100))
+        verifyNoMoreInteractions(boundaryCallback)
+    }
+
+    private fun drain() {
+        var executed: Boolean
+        do {
+            executed = mBackgroundThread.executeAll()
+            executed = mMainThread.executeAll() || executed
+        } while (executed)
+    }
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "counted:{0}")
+        fun parameters(): Array<Array<Boolean>> {
+            return arrayOf(arrayOf(true), arrayOf(false))
+        }
+
+        private val ITEMS = List(100) { Item(it) }
+    }
+}
diff --git a/paging/common/src/test/java/android/arch/paging/KeyedDataSourceTest.kt b/paging/common/src/test/java/android/arch/paging/KeyedDataSourceTest.kt
index 92ab3c5..115fea2 100644
--- a/paging/common/src/test/java/android/arch/paging/KeyedDataSourceTest.kt
+++ b/paging/common/src/test/java/android/arch/paging/KeyedDataSourceTest.kt
@@ -1,10 +1,32 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package android.arch.paging
 
+import org.junit.Assert.assertArrayEquals
 import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
 import org.junit.Assert.assertTrue
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
+import org.mockito.ArgumentCaptor
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
 
 @RunWith(JUnit4::class)
 class KeyedDataSourceTest {
@@ -25,17 +47,30 @@
         assertEquals(ITEMS_BY_NAME_ID, dataSource.loadInitial(ITEMS_BY_NAME_ID.size + 10))
     }
 
+    private fun loadInitial(dataSource: ItemDataSource, key: Key?, initialLoadSize: Int,
+            enablePlaceholders: Boolean): PageResult<Key, Item> {
+        @Suppress("UNCHECKED_CAST")
+        val receiver = mock(PageResult.Receiver::class.java) as PageResult.Receiver<Key, Item>
+        @Suppress("UNCHECKED_CAST")
+        val captor = ArgumentCaptor.forClass(PageResult::class.java)
+                as ArgumentCaptor<PageResult<Key, Item>>
+
+        dataSource.loadInitial(key, initialLoadSize, enablePlaceholders, receiver)
+
+        verify(receiver).onPageResult(captor.capture())
+        verifyNoMoreInteractions(receiver)
+        assertNotNull(captor.value)
+        return captor.value
+    }
+
     @Test
     fun loadInitial() {
         val dataSource = ItemDataSource()
+        val result = loadInitial(dataSource, dataSource.getKey(ITEMS_BY_NAME_ID[49]), 10, true)
 
-        // loadInitial(key, count) == null padding, loadAfter(key, count), null padding
-        val key = dataSource.getKey(ITEMS_BY_NAME_ID[49])
-        val initialLoad = dataSource.loadInitial(key, 10, true)!!
-
-        assertEquals(45, initialLoad.leadingNullCount)
-        assertEquals(ITEMS_BY_NAME_ID.subList(45, 55), initialLoad.mList)
-        assertEquals(45, initialLoad.trailingNullCount)
+        assertEquals(45, result.leadingNulls)
+        assertEquals(ITEMS_BY_NAME_ID.subList(45, 55), result.page.items)
+        assertEquals(45, result.trailingNulls)
     }
 
     @Test
@@ -43,11 +78,11 @@
         val dataSource = ItemDataSource(items = ITEMS_BY_NAME_ID.subList(0, 1))
 
         // this is tricky, since load after and load before with the passed key will fail
-        val initialLoad = dataSource.loadInitial(dataSource.getKey(ITEMS_BY_NAME_ID[0]), 20, true)!!
+        val result = loadInitial(dataSource, dataSource.getKey(ITEMS_BY_NAME_ID[0]), 20, true)
 
-        assertEquals(0, initialLoad.leadingNullCount)
-        assertEquals(ITEMS_BY_NAME_ID.subList(0, 1), initialLoad.mList)
-        assertEquals(0, initialLoad.trailingNullCount)
+        assertEquals(0, result.leadingNulls)
+        assertEquals(ITEMS_BY_NAME_ID.subList(0, 1), result.page.items)
+        assertEquals(0, result.trailingNulls)
     }
 
     @Test
@@ -56,11 +91,11 @@
 
         // tricky, because load after key is empty, so another load before and load after required
         val key = dataSource.getKey(ITEMS_BY_NAME_ID.last())
-        val initialLoad = dataSource.loadInitial(key, 20, true)!!
+        val result = loadInitial(dataSource, key, 20, true)
 
-        assertEquals(89, initialLoad.leadingNullCount)
-        assertEquals(ITEMS_BY_NAME_ID.subList(89, 100), initialLoad.mList)
-        assertEquals(0, initialLoad.trailingNullCount)
+        assertEquals(89, result.leadingNulls)
+        assertEquals(ITEMS_BY_NAME_ID.subList(89, 100), result.page.items)
+        assertEquals(0, result.trailingNulls)
     }
 
     @Test
@@ -68,11 +103,11 @@
         val dataSource = ItemDataSource()
 
         // loadInitial(null, count) == loadInitial(count)
-        val initialLoad = dataSource.loadInitial(null, 10, true)!!
+        val result = loadInitial(dataSource, null, 10, true)
 
-        assertEquals(0, initialLoad.leadingNullCount)
-        assertEquals(ITEMS_BY_NAME_ID.subList(0, 10), initialLoad.mList)
-        assertEquals(90, initialLoad.trailingNullCount)
+        assertEquals(0, result.leadingNulls)
+        assertEquals(ITEMS_BY_NAME_ID.subList(0, 10), result.page.items)
+        assertEquals(90, result.trailingNulls)
     }
 
     @Test
@@ -81,14 +116,14 @@
 
         // if key is past entire data set, should return last items in data set
         val key = Key("fz", 0)
-        val initialLoad = dataSource.loadInitial(key, 10, true)!!
+        val result = loadInitial(dataSource, key, 10, true)
 
         // NOTE: ideally we'd load 10 items here, but it adds complexity and unpredictability to
         // do: load after was empty, so pass full size to load before, since this can incur larger
         // loads than requested (see keyMatchesLastItem test)
-        assertEquals(95, initialLoad.leadingNullCount)
-        assertEquals(ITEMS_BY_NAME_ID.subList(95, 100), initialLoad.mList)
-        assertEquals(0, initialLoad.trailingNullCount)
+        assertEquals(95, result.leadingNulls)
+        assertEquals(ITEMS_BY_NAME_ID.subList(95, 100), result.page.items)
+        assertEquals(0, result.trailingNulls)
     }
 
     // ----- UNCOUNTED -----
@@ -99,11 +134,11 @@
 
         // loadInitial(key, count) == null padding, loadAfter(key, count), null padding
         val key = dataSource.getKey(ITEMS_BY_NAME_ID[49])
-        val initialLoad = dataSource.loadInitial(key, 10, false)!!
+        val result = loadInitial(dataSource, key, 10, false)
 
-        assertEquals(0, initialLoad.leadingNullCount)
-        assertEquals(ITEMS_BY_NAME_ID.subList(45, 55), initialLoad.mList)
-        assertEquals(0, initialLoad.trailingNullCount)
+        assertEquals(0, result.leadingNulls)
+        assertEquals(ITEMS_BY_NAME_ID.subList(45, 55), result.page.items)
+        assertEquals(0, result.trailingNulls)
     }
 
     @Test
@@ -112,11 +147,11 @@
 
         // loadInitial(key, count) == null padding, loadAfter(key, count), null padding
         val key = dataSource.getKey(ITEMS_BY_NAME_ID[49])
-        val initialLoad = dataSource.loadInitial(key, 10, true)!!
+        val result = loadInitial(dataSource, key, 10, true)
 
-        assertEquals(0, initialLoad.leadingNullCount)
-        assertEquals(ITEMS_BY_NAME_ID.subList(45, 55), initialLoad.mList)
-        assertEquals(0, initialLoad.trailingNullCount)
+        assertEquals(0, result.leadingNulls)
+        assertEquals(ITEMS_BY_NAME_ID.subList(45, 55), result.page.items)
+        assertEquals(0, result.trailingNulls)
     }
 
     @Test
@@ -124,11 +159,11 @@
         val dataSource = ItemDataSource(counted = false)
 
         // loadInitial(null, count) == loadInitial(count)
-        val initialLoad = dataSource.loadInitial(null, 10, true)!!
+        val result = loadInitial(dataSource, null, 10, true)
 
-        assertEquals(0, initialLoad.leadingNullCount)
-        assertEquals(ITEMS_BY_NAME_ID.subList(0, 10), initialLoad.mList)
-        assertEquals(0, initialLoad.trailingNullCount)
+        assertEquals(0, result.leadingNulls)
+        assertEquals(ITEMS_BY_NAME_ID.subList(0, 10), result.page.items)
+        assertEquals(0, result.trailingNulls)
     }
 
     // ----- EMPTY -----
@@ -139,21 +174,44 @@
 
         // loadInitial(key, count) == null padding, loadAfter(key, count), null padding
         val key = dataSource.getKey(ITEMS_BY_NAME_ID[49])
-        val initialLoad = dataSource.loadInitial(key, 10, true)!!
+        val result = loadInitial(dataSource, key, 10, true)
 
-        assertEquals(0, initialLoad.leadingNullCount)
-        assertTrue(initialLoad.mList.isEmpty())
-        assertEquals(0, initialLoad.trailingNullCount)
+        assertEquals(0, result.leadingNulls)
+        assertTrue(result.page.items.isEmpty())
+        assertEquals(0, result.trailingNulls)
     }
 
     @Test
     fun loadInitial_nullKey_empty() {
         val dataSource = ItemDataSource(items = ArrayList())
-        val initialLoad = dataSource.loadInitial(null, 10, true)!!
+        val result = loadInitial(dataSource, null, 10, true)
 
-        assertEquals(0, initialLoad.leadingNullCount)
-        assertTrue(initialLoad.mList.isEmpty())
-        assertEquals(0, initialLoad.trailingNullCount)
+        assertEquals(0, result.leadingNulls)
+        assertTrue(result.page.items.isEmpty())
+        assertEquals(0, result.trailingNulls)
+    }
+
+    // ----- Other behavior -----
+
+    @Test
+    fun loadBefore() {
+        val dataSource = ItemDataSource()
+        @Suppress("UNCHECKED_CAST")
+        val receiver = mock(PageResult.Receiver::class.java)
+                as PageResult.Receiver<Key, Item>
+
+        dataSource.loadBefore(5, ITEMS_BY_NAME_ID[5], 5, receiver)
+
+        @Suppress("UNCHECKED_CAST")
+        val argument = ArgumentCaptor.forClass(PageResult::class.java)
+                as ArgumentCaptor<PageResult<Key, Item>>
+        verify(receiver).postOnPageResult(argument.capture())
+        verifyNoMoreInteractions(receiver)
+
+        val observed = argument.value
+
+        assertEquals(PageResult.PREPEND, observed.type)
+        assertEquals(ITEMS_BY_NAME_ID.subList(0, 5), observed.page.items)
     }
 
     internal data class Key(val name: String, val id: Int)
@@ -223,14 +281,12 @@
         private val ITEM_COMPARATOR = compareBy<Item>( {it.name} ).thenByDescending( {it.id} )
         private val KEY_COMPARATOR = compareBy<Key>( {it.name} ).thenByDescending( {it.id} )
 
-        private val ITEMS_BY_NAME_ID = List(size = 100, init = {
-            val names = Array(size = 10, init = {
-                "f" + ('a' + it)
-            })
+        private val ITEMS_BY_NAME_ID = List(100) {
+            val names = Array(10) { "f" + ('a' + it) }
             Item(names[it % 10],
                  it,
                  Math.random() * 1000,
                  (Math.random() * 200).toInt().toString() + " fake st.")
-        }).sortedWith(ITEM_COMPARATOR)
+        }.sortedWith(ITEM_COMPARATOR)
     }
 }
diff --git a/paging/common/src/test/java/android/arch/paging/NullPaddedListTest.java b/paging/common/src/test/java/android/arch/paging/NullPaddedListTest.java
deleted file mode 100644
index 0c38485..0000000
--- a/paging/common/src/test/java/android/arch/paging/NullPaddedListTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.paging;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-@RunWith(JUnit4.class)
-public class NullPaddedListTest {
-    @Test
-    public void simple() {
-        List<String> data = Arrays.asList("A", "B", "C", "D", "E", "F");
-        NullPaddedList<String> list = new NullPaddedList<>(
-                2, data.subList(2, 4), 2);
-
-        assertNull(list.get(0));
-        assertNull(list.get(1));
-        assertSame(data.get(2), list.get(2));
-        assertSame(data.get(3), list.get(3));
-        assertNull(list.get(4));
-        assertNull(list.get(5));
-
-        assertEquals(6, list.size());
-        assertEquals(2, list.getLeadingNullCount());
-        assertEquals(2, list.getTrailingNullCount());
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void getEmpty() {
-        NullPaddedList<String> list = new NullPaddedList<>(0, new ArrayList<String>(), 0);
-        list.get(0);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void getNegative() {
-        NullPaddedList<String> list = new NullPaddedList<>(0, Arrays.asList("a", "b"), 0);
-        list.get(-1);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void getPastEnd() {
-        NullPaddedList<String> list = new NullPaddedList<>(0, Arrays.asList("a", "b"), 0);
-        list.get(2);
-    }
-}
diff --git a/paging/common/src/test/java/android/arch/paging/PageArrayListTest.java b/paging/common/src/test/java/android/arch/paging/PageArrayListTest.java
deleted file mode 100644
index 135e640..0000000
--- a/paging/common/src/test/java/android/arch/paging/PageArrayListTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.paging;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.util.Arrays;
-import java.util.List;
-
-@RunWith(JUnit4.class)
-public class PageArrayListTest {
-    @Test
-    public void simple() {
-        List<String> data = Arrays.asList("A", "B", "C", "D", "E", "F");
-        PageArrayList<String> list = new PageArrayList<>(2, data.size());
-
-        assertEquals(2, list.mPageSize);
-        assertEquals(data.size(), list.size());
-        assertEquals(3, list.mMaxPageCount);
-
-        for (int i = 0; i < data.size(); i++) {
-            assertEquals(null, list.get(i));
-        }
-        for (int i = 0; i < data.size(); i += list.mPageSize) {
-            list.mPages.add(data.subList(i, i + 2));
-        }
-        for (int i = 0; i < data.size(); i++) {
-            assertEquals(data.get(i), list.get(i));
-        }
-    }
-}
diff --git a/paging/common/src/test/java/android/arch/paging/PagedStorageTest.kt b/paging/common/src/test/java/android/arch/paging/PagedStorageTest.kt
new file mode 100644
index 0000000..92b6c87
--- /dev/null
+++ b/paging/common/src/test/java/android/arch/paging/PagedStorageTest.kt
@@ -0,0 +1,409 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.paging
+
+import org.junit.Assert.assertArrayEquals
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+
+@RunWith(JUnit4::class)
+class PagedStorageTest {
+    private fun createPage(vararg strings: String): Page<Int, String> {
+        return Page(strings.asList())
+    }
+
+    @Test
+    fun construct() {
+        val storage = PagedStorage(2, createPage("a", "b"), 2)
+
+        assertArrayEquals(arrayOf(null, null, "a", "b", null, null), storage.toArray())
+        assertEquals(6, storage.size)
+    }
+
+    @Test
+    fun appendFill() {
+        val callback = mock(PagedStorage.Callback::class.java)
+
+        val storage = PagedStorage(2, createPage("a", "b"), 2)
+        storage.appendPage(createPage("c", "d"), callback)
+
+
+        assertArrayEquals(arrayOf(null, null, "a", "b", "c", "d"), storage.toArray())
+        verify(callback).onPageAppended(4, 2, 0)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun appendAdd() {
+        val callback = mock(PagedStorage.Callback::class.java)
+
+        val storage = PagedStorage(2, createPage("a", "b"), 0)
+        storage.appendPage(createPage("c", "d"), callback)
+
+        assertArrayEquals(arrayOf(null, null, "a", "b", "c", "d"), storage.toArray())
+        verify(callback).onPageAppended(4, 0, 2)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun appendFillAdd() {
+        val callback = mock(PagedStorage.Callback::class.java)
+
+        val storage = PagedStorage(2, createPage("a", "b"), 2)
+
+        // change 2 nulls into c, d
+        storage.appendPage(createPage("c", "d"), callback)
+
+        assertArrayEquals(arrayOf(null, null, "a", "b", "c", "d"), storage.toArray())
+        verify(callback).onPageAppended(4, 2, 0)
+        verifyNoMoreInteractions(callback)
+
+        // append e, f
+        storage.appendPage(createPage("e", "f"), callback)
+
+        assertArrayEquals(arrayOf(null, null, "a", "b", "c", "d", "e", "f"), storage.toArray())
+        verify(callback).onPageAppended(6, 0, 2)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun prependFill() {
+        val callback = mock(PagedStorage.Callback::class.java)
+
+        val storage = PagedStorage(2, createPage("c", "d"), 2)
+        storage.prependPage(createPage("a", "b"), callback)
+
+        assertArrayEquals(arrayOf("a", "b", "c", "d", null, null), storage.toArray())
+        verify(callback).onPagePrepended(0, 2, 0)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun prependAdd() {
+        val callback = mock(PagedStorage.Callback::class.java)
+
+        val storage = PagedStorage(0, createPage("c", "d"), 2)
+        storage.prependPage(createPage("a", "b"), callback)
+
+
+        assertArrayEquals(arrayOf("a", "b", "c", "d", null, null), storage.toArray())
+        verify(callback).onPagePrepended(0, 0, 2)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun prependFillAdd() {
+        val callback = mock(PagedStorage.Callback::class.java)
+
+        val storage = PagedStorage(2, createPage("e", "f"), 2)
+
+        // change 2 nulls into c, d
+        storage.prependPage(createPage("c", "d"), callback)
+
+        assertArrayEquals(arrayOf("c", "d", "e", "f", null, null), storage.toArray())
+        verify(callback).onPagePrepended(0, 2, 0)
+        verifyNoMoreInteractions(callback)
+
+        // prepend a, b
+        storage.prependPage(createPage("a", "b"), callback)
+
+        assertArrayEquals(arrayOf("a", "b", "c", "d", "e", "f", null, null), storage.toArray())
+        verify(callback).onPagePrepended(0, 0, 2)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun isTiled_addend_smallerPageIsNotLast() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage(0, createPage("a", "a"), 0)
+        assertTrue(storage.isTiled)
+
+        storage.appendPage(createPage("a", "a"), callback)
+        assertTrue(storage.isTiled)
+
+        storage.appendPage(createPage("a"), callback)
+        assertTrue(storage.isTiled)
+
+        // no matter what we append here, we're no longer tiled
+        storage.appendPage(createPage("a", "a"), callback)
+        assertFalse(storage.isTiled)
+    }
+
+    @Test
+    fun isTiled_append_growingSizeDisable() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage(0, createPage("a", "a"), 0)
+        assertTrue(storage.isTiled)
+
+        // page size can't grow from append
+        storage.appendPage(createPage("a", "a", "a"), callback)
+        assertFalse(storage.isTiled)
+    }
+
+    @Test
+    fun isTiled_prepend_smallerPage() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage(0, createPage("a"), 0)
+        assertTrue(storage.isTiled)
+
+        storage.prependPage(createPage("a", "a"), callback)
+        assertTrue(storage.isTiled)
+
+        storage.prependPage(createPage("a", "a"), callback)
+        assertTrue(storage.isTiled)
+
+        storage.prependPage(createPage("a"), callback)
+        assertFalse(storage.isTiled)
+    }
+
+    @Test
+    fun isTiled_prepend_smallerThanInitialPage() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage(0, createPage("a", "a"), 0)
+        assertTrue(storage.isTiled)
+
+        storage.prependPage(createPage("a"), callback)
+        assertFalse(storage.isTiled)
+    }
+
+    @Test
+    fun get_tiled() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage(1, createPage("a", "b"), 5)
+        assertTrue(storage.isTiled)
+
+        storage.appendPage(createPage("c", "d"), callback)
+        storage.appendPage(createPage("e", "f"), callback)
+
+        assertTrue(storage.isTiled)
+        assertArrayEquals(arrayOf(null, "a", "b", "c", "d", "e", "f", null), storage.toArray())
+    }
+
+    @Test
+    fun get_nonTiled() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage(1, createPage("a"), 6)
+        assertTrue(storage.isTiled)
+
+        storage.appendPage(createPage("b", "c"), callback)
+        storage.appendPage(createPage("d", "e", "f"), callback)
+
+        assertFalse(storage.isTiled)
+        assertArrayEquals(arrayOf(null, "a", "b", "c", "d", "e", "f", null), storage.toArray())
+    }
+
+    @Test
+    fun insertOne() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage<Int, String>()
+
+        storage.init(2, createPage("c", "d"), 3, 0, callback)
+
+        assertEquals(7, storage.size)
+        assertArrayEquals(arrayOf(null, null, "c", "d", null, null, null), storage.toArray())
+        verify(callback).onInitialized(7)
+        verifyNoMoreInteractions(callback)
+
+        storage.insertPage(4, createPage("e", "f"), callback)
+
+        assertEquals(7, storage.size)
+        assertArrayEquals(arrayOf(null, null, "c", "d", "e", "f", null), storage.toArray())
+        verify(callback).onPageInserted(4, 2)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun insertThree() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage<Int, String>()
+
+        storage.init(2, createPage("c", "d"), 3, 0, callback)
+
+        assertEquals(7, storage.size)
+        assertArrayEquals(arrayOf(null, null, "c", "d", null, null, null), storage.toArray())
+        verify(callback).onInitialized(7)
+        verifyNoMoreInteractions(callback)
+
+        // first, insert 1st page
+        storage.insertPage(0, createPage("a", "b"), callback)
+
+        assertEquals(7, storage.size)
+        assertArrayEquals(arrayOf("a", "b", "c", "d", null, null, null), storage.toArray())
+        verify(callback).onPageInserted(0, 2)
+        verifyNoMoreInteractions(callback)
+
+        // then 3rd page
+        storage.insertPage(4, createPage("e", "f"), callback)
+
+        assertEquals(7, storage.size)
+        assertArrayEquals(arrayOf("a", "b", "c", "d", "e", "f", null), storage.toArray())
+        verify(callback).onPageInserted(4, 2)
+        verifyNoMoreInteractions(callback)
+
+        // then last, small page
+        storage.insertPage(6, createPage("g"), callback)
+
+        assertEquals(7, storage.size)
+        assertArrayEquals(arrayOf("a", "b", "c", "d", "e", "f", "g"), storage.toArray())
+        verify(callback).onPageInserted(6, 1)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun insertLastFirst() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage<Int, String>()
+
+        storage.init(6, createPage("g"), 0, 0, callback)
+
+        assertEquals(7, storage.size)
+        assertArrayEquals(arrayOf(null, null, null, null, null, null, "g"), storage.toArray())
+        verify(callback).onInitialized(7)
+        verifyNoMoreInteractions(callback)
+
+        // insert 1st page
+        storage.insertPage(0, createPage("a", "b"), callback)
+
+        assertEquals(7, storage.size)
+        assertArrayEquals(arrayOf("a", "b", null, null, null, null, "g"), storage.toArray())
+        verify(callback).onPageInserted(0, 2)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun insertFailure_decreaseLast() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage<Int, String>()
+
+        storage.init(2, createPage("c", "d"), 0, 0, callback)
+
+        // should throw, page too small
+        storage.insertPage(0, createPage("a"), callback)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun insertFailure_increase() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage<Int, String>()
+
+        storage.init(0, createPage("a", "b"), 3, 0, callback)
+
+        // should throw, page too big
+        storage.insertPage(2, createPage("c", "d", "e"), callback)
+    }
+
+    @Test
+    fun allocatePlaceholders_simple() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage<Int, String>()
+
+        storage.init(2, createPage("c"), 2, 0, callback)
+
+        verify(callback).onInitialized(5)
+
+        storage.allocatePlaceholders(2, 1, 1, callback)
+
+        verify(callback).onPagePlaceholderInserted(1)
+        verify(callback).onPagePlaceholderInserted(3)
+        verifyNoMoreInteractions(callback)
+
+        assertArrayEquals(arrayOf(null, null, "c", null, null), storage.toArray())
+    }
+
+    @Test
+    fun allocatePlaceholders_adoptPageSize() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage<Int, String>()
+
+        storage.init(4, createPage("e"), 0, 0, callback)
+
+        verify(callback).onInitialized(5)
+
+        storage.allocatePlaceholders(0, 2, 2, callback)
+
+        verify(callback).onPagePlaceholderInserted(0)
+        verify(callback).onPagePlaceholderInserted(1)
+        verifyNoMoreInteractions(callback)
+
+        assertArrayEquals(arrayOf(null, null, null, null, "e"), storage.toArray())
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun allocatePlaceholders_cannotShrinkPageSize() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage<Int, String>()
+
+        storage.init(4, createPage("e", "f"), 0, 0, callback)
+
+        verify(callback).onInitialized(6)
+
+        storage.allocatePlaceholders(0, 2, 1, callback)
+    }
+
+
+    @Test(expected = IllegalArgumentException::class)
+    fun allocatePlaceholders_cannotAdoptPageSize() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage<Int, String>()
+
+        storage.init(2, createPage("c", "d"), 2, 0, callback)
+
+        verify(callback).onInitialized(6)
+
+        storage.allocatePlaceholders(0, 2, 3, callback)
+    }
+
+    @Test
+    fun get_placeholdersMulti() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage<Int, String>()
+
+        storage.init(2, createPage("c", "d"), 3, 0, callback)
+
+        assertArrayEquals(arrayOf(null, null, "c", "d", null, null, null), storage.toArray())
+
+        storage.allocatePlaceholders(0, 10, 2, callback)
+
+        // allocating placeholders shouldn't affect result of get
+        assertArrayEquals(arrayOf(null, null, "c", "d", null, null, null), storage.toArray())
+    }
+
+    @Test
+    fun hasPage() {
+        val callback = mock(PagedStorage.Callback::class.java)
+        val storage = PagedStorage<Int, String>()
+
+        storage.init(4, createPage("e"), 0, 0, callback)
+
+        assertFalse(storage.hasPage(1, 0))
+        assertFalse(storage.hasPage(1, 1))
+        assertFalse(storage.hasPage(1, 2))
+        assertFalse(storage.hasPage(1, 3))
+        assertTrue(storage.hasPage(1, 4))
+
+        assertFalse(storage.hasPage(2, 0))
+        assertFalse(storage.hasPage(2, 1))
+        assertTrue(storage.hasPage(2, 2))
+    }
+}
diff --git a/paging/common/src/test/java/android/arch/paging/TestExecutor.java b/paging/common/src/test/java/android/arch/paging/TestExecutor.java
deleted file mode 100644
index 30809c3..0000000
--- a/paging/common/src/test/java/android/arch/paging/TestExecutor.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.paging;
-
-import android.support.annotation.NonNull;
-
-import java.util.LinkedList;
-import java.util.Queue;
-import java.util.concurrent.Executor;
-
-public class TestExecutor implements Executor {
-    private Queue<Runnable> mTasks = new LinkedList<>();
-
-    @Override
-    public void execute(@NonNull Runnable command) {
-        mTasks.add(command);
-    }
-
-    boolean executeAll() {
-        boolean consumed = !mTasks.isEmpty();
-        Runnable task;
-        while ((task = mTasks.poll()) != null) {
-            task.run();
-        }
-        return consumed;
-    }
-}
diff --git a/paging/common/src/test/java/android/arch/paging/TestExecutor.kt b/paging/common/src/test/java/android/arch/paging/TestExecutor.kt
new file mode 100644
index 0000000..7034aa0
--- /dev/null
+++ b/paging/common/src/test/java/android/arch/paging/TestExecutor.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.paging
+
+import java.util.LinkedList
+import java.util.concurrent.Executor
+
+class TestExecutor : Executor {
+    private val mTasks = LinkedList<Runnable>()
+
+    override fun execute(command: Runnable) {
+        mTasks.add(command)
+    }
+
+    internal fun executeAll(): Boolean {
+        val consumed = !mTasks.isEmpty()
+
+        var task = mTasks.poll()
+        while (task != null) {
+            task.run()
+            task = mTasks.poll()
+        }
+        return consumed
+    }
+}
diff --git a/paging/common/src/test/java/android/arch/paging/TiledDataSourceTest.kt b/paging/common/src/test/java/android/arch/paging/TiledDataSourceTest.kt
new file mode 100644
index 0000000..2b16fb2
--- /dev/null
+++ b/paging/common/src/test/java/android/arch/paging/TiledDataSourceTest.kt
@@ -0,0 +1,45 @@
+package android.arch.paging
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.ArgumentCaptor
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import java.util.Collections
+
+
+@RunWith(JUnit4::class)
+class TiledDataSourceTest {
+    @Test
+    fun loadInitialEmpty() {
+        @Suppress("UNCHECKED_CAST")
+        val receiver = mock(PageResult.Receiver::class.java) as PageResult.Receiver<Int, String>
+        val dataSource = EmptyDataSource()
+        dataSource.loadRangeInitial(0, 0, 1, 0, receiver)
+
+        @Suppress("UNCHECKED_CAST")
+        val argument = ArgumentCaptor.forClass(PageResult::class.java)
+                as ArgumentCaptor<PageResult<Int, String>>
+        verify(receiver).onPageResult(argument.capture())
+        verifyNoMoreInteractions(receiver)
+
+        val observed = argument.value
+
+        assertEquals(PageResult.INIT, observed.type)
+        assertEquals(Collections.EMPTY_LIST, observed.page.items)
+    }
+
+    class EmptyDataSource : TiledDataSource<String>() {
+        override fun countItems(): Int {
+            return 0
+        }
+
+        override fun loadRange(startPosition: Int, count: Int): List<String> {
+            @Suppress("UNCHECKED_CAST")
+            return Collections.EMPTY_LIST as List<String>
+        }
+    }
+}
\ No newline at end of file
diff --git a/paging/common/src/test/java/android/arch/paging/TiledPagedListTest.java b/paging/common/src/test/java/android/arch/paging/TiledPagedListTest.java
deleted file mode 100644
index 4ad02e1..0000000
--- a/paging/common/src/test/java/android/arch/paging/TiledPagedListTest.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.paging;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-@RunWith(JUnit4.class)
-public class TiledPagedListTest {
-
-    private TestExecutor mMainThread = new TestExecutor();
-    private TestExecutor mBackgroundThread = new TestExecutor();
-
-    private static final ArrayList<Item> ITEMS = new ArrayList<>();
-
-    static {
-        for (int i = 0; i < 45; i++) {
-            ITEMS.add(new Item(i));
-        }
-    }
-
-    // use a page size that's not an even divisor of ITEMS.size() to test end conditions
-    private static final int PAGE_SIZE = 10;
-
-    private static class Item {
-        private Item(int position) {
-            this.position = position;
-            this.name = "Item " + position;
-        }
-
-        @SuppressWarnings("WeakerAccess")
-        public final int position;
-        public final String name;
-
-        @Override
-        public String toString() {
-            return name;
-        }
-    }
-
-    private static class TestTiledSource extends TiledDataSource<Item> {
-        @Override
-        public int countItems() {
-            return ITEMS.size();
-        }
-
-        @Override
-        public List<Item> loadRange(int startPosition, int count) {
-            int endPosition = Math.min(ITEMS.size(), startPosition + count);
-            return ITEMS.subList(startPosition, endPosition);
-        }
-    }
-
-    private void verifyRange(PageArrayList<Item> list, Integer... loadedPages) {
-        List<Integer> loadedPageList = Arrays.asList(loadedPages);
-        assertEquals(ITEMS.size(), list.size());
-        for (int i = 0; i < list.size(); i++) {
-            if (loadedPageList.contains(i / PAGE_SIZE)) {
-                assertSame(ITEMS.get(i), list.get(i));
-            } else {
-                assertEquals(null, list.get(i));
-            }
-        }
-    }
-    private TiledPagedList<Item> createTiledPagedList(int loadPosition) {
-        return createTiledPagedList(loadPosition, PAGE_SIZE);
-    }
-
-    private TiledPagedList<Item> createTiledPagedList(int loadPosition, int prefetchDistance) {
-        TestTiledSource source = new TestTiledSource();
-        return new TiledPagedList<>(
-                source, mMainThread, mBackgroundThread,
-                new PagedList.Config.Builder()
-                        .setPageSize(PAGE_SIZE)
-                        .setPrefetchDistance(prefetchDistance)
-                        .build(),
-                loadPosition);
-    }
-
-    @Test
-    public void initialLoad() {
-        TiledPagedList<Item> pagedList = createTiledPagedList(0);
-        verifyRange(pagedList, 0);
-    }
-
-    @Test
-    public void initialLoad_end() {
-        TiledPagedList<Item> pagedList = createTiledPagedList(44);
-        verifyRange(pagedList, 3, 4);
-    }
-
-    @Test
-    public void initialLoad_multiple() {
-        TiledPagedList<Item> pagedList = createTiledPagedList(9);
-        verifyRange(pagedList, 0, 1);
-    }
-
-    @Test
-    public void initialLoad_offset() {
-        TiledPagedList<Item> pagedList = createTiledPagedList(41);
-        verifyRange(pagedList, 3, 4);
-    }
-
-    @Test
-    public void append() {
-        TiledPagedList<Item> pagedList = createTiledPagedList(0);
-        PagedList.Callback callback = mock(PagedList.Callback.class);
-        pagedList.addWeakCallback(null, callback);
-        verifyRange(pagedList, 0);
-        verifyZeroInteractions(callback);
-
-        pagedList.loadAround(5);
-        drain();
-
-        verifyRange(pagedList, 0, 1);
-        verify(callback).onChanged(10, 10);
-        verifyNoMoreInteractions(callback);
-    }
-
-    @Test
-    public void prepend() {
-        TiledPagedList<Item> pagedList = createTiledPagedList(44);
-        PagedList.Callback callback = mock(PagedList.Callback.class);
-        pagedList.addWeakCallback(null, callback);
-        verifyRange(pagedList, 3, 4);
-        verifyZeroInteractions(callback);
-
-        pagedList.loadAround(35);
-        drain();
-
-        verifyRange(pagedList, 2, 3, 4);
-        verify(callback).onChanged(20, 10);
-        verifyNoMoreInteractions(callback);
-    }
-
-    @Test
-    public void loadWithGap() {
-        TiledPagedList<Item> pagedList = createTiledPagedList(0);
-        PagedList.Callback callback = mock(PagedList.Callback.class);
-        pagedList.addWeakCallback(null, callback);
-        verifyRange(pagedList, 0);
-        verifyZeroInteractions(callback);
-
-        pagedList.loadAround(44);
-        drain();
-
-        verifyRange(pagedList, 0, 3, 4);
-        verify(callback).onChanged(30, 10);
-        verify(callback).onChanged(40, 5);
-        verifyNoMoreInteractions(callback);
-    }
-
-    @Test
-    public void tinyPrefetchTest() {
-        TiledPagedList<Item> pagedList = createTiledPagedList(0, 1);
-        PagedList.Callback callback = mock(PagedList.Callback.class);
-        pagedList.addWeakCallback(null, callback);
-        verifyRange(pagedList, 0); // just 4 loaded
-        verifyZeroInteractions(callback);
-
-        pagedList.loadAround(23);
-        drain();
-
-        verifyRange(pagedList, 0, 2);
-        verify(callback).onChanged(20, 10);
-        verifyNoMoreInteractions(callback);
-
-        pagedList.loadAround(44);
-        drain();
-
-        verifyRange(pagedList, 0, 2, 4);
-        verify(callback).onChanged(40, 5);
-        verifyNoMoreInteractions(callback);
-    }
-
-    @Test
-    public void appendCallbackAddedLate() {
-        TiledPagedList<Item> pagedList = createTiledPagedList(0, 0);
-        verifyRange(pagedList, 0);
-
-        pagedList.loadAround(15);
-        drain();
-        verifyRange(pagedList, 0, 1);
-
-        // snapshot at 20 items
-        PageArrayList<Item> snapshot = (PageArrayList<Item>) pagedList.snapshot();
-        verifyRange(snapshot, 0, 1);
-
-
-        pagedList.loadAround(25);
-        pagedList.loadAround(35);
-        drain();
-        verifyRange(pagedList, 0, 1, 2, 3);
-        verifyRange(snapshot, 0, 1);
-
-        PagedList.Callback callback = mock(
-                PagedList.Callback.class);
-        pagedList.addWeakCallback(snapshot, callback);
-        verify(callback).onChanged(20, 20);
-        verifyNoMoreInteractions(callback);
-    }
-
-
-    @Test
-    public void prependCallbackAddedLate() {
-        TiledPagedList<Item> pagedList = createTiledPagedList(44, 0);
-        verifyRange(pagedList, 3, 4);
-
-        pagedList.loadAround(25);
-        drain();
-        verifyRange(pagedList, 2, 3, 4);
-
-        // snapshot at 30 items
-        PageArrayList<Item> snapshot = (PageArrayList<Item>) pagedList.snapshot();
-        verifyRange(snapshot, 2, 3, 4);
-
-
-        pagedList.loadAround(15);
-        pagedList.loadAround(5);
-        drain();
-        verifyRange(pagedList, 0, 1, 2, 3, 4);
-        verifyRange(snapshot, 2, 3, 4);
-
-        PagedList.Callback callback = mock(PagedList.Callback.class);
-        pagedList.addWeakCallback(snapshot, callback);
-        verify(callback).onChanged(0, 20);
-        verifyNoMoreInteractions(callback);
-    }
-
-    @Test
-    public void placeholdersDisabled() {
-        // disable placeholders with config, so we create a contiguous version of the pagedlist
-        PagedList<Item> pagedList = new PagedList.Builder<Integer, Item>()
-                .setDataSource(new TestTiledSource())
-                .setMainThreadExecutor(mMainThread)
-                .setBackgroundThreadExecutor(mBackgroundThread)
-                .setConfig(new PagedList.Config.Builder()
-                        .setPageSize(PAGE_SIZE)
-                        .setPrefetchDistance(PAGE_SIZE)
-                        .setInitialLoadSizeHint(PAGE_SIZE)
-                        .setEnablePlaceholders(false)
-                        .build())
-                .setInitialKey(20)
-                .build();
-
-        assertTrue(pagedList.isContiguous());
-
-        ContiguousPagedList<Item> contiguousPagedList = (ContiguousPagedList<Item>) pagedList;
-        assertEquals(0, contiguousPagedList.getLeadingNullCount());
-        assertEquals(PAGE_SIZE, contiguousPagedList.mList.size());
-        assertEquals(0, contiguousPagedList.getTrailingNullCount());
-    }
-
-    private void drain() {
-        boolean executed;
-        do {
-            executed = mBackgroundThread.executeAll();
-            executed |= mMainThread.executeAll();
-        } while (executed);
-    }
-}
diff --git a/paging/common/src/test/java/android/arch/paging/TiledPagedListTest.kt b/paging/common/src/test/java/android/arch/paging/TiledPagedListTest.kt
new file mode 100644
index 0000000..6524008
--- /dev/null
+++ b/paging/common/src/test/java/android/arch/paging/TiledPagedListTest.kt
@@ -0,0 +1,382 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.paging
+
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
+import org.junit.Assert.assertSame
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.Mockito.any
+import org.mockito.Mockito.eq
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.Mockito.verifyZeroInteractions
+
+@RunWith(JUnit4::class)
+class TiledPagedListTest {
+    private val mMainThread = TestExecutor()
+    private val mBackgroundThread = TestExecutor()
+
+    private class Item(position: Int) {
+        val name: String = "Item $position"
+
+        override fun toString(): String {
+            return name
+        }
+    }
+
+    private fun verifyLoadedPages(list: List<Item>, vararg loadedPages: Int, expected: List<Item> = ITEMS) {
+        val loadedPageList = loadedPages.asList()
+        assertEquals(expected.size, list.size)
+        for (i in list.indices) {
+            if (loadedPageList.contains(i / PAGE_SIZE)) {
+                assertSame("Index $i", expected[i], list[i])
+            } else {
+                assertNull("Index $i", list[i])
+            }
+        }
+    }
+
+    private fun createTiledPagedList(loadPosition: Int, initPageCount: Int,
+            prefetchDistance: Int = PAGE_SIZE,
+            listData: List<Item> = ITEMS,
+            boundaryCallback: PagedList.BoundaryCallback<Item>? = null): TiledPagedList<Item> {
+        return TiledPagedList(
+                ListDataSource(listData), mMainThread, mBackgroundThread, boundaryCallback,
+                PagedList.Config.Builder()
+                        .setPageSize(PAGE_SIZE)
+                        .setInitialLoadSizeHint(PAGE_SIZE * initPageCount)
+                        .setPrefetchDistance(prefetchDistance)
+                        .build(),
+                loadPosition)
+    }
+
+    @Test
+    fun computeFirstLoadPosition_zero() {
+        assertEquals(0, TiledPagedList.computeFirstLoadPosition(0, 30, 10, 100))
+    }
+
+    @Test
+    fun computeFirstLoadPosition_requestedPositionIncluded() {
+        assertEquals(0, TiledPagedList.computeFirstLoadPosition(10, 10, 10, 100))
+    }
+
+    @Test
+    fun computeFirstLoadPosition_endAdjusted() {
+        assertEquals(70, TiledPagedList.computeFirstLoadPosition(99, 30, 10, 100))
+    }
+
+    @Test
+    fun initialLoad_onePage() {
+        val pagedList = createTiledPagedList(loadPosition = 0, initPageCount = 1)
+        verifyLoadedPages(pagedList, 0, 1)
+    }
+
+    @Test
+    fun initialLoad_onePageOffset() {
+        val pagedList = createTiledPagedList(loadPosition = 10, initPageCount = 1)
+        verifyLoadedPages(pagedList, 0, 1)
+    }
+
+    @Test
+    fun initialLoad_full() {
+        val pagedList = createTiledPagedList(loadPosition = 0, initPageCount = 100)
+        verifyLoadedPages(pagedList, 0, 1, 2, 3, 4)
+    }
+
+    @Test
+    fun initialLoad_end() {
+        val pagedList = createTiledPagedList(loadPosition = 44, initPageCount = 2)
+        verifyLoadedPages(pagedList, 3, 4)
+    }
+
+    @Test
+    fun initialLoad_multiple() {
+        val pagedList = createTiledPagedList(loadPosition = 9, initPageCount = 2)
+        verifyLoadedPages(pagedList, 0, 1)
+    }
+
+    @Test
+    fun initialLoad_offset() {
+        val pagedList = createTiledPagedList(loadPosition = 41, initPageCount = 2)
+        verifyLoadedPages(pagedList, 3, 4)
+    }
+
+    @Test
+    fun append() {
+        val pagedList = createTiledPagedList(loadPosition = 0, initPageCount = 1)
+        val callback = mock(PagedList.Callback::class.java)
+        pagedList.addWeakCallback(null, callback)
+        verifyLoadedPages(pagedList, 0, 1)
+        verifyZeroInteractions(callback)
+
+        pagedList.loadAround(15)
+
+        verifyLoadedPages(pagedList, 0, 1)
+
+        drain()
+
+        verifyLoadedPages(pagedList, 0, 1, 2)
+        verify(callback).onChanged(20, 10)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun prepend() {
+        val pagedList = createTiledPagedList(loadPosition = 44, initPageCount = 2)
+        val callback = mock(PagedList.Callback::class.java)
+        pagedList.addWeakCallback(null, callback)
+        verifyLoadedPages(pagedList, 3, 4)
+        verifyZeroInteractions(callback)
+
+        pagedList.loadAround(35)
+        drain()
+
+        verifyLoadedPages(pagedList, 2, 3, 4)
+        verify<PagedList.Callback>(callback).onChanged(20, 10)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun loadWithGap() {
+        val pagedList = createTiledPagedList(loadPosition = 0, initPageCount = 1)
+        val callback = mock(PagedList.Callback::class.java)
+        pagedList.addWeakCallback(null, callback)
+        verifyLoadedPages(pagedList, 0, 1)
+        verifyZeroInteractions(callback)
+
+        pagedList.loadAround(44)
+        drain()
+
+        verifyLoadedPages(pagedList, 0, 1, 3, 4)
+        verify(callback).onChanged(30, 10)
+        verify(callback).onChanged(40, 5)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun tinyPrefetchTest() {
+        val pagedList = createTiledPagedList(
+                loadPosition = 0, initPageCount = 1, prefetchDistance = 1)
+        val callback = mock(PagedList.Callback::class.java)
+        pagedList.addWeakCallback(null, callback)
+        verifyLoadedPages(pagedList, 0, 1)
+        verifyZeroInteractions(callback)
+
+        pagedList.loadAround(33)
+        drain()
+
+        verifyLoadedPages(pagedList, 0, 1, 3)
+        verify(callback).onChanged(30, 10)
+        verifyNoMoreInteractions(callback)
+
+        pagedList.loadAround(44)
+        drain()
+
+        verifyLoadedPages(pagedList, 0, 1, 3, 4)
+        verify(callback).onChanged(40, 5)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun appendCallbackAddedLate() {
+        val pagedList = createTiledPagedList(
+                loadPosition = 0, initPageCount = 1, prefetchDistance = 0)
+        verifyLoadedPages(pagedList, 0, 1)
+
+        pagedList.loadAround(25)
+        drain()
+        verifyLoadedPages(pagedList, 0, 1, 2)
+
+        // snapshot at 30 items
+        val snapshot = pagedList.snapshot()
+        verifyLoadedPages(snapshot, 0, 1, 2)
+
+        pagedList.loadAround(35)
+        pagedList.loadAround(44)
+        drain()
+        verifyLoadedPages(pagedList, 0, 1, 2, 3, 4)
+        verifyLoadedPages(snapshot, 0, 1, 2)
+
+        val callback = mock(PagedList.Callback::class.java)
+        pagedList.addWeakCallback(snapshot, callback)
+        verify(callback).onChanged(30, 20)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun prependCallbackAddedLate() {
+        val pagedList = createTiledPagedList(
+                loadPosition = 44, initPageCount = 2, prefetchDistance = 0)
+        verifyLoadedPages(pagedList, 3, 4)
+
+        pagedList.loadAround(25)
+        drain()
+        verifyLoadedPages(pagedList, 2, 3, 4)
+
+        // snapshot at 30 items
+        val snapshot = pagedList.snapshot()
+        verifyLoadedPages(snapshot, 2, 3, 4)
+
+        pagedList.loadAround(15)
+        pagedList.loadAround(5)
+        drain()
+        verifyLoadedPages(pagedList, 0, 1, 2, 3, 4)
+        verifyLoadedPages(snapshot, 2, 3, 4)
+
+        val callback = mock(PagedList.Callback::class.java)
+        pagedList.addWeakCallback(snapshot, callback)
+        verify(callback).onChanged(0, 20)
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun placeholdersDisabled() {
+        // disable placeholders with config, so we create a contiguous version of the pagedlist
+        val pagedList = PagedList.Builder<Int, Item>()
+                .setDataSource(ListDataSource(ITEMS))
+                .setMainThreadExecutor(mMainThread)
+                .setBackgroundThreadExecutor(mBackgroundThread)
+                .setConfig(PagedList.Config.Builder()
+                        .setPageSize(PAGE_SIZE)
+                        .setPrefetchDistance(PAGE_SIZE)
+                        .setInitialLoadSizeHint(PAGE_SIZE)
+                        .setEnablePlaceholders(false)
+                        .build())
+                .setInitialKey(20)
+                .build()
+
+        assertTrue(pagedList.isContiguous)
+
+        @Suppress("UNCHECKED_CAST")
+        val contiguousPagedList = pagedList as ContiguousPagedList<Int, Item>
+        assertEquals(0, contiguousPagedList.mStorage.leadingNullCount)
+        assertEquals(PAGE_SIZE, contiguousPagedList.mStorage.storageCount)
+        assertEquals(0, contiguousPagedList.mStorage.trailingNullCount)
+    }
+
+    @Test
+    fun boundaryCallback_empty() {
+        @Suppress("UNCHECKED_CAST")
+        val boundaryCallback =
+                mock(PagedList.BoundaryCallback::class.java) as PagedList.BoundaryCallback<Item>
+        val pagedList = createTiledPagedList(loadPosition = 0, initPageCount = 1,
+                listData = ArrayList(), boundaryCallback = boundaryCallback)
+        assertEquals(0, pagedList.size)
+
+        // nothing yet
+        verifyNoMoreInteractions(boundaryCallback)
+
+        // onZeroItemsLoaded posted, since creation often happens on BG thread
+        drain()
+        verify(boundaryCallback).onZeroItemsLoaded()
+        verifyNoMoreInteractions(boundaryCallback)
+    }
+
+    @Test
+    fun boundaryCallback_immediate() {
+        @Suppress("UNCHECKED_CAST")
+        val boundaryCallback =
+                mock(PagedList.BoundaryCallback::class.java) as PagedList.BoundaryCallback<Item>
+        val pagedList = createTiledPagedList(loadPosition = 0, initPageCount = 1,
+                listData = ITEMS.subList(0, 2), boundaryCallback = boundaryCallback)
+        assertEquals(2, pagedList.size)
+
+        // nothing yet
+        verifyZeroInteractions(boundaryCallback)
+
+        // callbacks posted, since creation often happens on BG thread
+        drain()
+        verify(boundaryCallback).onItemAtFrontLoaded(any(), eq(ITEMS[0]), eq(2))
+        verify(boundaryCallback).onItemAtEndLoaded(any(), eq(ITEMS[1]), eq(2))
+        verifyNoMoreInteractions(boundaryCallback)
+    }
+
+    @Test
+    fun boundaryCallback_delayedUntilLoaded() {
+        @Suppress("UNCHECKED_CAST")
+        val boundaryCallback =
+                mock(PagedList.BoundaryCallback::class.java) as PagedList.BoundaryCallback<Item>
+        val pagedList = createTiledPagedList(loadPosition = 20, initPageCount = 1,
+                boundaryCallback = boundaryCallback)
+        verifyLoadedPages(pagedList, 1, 2) // 0, 3, and 4 not loaded yet
+
+        // nothing yet, even after drain
+        verifyZeroInteractions(boundaryCallback)
+        drain()
+        verifyZeroInteractions(boundaryCallback)
+
+        pagedList.loadAround(0)
+        pagedList.loadAround(44)
+
+        // still nothing, since items aren't loaded...
+        verifyZeroInteractions(boundaryCallback)
+
+        drain()
+        // first/last items loaded now, so callbacks dispatched
+        verify(boundaryCallback).onItemAtFrontLoaded(any(), eq(ITEMS.first()), eq(45))
+        verify(boundaryCallback).onItemAtEndLoaded(any(), eq(ITEMS.last()), eq(45))
+        verifyNoMoreInteractions(boundaryCallback)
+    }
+
+    @Test
+    fun boundaryCallback_delayedUntilNearbyAccess() {
+        @Suppress("UNCHECKED_CAST")
+        val boundaryCallback =
+                mock(PagedList.BoundaryCallback::class.java) as PagedList.BoundaryCallback<Item>
+        val pagedList = createTiledPagedList(loadPosition = 0, initPageCount = 5,
+                prefetchDistance = 2, boundaryCallback = boundaryCallback)
+        verifyLoadedPages(pagedList, 0, 1, 2, 3, 4)
+
+        // all items loaded, but no access near ends, so no callbacks
+        verifyZeroInteractions(boundaryCallback)
+        drain()
+        verifyZeroInteractions(boundaryCallback)
+
+        pagedList.loadAround(0)
+        pagedList.loadAround(44)
+
+        // callbacks not posted immediately
+        verifyZeroInteractions(boundaryCallback)
+
+        drain()
+
+        // items accessed, so now posted callbacks are run
+        verify(boundaryCallback).onItemAtFrontLoaded(any(), eq(ITEMS.first()), eq(45))
+        verify(boundaryCallback).onItemAtEndLoaded(any(), eq(ITEMS.last()), eq(45))
+        verifyNoMoreInteractions(boundaryCallback)
+    }
+
+    private fun drain() {
+        var executed: Boolean
+        do {
+            executed = mBackgroundThread.executeAll()
+            executed = mMainThread.executeAll() || executed
+        } while (executed)
+    }
+
+    companion object {
+        // use a page size that's not an even divisor of ITEMS.size() to test end conditions
+        private val PAGE_SIZE = 10
+
+        private val ITEMS = List(45) { Item(it) }
+    }
+}
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListItemAdapter.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListItemAdapter.java
index 3522e43..d1ae5ab 100644
--- a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListItemAdapter.java
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListItemAdapter.java
@@ -23,7 +23,7 @@
 import android.widget.TextView;
 
 /**
- * Sample NullPaddedList adapter, which uses a PagedListAdapterHelper.
+ * Sample PagedList item Adapter, which uses a PagedListAdapterHelper.
  */
 class PagedListItemAdapter extends PagedListAdapter<Item, RecyclerView.ViewHolder> {
 
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListItemViewModel.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListItemViewModel.java
index 237cc14..974eab9 100644
--- a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListItemViewModel.java
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListItemViewModel.java
@@ -19,7 +19,7 @@
 import android.arch.lifecycle.LiveData;
 import android.arch.lifecycle.ViewModel;
 import android.arch.paging.DataSource;
-import android.arch.paging.LivePagedListProvider;
+import android.arch.paging.LivePagedListBuilder;
 import android.arch.paging.PagedList;
 
 /**
@@ -41,16 +41,19 @@
 
     LiveData<PagedList<Item>> getLivePagedList() {
         if (mLivePagedList == null) {
-            mLivePagedList = new LivePagedListProvider<Integer, Item>() {
-                @Override
-                protected DataSource<Integer, Item> createDataSource() {
-                    ItemDataSource newDataSource = new ItemDataSource();
-                    synchronized (mDataSourceLock) {
-                        mDataSource = newDataSource;
-                        return mDataSource;
-                    }
-                }
-            }.create(0, 20);
+            mLivePagedList = new LivePagedListBuilder<Integer, Item>()
+                    .setPagingConfig(20)
+                    .setDataSourceFactory(new DataSource.Factory<Integer, Item>() {
+                        @Override
+                        public DataSource<Integer, Item> create() {
+                            ItemDataSource newDataSource = new ItemDataSource();
+                            synchronized (mDataSourceLock) {
+                                mDataSource = newDataSource;
+                                return mDataSource;
+                            }
+                        }
+                    })
+                    .build();
         }
 
         return mLivePagedList;
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListSampleActivity.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListSampleActivity.java
index 5d0117d..f1f233f 100644
--- a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListSampleActivity.java
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/PagedListSampleActivity.java
@@ -16,7 +16,6 @@
 
 package android.arch.paging.integration.testapp;
 
-import android.arch.lifecycle.LifecycleRegistry;
 import android.arch.lifecycle.Observer;
 import android.arch.lifecycle.ViewModelProviders;
 import android.arch.paging.PagedList;
@@ -28,7 +27,7 @@
 import android.widget.Button;
 
 /**
- * Sample NullPaddedList activity with artificial data source.
+ * Sample PagedList activity with artificial data source.
  */
 public class PagedListSampleActivity extends AppCompatActivity {
 
@@ -56,11 +55,4 @@
             }
         });
     }
-
-    private LifecycleRegistry  mLifecycleRegistry = new LifecycleRegistry(this);
-
-    @Override
-    public LifecycleRegistry getLifecycle() {
-        return mLifecycleRegistry;
-    }
 }
diff --git a/paging/runtime/build.gradle b/paging/runtime/build.gradle
index 0ee0c77..c318c65 100644
--- a/paging/runtime/build.gradle
+++ b/paging/runtime/build.gradle
@@ -18,6 +18,7 @@
 import android.support.SupportLibraryExtension
 
 apply plugin: android.support.FlatfootAndroidLibraryPlugin
+apply plugin: 'kotlin-android'
 
 android {
     compileSdkVersion tools.current_sdk
@@ -49,10 +50,12 @@
     androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
     androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
     androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
+    androidTestImplementation libs.kotlin.stdlib
 
 }
 
 createAndroidCheckstyle(project)
+createKotlinCheckstyle(project)
 
 android.libraryVariants.all { variant ->
     def name = variant.buildType.name
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/ContiguousDiffHelperTest.java b/paging/runtime/src/androidTest/java/android/arch/paging/ContiguousDiffHelperTest.java
deleted file mode 100644
index 4f221b3..0000000
--- a/paging/runtime/src/androidTest/java/android/arch/paging/ContiguousDiffHelperTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.paging;
-
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-
-import android.support.annotation.NonNull;
-import android.support.test.filters.SmallTest;
-import android.support.v7.recyclerview.extensions.DiffCallback;
-import android.support.v7.util.DiffUtil;
-import android.support.v7.util.ListUpdateCallback;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-import org.mockito.Mockito;
-
-@SmallTest
-@RunWith(JUnit4.class)
-public class ContiguousDiffHelperTest {
-    private interface CallbackValidator {
-        void validate(ListUpdateCallback callback);
-    }
-
-    private static final DiffCallback<String> DIFF_CALLBACK = new DiffCallback<String>() {
-        @Override
-        public boolean areItemsTheSame(@NonNull String oldItem, @NonNull String newItem) {
-            // first char means same item
-            return oldItem.charAt(0) == newItem.charAt(0);
-        }
-
-        @Override
-        public boolean areContentsTheSame(@NonNull String oldItem, @NonNull String newItem) {
-            return oldItem.equals(newItem);
-        }
-    };
-
-    private void validateTwoListDiff(StringPagedList oldList, StringPagedList newList,
-            CallbackValidator callbackValidator) {
-        DiffUtil.DiffResult diffResult = ContiguousDiffHelper.computeDiff(oldList, newList,
-                DIFF_CALLBACK, false);
-
-        ListUpdateCallback listUpdateCallback = Mockito.mock(ListUpdateCallback.class);
-        ContiguousDiffHelper.dispatchDiff(listUpdateCallback, oldList, newList, diffResult);
-
-        callbackValidator.validate(listUpdateCallback);
-    }
-
-    @Test
-    public void sameListNoUpdates() {
-        validateTwoListDiff(
-                new StringPagedList(5, 5, "a", "b", "c"),
-                new StringPagedList(5, 5, "a", "b", "c"),
-                new CallbackValidator() {
-                    @Override
-                    public void validate(ListUpdateCallback callback) {
-                        verifyZeroInteractions(callback);
-                    }
-                }
-        );
-    }
-
-    @Test
-    public void appendFill() {
-        validateTwoListDiff(
-                new StringPagedList(5, 5, "a", "b"),
-                new StringPagedList(5, 4, "a", "b", "c"),
-                new CallbackValidator() {
-                    @Override
-                    public void validate(ListUpdateCallback callback) {
-                        verify(callback).onRemoved(11, 1);
-                        verify(callback).onInserted(7, 1);
-                        // NOTE: ideally would be onChanged(7, 1, null)
-                        verifyNoMoreInteractions(callback);
-                    }
-                }
-        );
-    }
-
-    @Test
-    public void prependFill() {
-        validateTwoListDiff(
-                new StringPagedList(5, 5, "b", "c"),
-                new StringPagedList(4, 5, "a", "b", "c"),
-                new CallbackValidator() {
-                    @Override
-                    public void validate(ListUpdateCallback callback) {
-                        verify(callback).onRemoved(0, 1);
-                        verify(callback).onInserted(4, 1);
-                        //NOTE: ideally would be onChanged(4, 1, null);
-                        verifyNoMoreInteractions(callback);
-                    }
-                }
-        );
-    }
-
-    @Test
-    public void change() {
-        validateTwoListDiff(
-                new StringPagedList(5, 5, "a1", "b1", "c1"),
-                new StringPagedList(5, 5, "a2", "b1", "c2"),
-                new CallbackValidator() {
-                    @Override
-                    public void validate(ListUpdateCallback callback) {
-                        verify(callback).onChanged(5, 1, null);
-                        verify(callback).onChanged(7, 1, null);
-                        verifyNoMoreInteractions(callback);
-                    }
-                }
-        );
-    }
-}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/PagedListAdapterHelperTest.java b/paging/runtime/src/androidTest/java/android/arch/paging/PagedListAdapterHelperTest.java
deleted file mode 100644
index 3518540..0000000
--- a/paging/runtime/src/androidTest/java/android/arch/paging/PagedListAdapterHelperTest.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.paging;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertNull;
-import static junit.framework.Assert.assertTrue;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-
-import android.support.annotation.NonNull;
-import android.support.test.filters.SmallTest;
-import android.support.v7.recyclerview.extensions.DiffCallback;
-import android.support.v7.recyclerview.extensions.ListAdapterConfig;
-import android.support.v7.util.ListUpdateCallback;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@SmallTest
-@RunWith(JUnit4.class)
-public class PagedListAdapterHelperTest {
-    private TestExecutor mMainThread = new TestExecutor();
-    private TestExecutor mDiffThread = new TestExecutor();
-    private TestExecutor mPageLoadingThread = new TestExecutor();
-
-    private static final ArrayList<String> ALPHABET_LIST = new ArrayList<>();
-    static {
-        for (int i = 0; i < 26; i++) {
-            ALPHABET_LIST.add("" + 'a' + i);
-        }
-    }
-
-    private static final DiffCallback<String> STRING_DIFF_CALLBACK = new DiffCallback<String>() {
-        @Override
-        public boolean areItemsTheSame(@NonNull String oldItem, @NonNull String newItem) {
-            return oldItem.equals(newItem);
-        }
-
-        @Override
-        public boolean areContentsTheSame(@NonNull String oldItem, @NonNull String newItem) {
-            return oldItem.equals(newItem);
-        }
-    };
-
-    private static final ListUpdateCallback IGNORE_CALLBACK = new ListUpdateCallback() {
-        @Override
-        public void onInserted(int position, int count) {
-        }
-
-        @Override
-        public void onRemoved(int position, int count) {
-        }
-
-        @Override
-        public void onMoved(int fromPosition, int toPosition) {
-        }
-
-        @Override
-        public void onChanged(int position, int count, Object payload) {
-        }
-    };
-
-
-    private <T> PagedListAdapterHelper<T> createHelper(
-            ListUpdateCallback listUpdateCallback, DiffCallback<T> diffCallback) {
-        return new PagedListAdapterHelper<T>(listUpdateCallback,
-                new ListAdapterConfig.Builder<T>()
-                        .setDiffCallback(diffCallback)
-                        .setMainThreadExecutor(mMainThread)
-                        .setBackgroundThreadExecutor(mDiffThread)
-                        .build());
-    }
-
-    private <V> PagedList<V> createPagedListFromListAndPos(
-            PagedList.Config config, List<V> data, int initialKey) {
-        return new PagedList.Builder<Integer, V>()
-                .setInitialKey(initialKey)
-                .setConfig(config)
-                .setMainThreadExecutor(mMainThread)
-                .setBackgroundThreadExecutor(mPageLoadingThread)
-                .setDataSource(new ListDataSource<>(data))
-                .build();
-    }
-
-    @Test
-    public void initialState() {
-        ListUpdateCallback callback = mock(ListUpdateCallback.class);
-        PagedListAdapterHelper<String> helper = createHelper(callback, STRING_DIFF_CALLBACK);
-        assertEquals(null, helper.getCurrentList());
-        assertEquals(0, helper.getItemCount());
-        verifyZeroInteractions(callback);
-    }
-
-    @Test
-    public void setFullList() {
-        ListUpdateCallback callback = mock(ListUpdateCallback.class);
-        PagedListAdapterHelper<String> helper = createHelper(callback, STRING_DIFF_CALLBACK);
-        helper.setList(new StringPagedList(0, 0, "a", "b"));
-
-        assertEquals(2, helper.getItemCount());
-        assertEquals("a", helper.getItem(0));
-        assertEquals("b", helper.getItem(1));
-
-        verify(callback).onInserted(0, 2);
-        verifyNoMoreInteractions(callback);
-        drain();
-        verifyNoMoreInteractions(callback);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void getEmpty() {
-        PagedListAdapterHelper<String> helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK);
-        helper.getItem(0);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void getNegative() {
-        PagedListAdapterHelper<String> helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK);
-        helper.setList(new StringPagedList(0, 0, "a", "b"));
-        helper.getItem(-1);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void getPastEnd() {
-        PagedListAdapterHelper<String> helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK);
-        helper.setList(new StringPagedList(0, 0, "a", "b"));
-        helper.getItem(2);
-    }
-
-    @Test
-    public void simpleStatic() {
-        ListUpdateCallback callback = mock(ListUpdateCallback.class);
-        PagedListAdapterHelper<String> helper = createHelper(callback, STRING_DIFF_CALLBACK);
-
-        assertEquals(0, helper.getItemCount());
-
-        helper.setList(new StringPagedList(2, 2, "a", "b"));
-
-        verify(callback).onInserted(0, 6);
-        verifyNoMoreInteractions(callback);
-        assertEquals(6, helper.getItemCount());
-
-        assertNull(helper.getItem(0));
-        assertNull(helper.getItem(1));
-        assertEquals("a", helper.getItem(2));
-        assertEquals("b", helper.getItem(3));
-        assertNull(helper.getItem(4));
-        assertNull(helper.getItem(5));
-    }
-
-    @Test
-    public void pagingInContent() {
-        PagedList.Config config = new PagedList.Config.Builder()
-                .setInitialLoadSizeHint(4)
-                .setPageSize(2)
-                .setPrefetchDistance(2)
-                .build();
-
-        final ListUpdateCallback callback = mock(ListUpdateCallback.class);
-        PagedListAdapterHelper<String> helper = createHelper(callback, STRING_DIFF_CALLBACK);
-
-        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2));
-        verify(callback).onInserted(0, ALPHABET_LIST.size());
-        verifyNoMoreInteractions(callback);
-        drain();
-        verifyNoMoreInteractions(callback);
-
-        // get without triggering prefetch...
-        helper.getItem(1);
-        verifyNoMoreInteractions(callback);
-        drain();
-        verifyNoMoreInteractions(callback);
-
-        // get triggering prefetch...
-        helper.getItem(2);
-        verifyNoMoreInteractions(callback);
-        drain();
-        verify(callback).onChanged(4, 2, null);
-        verifyNoMoreInteractions(callback);
-
-        // get with no data loaded nearby...
-        helper.getItem(12);
-        verifyNoMoreInteractions(callback);
-        drain();
-        verify(callback).onChanged(10, 2, null);
-        verify(callback).onChanged(12, 2, null);
-        verify(callback).onChanged(14, 2, null);
-        verifyNoMoreInteractions(callback);
-
-        // finally, clear
-        helper.setList(null);
-        verify(callback).onRemoved(0, 26);
-        drain();
-        verifyNoMoreInteractions(callback);
-    }
-
-    @Test
-    public void simpleSwap() {
-        // Page size large enough to load
-        PagedList.Config config = new PagedList.Config.Builder()
-                .setPageSize(50)
-                .build();
-
-        final ListUpdateCallback callback = mock(ListUpdateCallback.class);
-        PagedListAdapterHelper<String> helper = createHelper(callback, STRING_DIFF_CALLBACK);
-
-        // initial list missing one item (immediate)
-        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST.subList(0, 25), 0));
-        verify(callback).onInserted(0, 25);
-        verifyNoMoreInteractions(callback);
-        assertEquals(helper.getItemCount(), 25);
-        drain();
-        verifyNoMoreInteractions(callback);
-
-        // pass second list with full data
-        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 0));
-        verifyNoMoreInteractions(callback);
-        drain();
-        verify(callback).onInserted(25, 1);
-        verifyNoMoreInteractions(callback);
-        assertEquals(helper.getItemCount(), 26);
-
-        // finally, clear (immediate)
-        helper.setList(null);
-        verify(callback).onRemoved(0, 26);
-        verifyNoMoreInteractions(callback);
-        drain();
-        verifyNoMoreInteractions(callback);
-    }
-
-    @Test
-    public void newPageWhileDiffing() {
-        PagedList.Config config = new PagedList.Config.Builder()
-                .setInitialLoadSizeHint(4)
-                .setPageSize(2)
-                .setPrefetchDistance(2)
-                .build();
-
-        final ListUpdateCallback callback = mock(ListUpdateCallback.class);
-        PagedListAdapterHelper<String> helper = createHelper(callback, STRING_DIFF_CALLBACK);
-
-        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2));
-        verify(callback).onInserted(0, ALPHABET_LIST.size());
-        verifyNoMoreInteractions(callback);
-        drain();
-        verifyNoMoreInteractions(callback);
-        assertNotNull(helper.getCurrentList());
-        assertFalse(helper.getCurrentList().isImmutable());
-
-        // trigger page loading
-        helper.getItem(10);
-        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2));
-        verifyNoMoreInteractions(callback);
-
-        // drain page fetching, but list became immutable, page will be ignored
-        drainExceptDiffThread();
-        verifyNoMoreInteractions(callback);
-        assertNotNull(helper.getCurrentList());
-        assertTrue(helper.getCurrentList().isImmutable());
-
-        // finally full drain, which signals nothing, since 1st pagedlist == 2nd pagedlist
-        drain();
-        verifyNoMoreInteractions(callback);
-        assertNotNull(helper.getCurrentList());
-        assertFalse(helper.getCurrentList().isImmutable());
-    }
-
-    private void drainExceptDiffThread() {
-        boolean executed;
-        do {
-            executed = mPageLoadingThread.executeAll();
-            executed |= mMainThread.executeAll();
-        } while (executed);
-    }
-
-    private void drain() {
-        boolean executed;
-        do {
-            executed = mPageLoadingThread.executeAll();
-            executed |= mDiffThread.executeAll();
-            executed |= mMainThread.executeAll();
-        } while (executed);
-    }
-}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/PagedListAdapterHelperTest.kt b/paging/runtime/src/androidTest/java/android/arch/paging/PagedListAdapterHelperTest.kt
new file mode 100644
index 0000000..735a61f
--- /dev/null
+++ b/paging/runtime/src/androidTest/java/android/arch/paging/PagedListAdapterHelperTest.kt
@@ -0,0 +1,342 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.paging
+
+import android.support.test.filters.SmallTest
+import android.support.v7.recyclerview.extensions.DiffCallback
+import android.support.v7.recyclerview.extensions.ListAdapterConfig
+import android.support.v7.util.ListUpdateCallback
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertNull
+import org.junit.Assert.assertTrue
+import org.junit.Assert.fail
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.Mockito.verifyZeroInteractions
+
+@SmallTest
+@RunWith(JUnit4::class)
+class PagedListAdapterHelperTest {
+    private val mMainThread = TestExecutor()
+    private val mDiffThread = TestExecutor()
+    private val mPageLoadingThread = TestExecutor()
+
+
+    private fun <T> createHelper(
+            listUpdateCallback: ListUpdateCallback, diffCallback: DiffCallback<T>): PagedListAdapterHelper<T> {
+        return PagedListAdapterHelper(listUpdateCallback,
+                ListAdapterConfig.Builder<T>()
+                        .setDiffCallback(diffCallback)
+                        .setMainThreadExecutor(mMainThread)
+                        .setBackgroundThreadExecutor(mDiffThread)
+                        .build())
+    }
+
+    private fun <V> createPagedListFromListAndPos(
+            config: PagedList.Config, data: List<V>, initialKey: Int): PagedList<V> {
+        return PagedList.Builder<Int, V>()
+                .setInitialKey(initialKey)
+                .setConfig(config)
+                .setMainThreadExecutor(mMainThread)
+                .setBackgroundThreadExecutor(mPageLoadingThread)
+                .setDataSource(ListDataSource(data))
+                .build()
+    }
+
+    @Test
+    fun initialState() {
+        val callback = mock(ListUpdateCallback::class.java)
+        val helper = createHelper(callback, STRING_DIFF_CALLBACK)
+        assertEquals(null, helper.currentList)
+        assertEquals(0, helper.itemCount)
+        verifyZeroInteractions(callback)
+    }
+
+    @Test
+    fun setFullList() {
+        val callback = mock(ListUpdateCallback::class.java)
+        val helper = createHelper(callback, STRING_DIFF_CALLBACK)
+        helper.setList(StringPagedList(0, 0, "a", "b"))
+
+        assertEquals(2, helper.itemCount)
+        assertEquals("a", helper.getItem(0))
+        assertEquals("b", helper.getItem(1))
+
+        verify(callback).onInserted(0, 2)
+        verifyNoMoreInteractions(callback)
+        drain()
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test(expected = IndexOutOfBoundsException::class)
+    fun getEmpty() {
+        val helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK)
+        helper.getItem(0)
+    }
+
+    @Test(expected = IndexOutOfBoundsException::class)
+    fun getNegative() {
+        val helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK)
+        helper.setList(StringPagedList(0, 0, "a", "b"))
+        helper.getItem(-1)
+    }
+
+    @Test(expected = IndexOutOfBoundsException::class)
+    fun getPastEnd() {
+        val helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK)
+        helper.setList(StringPagedList(0, 0, "a", "b"))
+        helper.getItem(2)
+    }
+
+    @Test
+    fun simpleStatic() {
+        val callback = mock(ListUpdateCallback::class.java)
+        val helper = createHelper(callback, STRING_DIFF_CALLBACK)
+
+        assertEquals(0, helper.itemCount)
+
+        helper.setList(StringPagedList(2, 2, "a", "b"))
+
+        verify(callback).onInserted(0, 6)
+        verifyNoMoreInteractions(callback)
+        assertEquals(6, helper.itemCount)
+
+        assertNull(helper.getItem(0))
+        assertNull(helper.getItem(1))
+        assertEquals("a", helper.getItem(2))
+        assertEquals("b", helper.getItem(3))
+        assertNull(helper.getItem(4))
+        assertNull(helper.getItem(5))
+    }
+
+    @Test
+    fun pagingInContent() {
+        val config = PagedList.Config.Builder()
+                .setInitialLoadSizeHint(4)
+                .setPageSize(2)
+                .setPrefetchDistance(2)
+                .build()
+
+        val callback = mock(ListUpdateCallback::class.java)
+        val helper = createHelper(callback, STRING_DIFF_CALLBACK)
+
+        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
+        verify(callback).onInserted(0, ALPHABET_LIST.size)
+        verifyNoMoreInteractions(callback)
+        drain()
+        verifyNoMoreInteractions(callback)
+
+        // get without triggering prefetch...
+        helper.getItem(1)
+        verifyNoMoreInteractions(callback)
+        drain()
+        verifyNoMoreInteractions(callback)
+
+        // get triggering prefetch...
+        helper.getItem(2)
+        verifyNoMoreInteractions(callback)
+        drain()
+        verify(callback).onChanged(4, 2, null)
+        verifyNoMoreInteractions(callback)
+
+        // get with no data loaded nearby...
+        helper.getItem(12)
+        verifyNoMoreInteractions(callback)
+        drain()
+        verify(callback).onChanged(10, 2, null)
+        verify(callback).onChanged(12, 2, null)
+        verify(callback).onChanged(14, 2, null)
+        verifyNoMoreInteractions(callback)
+
+        // finally, clear
+        helper.setList(null)
+        verify(callback).onRemoved(0, 26)
+        drain()
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun simpleSwap() {
+        // Page size large enough to load
+        val config = PagedList.Config.Builder()
+                .setPageSize(50)
+                .build()
+
+        val callback = mock(ListUpdateCallback::class.java)
+        val helper = createHelper(callback, STRING_DIFF_CALLBACK)
+
+        // initial list missing one item (immediate)
+        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST.subList(0, 25), 0))
+        verify(callback).onInserted(0, 25)
+        verifyNoMoreInteractions(callback)
+        assertEquals(helper.itemCount, 25)
+        drain()
+        verifyNoMoreInteractions(callback)
+
+        // pass second list with full data
+        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 0))
+        verifyNoMoreInteractions(callback)
+        drain()
+        verify(callback).onInserted(25, 1)
+        verifyNoMoreInteractions(callback)
+        assertEquals(helper.itemCount, 26)
+
+        // finally, clear (immediate)
+        helper.setList(null)
+        verify(callback).onRemoved(0, 26)
+        verifyNoMoreInteractions(callback)
+        drain()
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun newPageWhileDiffing() {
+        val config = PagedList.Config.Builder()
+                .setInitialLoadSizeHint(4)
+                .setPageSize(2)
+                .setPrefetchDistance(2)
+                .build()
+
+        val callback = mock(ListUpdateCallback::class.java)
+        val helper = createHelper(callback, STRING_DIFF_CALLBACK)
+
+        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
+        verify(callback).onInserted(0, ALPHABET_LIST.size)
+        verifyNoMoreInteractions(callback)
+        drain()
+        verifyNoMoreInteractions(callback)
+        assertNotNull(helper.currentList)
+        assertFalse(helper.currentList!!.isImmutable)
+
+        // trigger page loading
+        helper.getItem(10)
+        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
+        verifyNoMoreInteractions(callback)
+
+        // drain page fetching, but list became immutable, page will be ignored
+        drainExceptDiffThread()
+        verifyNoMoreInteractions(callback)
+        assertNotNull(helper.currentList)
+        assertTrue(helper.currentList!!.isImmutable)
+
+        // finally full drain, which signals nothing, since 1st pagedlist == 2nd pagedlist
+        drain()
+        verifyNoMoreInteractions(callback)
+        assertNotNull(helper.currentList)
+        assertFalse(helper.currentList!!.isImmutable)
+    }
+
+    @Test
+    fun itemCountUpdatedBeforeListUpdateCallbacks() {
+        // verify that itemCount is updated in the helper before dispatching ListUpdateCallbacks
+
+        val expectedCount = intArrayOf(0)
+        // provides access to helper, which must be constructed after callback
+        val helperAccessor = arrayOf<PagedListAdapterHelper<*>?>(null)
+
+        val callback = object : ListUpdateCallback {
+            override fun onInserted(position: Int, count: Int) {
+                assertEquals(expectedCount[0], helperAccessor[0]!!.itemCount)
+            }
+
+            override fun onRemoved(position: Int, count: Int) {
+                assertEquals(expectedCount[0], helperAccessor[0]!!.itemCount)
+            }
+
+            override fun onMoved(fromPosition: Int, toPosition: Int) {
+                fail("not expected")
+            }
+
+            override fun onChanged(position: Int, count: Int, payload: Any) {
+                fail("not expected")
+            }
+        }
+
+        val helper = createHelper(callback, STRING_DIFF_CALLBACK)
+        helperAccessor[0] = helper
+
+        val config = PagedList.Config.Builder()
+                .setPageSize(20)
+                .build()
+
+        // in the fast-add case...
+        expectedCount[0] = 5
+        assertEquals(0, helper.itemCount)
+        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST.subList(0, 5), 0))
+        assertEquals(5, helper.itemCount)
+
+        // in the slow, diff on BG thread case...
+        expectedCount[0] = 10
+        assertEquals(5, helper.itemCount)
+        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST.subList(0, 10), 0))
+        drain()
+        assertEquals(10, helper.itemCount)
+
+        // and in the fast-remove case
+        expectedCount[0] = 0
+        assertEquals(10, helper.itemCount)
+        helper.setList(null)
+        assertEquals(0, helper.itemCount)
+    }
+
+    private fun drainExceptDiffThread() {
+        var executed: Boolean
+        do {
+            executed = mPageLoadingThread.executeAll()
+            executed = mMainThread.executeAll() or executed
+        } while (executed)
+    }
+
+    private fun drain() {
+        var executed: Boolean
+        do {
+            executed = mPageLoadingThread.executeAll()
+            executed = mDiffThread.executeAll() or executed
+            executed = mMainThread.executeAll() or executed
+        } while (executed)
+    }
+
+    companion object {
+        private val ALPHABET_LIST = List(26) { "" + 'a' + it }
+
+        private val STRING_DIFF_CALLBACK = object : DiffCallback<String>() {
+            override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
+                return oldItem == newItem
+            }
+
+            override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
+                return oldItem == newItem
+            }
+        }
+
+        private val IGNORE_CALLBACK = object : ListUpdateCallback {
+            override fun onInserted(position: Int, count: Int) {}
+
+            override fun onRemoved(position: Int, count: Int) {}
+
+            override fun onMoved(fromPosition: Int, toPosition: Int) {}
+
+            override fun onChanged(position: Int, count: Int, payload: Any) {}
+        }
+    }
+}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/PagedStorageDiffHelperTest.kt b/paging/runtime/src/androidTest/java/android/arch/paging/PagedStorageDiffHelperTest.kt
new file mode 100644
index 0000000..64501f7
--- /dev/null
+++ b/paging/runtime/src/androidTest/java/android/arch/paging/PagedStorageDiffHelperTest.kt
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.paging
+
+import android.support.test.filters.SmallTest
+import android.support.v7.recyclerview.extensions.DiffCallback
+import android.support.v7.util.ListUpdateCallback
+import junit.framework.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.Mockito.verifyZeroInteractions
+
+@SmallTest
+@RunWith(JUnit4::class)
+class PagedStorageDiffHelperTest {
+
+    @Test
+    fun sameListNoUpdates() {
+        validateTwoListDiff(
+                PagedStorage(5, createPage("a", "b", "c"), 5),
+                PagedStorage(5, createPage("a", "b", "c"), 5)) {
+            verifyZeroInteractions(it)
+        }
+    }
+
+    @Test
+    fun sameListNoUpdatesPlaceholder() {
+        val storageNoPlaceholder = PagedStorage(0, createPage("a", "b", "c"), 10)
+
+        val storageWithPlaceholder = PagedStorage(0, createPage("a", "b", "c"), 10)
+        storageWithPlaceholder.allocatePlaceholders(3, 0, 3,
+                /* ignored */ mock(PagedStorage.Callback::class.java))
+
+        // even though one has placeholders, and null counts are different...
+        assertEquals(10, storageNoPlaceholder.trailingNullCount)
+        assertEquals(7, storageWithPlaceholder.trailingNullCount)
+
+        // ... should be no interactions, since content still same
+        validateTwoListDiff(
+                storageNoPlaceholder,
+                storageWithPlaceholder) {
+            verifyZeroInteractions(it)
+        }
+    }
+
+    @Test
+    fun appendFill() {
+        validateTwoListDiff(
+                PagedStorage(5, createPage("a", "b"), 5),
+                PagedStorage(5, createPage("a", "b", "c"), 4)) {
+            verify(it).onRemoved(11, 1)
+            verify(it).onInserted(7, 1)
+            // NOTE: ideally would be onChanged(7, 1, null)
+            verifyNoMoreInteractions(it)
+        }
+    }
+
+    @Test
+    fun prependFill() {
+        validateTwoListDiff(
+                PagedStorage(5, createPage("b", "c"), 5),
+                PagedStorage(4, createPage("a", "b", "c"), 5)) {
+            verify(it).onRemoved(0, 1)
+            verify(it).onInserted(4, 1)
+            //NOTE: ideally would be onChanged(4, 1, null);
+            verifyNoMoreInteractions(it)
+        }
+    }
+
+    @Test
+    fun change() {
+        validateTwoListDiff(
+                PagedStorage(5, createPage("a1", "b1", "c1"), 5),
+                PagedStorage(5, createPage("a2", "b1", "c2"), 5)) {
+            verify(it).onChanged(5, 1, null)
+            verify(it).onChanged(7, 1, null)
+            verifyNoMoreInteractions(it)
+        }
+    }
+
+    companion object {
+        private val DIFF_CALLBACK = object : DiffCallback<String>() {
+            override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
+                // first char means same item
+                return oldItem[0] == newItem[0]
+            }
+
+            override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
+                return oldItem == newItem
+            }
+        }
+
+        private fun createPage(vararg items: String): Page<Int, String> {
+            return Page(items.toList())
+        }
+
+        private fun validateTwoListDiff(oldList: PagedStorage<*, String>,
+                                        newList: PagedStorage<*, String>,
+                                        validator: (callback: ListUpdateCallback) -> Unit) {
+            val diffResult = PagedStorageDiffHelper.computeDiff(
+                    oldList, newList, DIFF_CALLBACK)
+
+            val listUpdateCallback = mock(ListUpdateCallback::class.java)
+            PagedStorageDiffHelper.dispatchDiff(listUpdateCallback, oldList, newList, diffResult)
+
+            validator(listUpdateCallback)
+        }
+    }
+}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.kt b/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.kt
new file mode 100644
index 0000000..c2e5ec7
--- /dev/null
+++ b/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.paging
+
+class StringPagedList constructor(leadingNulls: Int, trailingNulls: Int, vararg items: String)
+        : PagedList<String>(PagedStorage<Int, String>(), TestExecutor(), TestExecutor(), null,
+                PagedList.Config.Builder().setPageSize(1).build()), PagedStorage.Callback {
+    init {
+        @Suppress("UNCHECKED_CAST")
+        val keyedStorage = mStorage as PagedStorage<Int, String>
+        keyedStorage.init(leadingNulls,
+                Page<Int, String>(null, items.toList(), null),
+                trailingNulls,
+                0,
+                this)
+    }
+
+    internal override fun isContiguous(): Boolean {
+        return true
+    }
+
+    override fun getLastKey(): Any? {
+        return null
+    }
+
+    override fun dispatchUpdatesSinceSnapshot(storageSnapshot: PagedList<String>,
+            callback: PagedList.Callback) {
+    }
+
+    override fun loadAroundInternal(index: Int) {}
+
+    override fun onInitialized(count: Int) {}
+
+    override fun onPagePrepended(leadingNulls: Int, changed: Int, added: Int) {}
+
+    override fun onPageAppended(endPosition: Int, changed: Int, added: Int) {}
+
+    override fun onPagePlaceholderInserted(pageIndex: Int) {}
+
+    override fun onPageInserted(start: Int, count: Int) {}
+}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/TestExecutor.java b/paging/runtime/src/androidTest/java/android/arch/paging/TestExecutor.java
deleted file mode 100644
index 976f7df..0000000
--- a/paging/runtime/src/androidTest/java/android/arch/paging/TestExecutor.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.paging;
-
-import android.support.annotation.NonNull;
-
-import java.util.LinkedList;
-import java.util.Queue;
-import java.util.concurrent.Executor;
-
-public class TestExecutor implements Executor {
-    private Queue<Runnable> mTasks = new LinkedList<>();
-
-    @Override
-    public void execute(@NonNull Runnable command) {
-        mTasks.add(command);
-    }
-
-    public boolean executeAll() {
-        boolean consumed = !mTasks.isEmpty();
-        Runnable task;
-        while ((task = mTasks.poll()) != null) {
-            task.run();
-        }
-        return consumed;
-    }
-}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/TestExecutor.kt b/paging/runtime/src/androidTest/java/android/arch/paging/TestExecutor.kt
new file mode 100644
index 0000000..34e9787
--- /dev/null
+++ b/paging/runtime/src/androidTest/java/android/arch/paging/TestExecutor.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.paging
+
+import java.util.LinkedList
+import java.util.concurrent.Executor
+
+class TestExecutor : Executor {
+    private val mTasks = LinkedList<Runnable>()
+
+    override fun execute(command: Runnable) {
+        mTasks.add(command)
+    }
+
+    fun executeAll(): Boolean {
+        val consumed = !mTasks.isEmpty()
+
+        var task = mTasks.poll()
+        while (task != null) {
+            task.run()
+            task = mTasks.poll()
+        }
+        return consumed
+    }
+}
\ No newline at end of file
diff --git a/paging/runtime/src/androidTest/java/android/support/v7/recyclerview/extensions/ListAdapterHelperTest.java b/paging/runtime/src/androidTest/java/android/support/v7/recyclerview/extensions/ListAdapterHelperTest.java
deleted file mode 100644
index aab7417..0000000
--- a/paging/runtime/src/androidTest/java/android/support/v7/recyclerview/extensions/ListAdapterHelperTest.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v7.recyclerview.extensions;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-
-import android.arch.paging.TestExecutor;
-import android.support.annotation.NonNull;
-import android.support.test.filters.SmallTest;
-import android.support.v7.util.ListUpdateCallback;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.util.Arrays;
-
-@SmallTest
-@RunWith(JUnit4.class)
-public class ListAdapterHelperTest {
-    private TestExecutor mMainThread = new TestExecutor();
-    private TestExecutor mBackgroundThread = new TestExecutor();
-
-
-    private static final DiffCallback<String> STRING_DIFF_CALLBACK = new DiffCallback<String>() {
-        @Override
-        public boolean areItemsTheSame(@NonNull String oldItem, @NonNull String newItem) {
-            return oldItem.equals(newItem);
-        }
-
-        @Override
-        public boolean areContentsTheSame(@NonNull String oldItem, @NonNull String newItem) {
-            return oldItem.equals(newItem);
-        }
-    };
-
-    private static final ListUpdateCallback IGNORE_CALLBACK = new ListUpdateCallback() {
-        @Override
-        public void onInserted(int position, int count) {
-        }
-
-        @Override
-        public void onRemoved(int position, int count) {
-        }
-
-        @Override
-        public void onMoved(int fromPosition, int toPosition) {
-        }
-
-        @Override
-        public void onChanged(int position, int count, Object payload) {
-        }
-    };
-
-
-    private <T> ListAdapterHelper<T> createHelper(
-            ListUpdateCallback listUpdateCallback, DiffCallback<T> diffCallback) {
-        return new ListAdapterHelper<T>(listUpdateCallback,
-                new ListAdapterConfig.Builder<T>()
-                        .setDiffCallback(diffCallback)
-                        .setMainThreadExecutor(mMainThread)
-                        .setBackgroundThreadExecutor(mBackgroundThread)
-                        .build());
-    }
-
-    @Test
-    public void initialState() {
-        ListUpdateCallback callback = mock(ListUpdateCallback.class);
-        ListAdapterHelper<String> helper = createHelper(callback, STRING_DIFF_CALLBACK);
-        assertEquals(0, helper.getItemCount());
-        verifyZeroInteractions(callback);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void getEmpty() {
-        ListAdapterHelper<String> helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK);
-        helper.getItem(0);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void getNegative() {
-        ListAdapterHelper<String> helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK);
-        helper.setList(Arrays.asList("a", "b"));
-        helper.getItem(-1);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void getPastEnd() {
-        ListAdapterHelper<String> helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK);
-        helper.setList(Arrays.asList("a", "b"));
-        helper.getItem(2);
-    }
-
-    @Test
-    public void setListSimple() {
-        ListUpdateCallback callback = mock(ListUpdateCallback.class);
-        ListAdapterHelper<String> helper = createHelper(callback, STRING_DIFF_CALLBACK);
-
-        helper.setList(Arrays.asList("a", "b"));
-
-        assertEquals(2, helper.getItemCount());
-        assertEquals("a", helper.getItem(0));
-        assertEquals("b", helper.getItem(1));
-
-        verify(callback).onInserted(0, 2);
-        verifyNoMoreInteractions(callback);
-        drain();
-        verifyNoMoreInteractions(callback);
-    }
-
-    @Test
-    public void setListUpdate() {
-        ListUpdateCallback callback = mock(ListUpdateCallback.class);
-        ListAdapterHelper<String> helper = createHelper(callback, STRING_DIFF_CALLBACK);
-
-        // initial list (immediate)
-        helper.setList(Arrays.asList("a", "b"));
-        verify(callback).onInserted(0, 2);
-        verifyNoMoreInteractions(callback);
-        drain();
-        verifyNoMoreInteractions(callback);
-
-        // update (deferred)
-        helper.setList(Arrays.asList("a", "b", "c"));
-        verifyNoMoreInteractions(callback);
-        drain();
-        verify(callback).onInserted(2, 1);
-        verifyNoMoreInteractions(callback);
-
-        // clear (immediate)
-        helper.setList(null);
-        verify(callback).onRemoved(0, 3);
-        verifyNoMoreInteractions(callback);
-        drain();
-        verifyNoMoreInteractions(callback);
-
-    }
-
-    private void drain() {
-        boolean executed;
-        do {
-            executed = mBackgroundThread.executeAll();
-            executed |= mMainThread.executeAll();
-        } while (executed);
-    }
-}
diff --git a/paging/runtime/src/androidTest/java/android/support/v7/recyclerview/extensions/ListAdapterHelperTest.kt b/paging/runtime/src/androidTest/java/android/support/v7/recyclerview/extensions/ListAdapterHelperTest.kt
new file mode 100644
index 0000000..4c06f25
--- /dev/null
+++ b/paging/runtime/src/androidTest/java/android/support/v7/recyclerview/extensions/ListAdapterHelperTest.kt
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v7.recyclerview.extensions
+
+import android.arch.paging.TestExecutor
+import android.support.test.filters.SmallTest
+import android.support.v7.util.ListUpdateCallback
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.Mockito.verifyZeroInteractions
+
+@SmallTest
+@RunWith(JUnit4::class)
+class ListAdapterHelperTest {
+    private val mMainThread = TestExecutor()
+    private val mBackgroundThread = TestExecutor()
+
+    private fun <T> createHelper(
+            listUpdateCallback: ListUpdateCallback, diffCallback: DiffCallback<T>): ListAdapterHelper<T> {
+        return ListAdapterHelper(listUpdateCallback,
+                ListAdapterConfig.Builder<T>()
+                        .setDiffCallback(diffCallback)
+                        .setMainThreadExecutor(mMainThread)
+                        .setBackgroundThreadExecutor(mBackgroundThread)
+                        .build())
+    }
+
+    @Test
+    fun initialState() {
+        val callback = mock(ListUpdateCallback::class.java)
+        val helper = createHelper(callback, STRING_DIFF_CALLBACK)
+        assertEquals(0, helper.itemCount)
+        verifyZeroInteractions(callback)
+    }
+
+    @Test(expected = IndexOutOfBoundsException::class)
+    fun getEmpty() {
+        val helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK)
+        helper.getItem(0)
+    }
+
+    @Test(expected = IndexOutOfBoundsException::class)
+    fun getNegative() {
+        val helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK)
+        helper.setList(listOf("a", "b"))
+        helper.getItem(-1)
+    }
+
+    @Test(expected = IndexOutOfBoundsException::class)
+    fun getPastEnd() {
+        val helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK)
+        helper.setList(listOf("a", "b"))
+        helper.getItem(2)
+    }
+
+    @Test
+    fun setListSimple() {
+        val callback = mock(ListUpdateCallback::class.java)
+        val helper = createHelper(callback, STRING_DIFF_CALLBACK)
+
+        helper.setList(listOf("a", "b"))
+
+        assertEquals(2, helper.itemCount)
+        assertEquals("a", helper.getItem(0))
+        assertEquals("b", helper.getItem(1))
+
+        verify(callback).onInserted(0, 2)
+        verifyNoMoreInteractions(callback)
+        drain()
+        verifyNoMoreInteractions(callback)
+    }
+
+    @Test
+    fun setListUpdate() {
+        val callback = mock(ListUpdateCallback::class.java)
+        val helper = createHelper(callback, STRING_DIFF_CALLBACK)
+
+        // initial list (immediate)
+        helper.setList(listOf("a", "b"))
+        verify(callback).onInserted(0, 2)
+        verifyNoMoreInteractions(callback)
+        drain()
+        verifyNoMoreInteractions(callback)
+
+        // update (deferred)
+        helper.setList(listOf("a", "b", "c"))
+        verifyNoMoreInteractions(callback)
+        drain()
+        verify(callback).onInserted(2, 1)
+        verifyNoMoreInteractions(callback)
+
+        // clear (immediate)
+        helper.setList(null)
+        verify(callback).onRemoved(0, 3)
+        verifyNoMoreInteractions(callback)
+        drain()
+        verifyNoMoreInteractions(callback)
+
+    }
+
+    private fun drain() {
+        var executed: Boolean
+        do {
+            executed = mBackgroundThread.executeAll()
+            executed = mMainThread.executeAll() or executed
+        } while (executed)
+    }
+
+    companion object {
+        private val STRING_DIFF_CALLBACK = object : DiffCallback<String>() {
+            override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
+                return oldItem == newItem
+            }
+
+            override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
+                return oldItem == newItem
+            }
+        }
+
+        private val IGNORE_CALLBACK = object : ListUpdateCallback {
+            override fun onInserted(position: Int, count: Int) {}
+
+            override fun onRemoved(position: Int, count: Int) {}
+
+            override fun onMoved(fromPosition: Int, toPosition: Int) {}
+
+            override fun onChanged(position: Int, count: Int, payload: Any) {}
+        }
+    }
+}
diff --git a/paging/runtime/src/main/AndroidManifest.xml b/paging/runtime/src/main/AndroidManifest.xml
index 8bf5de9..dfc4bdf 100644
--- a/paging/runtime/src/main/AndroidManifest.xml
+++ b/paging/runtime/src/main/AndroidManifest.xml
@@ -16,8 +16,4 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.paging.runtime">
-    <application>
-        <meta-data android:name="android.arch.paging.runtime.VERSION"
-                   android:value="${version}" />
-    </application>
 </manifest>
diff --git a/paging/runtime/src/main/java/android/arch/paging/LivePagedListBuilder.java b/paging/runtime/src/main/java/android/arch/paging/LivePagedListBuilder.java
new file mode 100644
index 0000000..ee1810b
--- /dev/null
+++ b/paging/runtime/src/main/java/android/arch/paging/LivePagedListBuilder.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.paging;
+
+import android.arch.core.executor.ArchTaskExecutor;
+import android.arch.lifecycle.ComputableLiveData;
+import android.arch.lifecycle.LiveData;
+import android.support.annotation.AnyThread;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import java.util.concurrent.Executor;
+
+public class LivePagedListBuilder<Key, Value> {
+    private Key mInitialLoadKey;
+    private PagedList.Config mConfig;
+    private DataSource.Factory<Key, Value> mDataSourceFactory;
+    private PagedList.BoundaryCallback mBoundaryCallback;
+    private Executor mMainThreadExecutor;
+    private Executor mBackgroundThreadExecutor;
+
+    @SuppressWarnings("WeakerAccess")
+    @NonNull
+    public LivePagedListBuilder<Key, Value> setInitialLoadKey(@Nullable Key key) {
+        mInitialLoadKey = key;
+        return this;
+    }
+
+    @SuppressWarnings("WeakerAccess")
+    @NonNull
+    public LivePagedListBuilder<Key, Value> setPagingConfig(@NonNull PagedList.Config config) {
+        mConfig = config;
+        return this;
+    }
+
+    @SuppressWarnings("WeakerAccess")
+    @NonNull
+    public LivePagedListBuilder<Key, Value> setPagingConfig(int pageSize) {
+        mConfig = new PagedList.Config.Builder().setPageSize(pageSize).build();
+        return this;
+    }
+
+    @NonNull
+    public LivePagedListBuilder<Key, Value> setDataSourceFactory(
+            @NonNull DataSource.Factory<Key, Value> dataSourceFactory) {
+        mDataSourceFactory = dataSourceFactory;
+        return this;
+    }
+
+    @SuppressWarnings("unused")
+    @NonNull
+    public LivePagedListBuilder<Key, Value> setBoundaryCallback(
+            @Nullable PagedList.BoundaryCallback<Value> boundaryCallback) {
+        mBoundaryCallback = boundaryCallback;
+        return this;
+    }
+
+    @SuppressWarnings("unused")
+    @NonNull
+    public LivePagedListBuilder<Key, Value> setMainThreadExecutor(
+            @NonNull Executor mainThreadExecutor) {
+        mMainThreadExecutor = mainThreadExecutor;
+        return this;
+    }
+
+    @SuppressWarnings("unused")
+    @NonNull
+    public LivePagedListBuilder<Key, Value> setBackgroundThreadExecutor(
+            @NonNull Executor backgroundThreadExecutor) {
+        mBackgroundThreadExecutor = backgroundThreadExecutor;
+        return this;
+    }
+
+    @NonNull
+    public LiveData<PagedList<Value>> build() {
+        if (mConfig == null) {
+            throw new IllegalArgumentException("PagedList.Config must be provided");
+        }
+        if (mDataSourceFactory == null) {
+            throw new IllegalArgumentException("DataSource.Factory must be provided");
+        }
+        if (mMainThreadExecutor == null) {
+            mMainThreadExecutor = ArchTaskExecutor.getMainThreadExecutor();
+        }
+        if (mBackgroundThreadExecutor == null) {
+            mBackgroundThreadExecutor = ArchTaskExecutor.getIOThreadExecutor();
+        }
+
+        return create(mInitialLoadKey, mConfig, mBoundaryCallback, mDataSourceFactory,
+                mMainThreadExecutor, mBackgroundThreadExecutor);
+    }
+
+    @AnyThread
+    @NonNull
+    public static <Key, Value> LiveData<PagedList<Value>> create(
+            @Nullable final Key initialLoadKey,
+            @NonNull final PagedList.Config config,
+            @Nullable final PagedList.BoundaryCallback boundaryCallback,
+            @NonNull final DataSource.Factory<Key, Value> dataSourceFactory,
+            @NonNull final Executor mainThreadExecutor,
+            @NonNull final Executor backgroundThreadExecutor) {
+        return new ComputableLiveData<PagedList<Value>>() {
+            @Nullable
+            private PagedList<Value> mList;
+            @Nullable
+            private DataSource<Key, Value> mDataSource;
+
+            private final DataSource.InvalidatedCallback mCallback =
+                    new DataSource.InvalidatedCallback() {
+                        @Override
+                        public void onInvalidated() {
+                            invalidate();
+                        }
+                    };
+
+            @Override
+            protected PagedList<Value> compute() {
+                @Nullable Key initializeKey = initialLoadKey;
+                if (mList != null) {
+                    //noinspection unchecked
+                    initializeKey = (Key) mList.getLastKey();
+                }
+
+                do {
+                    if (mDataSource != null) {
+                        mDataSource.removeInvalidatedCallback(mCallback);
+                    }
+
+                    mDataSource = dataSourceFactory.create();
+                    mDataSource.addInvalidatedCallback(mCallback);
+
+                    mList = new PagedList.Builder<Key, Value>()
+                            .setDataSource(mDataSource)
+                            .setMainThreadExecutor(mainThreadExecutor)
+                            .setBackgroundThreadExecutor(backgroundThreadExecutor)
+                            .setBoundaryCallback(boundaryCallback)
+                            .setConfig(config)
+                            .setInitialKey(initializeKey)
+                            .build();
+                } while (mList.isDetached());
+                return mList;
+            }
+        }.getLiveData();
+    }
+}
diff --git a/paging/runtime/src/main/java/android/arch/paging/LivePagedListProvider.java b/paging/runtime/src/main/java/android/arch/paging/LivePagedListProvider.java
index 1250aa1..e0a03cb 100644
--- a/paging/runtime/src/main/java/android/arch/paging/LivePagedListProvider.java
+++ b/paging/runtime/src/main/java/android/arch/paging/LivePagedListProvider.java
@@ -16,8 +16,6 @@
 
 package android.arch.paging;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
-import android.arch.lifecycle.ComputableLiveData;
 import android.arch.lifecycle.LiveData;
 import android.support.annotation.AnyThread;
 import android.support.annotation.NonNull;
@@ -53,8 +51,23 @@
  * @see PagedListAdapter
  * @see DataSource
  * @see PagedList
+ *
+ * @deprecated To construct a {@code LiveData<PagedList>}, use {@link LivePagedListBuilder}, which
+ * provides the same construction capability with more customization, and better defaults. The role
+ * of DataSource construction has been separated out to {@link DataSource.Factory} to access or
+ * provide a self-invalidating sequence of DataSources. If you were acquiring this from Room, you
+ * can switch to having your Dao return a {@link DataSource.Factory} instead, and create a LiveData
+ * of PagedList with a {@link LivePagedListBuilder}.
  */
-public abstract class LivePagedListProvider<Key, Value> {
+// NOTE: Room 1.0 depends on this class, so it should not be removed
+// until Room switches to using DataSource.Factory directly
+@Deprecated
+public abstract class LivePagedListProvider<Key, Value> implements DataSource.Factory<Key, Value> {
+
+    @Override
+    public DataSource<Key, Value> create() {
+        return createDataSource();
+    }
 
     /**
      * Construct a new data source to be wrapped in a new PagedList, which will be returned
@@ -80,10 +93,11 @@
     @AnyThread
     @NonNull
     public LiveData<PagedList<Value>> create(@Nullable Key initialLoadKey, int pageSize) {
-        return create(initialLoadKey,
-                new PagedList.Config.Builder()
-                        .setPageSize(pageSize)
-                        .build());
+        return new LivePagedListBuilder<Key, Value>()
+                .setInitialLoadKey(initialLoadKey)
+                .setPagingConfig(pageSize)
+                .setDataSourceFactory(this)
+                .build();
     }
 
     /**
@@ -100,49 +114,12 @@
      */
     @AnyThread
     @NonNull
-    public LiveData<PagedList<Value>> create(@Nullable final Key initialLoadKey,
-            final PagedList.Config config) {
-        return new ComputableLiveData<PagedList<Value>>() {
-            @Nullable
-            private PagedList<Value> mList;
-            @Nullable
-            private DataSource<Key, Value> mDataSource;
-
-            private final DataSource.InvalidatedCallback mCallback =
-                    new DataSource.InvalidatedCallback() {
-                @Override
-                public void onInvalidated() {
-                    invalidate();
-                }
-            };
-
-            @Override
-            protected PagedList<Value> compute() {
-                @Nullable Key initializeKey = initialLoadKey;
-                if (mList != null) {
-                    //noinspection unchecked
-                    initializeKey = (Key) mList.getLastKey();
-                }
-
-                do {
-                    if (mDataSource != null) {
-                        mDataSource.removeInvalidatedCallback(mCallback);
-                    }
-
-                    mDataSource = createDataSource();
-                    mDataSource.addInvalidatedCallback(mCallback);
-
-                    mList = new PagedList.Builder<Key, Value>()
-                            .setDataSource(mDataSource)
-                            .setMainThreadExecutor(AppToolkitTaskExecutor.getMainThreadExecutor())
-                            .setBackgroundThreadExecutor(
-                                    AppToolkitTaskExecutor.getIOThreadExecutor())
-                            .setConfig(config)
-                            .setInitialKey(initializeKey)
-                            .build();
-                } while (mList.isDetached());
-                return mList;
-            }
-        }.getLiveData();
+    public LiveData<PagedList<Value>> create(@Nullable Key initialLoadKey,
+            @NonNull PagedList.Config config) {
+        return new LivePagedListBuilder<Key, Value>()
+                .setInitialLoadKey(initialLoadKey)
+                .setPagingConfig(config)
+                .setDataSourceFactory(this)
+                .build();
     }
 }
diff --git a/paging/runtime/src/main/java/android/arch/paging/PagedListAdapter.java b/paging/runtime/src/main/java/android/arch/paging/PagedListAdapter.java
index 93c02ea..89b9c2e 100644
--- a/paging/runtime/src/main/java/android/arch/paging/PagedListAdapter.java
+++ b/paging/runtime/src/main/java/android/arch/paging/PagedListAdapter.java
@@ -113,6 +113,13 @@
 public abstract class PagedListAdapter<T, VH extends RecyclerView.ViewHolder>
         extends RecyclerView.Adapter<VH> {
     private final PagedListAdapterHelper<T> mHelper;
+    private final PagedListAdapterHelper.PagedListListener<T> mListener =
+            new PagedListAdapterHelper.PagedListListener<T>() {
+        @Override
+        public void onCurrentListChanged(@Nullable PagedList<T> currentList) {
+            PagedListAdapter.this.onCurrentListChanged(currentList);
+        }
+    };
 
     /**
      * Creates a PagedListAdapter with default threading and
@@ -125,11 +132,13 @@
      */
     protected PagedListAdapter(@NonNull DiffCallback<T> diffCallback) {
         mHelper = new PagedListAdapterHelper<>(this, diffCallback);
+        mHelper.mListener = mListener;
     }
 
     @SuppressWarnings("unused, WeakerAccess")
     protected PagedListAdapter(@NonNull ListAdapterConfig<T> config) {
         mHelper = new PagedListAdapterHelper<>(new ListAdapterHelper.AdapterCallback(this), config);
+        mHelper.mListener = mListener;
     }
 
     /**
@@ -167,4 +176,22 @@
     public PagedList<T> getCurrentList() {
         return mHelper.getCurrentList();
     }
+
+    /**
+     * Called when the current PagedList is updated.
+     * <p>
+     * This may be dispatched as part of {@link #setList(PagedList)} if a background diff isn't
+     * needed (such as when the first list is passed, or the list is cleared). In either case,
+     * PagedListAdapter will simply call
+     * {@link #notifyItemRangeInserted(int, int) notifyItemRangeInserted/Removed(0, mPreviousSize)}.
+     * <p>
+     * This method will <em>not</em>be called when the Adapter switches from presenting a PagedList
+     * to a snapshot version of the PagedList during a diff. This means you cannot observe each
+     * PagedList via this method.
+     *
+     * @param currentList new PagedList being displayed, may be null.
+     */
+    @SuppressWarnings("WeakerAccess")
+    public void onCurrentListChanged(@Nullable PagedList<T> currentList) {
+    }
 }
diff --git a/paging/runtime/src/main/java/android/arch/paging/PagedListAdapterHelper.java b/paging/runtime/src/main/java/android/arch/paging/PagedListAdapterHelper.java
index c7b61d9..51a6e37 100644
--- a/paging/runtime/src/main/java/android/arch/paging/PagedListAdapterHelper.java
+++ b/paging/runtime/src/main/java/android/arch/paging/PagedListAdapterHelper.java
@@ -25,8 +25,6 @@
 import android.support.v7.util.ListUpdateCallback;
 import android.support.v7.widget.RecyclerView;
 
-import java.util.List;
-
 /**
  * Helper object for mapping a {@link PagedList} into a
  * {@link android.support.v7.widget.RecyclerView.Adapter RecyclerView.Adapter}.
@@ -120,15 +118,23 @@
  * @param <T> Type of the PagedLists this helper will receive.
  */
 public class PagedListAdapterHelper<T> {
+    // updateCallback notifications must only be notified *after* new data and item count are stored
+    // this ensures Adapter#notifyItemRangeInserted etc are accessing the new data
     private final ListUpdateCallback mUpdateCallback;
     private final ListAdapterConfig<T> mConfig;
 
-    // true if our listener is detached from mList, because it's been snapshotted
-    private boolean mUpdateScheduled;
+    // TODO: REAL API
+    interface PagedListListener<T> {
+        void onCurrentListChanged(@Nullable PagedList<T> currentList);
+    }
+
+    @Nullable
+    PagedListListener<T> mListener;
 
     private boolean mIsContiguous;
 
-    private PagedList<T> mList;
+    private PagedList<T> mPagedList;
+    private PagedList<T> mSnapshot;
 
     // Max generation of currently scheduled runnable
     private int mMaxScheduledGeneration;
@@ -182,12 +188,17 @@
     @SuppressWarnings("WeakerAccess")
     @Nullable
     public T getItem(int index) {
-        if (mList == null) {
-            throw new IndexOutOfBoundsException("Item count is zero, getItem() call is invalid");
+        if (mPagedList == null) {
+            if (mSnapshot == null) {
+                throw new IndexOutOfBoundsException(
+                        "Item count is zero, getItem() call is invalid");
+            } else {
+                return mSnapshot.get(index);
+            }
         }
 
-        mList.loadAround(index);
-        return mList.get(index);
+        mPagedList.loadAround(index);
+        return mPagedList.get(index);
     }
 
     /**
@@ -198,7 +209,11 @@
      */
     @SuppressWarnings("WeakerAccess")
     public int getItemCount() {
-        return mList == null ? 0 : mList.size();
+        if (mPagedList != null) {
+            return mPagedList.size();
+        }
+
+        return mSnapshot == null ? 0 : mSnapshot.size();
     }
 
     /**
@@ -212,7 +227,7 @@
      */
     public void setList(final PagedList<T> pagedList) {
         if (pagedList != null) {
-            if (mList == null) {
+            if (mPagedList == null && mSnapshot == null) {
                 mIsContiguous = pagedList.isContiguous();
             } else {
                 if (pagedList.isContiguous() != mIsContiguous) {
@@ -222,7 +237,7 @@
             }
         }
 
-        if (pagedList == mList) {
+        if (pagedList == mPagedList) {
             // nothing to do
             return;
         }
@@ -231,49 +246,62 @@
         final int runGeneration = ++mMaxScheduledGeneration;
 
         if (pagedList == null) {
-            mUpdateCallback.onRemoved(0, mList.size());
-            mList.removeWeakCallback(mPagedListCallback);
-            mList = null;
+            int removedCount = getItemCount();
+            if (mPagedList != null) {
+                mPagedList.removeWeakCallback(mPagedListCallback);
+                mPagedList = null;
+            } else if (mSnapshot != null) {
+                mSnapshot = null;
+            }
+            // dispatch update callback after updating mPagedList/mSnapshot
+            mUpdateCallback.onRemoved(0, removedCount);
+            if (mListener != null) {
+                mListener.onCurrentListChanged(null);
+            }
             return;
         }
 
-        if (mList == null) {
+        if (mPagedList == null && mSnapshot == null) {
             // fast simple first insert
-            mUpdateCallback.onInserted(0, pagedList.size());
-            mList = pagedList;
+            mPagedList = pagedList;
             pagedList.addWeakCallback(null, mPagedListCallback);
+
+            // dispatch update callback after updating mPagedList/mSnapshot
+            mUpdateCallback.onInserted(0, pagedList.size());
+
+            if (mListener != null) {
+                mListener.onCurrentListChanged(pagedList);
+            }
             return;
         }
 
-        if (!mList.isImmutable()) {
+        if (mPagedList != null) {
             // first update scheduled on this list, so capture mPages as a snapshot, removing
             // callbacks so we don't have resolve updates against a moving target
-            mList.removeWeakCallback(mPagedListCallback);
-            mList = (PagedList<T>) mList.snapshot();
+            mPagedList.removeWeakCallback(mPagedListCallback);
+            mSnapshot = (PagedList<T>) mPagedList.snapshot();
+            mPagedList = null;
         }
 
-        final PagedList<T> oldSnapshot = mList;
-        final List<T> newSnapshot = pagedList.snapshot();
-        mUpdateScheduled = true;
+        if (mSnapshot == null || mPagedList != null) {
+            throw new IllegalStateException("must be in snapshot state to diff");
+        }
+
+        final PagedList<T> oldSnapshot = mSnapshot;
+        final PagedList<T> newSnapshot = (PagedList<T>) pagedList.snapshot();
         mConfig.getBackgroundThreadExecutor().execute(new Runnable() {
             @Override
             public void run() {
                 final DiffUtil.DiffResult result;
-                if (mIsContiguous) {
-                    result = ContiguousDiffHelper.computeDiff(
-                            (NullPaddedList<T>) oldSnapshot, (NullPaddedList<T>) newSnapshot,
-                            mConfig.getDiffCallback(), true);
-                } else {
-                    result = SparseDiffHelper.computeDiff(
-                            (PageArrayList<T>) oldSnapshot, (PageArrayList<T>) newSnapshot,
-                            mConfig.getDiffCallback(), true);
-                }
+                result = PagedStorageDiffHelper.computeDiff(
+                        oldSnapshot.mStorage,
+                        newSnapshot.mStorage,
+                        mConfig.getDiffCallback());
 
                 mConfig.getMainThreadExecutor().execute(new Runnable() {
                     @Override
                     public void run() {
                         if (mMaxScheduledGeneration == runGeneration) {
-                            mUpdateScheduled = false;
                             latchPagedList(pagedList, newSnapshot, result);
                         }
                     }
@@ -283,16 +311,24 @@
     }
 
     private void latchPagedList(
-            PagedList<T> newList, List<T> diffSnapshot,
+            PagedList<T> newList, PagedList<T> diffSnapshot,
             DiffUtil.DiffResult diffResult) {
-        if (mIsContiguous) {
-            ContiguousDiffHelper.dispatchDiff(mUpdateCallback,
-                    (NullPaddedList<T>) mList, (ContiguousPagedList<T>) newList, diffResult);
-        } else {
-            SparseDiffHelper.dispatchDiff(mUpdateCallback, diffResult);
+        if (mSnapshot == null || mPagedList != null) {
+            throw new IllegalStateException("must be in snapshot state to apply diff");
         }
-        mList = newList;
-        newList.addWeakCallback((PagedList<T>) diffSnapshot, mPagedListCallback);
+
+        PagedList<T> previousSnapshot = mSnapshot;
+        mPagedList = newList;
+        mSnapshot = null;
+
+        // dispatch update callback after updating mPagedList/mSnapshot
+        PagedStorageDiffHelper.dispatchDiff(mUpdateCallback,
+                previousSnapshot.mStorage, newList.mStorage, diffResult);
+
+        newList.addWeakCallback(diffSnapshot, mPagedListCallback);
+        if (mListener != null) {
+            mListener.onCurrentListChanged(mPagedList);
+        }
     }
 
     /**
@@ -307,6 +343,9 @@
     @SuppressWarnings("WeakerAccess")
     @Nullable
     public PagedList<T> getCurrentList() {
-        return mList;
+        if (mSnapshot != null) {
+            return mSnapshot;
+        }
+        return mPagedList;
     }
 }
diff --git a/paging/runtime/src/main/java/android/arch/paging/ContiguousDiffHelper.java b/paging/runtime/src/main/java/android/arch/paging/PagedStorageDiffHelper.java
similarity index 74%
rename from paging/runtime/src/main/java/android/arch/paging/ContiguousDiffHelper.java
rename to paging/runtime/src/main/java/android/arch/paging/PagedStorageDiffHelper.java
index 7dd194b..6fc7039 100644
--- a/paging/runtime/src/main/java/android/arch/paging/ContiguousDiffHelper.java
+++ b/paging/runtime/src/main/java/android/arch/paging/PagedStorageDiffHelper.java
@@ -16,36 +16,31 @@
 
 package android.arch.paging;
 
-import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
 import android.support.v7.recyclerview.extensions.DiffCallback;
 import android.support.v7.util.DiffUtil;
 import android.support.v7.util.ListUpdateCallback;
 
-/** @hide */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-class ContiguousDiffHelper {
-    private ContiguousDiffHelper() {
+class PagedStorageDiffHelper {
+    private PagedStorageDiffHelper() {
     }
 
-    @NonNull
     static <T> DiffUtil.DiffResult computeDiff(
-            final NullPaddedList<T> oldList, final NullPaddedList<T> newList,
-            final DiffCallback<T> diffCallback, boolean detectMoves) {
+            final PagedStorage<?, T> oldList,
+            final PagedStorage<?, T> newList,
+            final DiffCallback<T> diffCallback) {
+        final int oldOffset = oldList.computeLeadingNulls();
+        final int newOffset = newList.computeLeadingNulls();
 
-        if (!oldList.isImmutable()) {
-            throw new IllegalArgumentException("list must be immutable to safely perform diff");
-        }
-        if (!newList.isImmutable()) {
-            throw new IllegalArgumentException("list must be immutable to safely perform diff");
-        }
+        final int oldSize = oldList.size() - oldOffset - oldList.computeTrailingNulls();
+        final int newSize = newList.size() - newOffset - newList.computeTrailingNulls();
+
         return DiffUtil.calculateDiff(new DiffUtil.Callback() {
             @Nullable
             @Override
             public Object getChangePayload(int oldItemPosition, int newItemPosition) {
-                T oldItem = oldList.mList.get(oldItemPosition);
-                T newItem = newList.mList.get(newItemPosition);
+                T oldItem = oldList.get(oldItemPosition + oldOffset);
+                T newItem = newList.get(newItemPosition + newList.getLeadingNullCount());
                 if (oldItem == null || newItem == null) {
                     return null;
                 }
@@ -54,21 +49,22 @@
 
             @Override
             public int getOldListSize() {
-                return oldList.mList.size();
+                return oldSize;
             }
 
             @Override
             public int getNewListSize() {
-                return newList.mList.size();
+                return newSize;
             }
 
             @Override
             public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
-                T oldItem = oldList.mList.get(oldItemPosition);
-                T newItem = newList.mList.get(newItemPosition);
+                T oldItem = oldList.get(oldItemPosition + oldOffset);
+                T newItem = newList.get(newItemPosition + newList.getLeadingNullCount());
                 if (oldItem == newItem) {
                     return true;
                 }
+                //noinspection SimplifiableIfStatement
                 if (oldItem == null || newItem == null) {
                     return false;
                 }
@@ -77,18 +73,19 @@
 
             @Override
             public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
-                T oldItem = oldList.mList.get(oldItemPosition);
-                T newItem = newList.mList.get(newItemPosition);
+                T oldItem = oldList.get(oldItemPosition + oldOffset);
+                T newItem = newList.get(newItemPosition + newList.getLeadingNullCount());
                 if (oldItem == newItem) {
                     return true;
                 }
+                //noinspection SimplifiableIfStatement
                 if (oldItem == null || newItem == null) {
                     return false;
                 }
 
                 return diffCallback.areContentsTheSame(oldItem, newItem);
             }
-        }, detectMoves);
+        }, true);
     }
 
     private static class OffsettingListUpdateCallback implements ListUpdateCallback {
@@ -134,21 +131,25 @@
      * immediately after dispatching this diff.
      */
     static <T> void dispatchDiff(ListUpdateCallback callback,
-            final NullPaddedList<T> oldList, final NullPaddedList<T> newList,
+            final PagedStorage<?, T> oldList,
+            final PagedStorage<?, T> newList,
             final DiffUtil.DiffResult diffResult) {
 
-        if (oldList.getLeadingNullCount() == 0
-                && oldList.getTrailingNullCount() == 0
-                && newList.getLeadingNullCount() == 0
-                && newList.getTrailingNullCount() == 0) {
+        final int trailingOld = oldList.computeTrailingNulls();
+        final int trailingNew = newList.computeTrailingNulls();
+        final int leadingOld = oldList.computeLeadingNulls();
+        final int leadingNew = newList.computeLeadingNulls();
+
+        if (trailingOld == 0
+                && trailingNew == 0
+                && leadingOld == 0
+                && leadingNew == 0) {
             // Simple case, dispatch & return
             diffResult.dispatchUpdatesTo(callback);
             return;
         }
 
         // First, remove or insert trailing nulls
-        final int trailingOld = oldList.getTrailingNullCount();
-        final int trailingNew = newList.getTrailingNullCount();
         if (trailingOld > trailingNew) {
             int count = trailingOld - trailingNew;
             callback.onRemoved(oldList.size() - count, count);
@@ -157,8 +158,6 @@
         }
 
         // Second, remove or insert leading nulls
-        final int leadingOld = oldList.getLeadingNullCount();
-        final int leadingNew = newList.getLeadingNullCount();
         if (leadingOld > leadingNew) {
             callback.onRemoved(0, leadingOld - leadingNew);
         } else if (leadingOld < leadingNew) {
diff --git a/paging/runtime/src/main/java/android/arch/paging/SparseDiffHelper.java b/paging/runtime/src/main/java/android/arch/paging/SparseDiffHelper.java
deleted file mode 100644
index fe47897..0000000
--- a/paging/runtime/src/main/java/android/arch/paging/SparseDiffHelper.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.paging;
-
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-import android.support.v7.recyclerview.extensions.DiffCallback;
-import android.support.v7.util.DiffUtil;
-import android.support.v7.util.ListUpdateCallback;
-
-/** @hide */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-class SparseDiffHelper {
-    private SparseDiffHelper() {
-    }
-
-    @NonNull
-    static <T> DiffUtil.DiffResult computeDiff(
-            final PageArrayList<T> oldList, final PageArrayList<T> newList,
-            final DiffCallback<T> diffCallback, boolean detectMoves) {
-
-        if (!oldList.isImmutable()) {
-            throw new IllegalArgumentException("list must be immutable to safely perform diff");
-        }
-        if (!newList.isImmutable()) {
-            throw new IllegalArgumentException("list must be immutable to safely perform diff");
-        }
-        return DiffUtil.calculateDiff(new DiffUtil.Callback() {
-            @Nullable
-            @Override
-            public Object getChangePayload(int oldItemPosition, int newItemPosition) {
-                T oldItem = oldList.get(oldItemPosition);
-                T newItem = newList.get(newItemPosition);
-                if (oldItem == null || newItem == null) {
-                    return null;
-                }
-                return diffCallback.getChangePayload(oldItem, newItem);
-            }
-
-            @Override
-            public int getOldListSize() {
-                return oldList.size();
-            }
-
-            @Override
-            public int getNewListSize() {
-                return newList.size();
-            }
-
-            @Override
-            public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
-                T oldItem = oldList.get(oldItemPosition);
-                T newItem = newList.get(newItemPosition);
-                if (oldItem == newItem) {
-                    return true;
-                }
-                if (oldItem == null || newItem == null) {
-                    return false;
-                }
-                return diffCallback.areItemsTheSame(oldItem, newItem);
-            }
-
-            @Override
-            public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
-                T oldItem = oldList.get(oldItemPosition);
-                T newItem = newList.get(newItemPosition);
-                if (oldItem == newItem) {
-                    return true;
-                }
-                if (oldItem == null || newItem == null) {
-                    return false;
-                }
-
-                return diffCallback.areContentsTheSame(oldItem, newItem);
-            }
-        }, detectMoves);
-    }
-
-    static <T> void dispatchDiff(ListUpdateCallback callback,
-            final DiffUtil.DiffResult diffResult) {
-        // Simple case, dispatch & return
-        diffResult.dispatchUpdatesTo(callback);
-    }
-}
diff --git a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterConfig.java b/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterConfig.java
index f861242..25697a1 100644
--- a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterConfig.java
+++ b/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterConfig.java
@@ -16,7 +16,7 @@
 
 package android.support.v7.recyclerview.extensions;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 
 import java.util.concurrent.Executor;
 
@@ -118,10 +118,10 @@
                 throw new IllegalArgumentException("Must provide a diffCallback");
             }
             if (mBackgroundThreadExecutor == null) {
-                mBackgroundThreadExecutor = AppToolkitTaskExecutor.getIOThreadExecutor();
+                mBackgroundThreadExecutor = ArchTaskExecutor.getIOThreadExecutor();
             }
             if (mMainThreadExecutor == null) {
-                mMainThreadExecutor = AppToolkitTaskExecutor.getMainThreadExecutor();
+                mMainThreadExecutor = ArchTaskExecutor.getMainThreadExecutor();
             }
             return new ListAdapterConfig<>(
                     mMainThreadExecutor,
diff --git a/percent/Android.mk b/percent/Android.mk
index b569224..66ce397 100644
--- a/percent/Android.mk
+++ b/percent/Android.mk
@@ -25,7 +25,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-percent
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := android-support-v4
 LOCAL_JAR_EXCLUDE_FILES := none
diff --git a/percent/AndroidManifest.xml b/percent/AndroidManifest.xml
index db8dfa2..5d4707d 100644
--- a/percent/AndroidManifest.xml
+++ b/percent/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.percent">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.percent.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/percent/api/26.1.0.txt b/percent/api/26.1.0.txt
new file mode 100644
index 0000000..088c0de
--- /dev/null
+++ b/percent/api/26.1.0.txt
@@ -0,0 +1,70 @@
+package android.support.percent {
+
+  public deprecated 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);
+    method protected android.support.percent.PercentFrameLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.support.percent.PercentFrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+  }
+
+  public static deprecated 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 deprecated 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 deprecated class PercentLayoutHelper.PercentLayoutInfo {
+    ctor public PercentLayoutHelper.PercentLayoutInfo();
+    method public void fillLayoutParams(android.view.ViewGroup.LayoutParams, int, int);
+    method public deprecated void fillMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams, int, int);
+    method public void fillMarginLayoutParams(android.view.View, 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 deprecated interface PercentLayoutHelper.PercentLayoutParams {
+    method public abstract android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
+  }
+
+  public deprecated 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);
+    method protected android.support.percent.PercentRelativeLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.support.percent.PercentRelativeLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+  }
+
+  public static deprecated 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/api/27.0.0.txt b/percent/api/27.0.0.txt
new file mode 100644
index 0000000..088c0de
--- /dev/null
+++ b/percent/api/27.0.0.txt
@@ -0,0 +1,70 @@
+package android.support.percent {
+
+  public deprecated 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);
+    method protected android.support.percent.PercentFrameLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.support.percent.PercentFrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+  }
+
+  public static deprecated 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 deprecated 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 deprecated class PercentLayoutHelper.PercentLayoutInfo {
+    ctor public PercentLayoutHelper.PercentLayoutInfo();
+    method public void fillLayoutParams(android.view.ViewGroup.LayoutParams, int, int);
+    method public deprecated void fillMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams, int, int);
+    method public void fillMarginLayoutParams(android.view.View, 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 deprecated interface PercentLayoutHelper.PercentLayoutParams {
+    method public abstract android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
+  }
+
+  public deprecated 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);
+    method protected android.support.percent.PercentRelativeLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.support.percent.PercentRelativeLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+  }
+
+  public static deprecated 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 d390afb..aecaa28 100644
--- a/percent/build.gradle
+++ b/percent/build.gradle
@@ -13,10 +13,7 @@
     }
 
     sourceSets {
-        main.java.srcDirs = ['src']
         main.res.srcDir 'res'
-        main.assets.srcDir 'assets'
-        main.resources.srcDir 'src'
     }
 }
 
diff --git a/percent/src/android/support/percent/PercentFrameLayout.java b/percent/src/main/java/android/support/percent/PercentFrameLayout.java
similarity index 99%
rename from percent/src/android/support/percent/PercentFrameLayout.java
rename to percent/src/main/java/android/support/percent/PercentFrameLayout.java
index b9abd39..4190858 100644
--- a/percent/src/android/support/percent/PercentFrameLayout.java
+++ b/percent/src/main/java/android/support/percent/PercentFrameLayout.java
@@ -126,6 +126,7 @@
  *         app:layout_constraintBottom_toBottomOf="@+id/bottom_guideline" /&gt
  *
  * &lt;/android.support.constraint.ConstraintLayout&gt
+ * </pre>
  */
 @Deprecated
 public class PercentFrameLayout extends FrameLayout {
diff --git a/percent/src/android/support/percent/PercentLayoutHelper.java b/percent/src/main/java/android/support/percent/PercentLayoutHelper.java
similarity index 100%
rename from percent/src/android/support/percent/PercentLayoutHelper.java
rename to percent/src/main/java/android/support/percent/PercentLayoutHelper.java
diff --git a/percent/src/android/support/percent/PercentRelativeLayout.java b/percent/src/main/java/android/support/percent/PercentRelativeLayout.java
similarity index 100%
rename from percent/src/android/support/percent/PercentRelativeLayout.java
rename to percent/src/main/java/android/support/percent/PercentRelativeLayout.java
diff --git a/persistence/OWNERS b/persistence/OWNERS
new file mode 100644
index 0000000..fc51372
--- /dev/null
+++ b/persistence/OWNERS
@@ -0,0 +1,2 @@
+sergeyv@google.com
+yboyar@google.com
\ No newline at end of file
diff --git a/persistence/db-framework/src/main/AndroidManifest.xml b/persistence/db-framework/src/main/AndroidManifest.xml
index 89d09af..9350b90 100644
--- a/persistence/db-framework/src/main/AndroidManifest.xml
+++ b/persistence/db-framework/src/main/AndroidManifest.xml
@@ -16,8 +16,4 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.persistence.db.framework">
-    <application>
-        <meta-data android:name="android.arch.persistence.db.framework.VERSION"
-                   android:value="${version}" />
-    </application>
 </manifest>
diff --git a/persistence/db/src/main/AndroidManifest.xml b/persistence/db/src/main/AndroidManifest.xml
index 5894255..8a27324 100644
--- a/persistence/db/src/main/AndroidManifest.xml
+++ b/persistence/db/src/main/AndroidManifest.xml
@@ -16,8 +16,4 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.persistence.db">
-    <application>
-        <meta-data android:name="android.arch.persistence.db.VERSION"
-                   android:value="${version}" />
-    </application>
 </manifest>
diff --git a/recommendation/Android.mk b/recommendation/Android.mk
index 99ba65f..ea819e9 100644
--- a/recommendation/Android.mk
+++ b/recommendation/Android.mk
@@ -25,7 +25,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-recommendation
 LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-v4 \
diff --git a/recommendation/AndroidManifest.xml b/recommendation/AndroidManifest.xml
index 031e250..98e1ae9 100644
--- a/recommendation/AndroidManifest.xml
+++ b/recommendation/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.recommendation">
     <uses-sdk android:minSdkVersion="21"/>
-    <application>
-        <meta-data android:name="android.support.recommendation.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/recommendation/OWNERS b/recommendation/OWNERS
new file mode 100644
index 0000000..063702c
--- /dev/null
+++ b/recommendation/OWNERS
@@ -0,0 +1 @@
+dake@google.com
\ No newline at end of file
diff --git a/recommendation/api/26.1.0.txt b/recommendation/api/26.1.0.txt
new file mode 100644
index 0000000..ce69b31
--- /dev/null
+++ b/recommendation/api/26.1.0.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/recommendation/api/27.0.0.txt b/recommendation/api/27.0.0.txt
new file mode 100644
index 0000000..ce69b31
--- /dev/null
+++ b/recommendation/api/27.0.0.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/recommendation/build.gradle b/recommendation/build.gradle
index 61b2fb2..0c38487 100644
--- a/recommendation/build.gradle
+++ b/recommendation/build.gradle
@@ -8,12 +8,6 @@
     defaultConfig {
         minSdkVersion 21
     }
-
-    sourceSets {
-        main.java.srcDirs = ['src']
-        main.res.srcDir 'res'
-    }
-
 }
 
 supportLibrary {
diff --git a/recommendation/src/android/support/app/recommendation/ContentRecommendation.java b/recommendation/src/main/java/android/support/app/recommendation/ContentRecommendation.java
similarity index 100%
rename from recommendation/src/android/support/app/recommendation/ContentRecommendation.java
rename to recommendation/src/main/java/android/support/app/recommendation/ContentRecommendation.java
diff --git a/recommendation/src/android/support/app/recommendation/RecommendationExtender.java b/recommendation/src/main/java/android/support/app/recommendation/RecommendationExtender.java
similarity index 100%
rename from recommendation/src/android/support/app/recommendation/RecommendationExtender.java
rename to recommendation/src/main/java/android/support/app/recommendation/RecommendationExtender.java
diff --git a/room/OWNERS b/room/OWNERS
new file mode 100644
index 0000000..fc51372
--- /dev/null
+++ b/room/OWNERS
@@ -0,0 +1,2 @@
+sergeyv@google.com
+yboyar@google.com
\ No newline at end of file
diff --git a/room/common/src/main/java/android/arch/persistence/room/ForeignKey.java b/room/common/src/main/java/android/arch/persistence/room/ForeignKey.java
index 4ba0fb3..3ba632b 100644
--- a/room/common/src/main/java/android/arch/persistence/room/ForeignKey.java
+++ b/room/common/src/main/java/android/arch/persistence/room/ForeignKey.java
@@ -40,7 +40,7 @@
  * <a href="https://sqlite.org/pragma.html#pragma_defer_foreign_keys">defer_foreign_keys</a> PRAGMA
  * to defer them depending on your transaction.
  * <p>
- * Please refer to the SQLite <a href="https://sqlite.org/foreignkeys.html>foreign keys</a>
+ * Please refer to the SQLite <a href="https://sqlite.org/foreignkeys.html">foreign keys</a>
  * documentation for details.
  */
 public @interface ForeignKey {
diff --git a/room/common/src/main/java/android/arch/persistence/room/Relation.java b/room/common/src/main/java/android/arch/persistence/room/Relation.java
index 7206699..d55bbfe 100644
--- a/room/common/src/main/java/android/arch/persistence/room/Relation.java
+++ b/room/common/src/main/java/android/arch/persistence/room/Relation.java
@@ -28,6 +28,8 @@
  * <pre>
  * {@literal @}Entity
  * public class Pet {
+ *     {@literal @} PrimaryKey
+ *     int id;
  *     int userId;
  *     String name;
  *     // other fields
@@ -41,8 +43,8 @@
  *
  * {@literal @}Dao
  * public interface UserPetDao {
- *     {@literal @}Query("SELECT id, name from User WHERE age &gt; :minAge")
- *     public List&lt;UserNameAndAllPets&gt; loadUserAndPets(int minAge);
+ *     {@literal @}Query("SELECT id, name from User")
+ *     public List&lt;UserNameAndAllPets&gt; loadUserAndPets();
  * }
  * </pre>
  * <p>
@@ -63,16 +65,16 @@
  *   {@literal @}Embedded
  *   public User user;
  *   {@literal @}Relation(parentColumn = "id", entityColumn = "userId", entity = Pet.class)
- *   public List<PetNameAndId> pets;
+ *   public List&lt;PetNameAndId&gt; pets;
  * }
  * {@literal @}Dao
  * public interface UserPetDao {
- *     {@literal @}Query("SELECT * from User WHERE age &gt; :minAge")
- *     public List&lt;UserAllPets&gt; loadUserAndPets(int minAge);
+ *     {@literal @}Query("SELECT * from User")
+ *     public List&lt;UserAllPets&gt; loadUserAndPets();
  * }
  * </pre>
  * <p>
- * In the example above, {@code PetNameAndId} is a regular but all of fields are fetched
+ * In the example above, {@code PetNameAndId} is a regular Pojo but all of fields are fetched
  * from the {@code entity} defined in the {@code @Relation} annotation (<i>Pet</i>).
  * {@code PetNameAndId} could also define its own relations all of which would also be fetched
  * automatically.
@@ -85,7 +87,7 @@
  *   public User user;
  *   {@literal @}Relation(parentColumn = "id", entityColumn = "userId", entity = Pet.class,
  *           projection = {"name"})
- *   public List<String> petNames;
+ *   public List&lt;String&gt; petNames;
  * }
  * </pre>
  * <p>
@@ -93,7 +95,7 @@
  * cannot have relations. This is a design decision to avoid common pitfalls in {@link Entity}
  * setups. You can read more about it in the main Room documentation. When loading data, you can
  * simply work around this limitation by creating Pojo classes that extend the {@link Entity}.
- *
+ * <p>
  * Note that the {@code @Relation} annotated field cannot be a constructor parameter, it must be
  * public or have a public setter.
  */
diff --git a/room/common/src/main/java/android/arch/persistence/room/RoomWarnings.java b/room/common/src/main/java/android/arch/persistence/room/RoomWarnings.java
index 91f32e4..f05e6be 100644
--- a/room/common/src/main/java/android/arch/persistence/room/RoomWarnings.java
+++ b/room/common/src/main/java/android/arch/persistence/room/RoomWarnings.java
@@ -117,4 +117,20 @@
      */
     public static final String MISSING_INDEX_ON_FOREIGN_KEY_CHILD =
             "ROOM_MISSING_FOREIGN_KEY_CHILD_INDEX";
+
+    /**
+     * Reported when a Pojo has multiple constructors, one of which is a no-arg constructor. Room
+     * will pick that one by default but will print this warning in case the constructor choice is
+     * important. You can always guide Room to use the right constructor using the @Ignore
+     * annotation.
+     */
+    public static final String DEFAULT_CONSTRUCTOR = "ROOM_DEFAULT_CONSTRUCTOR";
+
+    /**
+     * Reported when a @Query method returns a Pojo that has relations but the method is not
+     * annotated with @Transaction. Relations are run as separate queries and if the query is not
+     * run inside a transaction, it might return inconsistent results from the database.
+     */
+    public static final String RELATION_QUERY_WITHOUT_TRANSACTION =
+            "ROOM_RELATION_QUERY_WITHOUT_TRANSACTION";
 }
diff --git a/room/common/src/main/java/android/arch/persistence/room/Transaction.java b/room/common/src/main/java/android/arch/persistence/room/Transaction.java
index 914e4f4..3b6ede9 100644
--- a/room/common/src/main/java/android/arch/persistence/room/Transaction.java
+++ b/room/common/src/main/java/android/arch/persistence/room/Transaction.java
@@ -22,9 +22,10 @@
 import java.lang.annotation.Target;
 
 /**
- * Marks a method in an abstract {@link Dao} class as a transaction method.
+ * Marks a method in a {@link Dao} class as a transaction method.
  * <p>
- * The derived implementation of the method will execute the super method in a database transaction.
+ * When used on a non-abstract method of an abstract {@link Dao} class,
+ * the derived implementation of the method will execute the super method in a database transaction.
  * All the parameters and return types are preserved. The transaction will be marked as successful
  * unless an exception is thrown in the method body.
  * <p>
@@ -44,6 +45,38 @@
  *     }
  * }
  * </pre>
+ * <p>
+ * When used on a {@link Query} method that has a {@code Select} statement, the generated code for
+ * the Query will be run in a transaction. There are 2 main cases where you may want to do that:
+ * <ol>
+ *     <li>If the result of the query is fairly big, it is better to run it inside a transaction
+ *     to receive a consistent result. Otherwise, if the query result does not fit into a single
+ *     {@link android.database.CursorWindow CursorWindow}, the query result may be corrupted due to
+ *     changes in the database in between cursor window swaps.
+ *     <li>If the result of the query is a Pojo with {@link Relation} fields, these fields are
+ *     queried separately. To receive consistent results between these queries, you probably want
+ *     to run them in a single transaction.
+ * </ol>
+ * Example:
+ * <pre>
+ * class ProductWithReviews extends Product {
+ *     {@literal @}Relation(parentColumn = "id", entityColumn = "productId", entity = Review.class)
+ *     public List&lt;Review> reviews;
+ * }
+ * {@literal @}Dao
+ * public interface ProductDao {
+ *     {@literal @}Transaction {@literal @}Query("SELECT * from products")
+ *     public List&lt;ProductWithReviews> loadAll();
+ * }
+ * </pre>
+ * If the query is an async query (e.g. returns a {@link android.arch.lifecycle.LiveData LiveData}
+ * or RxJava Flowable, the transaction is properly handled when the query is run, not when the
+ * method is called.
+ * <p>
+ * Putting this annotation on an {@link Insert}, {@link Update} or {@link Delete} method has no
+ * impact because they are always run inside a transaction. Similarly, if it is annotated with
+ * {@link Query} but runs an update or delete statement, it is automatically wrapped in a
+ * transaction.
  */
 @Target({ElementType.METHOD})
 @Retention(RetentionPolicy.CLASS)
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/RoomProcessor.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/RoomProcessor.kt
index 3b11efd..ad7621f 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/RoomProcessor.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/RoomProcessor.kt
@@ -81,7 +81,6 @@
                     }
                 }
             }
-            context.databaseVerifier?.closeConnection()
             return mutableSetOf()
         }
         override fun annotations(): MutableSet<out Class<out Annotation>> {
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/javapoet_ext.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/javapoet_ext.kt
index 6dc71f6..066bd1f 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/javapoet_ext.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/ext/javapoet_ext.kt
@@ -78,13 +78,15 @@
             ClassName.get("android.arch.persistence.room.util", "TableInfo.Column")
     val TABLE_INFO_FOREIGN_KEY : ClassName =
             ClassName.get("android.arch.persistence.room.util", "TableInfo.ForeignKey")
+    val TABLE_INFO_INDEX : ClassName =
+            ClassName.get("android.arch.persistence.room.util", "TableInfo.Index")
     val LIMIT_OFFSET_DATA_SOURCE : ClassName =
             ClassName.get("android.arch.persistence.room.paging", "LimitOffsetDataSource")
 }
 
 object ArchTypeNames {
     val APP_EXECUTOR : ClassName =
-            ClassName.get("android.arch.core.executor", "AppToolkitTaskExecutor")
+            ClassName.get("android.arch.core.executor", "ArchTaskExecutor")
 }
 
 object PagingTypeNames {
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/parser/SqlParser.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/parser/SqlParser.kt
index a4e8946..85e89d1 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/parser/SqlParser.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/parser/SqlParser.kt
@@ -24,7 +24,6 @@
 import org.antlr.v4.runtime.Recognizer
 import org.antlr.v4.runtime.tree.ParseTree
 import org.antlr.v4.runtime.tree.TerminalNode
-import java.util.ArrayList
 import javax.annotation.processing.ProcessingEnvironment
 import javax.lang.model.type.TypeKind
 import javax.lang.model.type.TypeMirror
@@ -120,6 +119,7 @@
 
 class SqlParser {
     companion object {
+        private val INVALID_IDENTIFIER_CHARS = arrayOf('`', '\"')
         fun parse(input: String): ParsedQuery {
             val inputStream = ANTLRInputStream(input)
             val lexer = SQLiteLexer(inputStream)
@@ -153,6 +153,9 @@
                         listOf("unknown error while parsing $input : ${antlrError.message}"))
             }
         }
+
+        fun isValidIdentifier(input : String) : Boolean =
+                input.isNotBlank() && INVALID_IDENTIFIER_CHARS.none { input.contains(it) }
     }
 }
 
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/DaoProcessor.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/DaoProcessor.kt
index 2093d91..c705eef 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/DaoProcessor.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/DaoProcessor.kt
@@ -110,9 +110,10 @@
                     executableElement = it).process()
         } ?: emptyList()
 
-        val transactionMethods = allMembers.filter {
-            it.hasAnnotation(Transaction::class)
-                    && it.kind == ElementKind.METHOD
+        val transactionMethods = allMembers.filter { member ->
+            member.hasAnnotation(Transaction::class)
+                    && member.kind == ElementKind.METHOD
+                    && PROCESSED_ANNOTATIONS.none { member.hasAnnotation(it) }
             // TODO: Exclude abstract methods and let @Query handle that case
         }.map {
             TransactionMethodProcessor(
@@ -161,5 +162,4 @@
                     element.toString(), dbType.toString()))
         }
     }
-
 }
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/DatabaseProcessor.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/DatabaseProcessor.kt
index 9ebf6df..90b24e1 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/DatabaseProcessor.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/DatabaseProcessor.kt
@@ -50,6 +50,14 @@
     }
 
     fun process(): Database {
+        try {
+            return doProcess()
+        } finally {
+            context.databaseVerifier?.closeConnection(context)
+        }
+    }
+
+    private fun doProcess(): Database {
         val dbAnnotation = MoreElements
                 .getAnnotationMirror(element, android.arch.persistence.room.Database::class.java)
                 .orNull()
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/EntityProcessor.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/EntityProcessor.kt
index c9e3e18..405c6b1 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/EntityProcessor.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/EntityProcessor.kt
@@ -22,6 +22,7 @@
 import android.arch.persistence.room.ext.getAsStringList
 import android.arch.persistence.room.ext.toType
 import android.arch.persistence.room.parser.SQLTypeAffinity
+import android.arch.persistence.room.parser.SqlParser
 import android.arch.persistence.room.processor.ProcessorErrors.INDEX_COLUMNS_CANNOT_BE_EMPTY
 import android.arch.persistence.room.processor.ProcessorErrors.RELATION_IN_ENTITY
 import android.arch.persistence.room.processor.cache.Cache
@@ -40,12 +41,15 @@
 import com.google.auto.common.MoreTypes
 import javax.lang.model.element.AnnotationMirror
 import javax.lang.model.element.AnnotationValue
+import javax.lang.model.element.Name
 import javax.lang.model.element.TypeElement
 import javax.lang.model.type.TypeKind
 import javax.lang.model.type.TypeMirror
 import javax.lang.model.util.SimpleAnnotationValueVisitor6
 
-class EntityProcessor(baseContext: Context, val element: TypeElement) {
+class EntityProcessor(baseContext: Context,
+                      val element: TypeElement,
+                      val referenceStack: LinkedHashSet<Name> = LinkedHashSet<Name>()) {
     val context = baseContext.fork(element)
 
     fun process(): Entity {
@@ -60,7 +64,8 @@
                 baseContext = context,
                 element = element,
                 bindingScope = FieldProcessor.BindingScope.TWO_WAY,
-                parent = null).process()
+                parent = null,
+                referenceStack = referenceStack).process()
         context.checker.check(pojo.relations.isEmpty(), element, RELATION_IN_ENTITY)
         val annotation = MoreElements.getAnnotationMirror(element,
                 android.arch.persistence.room.Entity::class.java).orNull()
@@ -112,7 +117,7 @@
         val indexInputs = entityIndices + fieldIndices + superIndices
         val indices = validateAndCreateIndices(indexInputs, pojo)
 
-        val primaryKey = findPrimaryKey(pojo.fields, pojo.embeddedFields)
+        val primaryKey = findAndValidatePrimaryKey(pojo.fields, pojo.embeddedFields)
         val affinity = primaryKey.fields.firstOrNull()?.affinity ?: SQLTypeAffinity.TEXT
         context.checker.check(
                 !primaryKey.autoGenerateId || affinity == SQLTypeAffinity.INTEGER,
@@ -123,6 +128,13 @@
         val entityForeignKeys = validateAndCreateForeignKeyReferences(foreignKeyInputs, pojo)
         checkIndicesForForeignKeys(entityForeignKeys, primaryKey, indices)
 
+        context.checker.check(SqlParser.isValidIdentifier(tableName), element,
+                ProcessorErrors.INVALID_TABLE_NAME)
+        pojo.fields.forEach {
+            context.checker.check(SqlParser.isValidIdentifier(it.columnName), it.element,
+                    ProcessorErrors.INVALID_COLUMN_NAME)
+        }
+
         val entity = Entity(element = element,
                 tableName = tableName,
                 type = pojo.type,
@@ -226,7 +238,7 @@
         }.filterNotNull()
     }
 
-    private fun findPrimaryKey(fields: List<Field>, embeddedFields: List<EmbeddedField>)
+    private fun findAndValidatePrimaryKey(fields: List<Field>, embeddedFields: List<EmbeddedField>)
             : PrimaryKey {
         val candidates = collectPrimaryKeysFromEntityAnnotations(element, fields) +
                 collectPrimaryKeysFromPrimaryKeyAnnotations(fields) +
@@ -235,14 +247,28 @@
         context.checker.check(candidates.isNotEmpty(), element, ProcessorErrors.MISSING_PRIMARY_KEY)
 
         // 1. If a key is not autogenerated, but is Primary key or is part of Primary key we
-        // force the @NonNull annotation
+        // force the @NonNull annotation. If the key is a single Primary Key, Integer or Long, we
+        // don't force the @NonNull annotation since SQLite will automatically generate IDs.
         // 2. If a key is autogenerate, we generate NOT NULL in table spec, but we don't require
         // @NonNull annotation on the field itself.
         candidates.filter { candidate -> !candidate.autoGenerateId }
                 .map { candidate ->
                     candidate.fields.map { field ->
-                        context.checker.check(field.nonNull, field.element,
-                                ProcessorErrors.PRIMARY_KEY_NULL)
+                        if (candidate.fields.size > 1 ||
+                                (candidate.fields.size == 1
+                                        && field.affinity != SQLTypeAffinity.INTEGER)) {
+                            context.checker.check(field.nonNull, field.element,
+                                    ProcessorErrors.primaryKeyNull(field.getPath()))
+                            // Validate parents for nullability
+                            var parent = field.parent
+                            while (parent != null) {
+                                val parentField = parent.field
+                                context.checker.check(parentField.nonNull,
+                                        parentField.element,
+                                        ProcessorErrors.primaryKeyNull(parentField.getPath()))
+                                parent = parentField.parent
+                            }
+                        }
                     }
                 }
 
@@ -498,7 +524,7 @@
         }
 
         private fun createIndexName(columnNames: List<String>, tableName: String): String {
-            return "index_" + tableName + "_" + columnNames.joinToString("_")
+            return Index.DEFAULT_PREFIX + tableName + "_" + columnNames.joinToString("_")
         }
 
         private fun extractForeignKeys(annotation: AnnotationMirror): List<ForeignKeyInput> {
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt
index e83d1ef..535e116 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoProcessor.kt
@@ -16,10 +16,10 @@
 
 package android.arch.persistence.room.processor
 
-import android.arch.persistence.room.Relation
 import android.arch.persistence.room.ColumnInfo
 import android.arch.persistence.room.Embedded
 import android.arch.persistence.room.Ignore
+import android.arch.persistence.room.Relation
 import android.arch.persistence.room.ext.getAllFieldsIncludingPrivateSupers
 import android.arch.persistence.room.ext.getAnnotationValue
 import android.arch.persistence.room.ext.getAsString
@@ -35,24 +35,24 @@
 import android.arch.persistence.room.processor.cache.Cache
 import android.arch.persistence.room.vo.CallType
 import android.arch.persistence.room.vo.Constructor
-import android.arch.persistence.room.vo.Field
-import android.arch.persistence.room.vo.FieldGetter
 import android.arch.persistence.room.vo.EmbeddedField
 import android.arch.persistence.room.vo.Entity
+import android.arch.persistence.room.vo.Field
+import android.arch.persistence.room.vo.FieldGetter
 import android.arch.persistence.room.vo.FieldSetter
 import android.arch.persistence.room.vo.Pojo
+import android.arch.persistence.room.vo.Warning
 import com.google.auto.common.AnnotationMirrors
 import com.google.auto.common.MoreElements
 import com.google.auto.common.MoreTypes
-import javax.lang.model.element.Element
 import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.Modifier
 import javax.lang.model.element.Modifier.ABSTRACT
 import javax.lang.model.element.Modifier.PRIVATE
 import javax.lang.model.element.Modifier.PROTECTED
 import javax.lang.model.element.Modifier.PUBLIC
 import javax.lang.model.element.Modifier.STATIC
 import javax.lang.model.element.Modifier.TRANSIENT
+import javax.lang.model.element.Name
 import javax.lang.model.element.TypeElement
 import javax.lang.model.element.VariableElement
 import javax.lang.model.type.DeclaredType
@@ -63,9 +63,11 @@
 /**
  * Processes any class as if it is a Pojo.
  */
-class PojoProcessor(baseContext: Context, val element: TypeElement,
+class PojoProcessor(baseContext: Context,
+                    val element: TypeElement,
                     val bindingScope: FieldProcessor.BindingScope,
-                    val parent: EmbeddedField?) {
+                    val parent: EmbeddedField?,
+                    val referenceStack: LinkedHashSet<Name> = LinkedHashSet<Name>()) {
     val context = baseContext.fork(element)
     companion object {
         val PROCESSED_ANNOTATIONS = listOf(ColumnInfo::class, Embedded::class,
@@ -73,12 +75,17 @@
     }
     fun process() : Pojo {
         return context.cache.pojos.get(Cache.PojoKey(element, bindingScope, parent), {
-            doProcess()
+            referenceStack.add(element.qualifiedName)
+            try {
+                doProcess()
+            }
+            finally {
+                referenceStack.remove(element.qualifiedName)
+            }
         })
     }
 
     private fun doProcess(): Pojo {
-        // TODO handle recursion: b/35980205
         val declaredType = MoreTypes.asDeclared(element.asType())
         // TODO handle conflicts with super: b/35568142
         val allFields = element.getAllFieldsIncludingPrivateSupers(context.processingEnv)
@@ -103,6 +110,7 @@
                         null
                     }
                 }
+
         val myFields = allFields[null]
                 ?.map {
                     FieldProcessor(
@@ -113,22 +121,25 @@
                             fieldParent = parent).process()
                 } ?: emptyList()
 
-        val embeddedFields = allFields[Embedded::class]
-                ?.map {
-                    processEmbeddedField(declaredType, it)
-                } ?: emptyList()
-        val subFields = embeddedFields.flatMap { it.pojo.fields }
+        val embeddedFields =
+                allFields[Embedded::class]
+                        ?.map {
+                            processEmbeddedField(declaredType, it)
+                        }
+                        ?.filterNotNull()
+                        ?: emptyList()
 
+        val subFields = embeddedFields.flatMap { it.pojo.fields }
         val fields = myFields + subFields
 
         val myRelationsList = allFields[Relation::class]
                 ?.map {
                     processRelationField(fields, declaredType, it)
                 }
-                ?.filterNotNull() ?: emptyList()
+                ?.filterNotNull()
+                ?: emptyList()
 
         val subRelations = embeddedFields.flatMap { it.pojo.relations }
-
         val relations = myRelationsList + subRelations
 
         fields.groupBy { it.columnName }
@@ -141,6 +152,7 @@
                         context.logger.e(it.element, POJO_FIELD_HAS_DUPLICATE_COLUMN_NAME)
                     }
                 }
+
         val methods = MoreElements.getLocalAndInheritedMethods(element,
                 context.processingEnv.elementUtils)
                 .filter {
@@ -156,6 +168,7 @@
         val setterCandidates = methods.filter {
             it.parameters.size == 1 && it.returnType.kind == TypeKind.VOID
         }
+
         // don't try to find a constructor for binding to statement.
         val constructor = if (bindingScope == FieldProcessor.BindingScope.BIND_TO_STMT) {
             // we don't need to construct this POJO.
@@ -177,13 +190,12 @@
             assignSetter(it.field, setterCandidates, constructor)
         }
 
-        val pojo = Pojo(element = element,
+        return Pojo(element = element,
                 type = declaredType,
                 fields = fields,
                 embeddedFields = embeddedFields,
                 relations = relations,
                 constructor = constructor)
-        return pojo
     }
 
     private fun chooseConstructor(myFields: List<Field>, embedded: List<EmbeddedField>)
@@ -264,41 +276,69 @@
             }
             context.logger.e(element, ProcessorErrors.MISSING_POJO_CONSTRUCTOR)
             return null
-        }
-        if (goodConstructors.size > 1) {
+        } else if (goodConstructors.size > 1) {
+            // if there is a no-arg constructor, pick it. Even though it is weird, easily happens
+            // with kotlin data classes.
+            val noArg = goodConstructors.firstOrNull { it.params.isEmpty() }
+            if (noArg != null) {
+                context.logger.w(Warning.DEFAULT_CONSTRUCTOR, element,
+                        ProcessorErrors.TOO_MANY_POJO_CONSTRUCTORS_CHOOSING_NO_ARG)
+                return noArg
+            }
             goodConstructors.forEach {
                 context.logger.e(it.element, ProcessorErrors.TOO_MANY_POJO_CONSTRUCTORS)
             }
             return null
+        } else {
+            return goodConstructors.first()
         }
-        return goodConstructors.first()
     }
 
-    private fun processEmbeddedField(declaredType: DeclaredType?, it: Element): EmbeddedField {
-        val fieldPrefix = it.getAnnotationValue(Embedded::class.java, "prefix")
-                ?.toString() ?: ""
+    private fun processEmbeddedField(declaredType: DeclaredType?, variableElement: VariableElement)
+            : EmbeddedField? {
+
+        val asTypeElement = MoreTypes.asTypeElement(variableElement.asType())
+
+        if (detectReferenceRecursion(asTypeElement)) {
+            return null
+        }
+
+        val fieldPrefix = variableElement
+                .getAnnotationValue(Embedded::class.java, "prefix")
+                ?.toString()
+                ?: ""
         val inheritedPrefix = parent?.prefix ?: ""
-        val embeddedField = Field(
-                it,
-                it.simpleName.toString(),
-                type = context.processingEnv.typeUtils.asMemberOf(declaredType, it),
-                affinity = null,
-                parent = parent)
+        val embeddedField = Field(variableElement,
+                                  variableElement.simpleName.toString(),
+                                  type = context
+                                          .processingEnv
+                                          .typeUtils
+                                          .asMemberOf(declaredType, variableElement),
+                                  affinity = null,
+                                  parent = parent)
         val subParent = EmbeddedField(
                 field = embeddedField,
                 prefix = inheritedPrefix + fieldPrefix,
                 parent = parent)
-        val asVariable = MoreElements.asVariable(it)
-        subParent.pojo = PojoProcessor(baseContext = context.fork(it),
-                element = MoreTypes.asTypeElement(asVariable.asType()),
+        subParent.pojo = PojoProcessor(
+                baseContext = context.fork(variableElement),
+                element = asTypeElement,
                 bindingScope = bindingScope,
-                parent = subParent).process()
+                parent = subParent,
+                referenceStack = referenceStack).process()
         return subParent
     }
 
     private fun processRelationField(myFields : List<Field>, container: DeclaredType?,
                                      relationElement: VariableElement)
             : android.arch.persistence.room.vo.Relation? {
+
+        val asTypeElement = MoreTypes.asTypeElement(MoreElements.asVariable(relationElement).asType())
+
+        if (detectReferenceRecursion(asTypeElement)) {
+            return null
+        }
+
         val annotation = MoreElements.getAnnotationMirror(relationElement, Relation::class.java)
                 .orNull()!!
         val parentColumnInput = AnnotationMirrors.getAnnotationValue(annotation, "parentColumn")
@@ -339,14 +379,17 @@
         val entity : Entity
         if (entityClassInput == null
                 || MoreTypes.isTypeOf(Any::class.java, entityClassInput)) {
-            entity = EntityProcessor(context, typeArgElement).process()
+            entity = EntityProcessor(context, typeArgElement, referenceStack).process()
             pojo = entity
         } else {
-            entity = EntityProcessor(context, MoreTypes.asTypeElement(entityClassInput)).process()
-            pojo = PojoProcessor(baseContext = context,
+            entity = EntityProcessor(context, MoreTypes.asTypeElement(entityClassInput),
+                                     referenceStack).process()
+            pojo = PojoProcessor(
+                    baseContext = context,
                     element = typeArgElement,
                     bindingScope = FieldProcessor.BindingScope.READ_FROM_CURSOR,
-                    parent = parent).process()
+                    parent = parent,
+                    referenceStack = referenceStack).process()
         }
         // now find the field in the entity.
         val entityColumnInput = AnnotationMirrors.getAnnotationValue(annotation, "entityColumn")
@@ -395,6 +438,31 @@
         )
     }
 
+    private fun detectReferenceRecursion(typeElement: TypeElement): Boolean {
+        if (referenceStack.contains(typeElement.qualifiedName)) {
+            context.logger.e(
+                    typeElement,
+                    ProcessorErrors
+                            .RECURSIVE_REFERENCE_DETECTED
+                            .format(computeReferenceRecursionString(typeElement)))
+            return true
+        }
+        return false
+    }
+
+    private fun computeReferenceRecursionString(typeElement: TypeElement): String {
+        val recursiveTailTypeName = typeElement.qualifiedName
+
+        val referenceRecursionList = mutableListOf<Name>()
+        with (referenceRecursionList) {
+            add(recursiveTailTypeName)
+            addAll(referenceStack.toList().takeLastWhile { it != recursiveTailTypeName })
+            add(recursiveTailTypeName)
+        }
+
+        return referenceRecursionList.joinToString(" -> ")
+    }
+
     private fun assignGetters(fields: List<Field>, getterCandidates: List<ExecutableElement>) {
         fields.forEach { field ->
             assignGetter(field, getterCandidates)
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/ProcessorErrors.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/ProcessorErrors.kt
index a576aa2..4752478 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/ProcessorErrors.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/ProcessorErrors.kt
@@ -25,7 +25,6 @@
 import android.arch.persistence.room.vo.CustomTypeConverter
 import android.arch.persistence.room.vo.Field
 import com.squareup.javapoet.TypeName
-import javax.lang.model.type.TypeMirror
 
 object ProcessorErrors {
     private fun String.trim(): String {
@@ -38,6 +37,8 @@
     val INVALID_ON_CONFLICT_VALUE = "On conflict value must be one of @OnConflictStrategy values."
     val INVALID_INSERTION_METHOD_RETURN_TYPE = "Methods annotated with @Insert can return either" +
             " void, long, Long, long[], Long[] or List<Long>."
+    val TRANSACTION_REFERENCE_DOCS = "https://developer.android.com/reference/android/arch/" +
+            "persistence/room/Transaction.html"
 
     fun insertionMethodReturnTypeMismatch(definedReturn : TypeName,
                                           expectedReturnTypes : List<TypeName>) : String {
@@ -123,7 +124,13 @@
             " @Update but does not have any parameters to update."
 
     val TRANSACTION_METHOD_MODIFIERS = "Method annotated with @Transaction must not be " +
-            "private, final, or abstract."
+            "private, final, or abstract. It can be abstract only if the method is also" +
+            " annotated with @Query."
+
+    val TRANSACTION_MISSING_ON_RELATION = "The return value includes a Pojo with a @Relation." +
+            " It is usually desired to annotate this method with @Transaction to avoid" +
+            " possibility of inconsistent results between the Pojo and its relations. See " +
+            TRANSACTION_REFERENCE_DOCS + " for details."
 
     val CANNOT_FIND_ENTITY_FOR_SHORTCUT_QUERY_PARAMETER = "Type of the parameter must be a class " +
             "annotated with @Entity or a collection/array of it."
@@ -134,9 +141,12 @@
     val LIVE_DATA_QUERY_WITHOUT_SELECT = "LiveData return type can only be used with SELECT" +
             " queries."
 
-    val LIVE_DATA_QUERY_NOTHING_TO_OBSERVE = "LiveData return type can only be used with SELECT" +
-            " queries that directly or indirectly (via @Relation, for example) access at least" +
-            " one table.";
+    val OBSERVABLE_QUERY_NOTHING_TO_OBSERVE = "Observable query return type (LiveData, Flowable" +
+            " etc) can only be used with SELECT queries that directly or indirectly (via" +
+            " @Relation, for example) access at least one table."
+
+    val RECURSIVE_REFERENCE_DETECTED = "Recursive referencing through @Embedded and/or @Relation " +
+            "detected: %s"
 
     private val TOO_MANY_MATCHING_GETTERS = "Ambiguous getter for %s. All of the following " +
             "match: %s. You can @Ignore the ones that you don't want to match."
@@ -197,6 +207,16 @@
                 """.trim()
     }
 
+    fun pojoMissingNonNull(pojoTypeName: TypeName, missingPojoFields: List<String>,
+                           allQueryColumns: List<String>) : String {
+        return """
+        The columns returned by the query does not have the fields
+        [${missingPojoFields.joinToString(",")}] in $pojoTypeName even though they are
+        annotated as non-null or primitive.
+        Columns returned by the query: [${allQueryColumns.joinToString(",")}]
+        """.trim()
+    }
+
     fun cursorPojoMismatch(pojoTypeName: TypeName,
                            unusedColumns: List<String>, allColumns: List<String>,
                            unusedFields: List<Field>, allFields: List<Field>): String {
@@ -448,9 +468,22 @@
             unwanted constructors with @Ignore.
             """.trim()
 
+    val TOO_MANY_POJO_CONSTRUCTORS_CHOOSING_NO_ARG = """
+            There are multiple good constructors and Room will pick the no-arg constructor.
+            You can use the @Ignore annotation to eliminate unwanted constructors.
+            """.trim()
+
     val PAGING_SPECIFY_DATA_SOURCE_TYPE = "For now, Room only supports TiledDataSource class."
 
-    val PRIMARY_KEY_NULL = "You must annotate primary keys with @NonNull. SQLite considers this a " +
-            "bug and Room does not allow it. See SQLite docs for details: " +
-            "https://www.sqlite.org/lang_createtable.html"
+    fun primaryKeyNull(field: String): String{
+        return "You must annotate primary keys with @NonNull. \"$field\" is nullable. SQLite " +
+                "considers this a " +
+                "bug and Room does not allow it. See SQLite docs for details: " +
+                "https://www.sqlite.org/lang_createtable.html"
+    }
+
+    val INVALID_COLUMN_NAME = "Invalid column name. Room does not allow using ` or \" in column" +
+            " names"
+
+    val INVALID_TABLE_NAME = "Invalid table name. Room does not allow using ` or \" in table names"
 }
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/QueryMethodProcessor.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/QueryMethodProcessor.kt
index fc60074..ebd586a 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/QueryMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/QueryMethodProcessor.kt
@@ -18,15 +18,18 @@
 
 import android.arch.persistence.room.Query
 import android.arch.persistence.room.SkipQueryVerification
+import android.arch.persistence.room.Transaction
 import android.arch.persistence.room.ext.hasAnnotation
 import android.arch.persistence.room.parser.ParsedQuery
 import android.arch.persistence.room.parser.QueryType
 import android.arch.persistence.room.parser.SqlParser
 import android.arch.persistence.room.solver.query.result.LiveDataQueryResultBinder
+import android.arch.persistence.room.solver.query.result.PojoRowAdapter
 import android.arch.persistence.room.verifier.DatabaseVerificaitonErrors
 import android.arch.persistence.room.verifier.DatabaseVerifier
 import android.arch.persistence.room.vo.QueryMethod
 import android.arch.persistence.room.vo.QueryParameter
+import android.arch.persistence.room.vo.Warning
 import com.google.auto.common.AnnotationMirrors
 import com.google.auto.common.MoreElements
 import com.google.auto.common.MoreTypes
@@ -91,6 +94,22 @@
                     ProcessorErrors.LIVE_DATA_QUERY_WITHOUT_SELECT)
         }
 
+        val inTransaction = when (query.type) {
+            QueryType.SELECT -> executableElement.hasAnnotation(Transaction::class)
+            else -> true
+        }
+
+        if (query.type == QueryType.SELECT && !inTransaction) {
+            // put a warning if it is has relations and not annotated w/ transaction
+            resultBinder.adapter?.rowAdapter?.let { rowAdapter ->
+                if (rowAdapter is PojoRowAdapter
+                        && rowAdapter.relationCollectors.isNotEmpty()) {
+                    context.logger.w(Warning.RELATION_QUERY_WITHOUT_TRANSACTION,
+                            executableElement, ProcessorErrors.TRANSACTION_MISSING_ON_RELATION)
+                }
+            }
+        }
+
         val queryMethod = QueryMethod(
                 element = executableElement,
                 query = query,
@@ -101,6 +120,7 @@
                                 baseContext = context,
                                 containing = containing,
                                 element = it).process() },
+                inTransaction = inTransaction,
                 queryResultBinder = resultBinder)
 
         val missing = queryMethod.sectionToParamMapping
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/TransactionMethodProcessor.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/TransactionMethodProcessor.kt
index f861ebe..256304a 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/TransactionMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/TransactionMethodProcessor.kt
@@ -20,9 +20,9 @@
 import android.arch.persistence.room.vo.TransactionMethod
 import javax.lang.model.element.ExecutableElement
 import javax.lang.model.element.Modifier.ABSTRACT
-import javax.lang.model.type.DeclaredType
 import javax.lang.model.element.Modifier.FINAL
 import javax.lang.model.element.Modifier.PRIVATE
+import javax.lang.model.type.DeclaredType
 
 class TransactionMethodProcessor(baseContext: Context,
                                  val containing: DeclaredType,
@@ -31,7 +31,6 @@
     val context = baseContext.fork(executableElement)
 
     fun process(): TransactionMethod {
-        // TODO: Remove abstract check
         context.checker.check(!executableElement.hasAnyOf(PRIVATE, FINAL, ABSTRACT),
                 executableElement, ProcessorErrors.TRANSACTION_METHOD_MODIFIERS)
 
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/ObservableQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/ObservableQueryResultBinderProvider.kt
new file mode 100644
index 0000000..89b0072
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/ObservableQueryResultBinderProvider.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.persistence.room.solver
+
+import android.arch.persistence.room.parser.ParsedQuery
+import android.arch.persistence.room.processor.Context
+import android.arch.persistence.room.processor.ProcessorErrors
+import android.arch.persistence.room.solver.query.result.QueryResultAdapter
+import android.arch.persistence.room.solver.query.result.QueryResultBinder
+import javax.lang.model.type.DeclaredType
+import javax.lang.model.type.TypeMirror
+
+/**
+ * Binder provider class that has common functionality for observables.
+ */
+abstract class ObservableQueryResultBinderProvider(val context: Context)
+    : QueryResultBinderProvider {
+    protected abstract fun extractTypeArg(declared: DeclaredType) : TypeMirror
+    protected abstract fun create(typeArg: TypeMirror,
+                                  resultAdapter: QueryResultAdapter?,
+                                  tableNames : Set<String>) : QueryResultBinder
+
+    override final fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+        val typeArg = extractTypeArg(declared)
+        val adapter = context.typeAdapterStore.findQueryResultAdapter(typeArg, query)
+        val tableNames = ((adapter?.accessedTableNames() ?: emptyList()) +
+                query.tables.map { it.name }).toSet()
+        context.checker.check(!tableNames.isEmpty(),
+                declared.asElement(),
+                ProcessorErrors.OBSERVABLE_QUERY_NOTHING_TO_OBSERVE)
+        return create(
+                typeArg = typeArg,
+                resultAdapter = adapter,
+                tableNames = tableNames
+        )
+    }
+}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/FlowableQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/FlowableQueryResultBinderProvider.kt
index 828f5a7..6a2c901 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/FlowableQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/FlowableQueryResultBinderProvider.kt
@@ -18,17 +18,17 @@
 
 import android.arch.persistence.room.ext.RoomRxJava2TypeNames
 import android.arch.persistence.room.ext.RxJava2TypeNames
-import android.arch.persistence.room.parser.ParsedQuery
 import android.arch.persistence.room.processor.Context
 import android.arch.persistence.room.processor.ProcessorErrors
-import android.arch.persistence.room.solver.QueryResultBinderProvider
+import android.arch.persistence.room.solver.ObservableQueryResultBinderProvider
 import android.arch.persistence.room.solver.query.result.FlowableQueryResultBinder
+import android.arch.persistence.room.solver.query.result.QueryResultAdapter
 import android.arch.persistence.room.solver.query.result.QueryResultBinder
-import com.google.common.annotations.VisibleForTesting
 import javax.lang.model.type.DeclaredType
 import javax.lang.model.type.TypeMirror
 
-class FlowableQueryResultBinderProvider(val context : Context) : QueryResultBinderProvider {
+class FlowableQueryResultBinderProvider(context: Context) :
+        ObservableQueryResultBinderProvider(context) {
     private val flowableTypeMirror: TypeMirror? by lazy {
         context.processingEnv.elementUtils
                 .getTypeElement(RxJava2TypeNames.FLOWABLE.toString())?.asType()
@@ -39,10 +39,14 @@
                 .getTypeElement(RoomRxJava2TypeNames.RX_ROOM.toString()) != null
     }
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
-        val typeArg = declared.typeArguments.first()
-        return FlowableQueryResultBinder(typeArg, query.tables.map { it.name },
-                context.typeAdapterStore.findQueryResultAdapter(typeArg, query))
+    override fun extractTypeArg(declared: DeclaredType): TypeMirror = declared.typeArguments.first()
+
+    override fun create(typeArg: TypeMirror, resultAdapter: QueryResultAdapter?,
+                        tableNames: Set<String>): QueryResultBinder {
+        return FlowableQueryResultBinder(
+                typeArg = typeArg,
+                queryTableNames = tableNames,
+                adapter = resultAdapter)
     }
 
     override fun matches(declared: DeclaredType): Boolean =
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt
index 7e6725f..650ec19 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt
@@ -17,34 +17,29 @@
 package android.arch.persistence.room.solver.binderprovider
 
 import android.arch.persistence.room.ext.LifecyclesTypeNames
-import android.arch.persistence.room.parser.ParsedQuery
 import android.arch.persistence.room.processor.Context
-import android.arch.persistence.room.processor.ProcessorErrors
-import android.arch.persistence.room.solver.QueryResultBinderProvider
+import android.arch.persistence.room.solver.ObservableQueryResultBinderProvider
 import android.arch.persistence.room.solver.query.result.LiveDataQueryResultBinder
+import android.arch.persistence.room.solver.query.result.QueryResultAdapter
 import android.arch.persistence.room.solver.query.result.QueryResultBinder
 import javax.lang.model.type.DeclaredType
 import javax.lang.model.type.TypeMirror
 
-class LiveDataQueryResultBinderProvider(val context : Context) : QueryResultBinderProvider {
+class LiveDataQueryResultBinderProvider(context : Context)
+    : ObservableQueryResultBinderProvider(context) {
     private val liveDataTypeMirror: TypeMirror? by lazy {
         context.processingEnv.elementUtils
                 .getTypeElement(LifecyclesTypeNames.LIVE_DATA.toString())?.asType()
     }
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
-        val liveDataTypeArg = declared.typeArguments.first()
-        val queryResultAdapter =
-                context.typeAdapterStore.findQueryResultAdapter(liveDataTypeArg, query)
-        val tableNames = ((queryResultAdapter?.accessedTableNames() ?: emptyList()) +
-                        query.tables.map { it.name }).toSet()
-        context.checker.check(!tableNames.isEmpty(),
-                              declared.asElement(),
-                              ProcessorErrors.LIVE_DATA_QUERY_NOTHING_TO_OBSERVE);
+    override fun extractTypeArg(declared: DeclaredType): TypeMirror = declared.typeArguments.first()
+
+    override fun create(typeArg: TypeMirror, resultAdapter: QueryResultAdapter?,
+                        tableNames: Set<String>): QueryResultBinder {
         return LiveDataQueryResultBinder(
-                liveDataTypeArg,
-                tableNames,
-                queryResultAdapter)
+                typeArg = typeArg,
+                tableNames = tableNames,
+                adapter = resultAdapter)
     }
 
     override fun matches(declared: DeclaredType): Boolean =
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt
index 84c71eb..0bd3fb1 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt
@@ -38,8 +38,7 @@
     override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
         val typeArg = declared.typeArguments.first()
         val adapter = context.typeAdapterStore.findQueryResultAdapter(typeArg, query)
-        return RxCallableQueryResultBinder(rxType,
-                typeArg, InstantQueryResultBinder(adapter), adapter)
+        return RxCallableQueryResultBinder(rxType, typeArg, adapter)
     }
 
     override fun matches(declared: DeclaredType): Boolean =
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/BaseObservableQueryResultBinder.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/BaseObservableQueryResultBinder.kt
index 7872c33..883180c 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/BaseObservableQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/BaseObservableQueryResultBinder.kt
@@ -22,6 +22,7 @@
 import android.arch.persistence.room.ext.T
 import android.arch.persistence.room.solver.CodeGenScope
 import android.arch.persistence.room.writer.DaoWriter
+import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.MethodSpec
 import javax.lang.model.element.Modifier
 
@@ -42,9 +43,17 @@
 
     protected fun createRunQueryAndReturnStatements(builder: MethodSpec.Builder,
                                                     roomSQLiteQueryVar: String,
+                                                    dbField: FieldSpec,
+                                                    inTransaction: Boolean,
                                                     scope: CodeGenScope) {
+        val transactionWrapper = if (inTransaction) {
+            builder.transactionWrapper(dbField)
+        } else {
+            null
+        }
         val outVar = scope.getTmpVar("_result")
         val cursorVar = scope.getTmpVar("_cursor")
+        transactionWrapper?.beginTransactionWithControlFlow()
         builder.apply {
             addStatement("final $T $L = $N.query($L)", AndroidTypeNames.CURSOR, cursorVar,
                     DaoWriter.dbField, roomSQLiteQueryVar)
@@ -52,6 +61,7 @@
                 val adapterScope = scope.fork()
                 adapter?.convert(outVar, cursorVar, adapterScope)
                 addCode(adapterScope.builder().build())
+                transactionWrapper?.commitTransaction()
                 addStatement("return $L", outVar)
             }
             nextControlFlow("finally").apply {
@@ -59,5 +69,6 @@
             }
             endControlFlow()
         }
+        transactionWrapper?.endTransactionWithControlFlow()
     }
 }
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/CursorQueryResultBinder.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/CursorQueryResultBinder.kt
index cd8ea74..06ec339 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/CursorQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/CursorQueryResultBinder.kt
@@ -16,19 +16,34 @@
 
 package android.arch.persistence.room.solver.query.result
 
+import android.arch.persistence.room.ext.AndroidTypeNames
 import android.arch.persistence.room.ext.L
 import android.arch.persistence.room.ext.N
+import android.arch.persistence.room.ext.T
 import android.arch.persistence.room.solver.CodeGenScope
 import android.arch.persistence.room.writer.DaoWriter
 import com.squareup.javapoet.FieldSpec
 
 class CursorQueryResultBinder : QueryResultBinder(NO_OP_RESULT_ADAPTER) {
-    override fun convertAndReturn(roomSQLiteQueryVar: String, dbField: FieldSpec,
+    override fun convertAndReturn(roomSQLiteQueryVar: String,
+                                  dbField: FieldSpec,
+                                  inTransaction : Boolean,
                                   scope: CodeGenScope) {
-        scope.builder().apply {
-            addStatement("return $N.query($L)", DaoWriter.dbField, roomSQLiteQueryVar)
+        val builder = scope.builder()
+        val transactionWrapper = if (inTransaction) {
+            builder.transactionWrapper(dbField)
+        } else {
+            null
         }
+        transactionWrapper?.beginTransactionWithControlFlow()
+        val resultName = scope.getTmpVar("_tmpResult")
+        builder.addStatement("final $T $L = $N.query($L)", AndroidTypeNames.CURSOR, resultName,
+                dbField, roomSQLiteQueryVar)
+        transactionWrapper?.commitTransaction()
+        builder.addStatement("return $L", resultName)
+        transactionWrapper?.endTransactionWithControlFlow()
     }
+
     companion object {
         private val NO_OP_RESULT_ADAPTER = object : QueryResultAdapter(null) {
             override fun convert(outVarName: String, cursorVarName: String, scope: CodeGenScope) {
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/FlowableQueryResultBinder.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/FlowableQueryResultBinder.kt
index dbd66ce..e1a75b5 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/FlowableQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/FlowableQueryResultBinder.kt
@@ -34,10 +34,12 @@
 /**
  * Binds the result as an RxJava2 Flowable.
  */
-class FlowableQueryResultBinder(val typeArg: TypeMirror, val queryTableNames: List<String>,
+class FlowableQueryResultBinder(val typeArg: TypeMirror, val queryTableNames: Set<String>,
                                 adapter: QueryResultAdapter?)
     : BaseObservableQueryResultBinder(adapter) {
-    override fun convertAndReturn(roomSQLiteQueryVar: String, dbField: FieldSpec,
+    override fun convertAndReturn(roomSQLiteQueryVar: String,
+                                  dbField: FieldSpec,
+                                  inTransaction : Boolean,
                                   scope: CodeGenScope) {
         val callableImpl = TypeSpec.anonymousClassBuilder("").apply {
             val typeName = typeArg.typeName()
@@ -47,7 +49,11 @@
                 returns(typeName)
                 addException(Exception::class.typeName())
                 addModifiers(Modifier.PUBLIC)
-                createRunQueryAndReturnStatements(this, roomSQLiteQueryVar, scope)
+                createRunQueryAndReturnStatements(builder = this,
+                        roomSQLiteQueryVar = roomSQLiteQueryVar,
+                        inTransaction = inTransaction,
+                        dbField = dbField,
+                        scope = scope)
             }.build())
             addMethod(createFinalizeMethod(roomSQLiteQueryVar))
         }.build()
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/InstantQueryResultBinder.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/InstantQueryResultBinder.kt
index ff15252..c18bf2d 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/InstantQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/InstantQueryResultBinder.kt
@@ -27,8 +27,16 @@
  * Instantly runs and returns the query.
  */
 class InstantQueryResultBinder(adapter: QueryResultAdapter?) : QueryResultBinder(adapter) {
-    override fun convertAndReturn(roomSQLiteQueryVar : String, dbField: FieldSpec,
+    override fun convertAndReturn(roomSQLiteQueryVar : String,
+                                  dbField: FieldSpec,
+                                  inTransaction : Boolean,
                                   scope: CodeGenScope) {
+        val transactionWrapper = if (inTransaction) {
+            scope.builder().transactionWrapper(dbField)
+        } else {
+            null
+        }
+        transactionWrapper?.beginTransactionWithControlFlow()
         scope.builder().apply {
             val outVar = scope.getTmpVar("_result")
             val cursorVar = scope.getTmpVar("_cursor")
@@ -36,6 +44,7 @@
                     DaoWriter.dbField, roomSQLiteQueryVar)
             beginControlFlow("try").apply {
                 adapter?.convert(outVar, cursorVar, scope)
+                transactionWrapper?.commitTransaction()
                 addStatement("return $L", outVar)
             }
             nextControlFlow("finally").apply {
@@ -44,5 +53,6 @@
             }
             endControlFlow()
         }
+        transactionWrapper?.endTransactionWithControlFlow()
     }
 }
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/LiveDataQueryResultBinder.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/LiveDataQueryResultBinder.kt
index a385a94..0ef8a93 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/LiveDataQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/LiveDataQueryResultBinder.kt
@@ -40,7 +40,9 @@
                                 adapter: QueryResultAdapter?)
     : BaseObservableQueryResultBinder(adapter) {
     @Suppress("JoinDeclarationAndAssignment")
-    override fun convertAndReturn(roomSQLiteQueryVar : String, dbField: FieldSpec,
+    override fun convertAndReturn(roomSQLiteQueryVar : String,
+                                  dbField: FieldSpec,
+                                  inTransaction : Boolean,
                                   scope: CodeGenScope) {
         val typeName = typeArg.typeName()
 
@@ -55,6 +57,7 @@
                     typeName = typeName,
                     roomSQLiteQueryVar = roomSQLiteQueryVar,
                     dbField = dbField,
+                    inTransaction = inTransaction,
                     scope = scope
             ))
             addMethod(createFinalizeMethod(roomSQLiteQueryVar))
@@ -66,6 +69,7 @@
 
     private fun createComputeMethod(roomSQLiteQueryVar: String, typeName: TypeName,
                                     observerField: FieldSpec, dbField: FieldSpec,
+                                    inTransaction: Boolean,
                                     scope: CodeGenScope): MethodSpec {
         return MethodSpec.methodBuilder("compute").apply {
             addAnnotation(Override::class.java)
@@ -79,7 +83,11 @@
             }
             endControlFlow()
 
-            createRunQueryAndReturnStatements(this, roomSQLiteQueryVar, scope)
+            createRunQueryAndReturnStatements(builder = this,
+                    roomSQLiteQueryVar = roomSQLiteQueryVar,
+                    dbField = dbField,
+                    inTransaction = inTransaction,
+                    scope = scope)
         }.build()
     }
 
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/LivePagedListQueryResultBinder.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/LivePagedListQueryResultBinder.kt
index 39ea32b..c10f9fb 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/LivePagedListQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/LivePagedListQueryResultBinder.kt
@@ -31,14 +31,20 @@
     : QueryResultBinder(tiledDataSourceQueryResultBinder.listAdapter) {
     @Suppress("HasPlatformType")
     val typeName = tiledDataSourceQueryResultBinder.itemTypeName
-    override fun convertAndReturn(roomSQLiteQueryVar: String, dbField: FieldSpec,
+    override fun convertAndReturn(roomSQLiteQueryVar: String,
+                                  dbField: FieldSpec,
+                                  inTransaction : Boolean,
                                   scope: CodeGenScope) {
         scope.builder().apply {
             val pagedListProvider = TypeSpec
                     .anonymousClassBuilder("").apply {
                 superclass(ParameterizedTypeName.get(PagingTypeNames.LIVE_PAGED_LIST_PROVIDER,
                         Integer::class.typeName(), typeName))
-                addMethod(createCreateDataSourceMethod(roomSQLiteQueryVar, dbField, scope))
+                addMethod(createCreateDataSourceMethod(
+                        roomSQLiteQueryVar = roomSQLiteQueryVar,
+                        dbField = dbField,
+                        inTransaction = inTransaction,
+                        scope = scope))
             }.build()
             addStatement("return $L", pagedListProvider)
         }
@@ -46,14 +52,18 @@
 
     private fun createCreateDataSourceMethod(roomSQLiteQueryVar: String,
                                              dbField: FieldSpec,
+                                             inTransaction : Boolean,
                                              scope: CodeGenScope): MethodSpec
             = MethodSpec.methodBuilder("createDataSource").apply {
         addAnnotation(Override::class.java)
         addModifiers(Modifier.PROTECTED)
         returns(tiledDataSourceQueryResultBinder.typeName)
         val countedBinderScope = scope.fork()
-        tiledDataSourceQueryResultBinder.convertAndReturn(roomSQLiteQueryVar, dbField,
-                countedBinderScope)
+        tiledDataSourceQueryResultBinder.convertAndReturn(
+                roomSQLiteQueryVar = roomSQLiteQueryVar,
+                dbField = dbField,
+                inTransaction = inTransaction,
+                scope = countedBinderScope)
         addCode(countedBinderScope.builder().build())
     }.build()
 }
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/PojoRowAdapter.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/PojoRowAdapter.kt
index 062b179..a013dc7 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/PojoRowAdapter.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/PojoRowAdapter.kt
@@ -19,7 +19,6 @@
 import android.arch.persistence.room.ext.L
 import android.arch.persistence.room.ext.S
 import android.arch.persistence.room.ext.T
-import android.arch.persistence.room.ext.typeName
 import android.arch.persistence.room.processor.Context
 import android.arch.persistence.room.processor.ProcessorErrors
 import android.arch.persistence.room.solver.CodeGenScope
@@ -71,6 +70,13 @@
             )
             context.logger.w(Warning.CURSOR_MISMATCH, null, warningMsg)
         }
+        val nonNulls = remainingFields.filter { it.nonNull }
+        if (nonNulls.isNotEmpty()) {
+            context.logger.e(ProcessorErrors.pojoMissingNonNull(
+                    pojoTypeName = pojo.typeName,
+                    missingPojoFields = nonNulls.map { it.name },
+                    allQueryColumns = info.columns.map { it.name }))
+        }
         if (matchedFields.isEmpty()) {
             context.logger.e(ProcessorErrors.CANNOT_FIND_QUERY_RESULT_ADAPTER)
         }
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/QueryResultBinder.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/QueryResultBinder.kt
index 205bd88..652de46 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/QueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/QueryResultBinder.kt
@@ -32,5 +32,7 @@
      * and returns the result.
      */
     abstract fun convertAndReturn(roomSQLiteQueryVar: String,
-                                  dbField: FieldSpec, scope: CodeGenScope)
+                                  dbField: FieldSpec,
+                                  inTransaction : Boolean,
+                                  scope: CodeGenScope)
 }
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/RxCallableQueryResultBinder.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/RxCallableQueryResultBinder.kt
index da960f6..1ab91e8 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/RxCallableQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/RxCallableQueryResultBinder.kt
@@ -38,28 +38,42 @@
  */
 class RxCallableQueryResultBinder(val rxType: RxType,
                                   val typeArg: TypeMirror,
-                                  val instantBinder : InstantQueryResultBinder,
-                                  adapter: QueryResultAdapter?) : QueryResultBinder(adapter) {
-    override fun convertAndReturn(roomSQLiteQueryVar: String, dbField: FieldSpec,
+                                  adapter: QueryResultAdapter?)
+    : QueryResultBinder(adapter) {
+    override fun convertAndReturn(roomSQLiteQueryVar: String,
+                                  dbField: FieldSpec,
+                                  inTransaction : Boolean,
                                   scope: CodeGenScope) {
         val callable = TypeSpec.anonymousClassBuilder("").apply {
             val typeName = typeArg.typeName()
             superclass(ParameterizedTypeName.get(java.util.concurrent.Callable::class.typeName(),
                     typeName))
-            addMethod(createCallMethod(roomSQLiteQueryVar, dbField, scope))
+            addMethod(createCallMethod(
+                    roomSQLiteQueryVar = roomSQLiteQueryVar,
+                    dbField = dbField,
+                    inTransaction = inTransaction,
+                    scope = scope))
         }.build()
         scope.builder().apply {
             addStatement("return $T.fromCallable($L)", rxType.className, callable)
         }
     }
 
-    fun createCallMethod(roomSQLiteQueryVar: String, dbField: FieldSpec,
+    fun createCallMethod(roomSQLiteQueryVar: String,
+                         dbField: FieldSpec,
+                         inTransaction: Boolean,
                          scope: CodeGenScope): MethodSpec {
         val adapterScope = scope.fork()
         return MethodSpec.methodBuilder("call").apply {
             returns(typeArg.typeName())
             addException(Exception::class.typeName())
             addModifiers(Modifier.PUBLIC)
+            val transactionWrapper = if (inTransaction) {
+                transactionWrapper(dbField)
+            } else {
+                null
+            }
+            transactionWrapper?.beginTransactionWithControlFlow()
             val outVar = scope.getTmpVar("_result")
             val cursorVar = scope.getTmpVar("_cursor")
             addStatement("final $T $L = $N.query($L)", AndroidTypeNames.CURSOR, cursorVar,
@@ -76,6 +90,7 @@
                     }
                     endControlFlow()
                 }
+                transactionWrapper?.commitTransaction()
                 addStatement("return $L", outVar)
             }
             nextControlFlow("finally").apply {
@@ -83,10 +98,11 @@
                 addStatement("$L.release()", roomSQLiteQueryVar)
             }
             endControlFlow()
+            transactionWrapper?.endTransactionWithControlFlow()
         }.build()
     }
 
-    enum class RxType(val className : ClassName, val canBeNull : Boolean) {
+    enum class RxType(val className: ClassName, val canBeNull: Boolean) {
         SINGLE(RxJava2TypeNames.SINGLE, canBeNull = false),
         MAYBE(RxJava2TypeNames.MAYBE, canBeNull = true);
     }
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/TiledDataSourceQueryResultBinder.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/TiledDataSourceQueryResultBinder.kt
index 1b4b3fe..2281cfb 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/TiledDataSourceQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/TiledDataSourceQueryResultBinder.kt
@@ -37,11 +37,13 @@
     val itemTypeName : TypeName = listAdapter?.rowAdapter?.out?.typeName() ?: TypeName.OBJECT
     val typeName : ParameterizedTypeName = ParameterizedTypeName.get(
             RoomTypeNames.LIMIT_OFFSET_DATA_SOURCE, itemTypeName)
-    override fun convertAndReturn(roomSQLiteQueryVar: String, dbField: FieldSpec,
+    override fun convertAndReturn(roomSQLiteQueryVar: String,
+                                  dbField: FieldSpec,
+                                  inTransaction : Boolean,
                                   scope: CodeGenScope) {
         val tableNamesList = tableNames.joinToString(",") { "\"$it\"" }
-        val spec = TypeSpec.anonymousClassBuilder("$N, $L, $L",
-                dbField, roomSQLiteQueryVar, tableNamesList).apply {
+        val spec = TypeSpec.anonymousClassBuilder("$N, $L, $L, $L",
+                dbField, roomSQLiteQueryVar, inTransaction, tableNamesList).apply {
             superclass(typeName)
             addMethod(createConvertRowsMethod(scope))
         }.build()
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/TransactionWrapper.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/TransactionWrapper.kt
new file mode 100644
index 0000000..30d02ee
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/solver/query/result/TransactionWrapper.kt
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.persistence.room.solver.query.result
+
+import android.arch.persistence.room.ext.N
+import com.squareup.javapoet.CodeBlock
+import com.squareup.javapoet.FieldSpec
+import com.squareup.javapoet.MethodSpec
+
+/**
+ * helper class to create correct transaction code.
+ */
+interface TransactionWrapper {
+    fun beginTransactionWithControlFlow()
+    fun commitTransaction()
+    fun endTransactionWithControlFlow()
+}
+
+fun MethodSpec.Builder.transactionWrapper(dbField : FieldSpec) = object : TransactionWrapper {
+    override fun beginTransactionWithControlFlow() {
+        addStatement("$N.beginTransaction()", dbField)
+        beginControlFlow("try")
+    }
+
+    override fun commitTransaction() {
+        addStatement("$N.setTransactionSuccessful()", dbField)
+    }
+
+    override fun endTransactionWithControlFlow() {
+        nextControlFlow("finally")
+        addStatement("$N.endTransaction()", dbField)
+        endControlFlow()
+    }
+}
+
+fun CodeBlock.Builder.transactionWrapper(dbField: FieldSpec) = object : TransactionWrapper {
+    override fun beginTransactionWithControlFlow() {
+        addStatement("$N.beginTransaction()", dbField)
+        beginControlFlow("try")
+    }
+
+    override fun commitTransaction() {
+        addStatement("$N.setTransactionSuccessful()", dbField)
+    }
+
+    override fun endTransactionWithControlFlow() {
+        nextControlFlow("finally")
+        addStatement("$N.endTransaction()", dbField)
+        endControlFlow()
+    }
+}
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/verifier/DatabaseVerifier.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/verifier/DatabaseVerifier.kt
index 8475f3a..11acbdf 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/verifier/DatabaseVerifier.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/verifier/DatabaseVerifier.kt
@@ -16,10 +16,11 @@
 
 package android.arch.persistence.room.verifier
 
-import columnInfo
 import android.arch.persistence.room.processor.Context
 import android.arch.persistence.room.vo.Entity
 import android.arch.persistence.room.vo.Warning
+import columnInfo
+import org.sqlite.JDBC
 import java.io.File
 import java.sql.Connection
 import java.sql.DriverManager
@@ -34,25 +35,28 @@
 class DatabaseVerifier private constructor(
         val connection : Connection, val context : Context, val entities : List<Entity>) {
     companion object {
+        private const val CONNECTION_URL = "jdbc:sqlite::memory:"
+
+        init {
+            // see: https://github.com/xerial/sqlite-jdbc/issues/97
+            val tmpDir = System.getProperty("java.io.tmpdir")
+            if (tmpDir != null) {
+                val outDir = File(tmpDir, "room-${UUID.randomUUID()}")
+                outDir.mkdirs()
+                outDir.deleteOnExit()
+                System.setProperty("org.sqlite.tmpdir", outDir.absolutePath)
+                // dummy call to trigger JDBC initialization so that we can unregister it
+                JDBC.isValidURL(CONNECTION_URL)
+                unregisterDrivers()
+            }
+        }
+
         /**
          * Tries to create a verifier but returns null if it cannot find the driver.
          */
         fun create(context: Context, element: Element, entities: List<Entity>) : DatabaseVerifier? {
             return try {
-                // see: https://github.com/xerial/sqlite-jdbc/issues/97
-                val tmpDir = System.getProperty("java.io.tmpdir")
-                if (tmpDir == null) {
-                    context.logger.w(Warning.MISSING_JAVA_TMP_DIR,
-                            element, DatabaseVerificaitonErrors.CANNOT_GET_TMP_JAVA_DIR)
-                    return null
-                }
-                val outDir = File(tmpDir, "room-${UUID.randomUUID()}")
-                outDir.mkdirs()
-                outDir.deleteOnExit()
-                System.setProperty("org.sqlite.tmpdir", outDir.absolutePath)
-                //force load:
-                Class.forName("org.sqlite.JDBC")
-                val connection = DriverManager.getConnection("jdbc:sqlite::memory:")
+                val connection = JDBC.createConnection(CONNECTION_URL, java.util.Properties())
                 DatabaseVerifier(connection, context, entities)
             } catch (ex : Exception) {
                 context.logger.w(Warning.CANNOT_CREATE_VERIFICATION_DATABASE, element,
@@ -60,6 +64,22 @@
                 null
             }
         }
+
+        /**
+         * Unregisters the JDBC driver. If we don't do this, we'll leak the driver which leaks a
+         * whole class loader.
+         * see: https://github.com/xerial/sqlite-jdbc/issues/267
+         * see: https://issuetracker.google.com/issues/62473121
+         */
+        private fun unregisterDrivers() {
+            try {
+                DriverManager.getDriver(CONNECTION_URL)?.let {
+                    DriverManager.deregisterDriver(it)
+                }
+            } catch (t : Throwable) {
+                System.err.println("Room: cannot unregister driver ${t.message}")
+            }
+        }
     }
     init {
         entities.forEach { entity ->
@@ -77,12 +97,13 @@
         }
     }
 
-    fun closeConnection() {
+    fun closeConnection(context: Context) {
         if (!connection.isClosed) {
             try {
                 connection.close()
             } catch (t : Throwable) {
                 //ignore.
+                context.logger.d("failed to close the database connection ${t.message}")
             }
         }
     }
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/Index.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/Index.kt
index 69f16f3..0bee2e0 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/Index.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/Index.kt
@@ -23,7 +23,10 @@
  * Represents a processed index.
  */
 data class Index(val name : String, val unique : Boolean, val fields : List<Field>) {
-
+    companion object {
+        // should match the value in TableInfo.Index.DEFAULT_PREFIX
+        const val DEFAULT_PREFIX = "index_"
+    }
     fun createQuery(tableName : String) : String {
         val uniqueSQL = if (unique) {
             "UNIQUE"
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/QueryMethod.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/QueryMethod.kt
index 1aa8430..a6b8cb7 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/QueryMethod.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/QueryMethod.kt
@@ -29,6 +29,7 @@
  */
 data class QueryMethod(val element: ExecutableElement, val query: ParsedQuery, val name: String,
                        val returnType: TypeMirror, val parameters: List<QueryParameter>,
+                       val inTransaction : Boolean,
                        val queryResultBinder : QueryResultBinder) {
     val sectionToParamMapping by lazy {
         query.bindSections.map {
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/Warning.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/Warning.kt
index 9cf137d..dd154c4 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/Warning.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/Warning.kt
@@ -31,7 +31,9 @@
     INDEX_FROM_PARENT_FIELD_IS_DROPPED("ROOM_PARENT_FIELD_INDEX_IS_DROPPED"),
     RELATION_TYPE_MISMATCH("ROOM_RELATION_TYPE_MISMATCH"),
     MISSING_SCHEMA_LOCATION("ROOM_MISSING_SCHEMA_LOCATION"),
-    MISSING_INDEX_ON_FOREIGN_KEY_CHILD("ROOM_MISSING_FOREIGN_KEY_CHILD_INDEX");
+    MISSING_INDEX_ON_FOREIGN_KEY_CHILD("ROOM_MISSING_FOREIGN_KEY_CHILD_INDEX"),
+    RELATION_QUERY_WITHOUT_TRANSACTION("ROOM_RELATION_QUERY_WITHOUT_TRANSACTION"),
+    DEFAULT_CONSTRUCTOR("ROOM_DEFAULT_CONSTRUCTOR");
 
     companion object {
         val PUBLIC_KEY_MAP = Warning.values().associateBy { it.publicKey }
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DaoWriter.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DaoWriter.kt
index 5c7d8a3..0bb9c19 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DaoWriter.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DaoWriter.kt
@@ -445,7 +445,11 @@
         val sqlVar = scope.getTmpVar("_sql")
         val roomSQLiteQueryVar = scope.getTmpVar("_statement")
         queryWriter.prepareReadAndBind(sqlVar, roomSQLiteQueryVar, scope)
-        method.queryResultBinder.convertAndReturn(roomSQLiteQueryVar, dbField, scope)
+        method.queryResultBinder.convertAndReturn(
+                roomSQLiteQueryVar = roomSQLiteQueryVar,
+                dbField = dbField,
+                inTransaction = method.inTransaction,
+                scope = scope)
         return scope.builder().build()
     }
 
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/TableInfoValidationWriter.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/TableInfoValidationWriter.kt
index fe9e743..e54f986 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/TableInfoValidationWriter.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/TableInfoValidationWriter.kt
@@ -75,9 +75,26 @@
                         /*parent column names*/ refColumnNames)
             }
 
-            addStatement("final $T $L = new $T($S, $L, $L)",
+            val indicesSetVar = scope.getTmpVar("_indices$suffix")
+            val indicesType = ParameterizedTypeName.get(HashSet::class.typeName(),
+                    RoomTypeNames.TABLE_INFO_INDEX)
+            addStatement("final $T $L = new $T($L)", indicesType, indicesSetVar,
+                    indicesType, entity.indices.size)
+            entity.indices.forEach { index ->
+                val columnNames = index.fields
+                        .joinToString(",") { "\"${it.columnName}\"" }
+                addStatement("$L.add(new $T($S, $L, $T.asList($L)))",
+                        indicesSetVar,
+                        RoomTypeNames.TABLE_INFO_INDEX,
+                        index.name,
+                        index.unique,
+                        Arrays::class.typeName(),
+                        columnNames)
+            }
+
+            addStatement("final $T $L = new $T($S, $L, $L, $L)",
                     RoomTypeNames.TABLE_INFO, expectedInfoVar, RoomTypeNames.TABLE_INFO,
-                    entity.tableName, columnListVar, foreignKeySetVar)
+                    entity.tableName, columnListVar, foreignKeySetVar, indicesSetVar)
 
             val existingVar = scope.getTmpVar("_existing$suffix")
             addStatement("final $T $L = $T.read($N, $S)",
diff --git a/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java b/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
index 80d73a9..cfdc110 100644
--- a/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
+++ b/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
@@ -11,6 +11,7 @@
 import android.arch.persistence.room.util.TableInfo;
 import android.arch.persistence.room.util.TableInfo.Column;
 import android.arch.persistence.room.util.TableInfo.ForeignKey;
+import android.arch.persistence.room.util.TableInfo.Index;
 import java.lang.IllegalStateException;
 import java.lang.Override;
 import java.lang.String;
@@ -59,7 +60,8 @@
                 _columnsUser.put("lastName", new TableInfo.Column("lastName", "TEXT", false, 0));
                 _columnsUser.put("ageColumn", new TableInfo.Column("ageColumn", "INTEGER", true, 0));
                 final HashSet<TableInfo.ForeignKey> _foreignKeysUser = new HashSet<TableInfo.ForeignKey>(0);
-                final TableInfo _infoUser = new TableInfo("User", _columnsUser, _foreignKeysUser);
+                final HashSet<TableInfo.Index> _indicesUser = new HashSet<TableInfo.Index>(0);
+                final TableInfo _infoUser = new TableInfo("User", _columnsUser, _foreignKeysUser, _indicesUser);
                 final TableInfo _existingUser = TableInfo.read(_db, "User");
                 if (! _infoUser.equals(_existingUser)) {
                     throw new IllegalStateException("Migration didn't properly handle User(foo.bar.User).\n"
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/parser/SqlParserTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/parser/SqlParserTest.kt
index 68b1868..6d3e194 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/parser/SqlParserTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/parser/SqlParserTest.kt
@@ -63,6 +63,22 @@
     }
 
     @Test
+    fun validColumnNames() {
+        listOf("f", "fo", "f2", "f 2", "foo_2", "foo-2", "_", "foo bar baz",
+                "foo 2 baz", "_baz", "fooBar", "2", "*", "foo*2", "dsa$", "\$fsa",
+                "-bar", "şoöğüı").forEach {
+            assertThat("name: $it", SqlParser.isValidIdentifier(it), `is`(true))
+        }
+    }
+
+    @Test
+    fun invalidColumnNames() {
+        listOf("", " ", "fd`a`", "f`a", "`a", "\"foo bar\"", "\"", "`").forEach {
+            assertThat("name: $it", SqlParser.isValidIdentifier(it), `is`(false))
+        }
+    }
+
+    @Test
     fun extractTableNames() {
         assertThat(SqlParser.parse("select * from users").tables,
                 `is`(setOf(Table("users", "users"))))
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/DaoProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/DaoProcessorTest.kt
index 3ade277..55f335d 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/DaoProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/DaoProcessorTest.kt
@@ -192,6 +192,81 @@
         }.compilesWithoutError()
     }
 
+    @Test
+    fun query_warnIfTransactionIsMissingForRelation() {
+        if (!enableVerification) {
+            return
+        }
+        singleDao(
+                """
+                @Dao interface MyDao {
+                    static class Merged extends User {
+                       @Relation(parentColumn = "name", entityColumn = "lastName",
+                                 entity = User.class)
+                       java.util.List<User> users;
+                    }
+                    @Query("select * from user")
+                    abstract java.util.List<Merged> loadUsers();
+                }
+                """
+        ) { dao, _ ->
+            assertThat(dao.queryMethods.size, `is`(1))
+            assertThat(dao.queryMethods.first().inTransaction, `is`(false))
+        }.compilesWithoutError()
+                .withWarningContaining(ProcessorErrors.TRANSACTION_MISSING_ON_RELATION)
+    }
+
+    @Test
+    fun query_dontWarnIfTransactionIsMissingForRelation_suppressed() {
+        if (!enableVerification) {
+            return
+        }
+        singleDao(
+                """
+                @Dao interface MyDao {
+                    static class Merged extends User {
+                       @Relation(parentColumn = "name", entityColumn = "lastName",
+                                 entity = User.class)
+                       java.util.List<User> users;
+                    }
+                    @SuppressWarnings(RoomWarnings.RELATION_QUERY_WITHOUT_TRANSACTION)
+                    @Query("select * from user")
+                    abstract java.util.List<Merged> loadUsers();
+                }
+                """
+        ) { dao, _ ->
+            assertThat(dao.queryMethods.size, `is`(1))
+            assertThat(dao.queryMethods.first().inTransaction, `is`(false))
+        }.compilesWithoutError()
+                .withWarningCount(0)
+    }
+
+    @Test
+    fun query_dontWarnIfTransactionNotIsMissingForRelation() {
+        if (!enableVerification) {
+            return
+        }
+        singleDao(
+                """
+                @Dao interface MyDao {
+                    static class Merged extends User {
+                       @Relation(parentColumn = "name", entityColumn = "lastName",
+                                 entity = User.class)
+                       java.util.List<User> users;
+                    }
+                    @Transaction
+                    @Query("select * from user")
+                    abstract java.util.List<Merged> loadUsers();
+                }
+                """
+        ) { dao, _ ->
+            // test sanity
+            assertThat(dao.queryMethods.size, `is`(1))
+            assertThat(dao.queryMethods.first().inTransaction, `is`(true))
+        }.compilesWithoutError()
+                .withWarningCount(0)
+    }
+
     fun singleDao(vararg inputs: String, handler: (Dao, TestInvocation) -> Unit):
             CompileTester {
         return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
@@ -200,7 +275,12 @@
                 ), COMMON.USER))
                 .processedWith(TestProcessor.builder()
                         .forAnnotations(android.arch.persistence.room.Dao::class,
-                                android.arch.persistence.room.Entity::class)
+                                android.arch.persistence.room.Entity::class,
+                                android.arch.persistence.room.Relation::class,
+                                android.arch.persistence.room.Transaction::class,
+                                android.arch.persistence.room.ColumnInfo::class,
+                                android.arch.persistence.room.PrimaryKey::class,
+                                android.arch.persistence.room.Query::class)
                         .nextRunHandler { invocation ->
                             val dao = invocation.roundEnv
                                     .getElementsAnnotatedWith(
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/EntityProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/EntityProcessorTest.kt
index c25d001..4abf13d 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/EntityProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/EntityProcessorTest.kt
@@ -18,7 +18,6 @@
 
 import COMMON
 import android.arch.persistence.room.parser.SQLTypeAffinity
-import android.arch.persistence.room.processor.ProcessorErrors.PRIMARY_KEY_NULL
 import android.arch.persistence.room.processor.ProcessorErrors.RELATION_IN_ENTITY
 import android.arch.persistence.room.vo.CallType
 import android.arch.persistence.room.vo.Field
@@ -1003,6 +1002,21 @@
     }
 
     @Test
+    fun primaryKey_nonNull_notNeeded() {
+        listOf("long", "Long", "Integer", "int").forEach { type ->
+            singleEntity(
+                    """
+                @PrimaryKey
+                public $type id;
+                """) { entity, _ ->
+                assertThat(entity.primaryKey.fields.size, `is`(1))
+                assertThat(entity.primaryKey.fields.firstOrNull()?.name, `is`("id"))
+                assertThat(entity.primaryKey.autoGenerateId, `is`(false))
+            }.compilesWithoutError()
+        }
+    }
+
+    @Test
     fun primaryKey_autoGenerateBadType() {
         listOf("String", "float", "Float", "Double", "double").forEach { type ->
             singleEntity(
@@ -1163,7 +1177,7 @@
             """) { entity, _ ->
             assertThat(entity.primaryKey.fields.size, `is`(1))
             assertThat(entity.primaryKey.fields.firstOrNull()?.name, `is`("id"))
-        }.failsToCompile().withErrorContaining(PRIMARY_KEY_NULL)
+        }.failsToCompile().withErrorContaining(ProcessorErrors.primaryKeyNull("id"))
     }
 
     @Test
@@ -1175,7 +1189,8 @@
             @PrimaryKey
             public String anotherId;
             """) { entity, _ ->
-        }.failsToCompile().withErrorContaining(PRIMARY_KEY_NULL)
+        }.failsToCompile().withErrorContaining(ProcessorErrors.primaryKeyNull("id"))
+                .and().withErrorContaining(ProcessorErrors.primaryKeyNull("anotherId"))
     }
 
     @Test
@@ -1188,7 +1203,7 @@
             @PrimaryKey
             public String anotherId;
             """) { entity, _ ->
-        }.failsToCompile().withErrorContaining(PRIMARY_KEY_NULL)
+        }.failsToCompile().withErrorContaining(ProcessorErrors.primaryKeyNull("anotherId"))
     }
 
     @Test
@@ -1199,7 +1214,7 @@
                 public String foo;
                 """,
                 attributes = mapOf("primaryKeys" to "{\"id\", \"foo\"}")) { _, _ ->
-        }.failsToCompile().withErrorContaining(PRIMARY_KEY_NULL)
+        }.failsToCompile().withErrorContaining(ProcessorErrors.primaryKeyNull("foo"))
     }
 
     @Test
@@ -1216,6 +1231,241 @@
     }
 
     @Test
+    fun primaryKey_nullableEmbedded(){
+        singleEntity(
+                """
+                public int id;
+
+                @Embedded(prefix = "bar_")
+                @PrimaryKey
+                public Foo foo;
+
+                static class Foo {
+                    public int a;
+                    public int b;
+                }
+                """) { _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.primaryKeyNull("foo"))
+    }
+
+    @Test
+    fun primaryKey_nullableEmbeddedObject(){
+        singleEntity(
+                """
+                public int id;
+
+                @Embedded(prefix = "bar_")
+                @PrimaryKey
+                public Foo foo;
+
+                static class Foo {
+                    public String a;
+                    public String b;
+                }
+                """) { _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.primaryKeyNull("foo > a"))
+                .and().withErrorContaining(ProcessorErrors.primaryKeyNull("foo > b"))
+                .and().withErrorContaining(ProcessorErrors.primaryKeyNull("foo"))
+                .and().withErrorCount(3)
+    }
+
+    @Test
+    fun primaryKey_nullableEmbeddedObject_multipleParents(){
+        singleEntity(
+                """
+                public int id;
+
+                @Embedded(prefix = "bar_")
+                @PrimaryKey
+                public Foo foo;
+
+                static class Foo {
+                @Embedded(prefix = "baz_")
+                public Baz a;
+                public String b;
+
+                static class Baz {
+                    public Integer bb;
+                }
+            }
+                """) { _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.primaryKeyNull("foo > a"))
+                .and().withErrorContaining(ProcessorErrors.primaryKeyNull("foo > b"))
+                .and().withErrorContaining(ProcessorErrors.primaryKeyNull("foo"))
+                .and().withErrorContaining(ProcessorErrors.primaryKeyNull("foo > a > bb"))
+                .and().withErrorCount(4)
+    }
+
+    @Test
+    fun primaryKey_nullableEmbeddedInherited(){
+        val parent = JavaFileObjects.forSourceLines("foo.bar.Base",
+                """
+                package foo.bar;
+                import android.support.annotation.NonNull;
+                import android.arch.persistence.room.*;
+
+                public class Base {
+                    long baseId;
+                    String name, lastName;
+                    @Embedded(prefix = "bar_")
+                    @PrimaryKey
+                    public Foo foo;
+
+                    static class Foo {
+                        public int a;
+                        public int b;
+                    }
+                }
+                """)
+        singleEntity(
+                """
+                public int id;
+                """,
+                baseClass = "foo.bar.Base",
+                jfos = listOf(parent)) { _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.primaryKeyNull("foo"))
+                .and().withErrorContaining(ProcessorErrors.primaryKeyNull("foo > a"))
+                .and().withErrorContaining(ProcessorErrors.primaryKeyNull("foo > b"))
+                .and().withErrorCount(3)
+    }
+
+    @Test
+    fun primaryKey_nullableOverrideViaEmbedded() {
+        val parent = JavaFileObjects.forSourceLines("foo.bar.Base",
+                """
+                package foo.bar;
+                import android.arch.persistence.room.*;
+
+                @Entity(primaryKeys = "baseId")
+                public class Base {
+                    long baseId;
+                    String name, lastName;
+                }
+                """)
+        singleEntity(
+                """
+                public int id;
+                @Embedded(prefix = "bar_")
+                @PrimaryKey
+                public Foo foo;
+
+                static class Foo {
+                    public int a;
+                    public int b;
+                }
+                """,
+                baseClass = "foo.bar.Base",
+                jfos = listOf(parent)) { _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.primaryKeyNull("foo"))
+                .and().withErrorContaining(ProcessorErrors.primaryKeyNull("foo > a"))
+                .and().withErrorContaining(ProcessorErrors.primaryKeyNull("foo > b"))
+                .and().withNoteContaining(
+                "PrimaryKey[baseId] is overridden by PrimaryKey[foo > a, foo > b]")
+                .and().withErrorCount(3)
+    }
+
+    @Test
+    fun primaryKey_nullableOverrideEmbedded() {
+        val parent = JavaFileObjects.forSourceLines("foo.bar.Base",
+                """
+                package foo.bar;
+                import android.support.annotation.NonNull;
+                import android.arch.persistence.room.*;
+
+                public class Base {
+                    long baseId;
+                    String name, lastName;
+                    @Embedded(prefix = "bar_")
+                    @PrimaryKey
+                    public Foo foo;
+
+                    static class Foo {
+                        public int a;
+                        public int b;
+                    }
+                }
+                """)
+        singleEntity(
+                """
+                @PrimaryKey
+                public int id;
+                """,
+                baseClass = "foo.bar.Base",
+                jfos = listOf(parent)) { _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.primaryKeyNull("foo"))
+                .and().withErrorContaining(ProcessorErrors.primaryKeyNull("foo > a"))
+                .and().withErrorContaining(ProcessorErrors.primaryKeyNull("foo > b"))
+                .and().withNoteContaining(
+                "PrimaryKey[foo > a, foo > b] is overridden by PrimaryKey[id]")
+                .and().withErrorCount(3)
+    }
+
+    @Test
+    fun primaryKey_integerOverrideEmbedded() {
+        val parent = JavaFileObjects.forSourceLines("foo.bar.Base",
+                """
+                package foo.bar;
+                import android.support.annotation.NonNull;
+                import android.arch.persistence.room.*;
+
+                public class Base {
+                    long baseId;
+                    String name, lastName;
+                    @Embedded(prefix = "bar_")
+                    @PrimaryKey
+                    public Foo foo;
+
+                    static class Foo {
+                        public Integer a;
+                    }
+                }
+                """)
+        singleEntity(
+                """
+                @PrimaryKey
+                public int id;
+                """,
+                baseClass = "foo.bar.Base",
+                jfos = listOf(parent)) { _, _ ->
+        }.compilesWithoutError().withNoteContaining(
+                "PrimaryKey[foo > a] is overridden by PrimaryKey[id]")
+    }
+
+    @Test
+    fun primaryKey_singleStringPrimaryKeyOverrideEmbedded() {
+        val parent = JavaFileObjects.forSourceLines("foo.bar.Base",
+                """
+                package foo.bar;
+                import android.support.annotation.NonNull;
+                import android.arch.persistence.room.*;
+
+                public class Base {
+                    long baseId;
+                    String name, lastName;
+                    @Embedded(prefix = "bar_")
+                    @PrimaryKey
+                    public Foo foo;
+
+                    static class Foo {
+                        public String a;
+                    }
+                }
+                """)
+        singleEntity(
+                """
+                @PrimaryKey
+                public int id;
+                """,
+                baseClass = "foo.bar.Base",
+                jfos = listOf(parent)) { _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.primaryKeyNull("foo"))
+                .and().withErrorContaining(ProcessorErrors.primaryKeyNull("foo > a"))
+                .and().withNoteContaining(
+                "PrimaryKey[foo > a] is overridden by PrimaryKey[id]")
+                .and().withErrorCount(2)
+    }
+
+    @Test
     fun relationInEntity() {
         singleEntity(
                 """
@@ -1550,4 +1800,102 @@
             assertThat(entity.indices, `is`(emptyList()))
         }.compilesWithoutWarnings()
     }
+
+    @Test
+    fun recursion_1Level() {
+        singleEntity(
+                """
+                @Embedded
+                MyEntity myEntity;
+                """){ _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.RECURSIVE_REFERENCE_DETECTED.format("foo.bar.MyEntity -> foo.bar.MyEntity"))
+    }
+
+    @Test
+    fun recursion_2Levels_embedToRelation() {
+        singleEntity(
+                """
+                int pojoId;
+                @Embedded
+                A a;
+
+                static class A {
+                    int entityId;
+                    @Relation(parentColumn = "pojoId", entityColumn = "entityId")
+                    MyEntity myEntity;
+                }
+                """){ _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.RECURSIVE_REFERENCE_DETECTED.format("foo.bar.MyEntity -> foo.bar.MyEntity.A -> foo.bar.MyEntity"))
+    }
+
+    @Test
+    fun recursion_2Levels_onlyEmbeds_entityToPojo() {
+        singleEntity(
+                """
+                @Embedded
+                A a;
+
+                static class A {
+                    @Embedded
+                    MyEntity myEntity;
+                }
+                """){ _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.RECURSIVE_REFERENCE_DETECTED.format("foo.bar.MyEntity -> foo.bar.MyEntity.A -> foo.bar.MyEntity"))
+    }
+
+    @Test
+    fun recursion_2Levels_onlyEmbeds_onlyEntities() {
+        singleEntity(
+                """
+                @Embedded
+                A a;
+
+                @Entity
+                static class A {
+                    @Embedded
+                    MyEntity myEntity;
+                }
+                """) { _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.RECURSIVE_REFERENCE_DETECTED.format("foo.bar.MyEntity -> foo.bar.MyEntity.A -> foo.bar.MyEntity"))
+    }
+    fun okTableName() {
+        val annotation = mapOf("tableName" to "\"foo bar\"")
+        singleEntity(
+                """
+                @PrimaryKey
+                int id;
+                String name;
+                """,
+                attributes = annotation, jfos = listOf(COMMON.USER)
+        ){ _, _ ->
+        }.compilesWithoutError()
+    }
+
+    @Test
+    fun badTableName() {
+        val annotation = mapOf("tableName" to """ "foo`bar" """)
+        singleEntity(
+                """
+                @PrimaryKey
+                int id;
+                String name;
+                """,
+                attributes = annotation, jfos = listOf(COMMON.USER)
+        ){ _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.INVALID_TABLE_NAME)
+    }
+
+    @Test
+    fun badColumnName() {
+        singleEntity(
+                """
+                @PrimaryKey
+                int id;
+                @ColumnInfo(name = "\"foo bar\"")
+                String name;
+                """,
+                jfos = listOf(COMMON.USER)
+        ){ _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.INVALID_COLUMN_NAME)
+    }
 }
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/PojoProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/PojoProcessorTest.kt
index 3ada5f6..4f14fdb 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/PojoProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/PojoProcessorTest.kt
@@ -693,6 +693,165 @@
         }.compilesWithoutError()
     }
 
+    @Test
+    fun constructor_multipleMatching_withNoArg() {
+        singleRun("""
+            String mName;
+            String mLastName;
+            public MyPojo() {
+            }
+            public MyPojo(String name, String lastName) {
+            }
+        """) { pojo ->
+            assertThat(pojo.constructor?.params?.size ?: -1, `is`(0))
+        }.compilesWithoutError().withWarningContaining(
+                ProcessorErrors.TOO_MANY_POJO_CONSTRUCTORS_CHOOSING_NO_ARG)
+    }
+
+    @Test
+    fun recursion_1Level() {
+        singleRun(
+                """
+                @Embedded
+                MyPojo myPojo;
+                """){ _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.RECURSIVE_REFERENCE_DETECTED.format("foo.bar.MyPojo -> foo.bar.MyPojo"))
+    }
+
+    @Test
+    fun recursion_2Levels_relationToEmbed() {
+        singleRun(
+                """
+                int pojoId;
+
+                @Relation(parentColumn = "pojoId", entityColumn = "entityId")
+                List<MyEntity> myEntity;
+
+                @Entity
+                static class MyEntity {
+                    int entityId;
+
+                    @Embedded
+                    MyPojo myPojo;
+                }
+                """){ _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.RECURSIVE_REFERENCE_DETECTED.format("foo.bar.MyPojo -> foo.bar.MyPojo.MyEntity -> foo.bar.MyPojo"))
+    }
+
+    @Test
+    fun recursion_2Levels_onlyEmbeds_pojoToEntity() {
+        singleRun(
+                """
+                @Embedded
+                A a;
+
+                @Entity
+                static class A {
+                    @Embedded
+                    MyPojo myPojo;
+                }
+                """){ _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.RECURSIVE_REFERENCE_DETECTED.format("foo.bar.MyPojo -> foo.bar.MyPojo.A -> foo.bar.MyPojo"))
+    }
+
+    @Test
+    fun recursion_2Levels_onlyEmbeds_onlyPojos() {
+        singleRun(
+                """
+                @Embedded
+                A a;
+                static class A {
+                    @Embedded
+                    MyPojo myPojo;
+                }
+                """){ _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.RECURSIVE_REFERENCE_DETECTED.format("foo.bar.MyPojo -> foo.bar.MyPojo.A -> foo.bar.MyPojo"))
+    }
+
+    @Test
+    fun recursion_3Levels() {
+        singleRun(
+                """
+                @Embedded
+                A a;
+                public static class A {
+                    @Embedded
+                    B b;
+                }
+                public static class B {
+                    @Embedded
+                    MyPojo myPojo;
+                }
+                """){ _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.RECURSIVE_REFERENCE_DETECTED.format("foo.bar.MyPojo -> foo.bar.MyPojo.A -> foo.bar.MyPojo.B -> foo.bar.MyPojo"))
+    }
+
+    @Test
+    fun recursion_1Level_1LevelDown() {
+        singleRun(
+                """
+                @Embedded
+                A a;
+                static class A {
+                    @Embedded
+                    B b;
+                }
+                static class B {
+                    @Embedded
+                    A a;
+                }
+                """){ _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.RECURSIVE_REFERENCE_DETECTED.format("foo.bar.MyPojo.A -> foo.bar.MyPojo.B -> foo.bar.MyPojo.A"))
+    }
+
+    @Test
+    fun recursion_branchAtLevel0_afterBackTrack() {
+        singleRun(
+                """
+                @PrimaryKey
+                int id;
+                @Embedded
+                A a;
+                @Embedded
+                C c;
+                static class A {
+                    @Embedded
+                    B b;
+                }
+                static class B {
+                }
+                static class C {
+                    @Embedded
+                    MyPojo myPojo;
+                }
+                """){ _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.RECURSIVE_REFERENCE_DETECTED.format("foo.bar.MyPojo -> foo.bar.MyPojo.C -> foo.bar.MyPojo"))
+    }
+
+    @Test
+    fun recursion_branchAtLevel1_afterBackTrack() {
+        singleRun(
+                """
+                @PrimaryKey
+                int id;
+                @Embedded
+                A a;
+                static class A {
+                    @Embedded
+                    B b;
+                    @Embedded
+                    MyPojo myPojo;
+                }
+                static class B {
+                    @Embedded
+                    C c;
+                }
+                static class C {
+                }
+                """){ _, _ ->
+        }.failsToCompile().withErrorContaining(ProcessorErrors.RECURSIVE_REFERENCE_DETECTED.format("foo.bar.MyPojo -> foo.bar.MyPojo.A -> foo.bar.MyPojo"))
+    }
+
     fun singleRun(code: String, vararg jfos:JavaFileObject, handler: (Pojo) -> Unit)
             : CompileTester {
         return singleRun(code, *jfos) { pojo, _ ->
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/QueryMethodProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/QueryMethodProcessorTest.kt
index 1172194..e07e04d 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/QueryMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/QueryMethodProcessorTest.kt
@@ -70,6 +70,7 @@
     companion object {
         const val DAO_PREFIX = """
                 package foo.bar;
+                import android.support.annotation.NonNull;
                 import android.arch.persistence.room.*;
                 @Dao
                 abstract class MyClass {
@@ -312,7 +313,7 @@
                 """) { _, _ ->
             // do nothing
         }.failsToCompile()
-                .withErrorContaining(ProcessorErrors.LIVE_DATA_QUERY_NOTHING_TO_OBSERVE)
+                .withErrorContaining(ProcessorErrors.OBSERVABLE_QUERY_NOTHING_TO_OBSERVE)
     }
 
     @Test
@@ -324,7 +325,7 @@
                 """) { _, _ ->
             // do nothing
         }.failsToCompile()
-                .withErrorContaining(ProcessorErrors.LIVE_DATA_QUERY_NOTHING_TO_OBSERVE)
+                .withErrorContaining(ProcessorErrors.OBSERVABLE_QUERY_NOTHING_TO_OBSERVE)
     }
 
     @Test
@@ -444,6 +445,55 @@
     }
 
     @Test
+    fun query_detectTransaction_delete() {
+        singleQueryMethod(
+                """
+                @Query("delete from user where uid = :id")
+                abstract int deleteUser(String id);
+                """
+        ) { method, _ ->
+            assertThat(method.inTransaction, `is`(true))
+        }.compilesWithoutError()
+    }
+
+    @Test
+    fun query_detectTransaction_update() {
+        singleQueryMethod(
+                """
+                @Query("UPDATE user set uid = :id + 1 where uid = :id")
+                abstract int incrementId(String id);
+                """
+        ) { method, _ ->
+            assertThat(method.inTransaction, `is`(true))
+        }.compilesWithoutError()
+    }
+
+    @Test
+    fun query_detectTransaction_select() {
+        singleQueryMethod(
+                """
+                @Query("select * from user")
+                abstract int loadUsers();
+                """
+        ) { method, _ ->
+            assertThat(method.inTransaction, `is`(false))
+        }.compilesWithoutError()
+    }
+
+    @Test
+    fun query_detectTransaction_selectInTransaction() {
+        singleQueryMethod(
+                """
+                @Transaction
+                @Query("select * from user")
+                abstract int loadUsers();
+                """
+        ) { method, _ ->
+            assertThat(method.inTransaction, `is`(true))
+        }.compilesWithoutError()
+    }
+
+    @Test
     fun skipVerification() {
         singleQueryMethod(
                 """
@@ -599,6 +649,30 @@
     }
 
     @Test
+    fun pojo_missingNonNull() {
+        pojoTest("""
+            @NonNull
+            String name;
+            String lastName;
+            """, listOf("lastName")) { adapter, _, _ ->
+            assertThat(adapter?.mapping?.unusedColumns, `is`(emptyList()))
+            assertThat(adapter?.mapping?.unusedFields, `is`(
+                    adapter?.pojo?.fields?.filter { it.name == "name" }
+            ))
+        }?.failsToCompile()?.withWarningContaining(
+                ProcessorErrors.cursorPojoMismatch(
+                        pojoTypeName = POJO,
+                        unusedColumns = emptyList(),
+                        unusedFields = listOf(createField("name")),
+                        allColumns = listOf("lastName"),
+                        allFields = listOf(createField("name"), createField("lastName"))
+                ))?.and()?.withErrorContaining(
+                ProcessorErrors.pojoMissingNonNull(pojoTypeName = POJO,
+                        missingPojoFields = listOf("name"),
+                        allQueryColumns = listOf("lastName")))
+    }
+
+    @Test
     fun pojo_tooManyFieldsAndColumns() {
         pojoTest("""
             String name;
diff --git a/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.TestDatabase/1.json b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.TestDatabase/1.json
index 6425de7..e6bb21c 100644
--- a/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.TestDatabase/1.json
+++ b/room/integration-tests/kotlintestapp/schemas/android.arch.persistence.room.integration.kotlintestapp.TestDatabase/1.json
@@ -2,7 +2,7 @@
   "formatVersion": 1,
   "database": {
     "version": 1,
-    "identityHash": "7beb328c9cd44a7782dfaa18c30ecb83",
+    "identityHash": "933c7e2810b0f89ab84faa68bbea5852",
     "entities": [
       {
         "tableName": "Book",
@@ -161,11 +161,37 @@
             ]
           }
         ]
+      },
+      {
+        "tableName": "NoArgClass",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `class_name` TEXT NOT NULL, PRIMARY KEY(`id`))",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "class_name",
+            "columnName": "class_name",
+            "affinity": "TEXT",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "id"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
       }
     ],
     "setupQueries": [
       "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
-      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"7beb328c9cd44a7782dfaa18c30ecb83\")"
+      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"933c7e2810b0f89ab84faa68bbea5852\")"
     ]
   }
 }
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/TestDatabase.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/TestDatabase.kt
index b9344af..74d8853 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/TestDatabase.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/TestDatabase.kt
@@ -23,9 +23,11 @@
 import android.arch.persistence.room.integration.kotlintestapp.vo.Author
 import android.arch.persistence.room.integration.kotlintestapp.vo.Book
 import android.arch.persistence.room.integration.kotlintestapp.vo.BookAuthor
+import android.arch.persistence.room.integration.kotlintestapp.vo.NoArgClass
 import android.arch.persistence.room.integration.kotlintestapp.vo.Publisher
 
-@Database(entities = arrayOf(Book::class, Author::class, Publisher::class, BookAuthor::class),
+@Database(entities = arrayOf(Book::class, Author::class, Publisher::class, BookAuthor::class,
+        NoArgClass::class),
         version = 1)
 abstract class TestDatabase : RoomDatabase() {
 
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/migration/MigrationKotlinTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/migration/MigrationKotlinTest.kt
index eb1a9b8..4265e19 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/migration/MigrationKotlinTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/migration/MigrationKotlinTest.kt
@@ -290,6 +290,8 @@
                     + " (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`),"
                     + " FOREIGN KEY(`name`) REFERENCES `Entity1`(`name`)"
                     + " ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED)")
+            database.execSQL("CREATE UNIQUE INDEX `index_entity1` ON "
+                    + MigrationDbKotlin.Entity1.TABLE_NAME + " (`name`)")
         }
     }
 
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/BooksDaoTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/BooksDaoTest.kt
index 7985c77..acc2c7d 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/BooksDaoTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/BooksDaoTest.kt
@@ -21,6 +21,7 @@
 import android.arch.persistence.room.integration.kotlintestapp.vo.BookWithPublisher
 import android.arch.persistence.room.integration.kotlintestapp.vo.Publisher
 import android.database.sqlite.SQLiteConstraintException
+import android.support.test.filters.SmallTest
 import org.hamcrest.CoreMatchers
 import org.hamcrest.CoreMatchers.`is`
 import org.hamcrest.CoreMatchers.instanceOf
@@ -30,6 +31,7 @@
 import java.util.Date
 import kotlin.collections.ArrayList
 
+@SmallTest
 class BooksDaoTest : TestDatabaseTest() {
 
     @Test
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/LiveDataQueryTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/LiveDataQueryTest.kt
index 41fcf82..70bc54c 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/LiveDataQueryTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/LiveDataQueryTest.kt
@@ -19,11 +19,12 @@
 import android.arch.persistence.room.integration.kotlintestapp.vo.Book
 import android.arch.persistence.room.integration.kotlintestapp.vo.BookWithPublisher
 import android.arch.persistence.room.integration.kotlintestapp.vo.Publisher
+import android.support.test.filters.SmallTest
 import org.hamcrest.CoreMatchers.`is`
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
 
-
+@SmallTest
 class LiveDataQueryTest : TestDatabaseTest() {
 
     @Test
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/RxJava2QueryTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/RxJava2QueryTest.kt
index 9cdeabc..094eea8 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/RxJava2QueryTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/test/RxJava2QueryTest.kt
@@ -18,8 +18,10 @@
 
 import android.arch.persistence.room.EmptyResultSetException
 import android.arch.persistence.room.integration.kotlintestapp.vo.BookWithPublisher
+import android.support.test.filters.SmallTest
 import org.junit.Test
 
+@SmallTest
 class RxJava2QueryTest : TestDatabaseTest() {
 
     @Test
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/NoArgClass.kt
similarity index 64%
copy from paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
copy to room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/NoArgClass.kt
index 5318d38..e1e1a7d 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/android/arch/persistence/room/integration/kotlintestapp/vo/NoArgClass.kt
@@ -14,12 +14,13 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package android.arch.persistence.room.integration.kotlintestapp.vo
 
-import java.util.Arrays;
+import android.arch.persistence.room.Entity
+import android.arch.persistence.room.PrimaryKey
 
-public class StringPagedList extends NullPaddedList<String> {
-    public StringPagedList(int leadingNulls, int trailingNulls, String... items) {
-        super(leadingNulls, Arrays.asList(items), trailingNulls);
-    }
-}
+/**
+ * just here to ensure that we handle no-arg constructors fine from kotlin.
+ */
+@Entity
+data class NoArgClass(@PrimaryKey var id: Long = 0, var class_name: String = "")
\ No newline at end of file
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/PKeyTestDatabase.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/PKeyTestDatabase.java
index b6339a8..63b9507 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/PKeyTestDatabase.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/PKeyTestDatabase.java
@@ -23,17 +23,19 @@
 import android.arch.persistence.room.RoomDatabase;
 import android.arch.persistence.room.integration.testapp.vo.IntAutoIncPKeyEntity;
 import android.arch.persistence.room.integration.testapp.vo.IntegerAutoIncPKeyEntity;
+import android.arch.persistence.room.integration.testapp.vo.IntegerPKeyEntity;
 import android.arch.persistence.room.integration.testapp.vo.ObjectPKeyEntity;
 
 import java.util.List;
 
 @Database(entities = {IntAutoIncPKeyEntity.class, IntegerAutoIncPKeyEntity.class,
-        ObjectPKeyEntity.class}, version = 1,
+        ObjectPKeyEntity.class, IntegerPKeyEntity.class}, version = 1,
         exportSchema = false)
 public abstract class PKeyTestDatabase extends RoomDatabase {
     public abstract IntPKeyDao intPKeyDao();
-    public abstract IntegerPKeyDao integerPKeyDao();
+    public abstract IntegerAutoIncPKeyDao integerAutoIncPKeyDao();
     public abstract ObjectPKeyDao objectPKeyDao();
+    public abstract IntegerPKeyDao integerPKeyDao();
 
     @Dao
     public interface IntPKeyDao {
@@ -53,7 +55,7 @@
     }
 
     @Dao
-    public interface IntegerPKeyDao {
+    public interface IntegerAutoIncPKeyDao {
         @Insert
         void insertMe(IntegerAutoIncPKeyEntity item);
 
@@ -75,4 +77,13 @@
         @Insert
         void insertMe(ObjectPKeyEntity item);
     }
+
+    @Dao
+    public interface IntegerPKeyDao {
+        @Insert
+        void insertMe(IntegerPKeyEntity item);
+
+        @Query("select * from IntegerPKeyEntity")
+        List<IntegerPKeyEntity> loadAll();
+    }
 }
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/TestDatabase.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/TestDatabase.java
index 9417296..2fad7b1 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/TestDatabase.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/TestDatabase.java
@@ -21,6 +21,7 @@
 import android.arch.persistence.room.TypeConverter;
 import android.arch.persistence.room.TypeConverters;
 import android.arch.persistence.room.integration.testapp.dao.BlobEntityDao;
+import android.arch.persistence.room.integration.testapp.dao.FunnyNamedDao;
 import android.arch.persistence.room.integration.testapp.dao.PetCoupleDao;
 import android.arch.persistence.room.integration.testapp.dao.PetDao;
 import android.arch.persistence.room.integration.testapp.dao.ProductDao;
@@ -31,6 +32,7 @@
 import android.arch.persistence.room.integration.testapp.dao.UserPetDao;
 import android.arch.persistence.room.integration.testapp.dao.WithClauseDao;
 import android.arch.persistence.room.integration.testapp.vo.BlobEntity;
+import android.arch.persistence.room.integration.testapp.vo.FunnyNamedEntity;
 import android.arch.persistence.room.integration.testapp.vo.Pet;
 import android.arch.persistence.room.integration.testapp.vo.PetCouple;
 import android.arch.persistence.room.integration.testapp.vo.Product;
@@ -41,7 +43,7 @@
 import java.util.Date;
 
 @Database(entities = {User.class, Pet.class, School.class, PetCouple.class, Toy.class,
-        BlobEntity.class, Product.class},
+        BlobEntity.class, Product.class, FunnyNamedEntity.class},
         version = 1, exportSchema = false)
 @TypeConverters(TestDatabase.Converters.class)
 public abstract class TestDatabase extends RoomDatabase {
@@ -55,6 +57,7 @@
     public abstract ProductDao getProductDao();
     public abstract SpecificDogDao getSpecificDogDao();
     public abstract WithClauseDao getWithClauseDao();
+    public abstract FunnyNamedDao getFunnyNamedDao();
 
     @SuppressWarnings("unused")
     public static class Converters {
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/FunnyNamedDao.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/FunnyNamedDao.java
new file mode 100644
index 0000000..93b5e72
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/FunnyNamedDao.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.persistence.room.integration.testapp.dao;
+
+import static android.arch.persistence.room.integration.testapp.vo.FunnyNamedEntity.COLUMN_ID;
+import static android.arch.persistence.room.integration.testapp.vo.FunnyNamedEntity.TABLE_NAME;
+
+import android.arch.lifecycle.LiveData;
+import android.arch.persistence.room.Dao;
+import android.arch.persistence.room.Delete;
+import android.arch.persistence.room.Insert;
+import android.arch.persistence.room.Query;
+import android.arch.persistence.room.Update;
+import android.arch.persistence.room.integration.testapp.vo.FunnyNamedEntity;
+
+import java.util.List;
+
+@Dao
+public interface FunnyNamedDao {
+    String SELECT_ONE = "select * from \"" +  TABLE_NAME + "\" WHERE \"" + COLUMN_ID + "\" = :id";
+    @Insert
+    void insert(FunnyNamedEntity... entities);
+    @Delete
+    void delete(FunnyNamedEntity... entities);
+    @Update
+    void update(FunnyNamedEntity... entities);
+
+    @Query("select * from \"" +  TABLE_NAME + "\" WHERE \"" + COLUMN_ID + "\" IN (:ids)")
+    List<FunnyNamedEntity> loadAll(int... ids);
+
+    @Query(SELECT_ONE)
+    LiveData<FunnyNamedEntity> observableOne(int id);
+
+    @Query(SELECT_ONE)
+    FunnyNamedEntity load(int id);
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/SchoolDao.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/SchoolDao.java
index 7bb137f..18e8d93 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/SchoolDao.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/SchoolDao.java
@@ -35,16 +35,16 @@
     @Query("SELECT * from School WHERE address_street LIKE '%' || :street || '%'")
     public abstract List<School> findByStreet(String street);
 
-    @Query("SELECT mName, manager_mName FROM School")
+    @Query("SELECT mId, mName, manager_mName FROM School")
     public abstract List<School> schoolAndManagerNames();
 
-    @Query("SELECT mName, manager_mName FROM School")
+    @Query("SELECT mId, mName, manager_mName FROM School")
     @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)
     public abstract List<SchoolRef> schoolAndManagerNamesAsPojo();
 
     @Query("SELECT address_lat as lat, address_lng as lng FROM School WHERE mId = :schoolId")
     public abstract Coordinates loadCoordinates(int schoolId);
 
-    @Query("SELECT address_lat, address_lng FROM School WHERE mId = :schoolId")
+    @Query("SELECT mId, address_lat, address_lng FROM School WHERE mId = :schoolId")
     public abstract School loadCoordinatesAsSchool(int schoolId);
 }
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserDao.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserDao.java
index 665a1ae..cb2bb03 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserDao.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserDao.java
@@ -17,6 +17,7 @@
 package android.arch.persistence.room.integration.testapp.dao;
 
 import android.arch.lifecycle.LiveData;
+import android.arch.paging.DataSource;
 import android.arch.paging.LivePagedListProvider;
 import android.arch.paging.TiledDataSource;
 import android.arch.persistence.room.Dao;
@@ -184,7 +185,10 @@
     }
 
     @Query("SELECT * FROM user where mAge > :age")
-    public abstract LivePagedListProvider<Integer, User> loadPagedByAge(int age);
+    public abstract DataSource.Factory<Integer, User> loadPagedByAge(int age);
+
+    @Query("SELECT * FROM user where mAge > :age")
+    public abstract LivePagedListProvider<Integer, User> loadPagedByAge_legacy(int age);
 
     @Query("SELECT * FROM user ORDER BY mAge DESC")
     public abstract TiledDataSource<User> loadUsersByAgeDesc();
@@ -200,67 +204,6 @@
     @Query("SELECT COUNT(*) from user")
     public abstract Integer getUserCount();
 
-
-    // QueryDataSourceTest - name desc
-
-    //   limit-offset
-    @Query("SELECT * from user ORDER BY mName DESC LIMIT :limit OFFSET :offset")
-    public abstract List<User> userNameLimitOffset(int limit, int offset);
-
-    //   keyed
-    @Query("SELECT * from user ORDER BY mName DESC LIMIT :limit")
-    public abstract List<User> userNameInitial(int limit);
-
-    @Query("SELECT * from user WHERE mName < :key ORDER BY mName DESC LIMIT :limit")
-    public abstract List<User> userNameLoadAfter(String key, int limit);
-
-    @Query("SELECT COUNT(*) from user WHERE mName < :key ORDER BY mName DESC")
-    public abstract int userNameCountAfter(String key);
-
-    @Query("SELECT * from user WHERE mName > :key ORDER BY mName ASC LIMIT :limit")
-    public abstract List<User> userNameLoadBefore(String key, int limit);
-
-    @Query("SELECT COUNT(*) from user WHERE mName > :key ORDER BY mName ASC")
-    public abstract int userNameCountBefore(String key);
-
-
-
-    // ComplexQueryDataSourceTest - last desc, first asc, id desc
-
-    //   limit-offset
-    @Query("SELECT * from user"
-            + " ORDER BY mLastName DESC, mName ASC, mId DESC"
-            + " LIMIT :limit OFFSET :offset")
-    public abstract List<User> userComplexLimitOffset(int limit, int offset);
-
-    //   keyed
-    @Query("SELECT * from user"
-            + " ORDER BY mLastName DESC, mName ASC, mId DESC"
-            + " LIMIT :limit")
-    public abstract List<User> userComplexInitial(int limit);
-
-    @Query("SELECT * from user"
-            + " WHERE mLastName < :lastName or (mLastName = :lastName and (mName > :name or (mName = :name and mId < :id)))"
-            + " ORDER BY mLastName DESC, mName ASC, mId DESC"
-            + " LIMIT :limit")
-    public abstract List<User> userComplexLoadAfter(String lastName, String name, int id, int limit);
-
-    @Query("SELECT COUNT(*) from user"
-            + " WHERE mLastName < :lastName or (mLastName = :lastName and (mName > :name or (mName = :name and mId < :id)))"
-            + " ORDER BY mLastName DESC, mName ASC, mId DESC")
-    public abstract int userComplexCountAfter(String lastName, String name, int id);
-
-    @Query("SELECT * from user"
-            + " WHERE mLastName > :lastName or (mLastName = :lastName and (mName < :name or (mName = :name and mId > :id)))"
-            + " ORDER BY mLastName ASC, mName DESC, mId ASC"
-            + " LIMIT :limit")
-    public abstract List<User> userComplexLoadBefore(String lastName, String name, int id, int limit);
-
-    @Query("SELECT COUNT(*) from user"
-            + " WHERE mLastName > :lastName or (mLastName = :lastName and (mName < :name or (mName = :name and mId > :id)))"
-            + " ORDER BY mLastName ASC, mName DESC, mId ASC")
-    public abstract int userComplexCountBefore(String lastName, String name, int id);
-
     @Transaction
     public void insertBothByAnnotation(final User a, final User b) {
         insert(a);
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserPetDao.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserPetDao.java
index 3507aee..eb15901 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserPetDao.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserPetDao.java
@@ -33,6 +33,8 @@
 
 import java.util.List;
 
+import io.reactivex.Flowable;
+
 @Dao
 public interface UserPetDao {
     @Query("SELECT * FROM User u, Pet p WHERE u.mId = p.mUserId")
@@ -62,6 +64,9 @@
     @Query("SELECT * FROM User u where u.mId = :userId")
     LiveData<UserAndAllPets> liveUserWithPets(int userId);
 
+    @Query("SELECT * FROM User u where u.mId = :userId")
+    Flowable<UserAndAllPets> flowableUserWithPets(int userId);
+
     @Query("SELECT * FROM User u where u.mId = :uid")
     EmbeddedUserAndAllPets loadUserAndPetsAsEmbedded(int uid);
 
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/WithClauseDao.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/WithClauseDao.java
index b1c38ed..40098ed 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/WithClauseDao.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/WithClauseDao.java
@@ -16,13 +16,16 @@
 
 package android.arch.persistence.room.integration.testapp.dao;
 
+import android.annotation.TargetApi;
 import android.arch.lifecycle.LiveData;
 import android.arch.persistence.room.Dao;
 import android.arch.persistence.room.Query;
+import android.os.Build;
 
 import java.util.List;
 
 @Dao
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
 public interface WithClauseDao {
     @Query("WITH RECURSIVE factorial(n, fact) AS \n"
             + "(SELECT 0, 1 \n"
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/migration/MigrationTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/migration/MigrationTest.java
index 725d53f..7fe2bc9 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/migration/MigrationTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/migration/MigrationTest.java
@@ -318,6 +318,8 @@
                     + " (`id` INTEGER NOT NULL, `name` TEXT COLLATE NOCASE, PRIMARY KEY(`id`),"
                     + " FOREIGN KEY(`name`) REFERENCES `Entity1`(`name`)"
                     + " ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED)");
+            database.execSQL("CREATE UNIQUE INDEX `index_entity1` ON "
+                    + MigrationDb.Entity1.TABLE_NAME + " (`name`)");
         }
     };
 
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/paging/LivePagedListProviderTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/paging/DataSourceFactoryTest.java
similarity index 73%
rename from room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/paging/LivePagedListProviderTest.java
rename to room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/paging/DataSourceFactoryTest.java
index 4c9d73e..c546531 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/paging/LivePagedListProviderTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/paging/DataSourceFactoryTest.java
@@ -21,17 +21,18 @@
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.core.executor.testing.CountingTaskExecutorRule;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.LifecycleRegistry;
 import android.arch.lifecycle.LiveData;
 import android.arch.lifecycle.Observer;
+import android.arch.paging.LivePagedListBuilder;
+import android.arch.paging.PagedList;
 import android.arch.persistence.room.integration.testapp.test.TestDatabaseTest;
 import android.arch.persistence.room.integration.testapp.test.TestUtil;
 import android.arch.persistence.room.integration.testapp.vo.User;
-import android.arch.paging.PagedList;
 import android.support.annotation.Nullable;
 import android.support.test.filters.LargeTest;
 import android.support.test.runner.AndroidJUnit4;
@@ -46,15 +47,54 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
+@LargeTest
 @RunWith(AndroidJUnit4.class)
-public class LivePagedListProviderTest extends TestDatabaseTest {
+public class DataSourceFactoryTest extends TestDatabaseTest {
     @Rule
     public CountingTaskExecutorRule mExecutorRule = new CountingTaskExecutorRule();
 
+    private interface LivePagedListFactory {
+        LiveData<PagedList<User>> create();
+    }
+
     @Test
-    @LargeTest
     public void getUsersAsPagedList()
             throws InterruptedException, ExecutionException, TimeoutException {
+        validateUsersAsPagedList(new LivePagedListFactory() {
+            @Override
+            public LiveData<PagedList<User>> create() {
+                return new LivePagedListBuilder<Integer, User>()
+                        .setPagingConfig(new PagedList.Config.Builder()
+                                .setPageSize(10)
+                                .setPrefetchDistance(1)
+                                .setInitialLoadSizeHint(10).build())
+                        .setDataSourceFactory(mUserDao.loadPagedByAge(3))
+                        .build();
+            }
+        });
+    }
+
+
+    // TODO: delete this and factory abstraction when LivePagedListProvider is removed
+    @Test
+    public void getUsersAsPagedList_legacyLivePagedListProvider()
+            throws InterruptedException, ExecutionException, TimeoutException {
+        validateUsersAsPagedList(new LivePagedListFactory() {
+            @Override
+            public LiveData<PagedList<User>> create() {
+                return mUserDao.loadPagedByAge_legacy(3).create(
+                        0,
+                        new PagedList.Config.Builder()
+                                .setPageSize(10)
+                                .setPrefetchDistance(1)
+                                .setInitialLoadSizeHint(10)
+                                .build());
+            }
+        });
+    }
+
+    private void validateUsersAsPagedList(LivePagedListFactory factory)
+            throws InterruptedException, ExecutionException, TimeoutException {
         mDatabase.beginTransaction();
         try {
             for (int i = 0; i < 100; i++) {
@@ -67,12 +107,8 @@
             mDatabase.endTransaction();
         }
         assertThat(mUserDao.count(), is(100));
-        final LiveData<PagedList<User>> livePagedUsers = mUserDao.loadPagedByAge(3).create(
-                0,
-                new PagedList.Config.Builder()
-                        .setPageSize(10)
-                        .setPrefetchDistance(1)
-                        .setInitialLoadSizeHint(10).build());
+
+        final LiveData<PagedList<User>> livePagedUsers = factory.create();
 
         final TestLifecycleOwner testOwner = new TestLifecycleOwner();
         testOwner.handleEvent(Lifecycle.Event.ON_CREATE);
@@ -131,7 +167,7 @@
                 return null;
             }
         });
-        AppToolkitTaskExecutor.getInstance().executeOnMainThread(futureTask);
+        ArchTaskExecutor.getInstance().executeOnMainThread(futureTask);
         futureTask.get();
     }
 
@@ -155,7 +191,7 @@
 
     private static class PagedListObserver<T> implements Observer<PagedList<T>> {
         private PagedList<T> mList;
-        public void reset() {
+        void reset() {
             mList = null;
         }
 
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/ComplexQueryDataSourceTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/ComplexQueryDataSourceTest.java
deleted file mode 100644
index 4d58512..0000000
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/ComplexQueryDataSourceTest.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.persistence.room.integration.testapp.test;
-
-import android.arch.paging.BoundedDataSource;
-import android.arch.paging.KeyedDataSource;
-import android.arch.persistence.room.integration.testapp.vo.User;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
-
-@MediumTest
-@RunWith(AndroidJUnit4.class)
-public class ComplexQueryDataSourceTest extends TestDatabaseTest {
-
-    @SuppressWarnings("WeakerAccess")
-    public class LastFirstIdKey {
-        public final String lastName;
-        public final String name;
-        public final int id;
-
-        public LastFirstIdKey(String lastName, String name, int id) {
-            this.lastName = lastName;
-            this.name = name;
-            this.id = id;
-        }
-    }
-
-    /**
-     * Proper, keyed implementation.
-     */
-    public class KeyedUserQueryDataSource extends KeyedDataSource<LastFirstIdKey, User> {
-
-        @NonNull
-        @Override
-        public LastFirstIdKey getKey(@NonNull User user) {
-            return new LastFirstIdKey(
-                    user.getLastName(),
-                    user.getName(),
-                    user.getId());
-        }
-
-        @Override
-        public int countItemsBefore(@NonNull LastFirstIdKey key) {
-            return mUserDao.userComplexCountBefore(
-                    key.lastName,
-                    key.name,
-                    key.id);
-        }
-
-        @Override
-        public int countItemsAfter(@NonNull LastFirstIdKey key) {
-            return mUserDao.userComplexCountAfter(
-                    key.lastName,
-                    key.name,
-                    key.id);
-        }
-
-        @Nullable
-        @Override
-        public List<User> loadInitial(int pageSize) {
-            return mUserDao.userComplexInitial(pageSize);
-        }
-
-        @Nullable
-        @Override
-        public List<User> loadBefore(@NonNull LastFirstIdKey key, int pageSize) {
-            return mUserDao.userComplexLoadBefore(
-                    key.lastName,
-                    key.name,
-                    key.id,
-                    pageSize);
-        }
-
-        @Nullable
-        @Override
-        public List<User> loadAfter(@Nullable LastFirstIdKey key, int pageSize) {
-            return mUserDao.userComplexLoadAfter(
-                    key.lastName,
-                    key.name,
-                    key.id,
-                    pageSize);
-        }
-    }
-
-    /**
-     * Lazy, LIMIT/OFFSET implementation.
-     */
-    public class OffsetUserQueryDataSource extends BoundedDataSource<User> {
-
-        @Override
-        public int countItems() {
-            return mUserDao.getUserCount();
-        }
-
-        @Nullable
-        @Override
-        public List<User> loadRange(int startPosition, int loadCount) {
-            return mUserDao.userComplexLimitOffset(loadCount, startPosition);
-        }
-    }
-
-    private static final User[] USERS_BY_LAST_FIRST_ID = new User[100];
-
-    @BeforeClass
-    public static void setupClass() {
-        String[] lastNames = new String[10];
-
-        String[] firstNames = new String[10];
-        for (int i = 0; i < 10; i++) {
-            lastNames[i] = "f" + (char) ('a' + i);
-            firstNames[i] = "l" + (char) ('a' + i);
-        }
-
-        for (int i = 0; i < USERS_BY_LAST_FIRST_ID.length; i++) {
-            User user = new User();
-            user.setId(i);
-            user.setName(firstNames[i % 10]);
-            user.setLastName(lastNames[(i / 10) % 10]);
-            user.setAge((int) (10 + Math.random() * 50));
-            user.setCustomField(UUID.randomUUID().toString());
-            user.setBirthday(new Date());
-            USERS_BY_LAST_FIRST_ID[i] = user;
-        }
-    }
-
-    @Before
-    public void setup() {
-        mUserDao.insertAll(USERS_BY_LAST_FIRST_ID);
-
-        Arrays.sort(USERS_BY_LAST_FIRST_ID, new Comparator<User>() {
-            @Override
-            public int compare(User o1, User o2) {
-                int diff = o2.getLastName().compareTo(o1.getLastName());
-                if (diff != 0) {
-                    return diff;
-                }
-                diff = o2.getName().compareTo(o1.getName());
-                if (diff != 0) {
-                    return -diff; // Note: 'mName' is ASC, therefore diff reversed
-                }
-
-                return o2.getId() - o1.getId();
-            }
-        });
-    }
-
-    @Test
-    public void testKeyedQueryDataSource() {
-        QueryDataSourceTest.verifyUserDataSource(USERS_BY_LAST_FIRST_ID,
-                new KeyedUserQueryDataSource());
-    }
-
-    @Test
-    public void testIndexedQueryDataSourceFull() {
-        QueryDataSourceTest.verifyUserDataSource(USERS_BY_LAST_FIRST_ID,
-                new OffsetUserQueryDataSource());
-    }
-}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/FunnyNamedDaoTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/FunnyNamedDaoTest.java
new file mode 100644
index 0000000..f4fca7f
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/FunnyNamedDaoTest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.persistence.room.integration.testapp.test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import android.arch.core.executor.testing.CountingTaskExecutorRule;
+import android.arch.lifecycle.Observer;
+import android.arch.persistence.room.integration.testapp.vo.FunnyNamedEntity;
+import android.support.annotation.Nullable;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class FunnyNamedDaoTest extends TestDatabaseTest {
+    @Rule
+    public CountingTaskExecutorRule mExecutorRule = new CountingTaskExecutorRule();
+
+    @Test
+    public void readWrite() {
+        FunnyNamedEntity entity = new FunnyNamedEntity(1, "a");
+        mFunnyNamedDao.insert(entity);
+        FunnyNamedEntity loaded = mFunnyNamedDao.load(1);
+        assertThat(loaded, is(entity));
+    }
+
+    @Test
+    public void update() {
+        FunnyNamedEntity entity = new FunnyNamedEntity(1, "a");
+        mFunnyNamedDao.insert(entity);
+        entity.setValue("b");
+        mFunnyNamedDao.update(entity);
+        FunnyNamedEntity loaded = mFunnyNamedDao.load(1);
+        assertThat(loaded.getValue(), is("b"));
+    }
+
+    @Test
+    public void delete() {
+        FunnyNamedEntity entity = new FunnyNamedEntity(1, "a");
+        mFunnyNamedDao.insert(entity);
+        assertThat(mFunnyNamedDao.load(1), notNullValue());
+        mFunnyNamedDao.delete(entity);
+        assertThat(mFunnyNamedDao.load(1), nullValue());
+    }
+
+    @Test
+    public void observe() throws TimeoutException, InterruptedException {
+        final FunnyNamedEntity[] item = new FunnyNamedEntity[1];
+        mFunnyNamedDao.observableOne(2).observeForever(new Observer<FunnyNamedEntity>() {
+            @Override
+            public void onChanged(@Nullable FunnyNamedEntity funnyNamedEntity) {
+                item[0] = funnyNamedEntity;
+            }
+        });
+
+        FunnyNamedEntity entity = new FunnyNamedEntity(1, "a");
+        mFunnyNamedDao.insert(entity);
+        mExecutorRule.drainTasks(1, TimeUnit.MINUTES);
+        assertThat(item[0], nullValue());
+
+        final FunnyNamedEntity entity2 = new FunnyNamedEntity(2, "b");
+        mFunnyNamedDao.insert(entity2);
+        mExecutorRule.drainTasks(1, TimeUnit.MINUTES);
+        assertThat(item[0], is(entity2));
+
+        final FunnyNamedEntity entity3 = new FunnyNamedEntity(2, "c");
+        mFunnyNamedDao.update(entity3);
+        mExecutorRule.drainTasks(1, TimeUnit.MINUTES);
+        assertThat(item[0], is(entity3));
+    }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/InvalidationTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/InvalidationTest.java
index 4787ce5..33f4018 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/InvalidationTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/InvalidationTest.java
@@ -17,20 +17,17 @@
 package android.arch.persistence.room.integration.testapp.test;
 
 import static org.hamcrest.CoreMatchers.hasItem;
-import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
-import android.arch.core.executor.TaskExecutor;
+import android.arch.core.executor.testing.CountingTaskExecutorRule;
 import android.arch.persistence.room.InvalidationTracker;
 import android.arch.persistence.room.Room;
 import android.arch.persistence.room.integration.testapp.TestDatabase;
 import android.arch.persistence.room.integration.testapp.dao.UserDao;
 import android.arch.persistence.room.integration.testapp.vo.User;
 import android.content.Context;
-import android.os.Handler;
-import android.os.Looper;
 import android.support.annotation.NonNull;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
@@ -38,17 +35,13 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.FutureTask;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 /**
  * Tests invalidation tracking.
@@ -56,138 +49,97 @@
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 public class InvalidationTest {
+    @Rule
+    public CountingTaskExecutorRule executorRule = new CountingTaskExecutorRule();
     private UserDao mUserDao;
     private TestDatabase mDb;
 
     @Before
-    public void createDb() {
+    public void createDb() throws TimeoutException, InterruptedException {
         Context context = InstrumentationRegistry.getTargetContext();
         mDb = Room.inMemoryDatabaseBuilder(context, TestDatabase.class).build();
         mUserDao = mDb.getUserDao();
-    }
-
-    @Before
-    public void setSingleThreadedIO() {
-        AppToolkitTaskExecutor.getInstance().setDelegate(new TaskExecutor() {
-            ExecutorService mIOExecutor = Executors.newSingleThreadExecutor();
-            Handler mHandler = new Handler(Looper.getMainLooper());
-
-            @Override
-            public void executeOnDiskIO(Runnable runnable) {
-                mIOExecutor.execute(runnable);
-            }
-
-            @Override
-            public void postToMainThread(Runnable runnable) {
-                mHandler.post(runnable);
-            }
-
-            @Override
-            public boolean isMainThread() {
-                return Thread.currentThread() == Looper.getMainLooper().getThread();
-            }
-        });
+        drain();
     }
 
     @After
-    public void clearExecutor() {
-        AppToolkitTaskExecutor.getInstance().setDelegate(null);
+    public void closeDb() throws TimeoutException, InterruptedException {
+        mDb.close();
+        drain();
     }
 
-    private void waitUntilIOThreadIsIdle() {
-        FutureTask<Void> future = new FutureTask<>(new Callable<Void>() {
-            @Override
-            public Void call() throws Exception {
-                return null;
-            }
-        });
-        AppToolkitTaskExecutor.getInstance().executeOnDiskIO(future);
-        //noinspection TryWithIdenticalCatches
-        try {
-            future.get();
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
-        } catch (ExecutionException e) {
-            throw new RuntimeException(e);
-        }
+    private void drain() throws TimeoutException, InterruptedException {
+        executorRule.drainTasks(1, TimeUnit.MINUTES);
     }
 
     @Test
-    public void testInvalidationOnUpdate() throws InterruptedException {
+    public void testInvalidationOnUpdate() throws InterruptedException, TimeoutException {
         User user = TestUtil.createUser(3);
         mUserDao.insert(user);
-        LatchObserver observer = new LatchObserver(1, "User");
+        LoggingObserver observer = new LoggingObserver("User");
         mDb.getInvalidationTracker().addObserver(observer);
+        drain();
         mUserDao.updateById(3, "foo2");
-        waitUntilIOThreadIsIdle();
-        assertThat(observer.await(), is(true));
+        drain();
         assertThat(observer.getInvalidatedTables(), hasSize(1));
         assertThat(observer.getInvalidatedTables(), hasItem("User"));
     }
 
     @Test
-    public void testInvalidationOnDelete() throws InterruptedException {
+    public void testInvalidationOnDelete() throws InterruptedException, TimeoutException {
         User user = TestUtil.createUser(3);
         mUserDao.insert(user);
-        LatchObserver observer = new LatchObserver(1, "User");
+        LoggingObserver observer = new LoggingObserver("User");
         mDb.getInvalidationTracker().addObserver(observer);
+        drain();
         mUserDao.delete(user);
-        waitUntilIOThreadIsIdle();
-        assertThat(observer.await(), is(true));
+        drain();
         assertThat(observer.getInvalidatedTables(), hasSize(1));
         assertThat(observer.getInvalidatedTables(), hasItem("User"));
     }
 
     @Test
-    public void testInvalidationOnInsert() throws InterruptedException {
-        LatchObserver observer = new LatchObserver(1, "User");
+    public void testInvalidationOnInsert() throws InterruptedException, TimeoutException {
+        LoggingObserver observer = new LoggingObserver("User");
         mDb.getInvalidationTracker().addObserver(observer);
+        drain();
         mUserDao.insert(TestUtil.createUser(3));
-        waitUntilIOThreadIsIdle();
-        assertThat(observer.await(), is(true));
+        drain();
         assertThat(observer.getInvalidatedTables(), hasSize(1));
         assertThat(observer.getInvalidatedTables(), hasItem("User"));
     }
 
     @Test
-    public void testDontInvalidateOnLateInsert() throws InterruptedException {
-        LatchObserver observer = new LatchObserver(1, "User");
+    public void testDontInvalidateOnLateInsert() throws InterruptedException, TimeoutException {
+        LoggingObserver observer = new LoggingObserver("User");
         mUserDao.insert(TestUtil.createUser(3));
-        waitUntilIOThreadIsIdle();
+        drain();
         mDb.getInvalidationTracker().addObserver(observer);
-        waitUntilIOThreadIsIdle();
-        assertThat(observer.await(), is(false));
+        drain();
+        assertThat(observer.getInvalidatedTables(), nullValue());
     }
 
     @Test
-    public void testMultipleTables() throws InterruptedException {
-        LatchObserver observer = new LatchObserver(1, "User", "Pet");
+    public void testMultipleTables() throws InterruptedException, TimeoutException {
+        LoggingObserver observer = new LoggingObserver("User", "Pet");
         mDb.getInvalidationTracker().addObserver(observer);
+        drain();
         mUserDao.insert(TestUtil.createUser(3));
-        waitUntilIOThreadIsIdle();
-        assertThat(observer.await(), is(true));
+        drain();
         assertThat(observer.getInvalidatedTables(), hasSize(1));
         assertThat(observer.getInvalidatedTables(), hasItem("User"));
     }
 
-    private static class LatchObserver extends InvalidationTracker.Observer {
-        CountDownLatch mLatch;
-
+    private static class LoggingObserver extends InvalidationTracker.Observer {
         private Set<String> mInvalidatedTables;
 
-        LatchObserver(int permits, String... tables) {
+        LoggingObserver(String... tables) {
             super(tables);
-            mLatch = new CountDownLatch(permits);
-        }
-
-        boolean await() throws InterruptedException {
-            return mLatch.await(5, TimeUnit.SECONDS);
         }
 
         @Override
         public void onInvalidated(@NonNull Set<String> tables) {
             mInvalidatedTables = tables;
-            mLatch.countDown();
         }
 
         Set<String> getInvalidatedTables() {
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/LiveDataQueryTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/LiveDataQueryTest.java
index cae8445..d78411f 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/LiveDataQueryTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/LiveDataQueryTest.java
@@ -21,7 +21,7 @@
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.core.executor.testing.CountingTaskExecutorRule;
 import android.arch.lifecycle.Lifecycle;
 import android.arch.lifecycle.LifecycleOwner;
@@ -35,9 +35,11 @@
 import android.arch.persistence.room.integration.testapp.vo.Toy;
 import android.arch.persistence.room.integration.testapp.vo.User;
 import android.arch.persistence.room.integration.testapp.vo.UserAndAllPets;
+import android.os.Build;
 import android.support.annotation.Nullable;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.MediumTest;
+import android.support.test.filters.SdkSuppress;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
@@ -235,6 +237,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
     public void withWithClause() throws ExecutionException, InterruptedException,
             TimeoutException {
         LiveData<List<String>> actual =
@@ -322,7 +325,7 @@
                 return null;
             }
         });
-        AppToolkitTaskExecutor.getInstance().executeOnMainThread(futureTask);
+        ArchTaskExecutor.getInstance().executeOnMainThread(futureTask);
         futureTask.get();
     }
 
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/PrimaryKeyTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/PrimaryKeyTest.java
index 8d213f2..fda4373 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/PrimaryKeyTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/PrimaryKeyTest.java
@@ -26,6 +26,7 @@
 import android.arch.persistence.room.integration.testapp.PKeyTestDatabase;
 import android.arch.persistence.room.integration.testapp.vo.IntAutoIncPKeyEntity;
 import android.arch.persistence.room.integration.testapp.vo.IntegerAutoIncPKeyEntity;
+import android.arch.persistence.room.integration.testapp.vo.IntegerPKeyEntity;
 import android.arch.persistence.room.integration.testapp.vo.ObjectPKeyEntity;
 import android.database.sqlite.SQLiteConstraintException;
 import android.support.test.InstrumentationRegistry;
@@ -37,6 +38,7 @@
 import org.junit.runner.RunWith;
 
 import java.util.Arrays;
+import java.util.List;
 
 @RunWith(AndroidJUnit4.class)
 @SmallTest
@@ -53,8 +55,8 @@
     public void integerTest() {
         IntegerAutoIncPKeyEntity entity = new IntegerAutoIncPKeyEntity();
         entity.data = "foo";
-        mDatabase.integerPKeyDao().insertMe(entity);
-        IntegerAutoIncPKeyEntity loaded = mDatabase.integerPKeyDao().getMe(1);
+        mDatabase.integerAutoIncPKeyDao().insertMe(entity);
+        IntegerAutoIncPKeyEntity loaded = mDatabase.integerAutoIncPKeyDao().getMe(1);
         assertThat(loaded, notNullValue());
         assertThat(loaded.data, is(entity.data));
     }
@@ -64,8 +66,8 @@
         IntegerAutoIncPKeyEntity entity = new IntegerAutoIncPKeyEntity();
         entity.pKey = 0;
         entity.data = "foo";
-        mDatabase.integerPKeyDao().insertMe(entity);
-        IntegerAutoIncPKeyEntity loaded = mDatabase.integerPKeyDao().getMe(0);
+        mDatabase.integerAutoIncPKeyDao().insertMe(entity);
+        IntegerAutoIncPKeyEntity loaded = mDatabase.integerAutoIncPKeyDao().getMe(0);
         assertThat(loaded, notNullValue());
         assertThat(loaded.data, is(entity.data));
     }
@@ -102,8 +104,8 @@
     public void getInsertedIdFromInteger() {
         IntegerAutoIncPKeyEntity entity = new IntegerAutoIncPKeyEntity();
         entity.data = "foo";
-        final long id = mDatabase.integerPKeyDao().insertAndGetId(entity);
-        assertThat(mDatabase.integerPKeyDao().getMe((int) id).data, is("foo"));
+        final long id = mDatabase.integerAutoIncPKeyDao().insertAndGetId(entity);
+        assertThat(mDatabase.integerAutoIncPKeyDao().getMe((int) id).data, is("foo"));
     }
 
     @Test
@@ -112,8 +114,9 @@
         entity.data = "foo";
         IntegerAutoIncPKeyEntity entity2 = new IntegerAutoIncPKeyEntity();
         entity2.data = "foo2";
-        final long[] ids = mDatabase.integerPKeyDao().insertAndGetIds(entity, entity2);
-        assertThat(mDatabase.integerPKeyDao().loadDataById(ids), is(Arrays.asList("foo", "foo2")));
+        final long[] ids = mDatabase.integerAutoIncPKeyDao().insertAndGetIds(entity, entity2);
+        assertThat(mDatabase.integerAutoIncPKeyDao().loadDataById(ids),
+                is(Arrays.asList("foo", "foo2")));
     }
 
     @Test
@@ -129,4 +132,16 @@
         assertNotNull("Was expecting an exception", throwable);
         assertThat(throwable, instanceOf(SQLiteConstraintException.class));
     }
+
+    @Test
+    public void insertNullPrimaryKeyForInteger() throws Exception {
+        IntegerPKeyEntity entity = new IntegerPKeyEntity();
+        entity.data = "data";
+        mDatabase.integerPKeyDao().insertMe(entity);
+
+        List<IntegerPKeyEntity> list = mDatabase.integerPKeyDao().loadAll();
+        assertThat(list.size(), is(1));
+        assertThat(list.get(0).data, is("data"));
+        assertNotNull(list.get(0).pKey);
+    }
 }
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/QueryDataSourceTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/QueryDataSourceTest.java
deleted file mode 100644
index e11117e..0000000
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/QueryDataSourceTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.persistence.room.integration.testapp.test;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import android.arch.paging.BoundedDataSource;
-import android.arch.paging.ContiguousDataSource;
-import android.arch.paging.KeyedDataSource;
-import android.arch.paging.NullPaddedList;
-import android.arch.paging.PositionalDataSource;
-import android.arch.persistence.room.integration.testapp.vo.User;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-
-@MediumTest
-@RunWith(AndroidJUnit4.class)
-public class QueryDataSourceTest extends TestDatabaseTest {
-    /**
-     * Proper, keyed implementation.
-     */
-    public class KeyedUserQueryDataSource extends KeyedDataSource<String, User> {
-        @NonNull
-        @Override
-        public String getKey(@NonNull User item) {
-            return item.getName();
-        }
-
-        @Override
-        public int countItemsBefore(@NonNull String userName) {
-            return mUserDao.userNameCountBefore(userName);
-        }
-
-        @Override
-        public int countItemsAfter(@NonNull String userName) {
-            return mUserDao.userNameCountAfter(userName);
-        }
-
-        @Nullable
-        @Override
-        public List<User> loadInitial(int pageSize) {
-            return mUserDao.userNameInitial(pageSize);
-        }
-
-        @Nullable
-        @Override
-        public List<User> loadBefore(@NonNull String userName, int pageSize) {
-            return mUserDao.userNameLoadBefore(userName, pageSize);
-        }
-
-        @Nullable
-        @Override
-        public List<User> loadAfter(@Nullable String userName, int pageSize) {
-            return mUserDao.userNameLoadAfter(userName, pageSize);
-        }
-    }
-
-    /**
-     * Lazy, LIMIT/OFFSET implementation.
-     */
-    public class OffsetUserQueryDataSource extends BoundedDataSource<User> {
-        @Override
-        public int countItems() {
-            return mUserDao.getUserCount();
-        }
-
-        @Nullable
-        @Override
-        public List<User> loadRange(int startPosition, int loadCount) {
-            return mUserDao.userNameLimitOffset(loadCount, startPosition);
-        }
-    }
-
-    private static final User[] USERS_BY_NAME = new User[50];
-
-    @BeforeClass
-    public static void setupClass() {
-        for (int i = 0; i < USERS_BY_NAME.length; i++) {
-            USERS_BY_NAME[i] = TestUtil.createUser(i);
-        }
-    }
-
-    @Before
-    public void setup() {
-        mUserDao.insertAll(USERS_BY_NAME);
-
-        Arrays.sort(USERS_BY_NAME, new Comparator<User>() {
-            @Override
-            public int compare(User o1, User o2) {
-                return o2.getName().compareTo(o1.getName());
-            }
-        });
-    }
-
-    @Test
-    public void testKeyedQueryDataSource() {
-        verifyUserDataSource(USERS_BY_NAME, new KeyedUserQueryDataSource());
-    }
-
-    @Test
-    public void testIndexedQueryDataSourceFull() {
-        verifyUserDataSource(USERS_BY_NAME, new OffsetUserQueryDataSource());
-    }
-
-
-    public static <Key> void verifyUserDataSource(User[] expected,
-            ContiguousDataSource<Key, User> dataSource) {
-        List<User> list = new ArrayList<>();
-
-        Object key;
-        if (dataSource instanceof PositionalDataSource) {
-            // start at 15 by loading 10 items around key 20
-            key = 20;
-        } else {
-            // start at 15 by loading 10 items around key 19 (note, keyed is exclusive, pos isn't)
-            KeyedDataSource<String, User> keyedDataSource =
-                    (KeyedDataSource<String, User>) dataSource;
-            key = keyedDataSource.getKey(expected[19]);
-        }
-        @SuppressWarnings("unchecked")
-        NullPaddedList<User> initial = dataSource.loadInitial((Key) key, 10, true);
-
-        assertNotNull(initial);
-        assertEquals(15, initial.getLeadingNullCount());
-        assertEquals(expected.length - 25, initial.getTrailingNullCount());
-        assertEquals(expected.length, initial.size());
-
-        for (int i = 15; i < initial.size() - initial.getTrailingNullCount(); i++) {
-            list.add(initial.get(i));
-        }
-
-        assertArrayEquals(Arrays.copyOfRange(expected, 15, 25), list.toArray());
-        List<User> p = dataSource.loadAfter(24, list.get(list.size() - 1), 10);
-        assertNotNull(p);
-        list.addAll(p);
-
-        assertArrayEquals(Arrays.copyOfRange(expected, 15, 35), list.toArray());
-
-        p = dataSource.loadBefore(15, list.get(0), 10);
-        assertNotNull(p);
-        for (User u : p) {
-            list.add(0, u);
-        }
-
-        assertArrayEquals(Arrays.copyOfRange(expected, 5, 35), list.toArray());
-
-        p = dataSource.loadBefore(5, list.get(0), 10);
-        assertNotNull(p);
-        for (User u : p) {
-            list.add(0, u);
-        }
-
-        assertArrayEquals(Arrays.copyOfRange(expected, 0, 35), list.toArray());
-    }
-}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/QueryTransactionTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/QueryTransactionTest.java
new file mode 100644
index 0000000..291cfd6
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/QueryTransactionTest.java
@@ -0,0 +1,475 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.persistence.room.integration.testapp.test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import android.arch.core.executor.ArchTaskExecutor;
+import android.arch.core.executor.testing.CountingTaskExecutorRule;
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LiveData;
+import android.arch.lifecycle.Observer;
+import android.arch.paging.DataSource;
+import android.arch.paging.LivePagedListBuilder;
+import android.arch.paging.PagedList;
+import android.arch.paging.TiledDataSource;
+import android.arch.persistence.room.Dao;
+import android.arch.persistence.room.Database;
+import android.arch.persistence.room.Entity;
+import android.arch.persistence.room.Ignore;
+import android.arch.persistence.room.Insert;
+import android.arch.persistence.room.PrimaryKey;
+import android.arch.persistence.room.Query;
+import android.arch.persistence.room.Relation;
+import android.arch.persistence.room.Room;
+import android.arch.persistence.room.RoomDatabase;
+import android.arch.persistence.room.RoomWarnings;
+import android.arch.persistence.room.Transaction;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import io.reactivex.Flowable;
+import io.reactivex.Maybe;
+import io.reactivex.Single;
+import io.reactivex.observers.TestObserver;
+import io.reactivex.schedulers.Schedulers;
+import io.reactivex.subscribers.TestSubscriber;
+
+@SmallTest
+@RunWith(Parameterized.class)
+public class QueryTransactionTest {
+    @Rule
+    public CountingTaskExecutorRule countingTaskExecutorRule = new CountingTaskExecutorRule();
+    private static final AtomicInteger sStartedTransactionCount = new AtomicInteger(0);
+    private TransactionDb mDb;
+    private final boolean mUseTransactionDao;
+    private Entity1Dao mDao;
+    private final LiveDataQueryTest.TestLifecycleOwner mLifecycleOwner = new LiveDataQueryTest
+            .TestLifecycleOwner();
+
+    @NonNull
+    @Parameterized.Parameters(name = "useTransaction_{0}")
+    public static Boolean[] getParams() {
+        return new Boolean[]{false, true};
+    }
+
+    public QueryTransactionTest(boolean useTransactionDao) {
+        mUseTransactionDao = useTransactionDao;
+    }
+
+    @Before
+    public void initDb() {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mLifecycleOwner.handleEvent(Lifecycle.Event.ON_START);
+            }
+        });
+
+        resetTransactionCount();
+        mDb = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getTargetContext(),
+                TransactionDb.class).build();
+        mDao = mUseTransactionDao ? mDb.transactionDao() : mDb.dao();
+        drain();
+    }
+
+    @After
+    public void closeDb() {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mLifecycleOwner.handleEvent(Lifecycle.Event.ON_DESTROY);
+            }
+        });
+        drain();
+        mDb.close();
+    }
+
+    @Test
+    public void readList() {
+        mDao.insert(new Entity1(1, "foo"));
+        resetTransactionCount();
+
+        int expectedTransactionCount = mUseTransactionDao ? 1 : 0;
+        List<Entity1> allEntities = mDao.allEntities();
+        assertTransactionCount(allEntities, expectedTransactionCount);
+    }
+
+    @Test
+    public void liveData() {
+        LiveData<List<Entity1>> listLiveData = mDao.liveData();
+        observeForever(listLiveData);
+        drain();
+        assertThat(listLiveData.getValue(), is(Collections.<Entity1>emptyList()));
+
+        resetTransactionCount();
+        mDao.insert(new Entity1(1, "foo"));
+        drain();
+
+        //noinspection ConstantConditions
+        assertThat(listLiveData.getValue().size(), is(1));
+        int expectedTransactionCount = mUseTransactionDao ? 2 : 1;
+        assertTransactionCount(listLiveData.getValue(), expectedTransactionCount);
+    }
+
+    @Test
+    public void flowable() {
+        Flowable<List<Entity1>> flowable = mDao.flowable();
+        TestSubscriber<List<Entity1>> subscriber = observe(flowable);
+        drain();
+        assertThat(subscriber.values().size(), is(1));
+
+        resetTransactionCount();
+        mDao.insert(new Entity1(1, "foo"));
+        drain();
+
+        List<Entity1> allEntities = subscriber.values().get(1);
+        assertThat(allEntities.size(), is(1));
+        int expectedTransactionCount = mUseTransactionDao ? 2 : 1;
+        assertTransactionCount(allEntities, expectedTransactionCount);
+    }
+
+    @Test
+    public void maybe() {
+        mDao.insert(new Entity1(1, "foo"));
+        resetTransactionCount();
+
+        int expectedTransactionCount = mUseTransactionDao ? 1 : 0;
+        Maybe<List<Entity1>> listMaybe = mDao.maybe();
+        TestObserver<List<Entity1>> observer = observe(listMaybe);
+        drain();
+        List<Entity1> allEntities = observer.values().get(0);
+        assertTransactionCount(allEntities, expectedTransactionCount);
+    }
+
+    @Test
+    public void single() {
+        mDao.insert(new Entity1(1, "foo"));
+        resetTransactionCount();
+
+        int expectedTransactionCount = mUseTransactionDao ? 1 : 0;
+        Single<List<Entity1>> listMaybe = mDao.single();
+        TestObserver<List<Entity1>> observer = observe(listMaybe);
+        drain();
+        List<Entity1> allEntities = observer.values().get(0);
+        assertTransactionCount(allEntities, expectedTransactionCount);
+    }
+
+    @Test
+    public void relation() {
+        mDao.insert(new Entity1(1, "foo"));
+        mDao.insert(new Child(1, 1));
+        mDao.insert(new Child(2, 1));
+        resetTransactionCount();
+
+        List<Entity1WithChildren> result = mDao.withRelation();
+        int expectedTransactionCount = mUseTransactionDao ? 1 : 0;
+        assertTransactionCountWithChildren(result, expectedTransactionCount);
+    }
+
+    @Test
+    public void pagedList() {
+        LiveData<PagedList<Entity1>> pagedList = new LivePagedListBuilder<Integer, Entity1>()
+                .setDataSourceFactory(mDao.pagedList())
+                .setPagingConfig(10)
+                .build();
+        observeForever(pagedList);
+        drain();
+        assertThat(sStartedTransactionCount.get(), is(mUseTransactionDao ? 0 : 0));
+
+        mDao.insert(new Entity1(1, "foo"));
+        drain();
+        //noinspection ConstantConditions
+        assertThat(pagedList.getValue().size(), is(1));
+        assertTransactionCount(pagedList.getValue(), mUseTransactionDao ? 2 : 1);
+
+        mDao.insert(new Entity1(2, "bar"));
+        drain();
+        assertThat(pagedList.getValue().size(), is(2));
+        assertTransactionCount(pagedList.getValue(), mUseTransactionDao ? 4 : 2);
+    }
+
+    @Test
+    public void dataSource() {
+        mDao.insert(new Entity1(2, "bar"));
+        drain();
+        resetTransactionCount();
+        TiledDataSource<Entity1> dataSource = mDao.dataSource();
+        dataSource.loadRange(0, 10);
+        assertThat(sStartedTransactionCount.get(), is(mUseTransactionDao ? 1 : 0));
+    }
+
+    private void assertTransactionCount(List<Entity1> allEntities, int expectedTransactionCount) {
+        assertThat(sStartedTransactionCount.get(), is(expectedTransactionCount));
+        assertThat(allEntities.isEmpty(), is(false));
+        for (Entity1 entity1 : allEntities) {
+            assertThat(entity1.transactionId, is(expectedTransactionCount));
+        }
+    }
+
+    private void assertTransactionCountWithChildren(List<Entity1WithChildren> allEntities,
+            int expectedTransactionCount) {
+        assertThat(sStartedTransactionCount.get(), is(expectedTransactionCount));
+        assertThat(allEntities.isEmpty(), is(false));
+        for (Entity1WithChildren entity1 : allEntities) {
+            assertThat(entity1.transactionId, is(expectedTransactionCount));
+            assertThat(entity1.children, notNullValue());
+            assertThat(entity1.children.isEmpty(), is(false));
+            for (Child child : entity1.children) {
+                assertThat(child.transactionId, is(expectedTransactionCount));
+            }
+        }
+    }
+
+    private void resetTransactionCount() {
+        sStartedTransactionCount.set(0);
+    }
+
+    private void drain() {
+        try {
+            countingTaskExecutorRule.drainTasks(30, TimeUnit.SECONDS);
+        } catch (InterruptedException e) {
+            throw new AssertionError("interrupted", e);
+        } catch (TimeoutException e) {
+            throw new AssertionError("drain timed out", e);
+        }
+    }
+
+    private <T> TestSubscriber<T> observe(final Flowable<T> flowable) {
+        TestSubscriber<T> subscriber = new TestSubscriber<>();
+        flowable.observeOn(Schedulers.from(ArchTaskExecutor.getMainThreadExecutor()))
+                .subscribeWith(subscriber);
+        return subscriber;
+    }
+
+    private <T> TestObserver<T> observe(final Maybe<T> maybe) {
+        TestObserver<T> observer = new TestObserver<>();
+        maybe.observeOn(Schedulers.from(ArchTaskExecutor.getMainThreadExecutor()))
+                .subscribeWith(observer);
+        return observer;
+    }
+
+    private <T> TestObserver<T> observe(final Single<T> single) {
+        TestObserver<T> observer = new TestObserver<>();
+        single.observeOn(Schedulers.from(ArchTaskExecutor.getMainThreadExecutor()))
+                .subscribeWith(observer);
+        return observer;
+    }
+
+    private <T> void observeForever(final LiveData<T> liveData) {
+        FutureTask<Void> futureTask = new FutureTask<>(new Callable<Void>() {
+            @Override
+            public Void call() throws Exception {
+                liveData.observe(mLifecycleOwner, new Observer<T>() {
+                    @Override
+                    public void onChanged(@Nullable T t) {
+
+                    }
+                });
+                return null;
+            }
+        });
+        ArchTaskExecutor.getMainThreadExecutor().execute(futureTask);
+        try {
+            futureTask.get();
+        } catch (InterruptedException e) {
+            throw new AssertionError("interrupted", e);
+        } catch (ExecutionException e) {
+            throw new AssertionError("execution error", e);
+        }
+    }
+
+    @SuppressWarnings("WeakerAccess")
+    static class Entity1WithChildren extends Entity1 {
+        @Relation(entity = Child.class, parentColumn = "id",
+                entityColumn = "entity1Id")
+        public List<Child> children;
+
+        Entity1WithChildren(int id, String value) {
+            super(id, value);
+        }
+    }
+
+    @SuppressWarnings("WeakerAccess")
+    @Entity
+    static class Child {
+        @PrimaryKey(autoGenerate = true)
+        public int id;
+        public int entity1Id;
+        @Ignore
+        public final int transactionId = sStartedTransactionCount.get();
+
+        Child(int id, int entity1Id) {
+            this.id = id;
+            this.entity1Id = entity1Id;
+        }
+    }
+
+    @SuppressWarnings("WeakerAccess")
+    @Entity
+    static class Entity1 {
+        @PrimaryKey(autoGenerate = true)
+        public int id;
+        public String value;
+        @Ignore
+        public final int transactionId = sStartedTransactionCount.get();
+
+        Entity1(int id, String value) {
+            this.id = id;
+            this.value = value;
+        }
+    }
+
+    // we don't support dao inheritance for queries so for now, go with this
+    interface Entity1Dao {
+        String SELECT_ALL = "select * from Entity1";
+
+        List<Entity1> allEntities();
+
+        Flowable<List<Entity1>> flowable();
+
+        Maybe<List<Entity1>> maybe();
+
+        Single<List<Entity1>> single();
+
+        LiveData<List<Entity1>> liveData();
+
+        List<Entity1WithChildren> withRelation();
+
+        DataSource.Factory<Integer, Entity1> pagedList();
+
+        TiledDataSource<Entity1> dataSource();
+
+        @Insert
+        void insert(Entity1 entity1);
+
+        @Insert
+        void insert(Child entity1);
+    }
+
+    @Dao
+    interface EntityDao extends Entity1Dao {
+        @Override
+        @Query(SELECT_ALL)
+        List<Entity1> allEntities();
+
+        @Override
+        @Query(SELECT_ALL)
+        Flowable<List<Entity1>> flowable();
+
+        @Override
+        @Query(SELECT_ALL)
+        LiveData<List<Entity1>> liveData();
+
+        @Override
+        @Query(SELECT_ALL)
+        Maybe<List<Entity1>> maybe();
+
+        @Override
+        @Query(SELECT_ALL)
+        Single<List<Entity1>> single();
+
+        @Override
+        @Query(SELECT_ALL)
+        @SuppressWarnings(RoomWarnings.RELATION_QUERY_WITHOUT_TRANSACTION)
+        List<Entity1WithChildren> withRelation();
+
+        @Override
+        @Query(SELECT_ALL)
+        DataSource.Factory<Integer, Entity1> pagedList();
+
+        @Override
+        @Query(SELECT_ALL)
+        TiledDataSource<Entity1> dataSource();
+    }
+
+    @Dao
+    interface TransactionDao extends Entity1Dao {
+        @Override
+        @Transaction
+        @Query(SELECT_ALL)
+        List<Entity1> allEntities();
+
+        @Override
+        @Transaction
+        @Query(SELECT_ALL)
+        Flowable<List<Entity1>> flowable();
+
+        @Override
+        @Transaction
+        @Query(SELECT_ALL)
+        LiveData<List<Entity1>> liveData();
+
+        @Override
+        @Transaction
+        @Query(SELECT_ALL)
+        Maybe<List<Entity1>> maybe();
+
+        @Override
+        @Transaction
+        @Query(SELECT_ALL)
+        Single<List<Entity1>> single();
+
+        @Override
+        @Transaction
+        @Query(SELECT_ALL)
+        List<Entity1WithChildren> withRelation();
+
+        @Override
+        @Transaction
+        @Query(SELECT_ALL)
+        DataSource.Factory<Integer, Entity1> pagedList();
+
+        @Override
+        @Transaction
+        @Query(SELECT_ALL)
+        TiledDataSource<Entity1> dataSource();
+    }
+
+    @Database(version = 1, entities = {Entity1.class, Child.class}, exportSchema = false)
+    abstract static class TransactionDb extends RoomDatabase {
+        abstract EntityDao dao();
+
+        abstract TransactionDao transactionDao();
+
+        @Override
+        public void beginTransaction() {
+            super.beginTransaction();
+            sStartedTransactionCount.incrementAndGet();
+        }
+    }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RxJava2Test.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RxJava2Test.java
index 1bbc140..01d071e 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RxJava2Test.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RxJava2Test.java
@@ -19,10 +19,12 @@
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.core.executor.TaskExecutor;
 import android.arch.persistence.room.EmptyResultSetException;
+import android.arch.persistence.room.integration.testapp.vo.Pet;
 import android.arch.persistence.room.integration.testapp.vo.User;
+import android.arch.persistence.room.integration.testapp.vo.UserAndAllPets;
 import android.support.test.filters.MediumTest;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
@@ -38,6 +40,7 @@
 import java.util.List;
 
 import io.reactivex.disposables.Disposable;
+import io.reactivex.functions.Predicate;
 import io.reactivex.observers.TestObserver;
 import io.reactivex.schedulers.TestScheduler;
 import io.reactivex.subscribers.TestSubscriber;
@@ -52,7 +55,7 @@
     public void setupSchedulers() {
         mTestScheduler = new TestScheduler();
         mTestScheduler.start();
-        AppToolkitTaskExecutor.getInstance().setDelegate(new TaskExecutor() {
+        ArchTaskExecutor.getInstance().setDelegate(new TaskExecutor() {
             @Override
             public void executeOnDiskIO(Runnable runnable) {
                 mTestScheduler.scheduleDirect(runnable);
@@ -73,7 +76,7 @@
     @After
     public void clearSchedulers() {
         mTestScheduler.shutdown();
-        AppToolkitTaskExecutor.getInstance().setDelegate(null);
+        ArchTaskExecutor.getInstance().setDelegate(null);
     }
 
     private void drain() throws InterruptedException {
@@ -269,4 +272,60 @@
         subscriber.cancel();
         subscriber.assertNoErrors();
     }
+
+    @Test
+    public void flowableWithRelation() throws InterruptedException {
+        final TestSubscriber<UserAndAllPets> subscriber = new TestSubscriber<>();
+
+        mUserPetDao.flowableUserWithPets(3).subscribe(subscriber);
+        drain();
+        subscriber.assertSubscribed();
+
+        drain();
+        subscriber.assertNoValues();
+
+        final User user = TestUtil.createUser(3);
+        mUserDao.insert(user);
+        drain();
+        subscriber.assertValue(new Predicate<UserAndAllPets>() {
+            @Override
+            public boolean test(UserAndAllPets userAndAllPets) throws Exception {
+                return userAndAllPets.user.equals(user);
+            }
+        });
+        subscriber.assertValueCount(1);
+        final Pet[] pets = TestUtil.createPetsForUser(3, 1, 2);
+        mPetDao.insertAll(pets);
+        drain();
+        subscriber.assertValueAt(1, new Predicate<UserAndAllPets>() {
+            @Override
+            public boolean test(UserAndAllPets userAndAllPets) throws Exception {
+                return userAndAllPets.user.equals(user)
+                        && userAndAllPets.pets.equals(Arrays.asList(pets));
+            }
+        });
+    }
+
+    @Test
+    public void flowable_updateInTransaction() throws InterruptedException {
+        // When subscribing to the emissions of the user
+        final TestSubscriber<User> userTestSubscriber = mUserDao
+                .flowableUserById(3)
+                .observeOn(mTestScheduler)
+                .test();
+        drain();
+        userTestSubscriber.assertValueCount(0);
+
+        // When inserting a new user in the data source
+        mDatabase.beginTransaction();
+        try {
+            mUserDao.insert(TestUtil.createUser(3));
+            mDatabase.setTransactionSuccessful();
+
+        } finally {
+            mDatabase.endTransaction();
+        }
+        drain();
+        userTestSubscriber.assertValueCount(1);
+    }
 }
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RxJava2WithInstantTaskExecutorTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RxJava2WithInstantTaskExecutorTest.java
new file mode 100644
index 0000000..fcd0b00
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RxJava2WithInstantTaskExecutorTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.persistence.room.integration.testapp.test;
+
+import android.arch.core.executor.testing.InstantTaskExecutorRule;
+import android.arch.persistence.room.Room;
+import android.arch.persistence.room.integration.testapp.TestDatabase;
+import android.arch.persistence.room.integration.testapp.vo.User;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import io.reactivex.subscribers.TestSubscriber;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class RxJava2WithInstantTaskExecutorTest {
+    @Rule
+    public InstantTaskExecutorRule instantTaskExecutorRule = new InstantTaskExecutorRule();
+
+    private TestDatabase mDatabase;
+
+    @Before
+    public void initDb() throws Exception {
+        // using an in-memory database because the information stored here disappears when the
+        // process is killed
+        mDatabase = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getContext(),
+                TestDatabase.class)
+                // allowing main thread queries, just for testing
+                .allowMainThreadQueries()
+                .build();
+    }
+
+    @Test
+    public void testFlowableInTransaction() {
+        // When subscribing to the emissions of the user
+        TestSubscriber<User> subscriber = mDatabase.getUserDao().flowableUserById(3).test();
+        subscriber.assertValueCount(0);
+
+        // When inserting a new user in the data source
+        mDatabase.beginTransaction();
+        try {
+            mDatabase.getUserDao().insert(TestUtil.createUser(3));
+            mDatabase.setTransactionSuccessful();
+        } finally {
+            mDatabase.endTransaction();
+        }
+
+        subscriber.assertValueCount(1);
+    }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/TestDatabaseTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/TestDatabaseTest.java
index 51d5bb3..ec77561 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/TestDatabaseTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/TestDatabaseTest.java
@@ -18,6 +18,7 @@
 
 import android.arch.persistence.room.Room;
 import android.arch.persistence.room.integration.testapp.TestDatabase;
+import android.arch.persistence.room.integration.testapp.dao.FunnyNamedDao;
 import android.arch.persistence.room.integration.testapp.dao.PetCoupleDao;
 import android.arch.persistence.room.integration.testapp.dao.PetDao;
 import android.arch.persistence.room.integration.testapp.dao.SchoolDao;
@@ -42,6 +43,7 @@
     protected ToyDao mToyDao;
     protected SpecificDogDao mSpecificDogDao;
     protected WithClauseDao mWithClauseDao;
+    protected FunnyNamedDao mFunnyNamedDao;
 
     @Before
     public void createDb() {
@@ -55,5 +57,6 @@
         mToyDao = mDatabase.getToyDao();
         mSpecificDogDao = mDatabase.getSpecificDogDao();
         mWithClauseDao = mDatabase.getWithClauseDao();
+        mFunnyNamedDao = mDatabase.getFunnyNamedDao();
     }
 }
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/WithClauseTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/WithClauseTest.java
index 10897da..9209638 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/WithClauseTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/WithClauseTest.java
@@ -20,6 +20,8 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import android.arch.persistence.room.integration.testapp.vo.User;
+import android.os.Build;
+import android.support.test.filters.SdkSuppress;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
@@ -32,6 +34,7 @@
 
 @RunWith(AndroidJUnit4.class)
 @SmallTest
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
 public class WithClauseTest extends TestDatabaseTest{
     @Test
     public void noSourceOfData() {
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/FunnyNamedEntity.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/FunnyNamedEntity.java
new file mode 100644
index 0000000..20f3c21
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/FunnyNamedEntity.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.persistence.room.integration.testapp.vo;
+
+import android.arch.persistence.room.ColumnInfo;
+import android.arch.persistence.room.Entity;
+import android.arch.persistence.room.PrimaryKey;
+
+/**
+ * An entity that was weird names
+ */
+@Entity(tableName = FunnyNamedEntity.TABLE_NAME)
+public class FunnyNamedEntity {
+    public static final String TABLE_NAME = "funny but not so funny";
+    public static final String COLUMN_ID = "_this $is id$";
+    public static final String COLUMN_VALUE = "unlikely-Ωşå¨ıünames";
+    @PrimaryKey(autoGenerate = true)
+    @ColumnInfo(name = COLUMN_ID)
+    private int mId;
+    @ColumnInfo(name = COLUMN_VALUE)
+    private String mValue;
+
+    public FunnyNamedEntity(int id, String value) {
+        mId = id;
+        mValue = value;
+    }
+
+    public int getId() {
+        return mId;
+    }
+
+    public void setId(int id) {
+        mId = id;
+    }
+
+    public String getValue() {
+        return mValue;
+    }
+
+    public void setValue(String value) {
+        mValue = value;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        FunnyNamedEntity entity = (FunnyNamedEntity) o;
+
+        if (mId != entity.mId) return false;
+        return mValue != null ? mValue.equals(entity.mValue) : entity.mValue == null;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = mId;
+        result = 31 * result + (mValue != null ? mValue.hashCode() : 0);
+        return result;
+    }
+}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/IntegerPKeyEntity.java
similarity index 69%
copy from paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
copy to room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/IntegerPKeyEntity.java
index 5318d38..cae1843 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/IntegerPKeyEntity.java
@@ -14,12 +14,14 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package android.arch.persistence.room.integration.testapp.vo;
 
-import java.util.Arrays;
+import android.arch.persistence.room.Entity;
+import android.arch.persistence.room.PrimaryKey;
 
-public class StringPagedList extends NullPaddedList<String> {
-    public StringPagedList(int leadingNulls, int trailingNulls, String... items) {
-        super(leadingNulls, Arrays.asList(items), trailingNulls);
-    }
+@Entity
+public class IntegerPKeyEntity {
+    @PrimaryKey
+    public Integer pKey;
+    public String data;
 }
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/CustomerViewModel.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/CustomerViewModel.java
index 1f434ad..89d16b7 100644
--- a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/CustomerViewModel.java
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/CustomerViewModel.java
@@ -17,11 +17,11 @@
 package android.arch.persistence.room.integration.testapp;
 
 import android.app.Application;
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.lifecycle.AndroidViewModel;
 import android.arch.lifecycle.LiveData;
 import android.arch.paging.DataSource;
-import android.arch.paging.LivePagedListProvider;
+import android.arch.paging.LivePagedListBuilder;
 import android.arch.paging.PagedList;
 import android.arch.persistence.room.Room;
 import android.arch.persistence.room.integration.testapp.database.Customer;
@@ -47,7 +47,7 @@
         mDatabase = Room.databaseBuilder(this.getApplication(),
                 SampleDatabase.class, "customerDatabase").build();
 
-        AppToolkitTaskExecutor.getInstance().executeOnDiskIO(new Runnable() {
+        ArchTaskExecutor.getInstance().executeOnDiskIO(new Runnable() {
             @Override
             public void run() {
                 // fill with some simple data
@@ -73,7 +73,7 @@
     }
 
     void insertCustomer() {
-        AppToolkitTaskExecutor.getInstance().executeOnDiskIO(new Runnable() {
+        ArchTaskExecutor.getInstance().executeOnDiskIO(new Runnable() {
             @Override
             public void run() {
                 mDatabase.getCustomerDao().insert(createCustomer());
@@ -81,30 +81,30 @@
         });
     }
 
+    private static <K> LiveData<PagedList<Customer>> getLivePagedList(
+            K initialLoadKey, DataSource.Factory<K, Customer> dataSourceFactory) {
+        return new LivePagedListBuilder<K, Customer>()
+                .setInitialLoadKey(initialLoadKey)
+                .setPagingConfig(new PagedList.Config.Builder()
+                        .setPageSize(10)
+                        .setEnablePlaceholders(false)
+                        .build())
+                .setDataSourceFactory(dataSourceFactory)
+                .build();
+    }
+
     LiveData<PagedList<Customer>> getLivePagedList(int position) {
         if (mLiveCustomerList == null) {
-            mLiveCustomerList = mDatabase.getCustomerDao()
-                    .loadPagedAgeOrder().create(position,
-                            new PagedList.Config.Builder()
-                                    .setPageSize(10)
-                                    .setEnablePlaceholders(false)
-                                    .build());
+            mLiveCustomerList =
+                    getLivePagedList(position, mDatabase.getCustomerDao().loadPagedAgeOrder());
         }
         return mLiveCustomerList;
     }
 
     LiveData<PagedList<Customer>> getLivePagedList(String key) {
         if (mLiveCustomerList == null) {
-            mLiveCustomerList = new LivePagedListProvider<String, Customer>() {
-                @Override
-                protected DataSource<String, Customer> createDataSource() {
-                    return new LastNameAscCustomerDataSource(mDatabase);
-                }
-            }.create(key,
-                    new PagedList.Config.Builder()
-                            .setPageSize(10)
-                            .setEnablePlaceholders(false)
-                            .build());
+            mLiveCustomerList =
+                    getLivePagedList(key, LastNameAscCustomerDataSource.factory(mDatabase));
         }
         return mLiveCustomerList;
     }
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/RoomPagedListActivity.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/RoomPagedListActivity.java
index 818c46b..cdd464e 100644
--- a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/RoomPagedListActivity.java
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/RoomPagedListActivity.java
@@ -86,6 +86,7 @@
 
     @Override
     protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
         PagedList<Customer> list = mAdapter.getCurrentList();
         if (list == null) {
             // Can't find anything to restore
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/CustomerDao.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/CustomerDao.java
index 9d40237..db45dc4 100644
--- a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/CustomerDao.java
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/CustomerDao.java
@@ -16,7 +16,7 @@
 
 package android.arch.persistence.room.integration.testapp.database;
 
-import android.arch.paging.LivePagedListProvider;
+import android.arch.paging.DataSource;
 import android.arch.persistence.room.Dao;
 import android.arch.persistence.room.Insert;
 import android.arch.persistence.room.Query;
@@ -44,12 +44,11 @@
     void insertAll(Customer[] customers);
 
     /**
-     * @return LivePagedListProvider of customers, ordered by last name. Call
-     * {@link LivePagedListProvider#create(Object, android.arch.paging.PagedList.Config)} to
-     * get a LiveData of PagedLists.
+     * @return DataSource.Factory of customers, ordered by last name. Use
+     * {@link android.arch.paging.LivePagedListBuilder} to get a LiveData of PagedLists.
      */
     @Query("SELECT * FROM customer ORDER BY mLastName ASC")
-    LivePagedListProvider<Integer, Customer> loadPagedAgeOrder();
+    DataSource.Factory<Integer, Customer> loadPagedAgeOrder();
 
     /**
      * @return number of customers
@@ -59,7 +58,7 @@
 
     // Keyed
 
-    @Query("SELECT * from customer ORDER BY mLastName ASC LIMIT :limit")
+    @Query("SELECT * from customer ORDER BY mLastName DESC LIMIT :limit")
     List<Customer> customerNameInitial(int limit);
 
     @Query("SELECT * from customer WHERE mLastName < :key ORDER BY mLastName DESC LIMIT :limit")
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/LastNameAscCustomerDataSource.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/LastNameAscCustomerDataSource.java
index 1bc731a..a38d6ae 100644
--- a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/LastNameAscCustomerDataSource.java
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/LastNameAscCustomerDataSource.java
@@ -15,6 +15,7 @@
  */
 package android.arch.persistence.room.integration.testapp.database;
 
+import android.arch.paging.DataSource;
 import android.arch.paging.KeyedDataSource;
 import android.arch.persistence.room.InvalidationTracker;
 import android.support.annotation.NonNull;
@@ -32,10 +33,19 @@
     private final InvalidationTracker.Observer mObserver;
     private SampleDatabase mDb;
 
+    public static Factory<String, Customer> factory(final SampleDatabase db) {
+        return new Factory<String, Customer>() {
+            @Override
+            public DataSource<String, Customer> create() {
+                return new LastNameAscCustomerDataSource(db);
+            }
+        };
+    }
+
     /**
      * Create a DataSource from the customer table of the given database
      */
-    public LastNameAscCustomerDataSource(SampleDatabase db) {
+    private LastNameAscCustomerDataSource(SampleDatabase db) {
         mDb = db;
         mCustomerDao = db.getCustomerDao();
         mObserver = new InvalidationTracker.Observer("customer") {
diff --git a/room/integration-tests/testapp/src/test/java/android/arch/persistence/room/integration/testapp/db/JDBCOpenHelper.java b/room/integration-tests/testapp/src/test/java/android/arch/persistence/room/integration/testapp/db/JDBCOpenHelper.java
deleted file mode 100644
index 3cbffc8..0000000
--- a/room/integration-tests/testapp/src/test/java/android/arch/persistence/room/integration/testapp/db/JDBCOpenHelper.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.arch.persistence.room.integration.testapp.db;
-
-import android.arch.persistence.db.SupportSQLiteDatabase;
-import android.arch.persistence.db.SupportSQLiteOpenHelper;
-
-public class JDBCOpenHelper implements SupportSQLiteOpenHelper {
-    @Override
-    public String getDatabaseName() {
-        return null;
-    }
-
-    @Override
-    public void setWriteAheadLoggingEnabled(boolean enabled) {
-
-    }
-
-    @Override
-    public SupportSQLiteDatabase getWritableDatabase() {
-        return null;
-    }
-
-    @Override
-    public SupportSQLiteDatabase getReadableDatabase() {
-        return null;
-    }
-
-    @Override
-    public void close() {
-
-    }
-}
diff --git a/room/migration/src/main/java/android/arch/persistence/room/migration/bundle/ForeignKeyBundle.java b/room/migration/src/main/java/android/arch/persistence/room/migration/bundle/ForeignKeyBundle.java
index 1467a4f..d72cf8c 100644
--- a/room/migration/src/main/java/android/arch/persistence/room/migration/bundle/ForeignKeyBundle.java
+++ b/room/migration/src/main/java/android/arch/persistence/room/migration/bundle/ForeignKeyBundle.java
@@ -16,13 +16,18 @@
 
 package android.arch.persistence.room.migration.bundle;
 
+import android.support.annotation.RestrictTo;
+
 import com.google.gson.annotations.SerializedName;
 
 import java.util.List;
 
 /**
  * Holds the information about a foreign key reference.
+ *
+ * @hide
  */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class ForeignKeyBundle {
     @SerializedName("table")
     private String mTable;
diff --git a/room/runtime/src/androidTest/java/android/arch/persistence/room/migration/TableInfoTest.java b/room/runtime/src/androidTest/java/android/arch/persistence/room/migration/TableInfoTest.java
index 8b7025b..d88c02f 100644
--- a/room/runtime/src/androidTest/java/android/arch/persistence/room/migration/TableInfoTest.java
+++ b/room/runtime/src/androidTest/java/android/arch/persistence/room/migration/TableInfoTest.java
@@ -37,6 +37,7 @@
 import org.junit.runner.RunWith;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -179,6 +180,35 @@
                 Collections.<TableInfo.ForeignKey>emptySet())));
     }
 
+    @Test
+    public void readIndices() {
+        mDb = createDatabase(
+                "CREATE TABLE foo (n INTEGER, indexed TEXT, unique_indexed TEXT,"
+                        + "a INTEGER, b INTEGER);",
+                "CREATE INDEX foo_indexed ON foo(indexed);",
+                "CREATE UNIQUE INDEX foo_unique_indexed ON foo(unique_indexed COLLATE NOCASE"
+                        + " DESC);",
+                "CREATE INDEX " + TableInfo.Index.DEFAULT_PREFIX + "foo_composite_indexed"
+                        + " ON foo(a, b);"
+        );
+        TableInfo info = TableInfo.read(mDb, "foo");
+        assertThat(info, is(new TableInfo(
+                "foo",
+                toMap(new TableInfo.Column("n", "INTEGER", false, 0),
+                        new TableInfo.Column("indexed", "TEXT", false, 0),
+                        new TableInfo.Column("unique_indexed", "TEXT", false, 0),
+                        new TableInfo.Column("a", "INTEGER", false, 0),
+                        new TableInfo.Column("b", "INTEGER", false, 0)),
+                Collections.<TableInfo.ForeignKey>emptySet(),
+                toSet(new TableInfo.Index("index_foo_blahblah", false,
+                        Arrays.asList("a", "b")),
+                        new TableInfo.Index("foo_unique_indexed", true,
+                                Arrays.asList("unique_indexed")),
+                        new TableInfo.Index("foo_indexed", false,
+                                Arrays.asList("indexed"))))
+        ));
+    }
+
     private static Map<String, TableInfo.Column> toMap(TableInfo.Column... columns) {
         Map<String, TableInfo.Column> result = new HashMap<>();
         for (TableInfo.Column column : columns) {
@@ -187,6 +217,14 @@
         return result;
     }
 
+    private static <T> Set<T> toSet(T... ts) {
+        final HashSet<T> result = new HashSet<T>();
+        for (T t : ts) {
+            result.add(t);
+        }
+        return result;
+    }
+
     @After
     public void closeDb() throws IOException {
         if (mDb != null && mDb.isOpen()) {
diff --git a/room/runtime/src/main/AndroidManifest.xml b/room/runtime/src/main/AndroidManifest.xml
index 79ffb93..54a5b36 100644
--- a/room/runtime/src/main/AndroidManifest.xml
+++ b/room/runtime/src/main/AndroidManifest.xml
@@ -16,8 +16,4 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.persistence.room">
-    <application>
-        <meta-data android:name="android.arch.persistence.room.VERSION"
-                   android:value="${version}" />
-    </application>
 </manifest>
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/InvalidationTracker.java b/room/runtime/src/main/java/android/arch/persistence/room/InvalidationTracker.java
index 33bc4ed..b31dc13 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/InvalidationTracker.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/InvalidationTracker.java
@@ -16,7 +16,7 @@
 
 package android.arch.persistence.room;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.core.internal.SafeIterableMap;
 import android.arch.persistence.db.SupportSQLiteDatabase;
 import android.arch.persistence.db.SupportSQLiteStatement;
@@ -166,10 +166,12 @@
 
     private static void appendTriggerName(StringBuilder builder, String tableName,
             String triggerType) {
-        builder.append("room_table_modification_trigger_")
+        builder.append("`")
+                .append("room_table_modification_trigger_")
                 .append(tableName)
                 .append("_")
-                .append(triggerType);
+                .append(triggerType)
+                .append("`");
     }
 
     private void stopTrackingTable(SupportSQLiteDatabase writableDb, int tableId) {
@@ -192,9 +194,9 @@
             appendTriggerName(stringBuilder, tableName, trigger);
             stringBuilder.append(" AFTER ")
                     .append(trigger)
-                    .append(" ON ")
+                    .append(" ON `")
                     .append(tableName)
-                    .append(" BEGIN INSERT OR REPLACE INTO ")
+                    .append("` BEGIN INSERT OR REPLACE INTO ")
                     .append(UPDATE_TABLE_NAME)
                     .append(" VALUES(null, ")
                     .append(tableId)
@@ -217,7 +219,7 @@
      *
      * @param observer The observer which listens the database for changes.
      */
-    public void addObserver(Observer observer) {
+    public void addObserver(@NonNull Observer observer) {
         final String[] tableNames = observer.mTables;
         int[] tableIds = new int[tableNames.length];
         final int size = tableNames.length;
@@ -238,7 +240,7 @@
             currentObserver = mObserverMap.putIfAbsent(observer, wrapper);
         }
         if (currentObserver == null && mObservedTableTracker.onAdded(tableIds)) {
-            AppToolkitTaskExecutor.getInstance().executeOnDiskIO(mSyncTriggers);
+            ArchTaskExecutor.getInstance().executeOnDiskIO(mSyncTriggers);
         }
     }
 
@@ -263,13 +265,13 @@
      * @param observer The observer to remove.
      */
     @SuppressWarnings("WeakerAccess")
-    public void removeObserver(final Observer observer) {
+    public void removeObserver(@NonNull final Observer observer) {
         ObserverWrapper wrapper;
         synchronized (mObserverMap) {
             wrapper = mObserverMap.remove(observer);
         }
         if (wrapper != null && mObservedTableTracker.onRemoved(wrapper.mTableIds)) {
-            AppToolkitTaskExecutor.getInstance().executeOnDiskIO(mSyncTriggers);
+            ArchTaskExecutor.getInstance().executeOnDiskIO(mSyncTriggers);
         }
     }
 
@@ -350,11 +352,18 @@
                     return;
                 }
 
-                if (mDatabase.inTransaction()
-                        || !mPendingRefresh.compareAndSet(true, false)) {
+                if (!mPendingRefresh.compareAndSet(true, false)) {
                     // no pending refresh
                     return;
                 }
+
+                if (mDatabase.inTransaction()) {
+                    // current thread is in a transaction. when it ends, it will invoke
+                    // refreshRunnable again. mPendingRefresh is left as false on purpose
+                    // so that the last transaction can flip it on again.
+                    return;
+                }
+
                 mCleanupStatement.executeUpdateDelete();
                 mQueryArgs[0] = mMaxVersion;
                 Cursor cursor = mDatabase.query(SELECT_UPDATED_TABLES_SQL, mQueryArgs);
@@ -400,7 +409,7 @@
     public void refreshVersionsAsync() {
         // TODO we should consider doing this sync instead of async.
         if (mPendingRefresh.compareAndSet(false, true)) {
-            AppToolkitTaskExecutor.getInstance().executeOnDiskIO(mRefreshRunnable);
+            ArchTaskExecutor.getInstance().executeOnDiskIO(mRefreshRunnable);
         }
     }
 
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/Room.java b/room/runtime/src/main/java/android/arch/persistence/room/Room.java
index 8ce4be0..2850b55 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/Room.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/Room.java
@@ -43,6 +43,7 @@
      * @return A {@code RoomDatabaseBuilder<T>} which you can use to create the database.
      */
     @SuppressWarnings("WeakerAccess")
+    @NonNull
     public static <T extends RoomDatabase> RoomDatabase.Builder<T> databaseBuilder(
             @NonNull Context context, @NonNull Class<T> klass, @NonNull String name) {
         //noinspection ConstantConditions
@@ -65,6 +66,7 @@
      * @param <T>     The type of the database class.
      * @return A {@code RoomDatabaseBuilder<T>} which you can use to create the database.
      */
+    @NonNull
     public static <T extends RoomDatabase> RoomDatabase.Builder<T> inMemoryDatabaseBuilder(
             @NonNull Context context, @NonNull Class<T> klass) {
         return new RoomDatabase.Builder<>(context, klass, null);
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/RoomDatabase.java b/room/runtime/src/main/java/android/arch/persistence/room/RoomDatabase.java
index f6f8c5c..8c94024 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/RoomDatabase.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/RoomDatabase.java
@@ -16,7 +16,7 @@
 
 package android.arch.persistence.room;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.arch.persistence.db.SimpleSQLiteQuery;
 import android.arch.persistence.db.SupportSQLiteDatabase;
 import android.arch.persistence.db.SupportSQLiteOpenHelper;
@@ -49,7 +49,7 @@
  *
  * @see Database
  */
-@SuppressWarnings({"unused", "WeakerAccess"})
+//@SuppressWarnings({"unused", "WeakerAccess"})
 public abstract class RoomDatabase {
     private static final String DB_IMPL_SUFFIX = "_Impl";
     // set by the generated open helper.
@@ -153,12 +153,14 @@
      *
      * @hide
      */
+    @SuppressWarnings("WeakerAccess")
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    // used in generated code
     public void assertNotMainThread() {
         if (mAllowMainThreadQueries) {
             return;
         }
-        if (AppToolkitTaskExecutor.getInstance().isMainThread()) {
+        if (ArchTaskExecutor.getInstance().isMainThread()) {
             throw new IllegalStateException("Cannot access database on the main thread since"
                     + " it may potentially lock the UI for a long period of time.");
         }
@@ -216,7 +218,11 @@
      */
     public void endTransaction() {
         mOpenHelper.getWritableDatabase().endTransaction();
-        mInvalidationTracker.refreshVersionsAsync();
+        if (!inTransaction()) {
+            // enqueue refresh only if we are NOT in a transaction. Otherwise, wait for the last
+            // endTransaction call to do it.
+            mInvalidationTracker.refreshVersionsAsync();
+        }
     }
 
     /**
@@ -294,6 +300,7 @@
      * @return True if there is an active transaction in current thread, false otherwise.
      * @see SupportSQLiteDatabase#inTransaction()
      */
+    @SuppressWarnings("WeakerAccess")
     public boolean inTransaction() {
         return mOpenHelper.getWritableDatabase().inTransaction();
     }
@@ -303,7 +310,6 @@
      *
      * @param <T> The type of the abstract database class.
      */
-    @SuppressWarnings("unused")
     public static class Builder<T extends RoomDatabase> {
         private final Class<T> mDatabaseClass;
         private final String mName;
@@ -333,7 +339,8 @@
          * @param factory The factory to use to access the database.
          * @return this
          */
-        public Builder<T> openHelperFactory(SupportSQLiteOpenHelper.Factory factory) {
+        @NonNull
+        public Builder<T> openHelperFactory(@Nullable SupportSQLiteOpenHelper.Factory factory) {
             mFactory = factory;
             return this;
         }
@@ -357,6 +364,7 @@
          *                   changes.
          * @return this
          */
+        @NonNull
         public Builder<T> addMigrations(Migration... migrations) {
             mMigrationContainer.addMigrations(migrations);
             return this;
@@ -374,12 +382,16 @@
          *
          * @return this
          */
+        @NonNull
         public Builder<T> allowMainThreadQueries() {
             mAllowMainThreadQueries = true;
             return this;
         }
 
         /**
+         * Allows Room to destructively recreate database tables if {@link Migration}s that would
+         * migrate old database schemas to the latest schema version are not found.
+         * <p>
          * When the database version on the device does not match the latest schema version, Room
          * runs necessary {@link Migration}s on the database.
          * <p>
@@ -393,6 +405,7 @@
          *
          * @return this
          */
+        @NonNull
         public Builder<T> fallbackToDestructiveMigration() {
             mRequireMigration = false;
             return this;
@@ -404,6 +417,7 @@
          * @param callback The callback.
          * @return this
          */
+        @NonNull
         public Builder<T> addCallback(@NonNull Callback callback) {
             if (mCallbacks == null) {
                 mCallbacks = new ArrayList<>();
@@ -420,6 +434,7 @@
          *
          * @return A new database instance.
          */
+        @NonNull
         public T build() {
             //noinspection ConstantConditions
             if (mContext == null) {
@@ -486,6 +501,7 @@
          * @return An ordered list of {@link Migration} objects that should be run to migrate
          * between the given versions. If a migration path cannot be found, returns {@code null}.
          */
+        @SuppressWarnings("WeakerAccess")
         @Nullable
         public List<Migration> findMigrationPath(int start, int end) {
             if (start == end) {
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/migration/Migration.java b/room/runtime/src/main/java/android/arch/persistence/room/migration/Migration.java
index 907e624..d69ea0d 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/migration/Migration.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/migration/Migration.java
@@ -17,6 +17,7 @@
 package android.arch.persistence.room.migration;
 
 import android.arch.persistence.db.SupportSQLiteDatabase;
+import android.support.annotation.NonNull;
 
 /**
  * Base class for a database migration.
@@ -58,5 +59,5 @@
      *
      * @param database The database instance
      */
-    public abstract void migrate(SupportSQLiteDatabase database);
+    public abstract void migrate(@NonNull SupportSQLiteDatabase database);
 }
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/paging/LimitOffsetDataSource.java b/room/runtime/src/main/java/android/arch/persistence/room/paging/LimitOffsetDataSource.java
index 800514c..2f9a888 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/paging/LimitOffsetDataSource.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/paging/LimitOffsetDataSource.java
@@ -49,10 +49,13 @@
     private final RoomDatabase mDb;
     @SuppressWarnings("FieldCanBeLocal")
     private final InvalidationTracker.Observer mObserver;
+    private final boolean mInTransaction;
 
-    protected LimitOffsetDataSource(RoomDatabase db, RoomSQLiteQuery query, String... tables) {
+    protected LimitOffsetDataSource(RoomDatabase db, RoomSQLiteQuery query,
+            boolean inTransaction, String... tables) {
         mDb = db;
         mSourceQuery = query;
+        mInTransaction = inTransaction;
         mCountQuery = "SELECT COUNT(*) FROM ( " + mSourceQuery.getSql() + " )";
         mLimitOffsetQuery = "SELECT * FROM ( " + mSourceQuery.getSql() + " ) LIMIT ? OFFSET ?";
         mObserver = new InvalidationTracker.Observer(tables) {
@@ -98,13 +101,30 @@
         sqLiteQuery.copyArgumentsFrom(mSourceQuery);
         sqLiteQuery.bindLong(sqLiteQuery.getArgCount() - 1, loadCount);
         sqLiteQuery.bindLong(sqLiteQuery.getArgCount(), startPosition);
-        Cursor cursor = mDb.query(sqLiteQuery);
-
-        try {
-            return convertRows(cursor);
-        } finally {
-            cursor.close();
-            sqLiteQuery.release();
+        if (mInTransaction) {
+            mDb.beginTransaction();
+            Cursor cursor = null;
+            try {
+                cursor = mDb.query(sqLiteQuery);
+                List<T> rows = convertRows(cursor);
+                mDb.setTransactionSuccessful();
+                return rows;
+            } finally {
+                if (cursor != null) {
+                    cursor.close();
+                }
+                mDb.endTransaction();
+                sqLiteQuery.release();
+            }
+        } else {
+            Cursor cursor = mDb.query(sqLiteQuery);
+            //noinspection TryFinallyCanBeTryWithResources
+            try {
+                return convertRows(cursor);
+            } finally {
+                cursor.close();
+                sqLiteQuery.release();
+            }
         }
     }
 }
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/util/StringUtil.java b/room/runtime/src/main/java/android/arch/persistence/room/util/StringUtil.java
index bee05dd..d01e3c5 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/util/StringUtil.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/util/StringUtil.java
@@ -17,6 +17,7 @@
 package android.arch.persistence.room.util;
 
 import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
 import android.util.Log;
 
 import java.util.ArrayList;
@@ -24,10 +25,14 @@
 import java.util.StringTokenizer;
 
 /**
+ * @hide
+ *
  * String utilities for Room
  */
-@SuppressWarnings("WeakerAccess")
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class StringUtil {
+
+    @SuppressWarnings("unused")
     public static final String[] EMPTY_STRING_ARRAY = new String[0];
     /**
      * Returns a new StringBuilder to be used while producing SQL queries.
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/util/TableInfo.java b/room/runtime/src/main/java/android/arch/persistence/room/util/TableInfo.java
index bcd2e9e..a115147 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/util/TableInfo.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/util/TableInfo.java
@@ -20,6 +20,7 @@
 import android.database.Cursor;
 import android.os.Build;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 
 import java.util.ArrayList;
@@ -29,6 +30,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeMap;
 
 /**
  * A data class that holds the information about a table.
@@ -56,11 +58,70 @@
 
     public final Set<ForeignKey> foreignKeys;
 
+    /**
+     * Sometimes, Index information is not available (older versions). If so, we skip their
+     * verification.
+     */
+    @Nullable
+    public final Set<Index> indices;
+
     @SuppressWarnings("unused")
-    public TableInfo(String name, Map<String, Column> columns, Set<ForeignKey> foreignKeys) {
+    public TableInfo(String name, Map<String, Column> columns, Set<ForeignKey> foreignKeys,
+            Set<Index> indices) {
         this.name = name;
         this.columns = Collections.unmodifiableMap(columns);
         this.foreignKeys = Collections.unmodifiableSet(foreignKeys);
+        this.indices = indices == null ? null : Collections.unmodifiableSet(indices);
+    }
+
+    /**
+     * For backward compatibility with dbs created with older versions.
+     */
+    @SuppressWarnings("unused")
+    public TableInfo(String name, Map<String, Column> columns, Set<ForeignKey> foreignKeys) {
+        this(name, columns, foreignKeys, Collections.<Index>emptySet());
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        TableInfo tableInfo = (TableInfo) o;
+
+        if (name != null ? !name.equals(tableInfo.name) : tableInfo.name != null) return false;
+        if (columns != null ? !columns.equals(tableInfo.columns) : tableInfo.columns != null) {
+            return false;
+        }
+        if (foreignKeys != null ? !foreignKeys.equals(tableInfo.foreignKeys)
+                : tableInfo.foreignKeys != null) {
+            return false;
+        }
+        if (indices == null || tableInfo.indices == null) {
+            // if one us is missing index information, seems like we couldn't acquire the
+            // information so we better skip.
+            return true;
+        }
+        return indices.equals(tableInfo.indices);
+    }
+
+    @Override
+    public int hashCode() {
+        int result = name != null ? name.hashCode() : 0;
+        result = 31 * result + (columns != null ? columns.hashCode() : 0);
+        result = 31 * result + (foreignKeys != null ? foreignKeys.hashCode() : 0);
+        // skip index, it is not reliable for comparison.
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return "TableInfo{"
+                + "name='" + name + '\''
+                + ", columns=" + columns
+                + ", foreignKeys=" + foreignKeys
+                + ", indices=" + indices
+                + '}';
     }
 
     /**
@@ -74,7 +135,8 @@
     public static TableInfo read(SupportSQLiteDatabase database, String tableName) {
         Map<String, Column> columns = readColumns(database, tableName);
         Set<ForeignKey> foreignKeys = readForeignKeys(database, tableName);
-        return new TableInfo(tableName, columns, foreignKeys);
+        Set<Index> indices = readIndices(database, tableName);
+        return new TableInfo(tableName, columns, foreignKeys, indices);
     }
 
     private static Set<ForeignKey> readForeignKeys(SupportSQLiteDatabase database,
@@ -167,34 +229,74 @@
         return columns;
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        TableInfo tableInfo = (TableInfo) o;
-
-        if (!name.equals(tableInfo.name)) return false;
-        //noinspection SimplifiableIfStatement
-        if (!columns.equals(tableInfo.columns)) return false;
-        return foreignKeys.equals(tableInfo.foreignKeys);
+    /**
+     * @return null if we cannot read the indices due to older sqlite implementations.
+     */
+    @Nullable
+    private static Set<Index> readIndices(SupportSQLiteDatabase database, String tableName) {
+        Cursor cursor = database.query("PRAGMA index_list(`" + tableName + "`)");
+        try {
+            final int nameColumnIndex = cursor.getColumnIndex("name");
+            final int originColumnIndex = cursor.getColumnIndex("origin");
+            final int uniqueIndex = cursor.getColumnIndex("unique");
+            if (nameColumnIndex == -1 || originColumnIndex == -1 || uniqueIndex == -1) {
+                // we cannot read them so better not validate any index.
+                return null;
+            }
+            HashSet<Index> indices = new HashSet<>();
+            while (cursor.moveToNext()) {
+                String origin = cursor.getString(originColumnIndex);
+                if (!"c".equals(origin)) {
+                    // Ignore auto-created indices
+                    continue;
+                }
+                String name = cursor.getString(nameColumnIndex);
+                boolean unique = cursor.getInt(uniqueIndex) == 1;
+                Index index = readIndex(database, name, unique);
+                if (index == null) {
+                    // we cannot read it properly so better not read it
+                    return null;
+                }
+                indices.add(index);
+            }
+            return indices;
+        } finally {
+            cursor.close();
+        }
     }
 
-    @Override
-    public int hashCode() {
-        int result = name.hashCode();
-        result = 31 * result + columns.hashCode();
-        result = 31 * result + foreignKeys.hashCode();
-        return result;
-    }
+    /**
+     * @return null if we cannot read the index due to older sqlite implementations.
+     */
+    @Nullable
+    private static Index readIndex(SupportSQLiteDatabase database, String name, boolean unique) {
+        Cursor cursor = database.query("PRAGMA index_xinfo(`" + name + "`)");
+        try {
+            final int seqnoColumnIndex = cursor.getColumnIndex("seqno");
+            final int cidColumnIndex = cursor.getColumnIndex("cid");
+            final int nameColumnIndex = cursor.getColumnIndex("name");
+            if (seqnoColumnIndex == -1 || cidColumnIndex == -1 || nameColumnIndex == -1) {
+                // we cannot read them so better not validate any index.
+                return null;
+            }
+            final TreeMap<Integer, String> results = new TreeMap<>();
 
-    @Override
-    public String toString() {
-        return "TableInfo{"
-                + "name='" + name + '\''
-                + ", columns=" + columns
-                + ", foreignKeys=" + foreignKeys
-                + '}';
+            while (cursor.moveToNext()) {
+                int cid = cursor.getInt(cidColumnIndex);
+                if (cid < 0) {
+                    // Ignore SQLite row ID
+                    continue;
+                }
+                int seq = cursor.getInt(seqnoColumnIndex);
+                String columnName = cursor.getString(nameColumnIndex);
+                results.put(seq, columnName);
+            }
+            final List<String> columns = new ArrayList<>(results.size());
+            columns.addAll(results.values());
+            return new Index(name, unique, columns);
+        } finally {
+            cursor.close();
+        }
     }
 
     /**
@@ -379,4 +481,65 @@
             }
         }
     }
+
+    /**
+     * Holds the information about an SQLite index
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public static class Index {
+        // should match the value in Index.kt
+        public static final String DEFAULT_PREFIX = "index_";
+        public final String name;
+        public final boolean unique;
+        public final List<String> columns;
+
+        public Index(String name, boolean unique, List<String> columns) {
+            this.name = name;
+            this.unique = unique;
+            this.columns = columns;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+
+            Index index = (Index) o;
+            if (unique != index.unique) {
+                return false;
+            }
+            if (!columns.equals(index.columns)) {
+                return false;
+            }
+            if (name.startsWith(Index.DEFAULT_PREFIX)) {
+                return index.name.startsWith(Index.DEFAULT_PREFIX);
+            } else {
+                return name.equals(index.name);
+            }
+        }
+
+        @Override
+        public int hashCode() {
+            int result;
+            if (name.startsWith(DEFAULT_PREFIX)) {
+                result = DEFAULT_PREFIX.hashCode();
+            } else {
+                result = name.hashCode();
+            }
+            result = 31 * result + (unique ? 1 : 0);
+            result = 31 * result + columns.hashCode();
+            return result;
+        }
+
+        @Override
+        public String toString() {
+            return "Index{"
+                    + "name='" + name + '\''
+                    + ", unique=" + unique
+                    + ", columns=" + columns
+                    + '}';
+        }
+    }
 }
diff --git a/room/runtime/src/test/java/android/arch/persistence/room/InvalidationTrackerTest.java b/room/runtime/src/test/java/android/arch/persistence/room/InvalidationTrackerTest.java
index f0b730a..d7474fd 100644
--- a/room/runtime/src/test/java/android/arch/persistence/room/InvalidationTrackerTest.java
+++ b/room/runtime/src/test/java/android/arch/persistence/room/InvalidationTrackerTest.java
@@ -247,7 +247,7 @@
         mTracker.mRefreshRunnable.run();
     }
 
-    @Test
+    // @Test - disabled due to flakiness b/65257997
     public void closedDbAfterOpen() throws InterruptedException {
         setVersions(3, 1);
         mTracker.addObserver(new LatchObserver(1, "a", "b"));
diff --git a/room/rxjava2/src/main/AndroidManifest.xml b/room/rxjava2/src/main/AndroidManifest.xml
index 958f331..33279c6 100644
--- a/room/rxjava2/src/main/AndroidManifest.xml
+++ b/room/rxjava2/src/main/AndroidManifest.xml
@@ -16,8 +16,4 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.persistence.room.rxjava2">
-    <application>
-        <meta-data android:name="android.arch.persistence.room.rxjava2.VERSION"
-                   android:value="${version}" />
-    </application>
 </manifest>
diff --git a/room/rxjava2/src/main/java/android/arch/persistence/room/RxRoom.java b/room/rxjava2/src/main/java/android/arch/persistence/room/RxRoom.java
index adfca27..285b3f8 100644
--- a/room/rxjava2/src/main/java/android/arch/persistence/room/RxRoom.java
+++ b/room/rxjava2/src/main/java/android/arch/persistence/room/RxRoom.java
@@ -16,7 +16,7 @@
 
 package android.arch.persistence.room;
 
-import android.arch.core.executor.AppToolkitTaskExecutor;
+import android.arch.core.executor.ArchTaskExecutor;
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 
@@ -133,7 +133,7 @@
                 public Disposable schedule(@NonNull Runnable run, long delay,
                         @NonNull TimeUnit unit) {
                     DisposableRunnable disposable = new DisposableRunnable(run, mDisposed);
-                    AppToolkitTaskExecutor.getInstance().executeOnDiskIO(run);
+                    ArchTaskExecutor.getInstance().executeOnDiskIO(run);
                     return disposable;
                 }
 
diff --git a/room/testing/src/main/AndroidManifest.xml b/room/testing/src/main/AndroidManifest.xml
index 3e6414c..594f016 100644
--- a/room/testing/src/main/AndroidManifest.xml
+++ b/room/testing/src/main/AndroidManifest.xml
@@ -16,8 +16,4 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.persistence.room.testing">
-    <application>
-        <meta-data android:name="android.arch.persistence.room.testing.VERSION"
-                   android:value="${version}" />
-    </application>
 </manifest>
diff --git a/room/testing/src/main/java/android/arch/persistence/room/testing/MigrationTestHelper.java b/room/testing/src/main/java/android/arch/persistence/room/testing/MigrationTestHelper.java
index a27fe0f..18e0a14 100644
--- a/room/testing/src/main/java/android/arch/persistence/room/testing/MigrationTestHelper.java
+++ b/room/testing/src/main/java/android/arch/persistence/room/testing/MigrationTestHelper.java
@@ -29,6 +29,7 @@
 import android.arch.persistence.room.migration.bundle.EntityBundle;
 import android.arch.persistence.room.migration.bundle.FieldBundle;
 import android.arch.persistence.room.migration.bundle.ForeignKeyBundle;
+import android.arch.persistence.room.migration.bundle.IndexBundle;
 import android.arch.persistence.room.migration.bundle.SchemaBundle;
 import android.arch.persistence.room.util.TableInfo;
 import android.content.Context;
@@ -285,7 +286,19 @@
 
     private static TableInfo toTableInfo(EntityBundle entityBundle) {
         return new TableInfo(entityBundle.getTableName(), toColumnMap(entityBundle),
-                toForeignKeys(entityBundle.getForeignKeys()));
+                toForeignKeys(entityBundle.getForeignKeys()), toIndices(entityBundle.getIndices()));
+    }
+
+    private static Set<TableInfo.Index> toIndices(List<IndexBundle> indices) {
+        if (indices == null) {
+            return Collections.emptySet();
+        }
+        Set<TableInfo.Index> result = new HashSet<>();
+        for (IndexBundle bundle : indices) {
+            result.add(new TableInfo.Index(bundle.getName(), bundle.isUnique(),
+                    bundle.getColumnNames()));
+        }
+        return result;
     }
 
     private static Set<TableInfo.ForeignKey> toForeignKeys(
diff --git a/samples/Support13Demos/build.gradle b/samples/Support13Demos/build.gradle
index f647e40..99175b3 100644
--- a/samples/Support13Demos/build.gradle
+++ b/samples/Support13Demos/build.gradle
@@ -12,12 +12,6 @@
         targetSdkVersion project.ext.currentSdk
     }
 
-    sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['src']
-        main.res.srcDirs = ['res']
-    }
-
     lintOptions {
         checkReleaseBuilds false
         abortOnError false
diff --git a/samples/Support13Demos/AndroidManifest.xml b/samples/Support13Demos/src/main/AndroidManifest.xml
similarity index 100%
rename from samples/Support13Demos/AndroidManifest.xml
rename to samples/Support13Demos/src/main/AndroidManifest.xml
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/Cheeses.java b/samples/Support13Demos/src/main/java/com/example/android/supportv13/Cheeses.java
similarity index 100%
rename from samples/Support13Demos/src/com/example/android/supportv13/Cheeses.java
rename to samples/Support13Demos/src/main/java/com/example/android/supportv13/Cheeses.java
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/Shakespeare.java b/samples/Support13Demos/src/main/java/com/example/android/supportv13/Shakespeare.java
similarity index 100%
rename from samples/Support13Demos/src/com/example/android/supportv13/Shakespeare.java
rename to samples/Support13Demos/src/main/java/com/example/android/supportv13/Shakespeare.java
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/Support13Demos.java b/samples/Support13Demos/src/main/java/com/example/android/supportv13/Support13Demos.java
similarity index 100%
rename from samples/Support13Demos/src/com/example/android/supportv13/Support13Demos.java
rename to samples/Support13Demos/src/main/java/com/example/android/supportv13/Support13Demos.java
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/_package.html b/samples/Support13Demos/src/main/java/com/example/android/supportv13/_package.html
similarity index 100%
rename from samples/Support13Demos/src/com/example/android/supportv13/_package.html
rename to samples/Support13Demos/src/main/java/com/example/android/supportv13/_package.html
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/CountingFragment.java b/samples/Support13Demos/src/main/java/com/example/android/supportv13/app/CountingFragment.java
similarity index 100%
rename from samples/Support13Demos/src/com/example/android/supportv13/app/CountingFragment.java
rename to samples/Support13Demos/src/main/java/com/example/android/supportv13/app/CountingFragment.java
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/CursorFragment.java b/samples/Support13Demos/src/main/java/com/example/android/supportv13/app/CursorFragment.java
similarity index 100%
rename from samples/Support13Demos/src/com/example/android/supportv13/app/CursorFragment.java
rename to samples/Support13Demos/src/main/java/com/example/android/supportv13/app/CursorFragment.java
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentNestingPagerSupport.java b/samples/Support13Demos/src/main/java/com/example/android/supportv13/app/FragmentNestingPagerSupport.java
similarity index 100%
rename from samples/Support13Demos/src/com/example/android/supportv13/app/FragmentNestingPagerSupport.java
rename to samples/Support13Demos/src/main/java/com/example/android/supportv13/app/FragmentNestingPagerSupport.java
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentNestingStatePagerSupport.java b/samples/Support13Demos/src/main/java/com/example/android/supportv13/app/FragmentNestingStatePagerSupport.java
similarity index 100%
rename from samples/Support13Demos/src/com/example/android/supportv13/app/FragmentNestingStatePagerSupport.java
rename to samples/Support13Demos/src/main/java/com/example/android/supportv13/app/FragmentNestingStatePagerSupport.java
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentPagerSupport.java b/samples/Support13Demos/src/main/java/com/example/android/supportv13/app/FragmentPagerSupport.java
similarity index 100%
rename from samples/Support13Demos/src/com/example/android/supportv13/app/FragmentPagerSupport.java
rename to samples/Support13Demos/src/main/java/com/example/android/supportv13/app/FragmentPagerSupport.java
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentStatePagerSupport.java b/samples/Support13Demos/src/main/java/com/example/android/supportv13/app/FragmentStatePagerSupport.java
similarity index 100%
rename from samples/Support13Demos/src/com/example/android/supportv13/app/FragmentStatePagerSupport.java
rename to samples/Support13Demos/src/main/java/com/example/android/supportv13/app/FragmentStatePagerSupport.java
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentTabsFragment.java b/samples/Support13Demos/src/main/java/com/example/android/supportv13/app/FragmentTabsFragment.java
similarity index 100%
rename from samples/Support13Demos/src/com/example/android/supportv13/app/FragmentTabsFragment.java
rename to samples/Support13Demos/src/main/java/com/example/android/supportv13/app/FragmentTabsFragment.java
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/_index.html b/samples/Support13Demos/src/main/java/com/example/android/supportv13/app/_index.html
similarity index 100%
rename from samples/Support13Demos/src/com/example/android/supportv13/app/_index.html
rename to samples/Support13Demos/src/main/java/com/example/android/supportv13/app/_index.html
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/view/CheckableFrameLayout.java b/samples/Support13Demos/src/main/java/com/example/android/supportv13/view/CheckableFrameLayout.java
similarity index 100%
rename from samples/Support13Demos/src/com/example/android/supportv13/view/CheckableFrameLayout.java
rename to samples/Support13Demos/src/main/java/com/example/android/supportv13/view/CheckableFrameLayout.java
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/view/inputmethod/CommitContentSupport.java b/samples/Support13Demos/src/main/java/com/example/android/supportv13/view/inputmethod/CommitContentSupport.java
similarity index 100%
rename from samples/Support13Demos/src/com/example/android/supportv13/view/inputmethod/CommitContentSupport.java
rename to samples/Support13Demos/src/main/java/com/example/android/supportv13/view/inputmethod/CommitContentSupport.java
diff --git a/samples/Support13Demos/res/drawable-hdpi/alert_dialog_icon.png b/samples/Support13Demos/src/main/res/drawable-hdpi/alert_dialog_icon.png
similarity index 100%
rename from samples/Support13Demos/res/drawable-hdpi/alert_dialog_icon.png
rename to samples/Support13Demos/src/main/res/drawable-hdpi/alert_dialog_icon.png
Binary files differ
diff --git a/samples/Support13Demos/res/drawable-hdpi/app_sample_code.png b/samples/Support13Demos/src/main/res/drawable-hdpi/app_sample_code.png
similarity index 100%
rename from samples/Support13Demos/res/drawable-hdpi/app_sample_code.png
rename to samples/Support13Demos/src/main/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/Support13Demos/res/drawable-mdpi/alert_dialog_icon.png b/samples/Support13Demos/src/main/res/drawable-mdpi/alert_dialog_icon.png
similarity index 100%
rename from samples/Support13Demos/res/drawable-mdpi/alert_dialog_icon.png
rename to samples/Support13Demos/src/main/res/drawable-mdpi/alert_dialog_icon.png
Binary files differ
diff --git a/samples/Support13Demos/res/drawable-mdpi/app_sample_code.png b/samples/Support13Demos/src/main/res/drawable-mdpi/app_sample_code.png
similarity index 100%
rename from samples/Support13Demos/res/drawable-mdpi/app_sample_code.png
rename to samples/Support13Demos/src/main/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/Support13Demos/res/layout/commit_content.xml b/samples/Support13Demos/src/main/res/layout/commit_content.xml
similarity index 100%
rename from samples/Support13Demos/res/layout/commit_content.xml
rename to samples/Support13Demos/src/main/res/layout/commit_content.xml
diff --git a/samples/Support13Demos/res/layout/counting.xml b/samples/Support13Demos/src/main/res/layout/counting.xml
similarity index 100%
rename from samples/Support13Demos/res/layout/counting.xml
rename to samples/Support13Demos/src/main/res/layout/counting.xml
diff --git a/samples/Support13Demos/res/layout/fragment_pager.xml b/samples/Support13Demos/src/main/res/layout/fragment_pager.xml
similarity index 100%
rename from samples/Support13Demos/res/layout/fragment_pager.xml
rename to samples/Support13Demos/src/main/res/layout/fragment_pager.xml
diff --git a/samples/Support13Demos/res/layout/fragment_pager_list.xml b/samples/Support13Demos/src/main/res/layout/fragment_pager_list.xml
similarity index 100%
rename from samples/Support13Demos/res/layout/fragment_pager_list.xml
rename to samples/Support13Demos/src/main/res/layout/fragment_pager_list.xml
diff --git a/samples/Support13Demos/res/layout/simple_list_item_checkable_1.xml b/samples/Support13Demos/src/main/res/layout/simple_list_item_checkable_1.xml
similarity index 100%
rename from samples/Support13Demos/res/layout/simple_list_item_checkable_1.xml
rename to samples/Support13Demos/src/main/res/layout/simple_list_item_checkable_1.xml
diff --git a/samples/Support13Demos/res/values/colors.xml b/samples/Support13Demos/src/main/res/values/colors.xml
similarity index 100%
rename from samples/Support13Demos/res/values/colors.xml
rename to samples/Support13Demos/src/main/res/values/colors.xml
diff --git a/samples/Support13Demos/res/values/strings.xml b/samples/Support13Demos/src/main/res/values/strings.xml
similarity index 100%
rename from samples/Support13Demos/res/values/strings.xml
rename to samples/Support13Demos/src/main/res/values/strings.xml
diff --git a/samples/Support4Demos/build.gradle b/samples/Support4Demos/build.gradle
index e9d6b5a..8e76229 100644
--- a/samples/Support4Demos/build.gradle
+++ b/samples/Support4Demos/build.gradle
@@ -12,12 +12,6 @@
         targetSdkVersion project.ext.currentSdk
     }
 
-    sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['src']
-        main.res.srcDirs = ['res']
-    }
-
     signingConfigs {
         debug {
             // Use a local debug keystore to avoid build server issues.
diff --git a/samples/Support4Demos/AndroidManifest.xml b/samples/Support4Demos/src/main/AndroidManifest.xml
similarity index 100%
rename from samples/Support4Demos/AndroidManifest.xml
rename to samples/Support4Demos/src/main/AndroidManifest.xml
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/Cheeses.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/Cheeses.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/Cheeses.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/Cheeses.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/Shakespeare.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/Shakespeare.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/Shakespeare.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/Shakespeare.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/Support4Demos.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/Support4Demos.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/Support4Demos.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/Support4Demos.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/_package.html b/samples/Support4Demos/src/main/java/com/example/android/supportv4/_package.html
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/_package.html
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/_package.html
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityDelegateSupportActivity.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/accessibility/AccessibilityDelegateSupportActivity.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityDelegateSupportActivity.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/accessibility/AccessibilityDelegateSupportActivity.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityManagerSupportActivity.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/accessibility/AccessibilityManagerSupportActivity.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityManagerSupportActivity.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/accessibility/AccessibilityManagerSupportActivity.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityRoleDescriptionSupportActivity.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/accessibility/AccessibilityRoleDescriptionSupportActivity.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityRoleDescriptionSupportActivity.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/accessibility/AccessibilityRoleDescriptionSupportActivity.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/_index.html b/samples/Support4Demos/src/main/java/com/example/android/supportv4/accessibility/_index.html
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/accessibility/_index.html
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/accessibility/_index.html
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentAlertDialogSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentAlertDialogSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentAlertDialogSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentAlertDialogSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentArgumentsSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentArgumentsSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentArgumentsSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentArgumentsSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentContextMenuSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentContextMenuSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentContextMenuSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentContextMenuSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentCustomAnimationSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentCustomAnimationSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentCustomAnimationSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentCustomAnimationSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentDialogOrActivitySupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentDialogOrActivitySupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentDialogOrActivitySupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentDialogOrActivitySupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentDialogSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentDialogSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentDialogSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentDialogSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentHideShowSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentHideShowSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentHideShowSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentHideShowSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentLayoutSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentLayoutSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentLayoutSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentLayoutSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentListArraySupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentListArraySupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentListArraySupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentListArraySupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentMenuFragmentSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentMenuFragmentSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentMenuFragmentSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentMenuFragmentSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentMenuSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentMenuSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentMenuSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentMenuSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentNestingTabsSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentNestingTabsSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentNestingTabsSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentNestingTabsSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentPagerSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentPagerSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentPagerSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentPagerSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentReceiveResultSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentReceiveResultSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentReceiveResultSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentReceiveResultSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentRetainInstanceSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentRetainInstanceSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentRetainInstanceSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentRetainInstanceSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStackFragmentSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentStackFragmentSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStackFragmentSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentStackFragmentSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStackSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentStackSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStackSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentStackSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStatePagerSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentStatePagerSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStatePagerSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentStatePagerSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabs.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentTabs.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabs.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentTabs.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsFragmentSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentTabsFragmentSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsFragmentSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentTabsFragmentSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsPager.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentTabsPager.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsPager.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentTabsPager.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderCursorSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/LoaderCursorSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/LoaderCursorSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/LoaderCursorSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderCustomSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/LoaderCustomSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/LoaderCustomSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/LoaderCustomSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderRetainedSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/LoaderRetainedSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/LoaderRetainedSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/LoaderRetainedSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderThrottleSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/LoaderThrottleSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/LoaderThrottleSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/LoaderThrottleSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/SendResult.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/SendResult.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/SendResult.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/SendResult.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/SharingReceiverSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/SharingReceiverSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/SharingReceiverSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/SharingReceiverSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/SharingSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/SharingSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/SharingSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/SharingSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/SimpleJobIntentController.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/SimpleJobIntentController.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/SimpleJobIntentController.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/SimpleJobIntentController.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/SimpleJobIntentService.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/SimpleJobIntentService.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/SimpleJobIntentService.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/SimpleJobIntentService.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/_index.html b/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/_index.html
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/app/_index.html
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/app/_index.html
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/content/FileProviderExample.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/content/FileProviderExample.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/content/FileProviderExample.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/content/FileProviderExample.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/content/LocalServiceBroadcaster.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/content/LocalServiceBroadcaster.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/content/LocalServiceBroadcaster.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/content/LocalServiceBroadcaster.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/content/SharingSupportProvider.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/content/SharingSupportProvider.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/content/SharingSupportProvider.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/content/SharingSupportProvider.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulController.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/content/SimpleWakefulController.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulController.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/content/SimpleWakefulController.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulReceiver.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/content/SimpleWakefulReceiver.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulReceiver.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/content/SimpleWakefulReceiver.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulService.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/content/SimpleWakefulService.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulService.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/content/SimpleWakefulService.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/graphics/DrawableCompatActivity.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/graphics/DrawableCompatActivity.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/graphics/DrawableCompatActivity.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/graphics/DrawableCompatActivity.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/graphics/RoundedBitmapDrawableActivity.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/graphics/RoundedBitmapDrawableActivity.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/graphics/RoundedBitmapDrawableActivity.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/graphics/RoundedBitmapDrawableActivity.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/AlbumArtCache.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/AlbumArtCache.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/AlbumArtCache.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/AlbumArtCache.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/BrowseFragment.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/BrowseFragment.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/BrowseFragment.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/BrowseFragment.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/MediaBrowserServiceSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/MediaBrowserServiceSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/MediaBrowserServiceSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/MediaBrowserServiceSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/MediaBrowserSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/MediaBrowserSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/MediaBrowserSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/MediaBrowserSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/MediaNotificationManager.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/MediaNotificationManager.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/PackageValidator.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/PackageValidator.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/PackageValidator.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/PackageValidator.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/Playback.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/Playback.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/Playback.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/Playback.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/QueueAdapter.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/QueueAdapter.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/QueueAdapter.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/QueueAdapter.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/QueueFragment.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/QueueFragment.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/QueueFragment.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/QueueFragment.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/model/MusicProvider.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/model/MusicProvider.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/model/MusicProvider.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/model/MusicProvider.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/model/MutableMediaMetadata.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/model/MutableMediaMetadata.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/model/MutableMediaMetadata.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/model/MutableMediaMetadata.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/utils/BitmapHelper.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/utils/BitmapHelper.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/utils/BitmapHelper.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/utils/BitmapHelper.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/utils/CarHelper.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/utils/CarHelper.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/utils/CarHelper.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/utils/CarHelper.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/utils/MediaIDHelper.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/utils/MediaIDHelper.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/utils/MediaIDHelper.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/utils/MediaIDHelper.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/utils/QueueHelper.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/utils/QueueHelper.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/utils/QueueHelper.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/utils/QueueHelper.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/utils/ResourceHelper.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/media/utils/ResourceHelper.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/media/utils/ResourceHelper.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/media/utils/ResourceHelper.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/text/BidiFormatterSupport.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/text/BidiFormatterSupport.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/text/BidiFormatterSupport.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/text/BidiFormatterSupport.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/view/CheckableFrameLayout.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/view/CheckableFrameLayout.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/view/CheckableFrameLayout.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/view/CheckableFrameLayout.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/view/ViewPagerActivity.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/view/ViewPagerActivity.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/view/ViewPagerActivity.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/view/ViewPagerActivity.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/BaseSwipeRefreshLayoutActivity.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/BaseSwipeRefreshLayoutActivity.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/widget/BaseSwipeRefreshLayoutActivity.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/BaseSwipeRefreshLayoutActivity.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/ContentLoadingProgressBarActivity.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/ContentLoadingProgressBarActivity.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/widget/ContentLoadingProgressBarActivity.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/ContentLoadingProgressBarActivity.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/ExploreByTouchHelperActivity.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/ExploreByTouchHelperActivity.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/widget/ExploreByTouchHelperActivity.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/ExploreByTouchHelperActivity.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/NestedScrollActivity.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/NestedScrollActivity.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/widget/NestedScrollActivity.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/NestedScrollActivity.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityList.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityList.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityList.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityList.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityNestedScrollView.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityNestedScrollView.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityNestedScrollView.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityNestedScrollView.java
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityTextView.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityTextView.java
similarity index 100%
rename from samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityTextView.java
rename to samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityTextView.java
diff --git a/samples/Support4Demos/res/anim/decelerate_quint.xml b/samples/Support4Demos/src/main/res/anim/decelerate_quint.xml
similarity index 100%
rename from samples/Support4Demos/res/anim/decelerate_quint.xml
rename to samples/Support4Demos/src/main/res/anim/decelerate_quint.xml
diff --git a/samples/Support4Demos/res/anim/fragment_slide_left_enter.xml b/samples/Support4Demos/src/main/res/anim/fragment_slide_left_enter.xml
similarity index 100%
rename from samples/Support4Demos/res/anim/fragment_slide_left_enter.xml
rename to samples/Support4Demos/src/main/res/anim/fragment_slide_left_enter.xml
diff --git a/samples/Support4Demos/res/anim/fragment_slide_left_exit.xml b/samples/Support4Demos/src/main/res/anim/fragment_slide_left_exit.xml
similarity index 100%
rename from samples/Support4Demos/res/anim/fragment_slide_left_exit.xml
rename to samples/Support4Demos/src/main/res/anim/fragment_slide_left_exit.xml
diff --git a/samples/Support4Demos/res/anim/fragment_slide_right_enter.xml b/samples/Support4Demos/src/main/res/anim/fragment_slide_right_enter.xml
similarity index 100%
rename from samples/Support4Demos/res/anim/fragment_slide_right_enter.xml
rename to samples/Support4Demos/src/main/res/anim/fragment_slide_right_enter.xml
diff --git a/samples/Support4Demos/res/anim/fragment_slide_right_exit.xml b/samples/Support4Demos/src/main/res/anim/fragment_slide_right_exit.xml
similarity index 100%
rename from samples/Support4Demos/res/anim/fragment_slide_right_exit.xml
rename to samples/Support4Demos/src/main/res/anim/fragment_slide_right_exit.xml
diff --git a/samples/Support4Demos/res/color/tint_state_list.xml b/samples/Support4Demos/src/main/res/color/tint_state_list.xml
similarity index 100%
rename from samples/Support4Demos/res/color/tint_state_list.xml
rename to samples/Support4Demos/src/main/res/color/tint_state_list.xml
diff --git a/samples/Support4Demos/res/drawable-hdpi/alert_dialog_icon.png b/samples/Support4Demos/src/main/res/drawable-hdpi/alert_dialog_icon.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-hdpi/alert_dialog_icon.png
rename to samples/Support4Demos/src/main/res/drawable-hdpi/alert_dialog_icon.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/android_robot.png b/samples/Support4Demos/src/main/res/drawable-hdpi/android_robot.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-hdpi/android_robot.png
rename to samples/Support4Demos/src/main/res/drawable-hdpi/android_robot.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/app_sample_code.png b/samples/Support4Demos/src/main/res/drawable-hdpi/app_sample_code.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-hdpi/app_sample_code.png
rename to samples/Support4Demos/src/main/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_drawer_am.png b/samples/Support4Demos/src/main/res/drawable-hdpi/ic_drawer_am.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-hdpi/ic_drawer_am.png
rename to samples/Support4Demos/src/main/res/drawable-hdpi/ic_drawer_am.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_favorite.png b/samples/Support4Demos/src/main/res/drawable-hdpi/ic_favorite.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-hdpi/ic_favorite.png
rename to samples/Support4Demos/src/main/res/drawable-hdpi/ic_favorite.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_notification.png b/samples/Support4Demos/src/main/res/drawable-hdpi/ic_notification.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-hdpi/ic_notification.png
rename to samples/Support4Demos/src/main/res/drawable-hdpi/ic_notification.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_pause_white_24dp.png b/samples/Support4Demos/src/main/res/drawable-hdpi/ic_pause_white_24dp.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-hdpi/ic_pause_white_24dp.png
rename to samples/Support4Demos/src/main/res/drawable-hdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_play_arrow_white_24dp.png b/samples/Support4Demos/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-hdpi/ic_play_arrow_white_24dp.png
rename to samples/Support4Demos/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_skip_next_white_24dp.png b/samples/Support4Demos/src/main/res/drawable-hdpi/ic_skip_next_white_24dp.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-hdpi/ic_skip_next_white_24dp.png
rename to samples/Support4Demos/src/main/res/drawable-hdpi/ic_skip_next_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_skip_previous_white_24dp.png b/samples/Support4Demos/src/main/res/drawable-hdpi/ic_skip_previous_white_24dp.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-hdpi/ic_skip_previous_white_24dp.png
rename to samples/Support4Demos/src/main/res/drawable-hdpi/ic_skip_previous_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/refresh.png b/samples/Support4Demos/src/main/res/drawable-hdpi/refresh.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-hdpi/refresh.png
rename to samples/Support4Demos/src/main/res/drawable-hdpi/refresh.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-mdpi/alert_dialog_icon.png b/samples/Support4Demos/src/main/res/drawable-mdpi/alert_dialog_icon.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-mdpi/alert_dialog_icon.png
rename to samples/Support4Demos/src/main/res/drawable-mdpi/alert_dialog_icon.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-mdpi/android_robot.png b/samples/Support4Demos/src/main/res/drawable-mdpi/android_robot.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-mdpi/android_robot.png
rename to samples/Support4Demos/src/main/res/drawable-mdpi/android_robot.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-mdpi/app_sample_code.png b/samples/Support4Demos/src/main/res/drawable-mdpi/app_sample_code.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-mdpi/app_sample_code.png
rename to samples/Support4Demos/src/main/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-mdpi/ic_drawer_am.png b/samples/Support4Demos/src/main/res/drawable-mdpi/ic_drawer_am.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-mdpi/ic_drawer_am.png
rename to samples/Support4Demos/src/main/res/drawable-mdpi/ic_drawer_am.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-mdpi/ic_favorite.png b/samples/Support4Demos/src/main/res/drawable-mdpi/ic_favorite.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-mdpi/ic_favorite.png
rename to samples/Support4Demos/src/main/res/drawable-mdpi/ic_favorite.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-mdpi/refresh.png b/samples/Support4Demos/src/main/res/drawable-mdpi/refresh.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-mdpi/refresh.png
rename to samples/Support4Demos/src/main/res/drawable-mdpi/refresh.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/android_robot.png b/samples/Support4Demos/src/main/res/drawable-xhdpi/android_robot.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xhdpi/android_robot.png
rename to samples/Support4Demos/src/main/res/drawable-xhdpi/android_robot.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_drawer_am.png b/samples/Support4Demos/src/main/res/drawable-xhdpi/ic_drawer_am.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xhdpi/ic_drawer_am.png
rename to samples/Support4Demos/src/main/res/drawable-xhdpi/ic_drawer_am.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_equalizer_white_24dp.png b/samples/Support4Demos/src/main/res/drawable-xhdpi/ic_equalizer_white_24dp.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xhdpi/ic_equalizer_white_24dp.png
rename to samples/Support4Demos/src/main/res/drawable-xhdpi/ic_equalizer_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_favorite.png b/samples/Support4Demos/src/main/res/drawable-xhdpi/ic_favorite.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xhdpi/ic_favorite.png
rename to samples/Support4Demos/src/main/res/drawable-xhdpi/ic_favorite.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_pause_white_24dp.png b/samples/Support4Demos/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xhdpi/ic_pause_white_24dp.png
rename to samples/Support4Demos/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_play_arrow_white_24dp.png b/samples/Support4Demos/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xhdpi/ic_play_arrow_white_24dp.png
rename to samples/Support4Demos/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_skip_next_white_24dp.png b/samples/Support4Demos/src/main/res/drawable-xhdpi/ic_skip_next_white_24dp.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xhdpi/ic_skip_next_white_24dp.png
rename to samples/Support4Demos/src/main/res/drawable-xhdpi/ic_skip_next_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_skip_previous_white_24dp.png b/samples/Support4Demos/src/main/res/drawable-xhdpi/ic_skip_previous_white_24dp.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xhdpi/ic_skip_previous_white_24dp.png
rename to samples/Support4Demos/src/main/res/drawable-xhdpi/ic_skip_previous_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/refresh.png b/samples/Support4Demos/src/main/res/drawable-xhdpi/refresh.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xhdpi/refresh.png
rename to samples/Support4Demos/src/main/res/drawable-xhdpi/refresh.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_default_art.png b/samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_default_art.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xxhdpi/ic_default_art.png
rename to samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_default_art.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_equalizer_white_24dp.png b/samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_equalizer_white_24dp.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xxhdpi/ic_equalizer_white_24dp.png
rename to samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_equalizer_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_favorite.png b/samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_favorite.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xxhdpi/ic_favorite.png
rename to samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_favorite.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_pause_white_24dp.png b/samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xxhdpi/ic_pause_white_24dp.png
rename to samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png b/samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png
rename to samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_skip_next_white_24dp.png b/samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_skip_next_white_24dp.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xxhdpi/ic_skip_next_white_24dp.png
rename to samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_skip_next_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_skip_previous_white_24dp.png b/samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_skip_previous_white_24dp.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xxhdpi/ic_skip_previous_white_24dp.png
rename to samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_skip_previous_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_star_off.png b/samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_star_off.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xxhdpi/ic_star_off.png
rename to samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_star_off.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_star_on.png b/samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_star_on.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xxhdpi/ic_star_on.png
rename to samples/Support4Demos/src/main/res/drawable-xxhdpi/ic_star_on.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxxhdpi/ic_favorite.png b/samples/Support4Demos/src/main/res/drawable-xxxhdpi/ic_favorite.png
similarity index 100%
rename from samples/Support4Demos/res/drawable-xxxhdpi/ic_favorite.png
rename to samples/Support4Demos/src/main/res/drawable-xxxhdpi/ic_favorite.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable/gradient.xml b/samples/Support4Demos/src/main/res/drawable/gradient.xml
similarity index 100%
rename from samples/Support4Demos/res/drawable/gradient.xml
rename to samples/Support4Demos/src/main/res/drawable/gradient.xml
diff --git a/samples/Support4Demos/res/drawable/ic_drawer.xml b/samples/Support4Demos/src/main/res/drawable/ic_drawer.xml
similarity index 100%
rename from samples/Support4Demos/res/drawable/ic_drawer.xml
rename to samples/Support4Demos/src/main/res/drawable/ic_drawer.xml
diff --git a/samples/Support4Demos/res/layout-land/fragment_arguments_support.xml b/samples/Support4Demos/src/main/res/layout-land/fragment_arguments_support.xml
similarity index 100%
rename from samples/Support4Demos/res/layout-land/fragment_arguments_support.xml
rename to samples/Support4Demos/src/main/res/layout-land/fragment_arguments_support.xml
diff --git a/samples/Support4Demos/res/layout-land/fragment_layout_support.xml b/samples/Support4Demos/src/main/res/layout-land/fragment_layout_support.xml
similarity index 100%
rename from samples/Support4Demos/res/layout-land/fragment_layout_support.xml
rename to samples/Support4Demos/src/main/res/layout-land/fragment_layout_support.xml
diff --git a/samples/Support4Demos/res/layout/accessibility_delegate.xml b/samples/Support4Demos/src/main/res/layout/accessibility_delegate.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/accessibility_delegate.xml
rename to samples/Support4Demos/src/main/res/layout/accessibility_delegate.xml
diff --git a/samples/Support4Demos/res/layout/accessibility_manager.xml b/samples/Support4Demos/src/main/res/layout/accessibility_manager.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/accessibility_manager.xml
rename to samples/Support4Demos/src/main/res/layout/accessibility_manager.xml
diff --git a/samples/Support4Demos/res/layout/accessibility_roledescription.xml b/samples/Support4Demos/src/main/res/layout/accessibility_roledescription.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/accessibility_roledescription.xml
rename to samples/Support4Demos/src/main/res/layout/accessibility_roledescription.xml
diff --git a/samples/Support4Demos/res/layout/activity_player.xml b/samples/Support4Demos/src/main/res/layout/activity_player.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/activity_player.xml
rename to samples/Support4Demos/src/main/res/layout/activity_player.xml
diff --git a/samples/Support4Demos/res/layout/activity_rounded_bitmap.xml b/samples/Support4Demos/src/main/res/layout/activity_rounded_bitmap.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/activity_rounded_bitmap.xml
rename to samples/Support4Demos/src/main/res/layout/activity_rounded_bitmap.xml
diff --git a/samples/Support4Demos/res/layout/bidiformater_support.xml b/samples/Support4Demos/src/main/res/layout/bidiformater_support.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/bidiformater_support.xml
rename to samples/Support4Demos/src/main/res/layout/bidiformater_support.xml
diff --git a/samples/Support4Demos/res/layout/content_loading_progressbar.xml b/samples/Support4Demos/src/main/res/layout/content_loading_progressbar.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/content_loading_progressbar.xml
rename to samples/Support4Demos/src/main/res/layout/content_loading_progressbar.xml
diff --git a/samples/Support4Demos/res/layout/drawable_compat.xml b/samples/Support4Demos/src/main/res/layout/drawable_compat.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/drawable_compat.xml
rename to samples/Support4Demos/src/main/res/layout/drawable_compat.xml
diff --git a/samples/Support4Demos/res/layout/explore_by_touch_helper.xml b/samples/Support4Demos/src/main/res/layout/explore_by_touch_helper.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/explore_by_touch_helper.xml
rename to samples/Support4Demos/src/main/res/layout/explore_by_touch_helper.xml
diff --git a/samples/Support4Demos/res/layout/file_provider_example.xml b/samples/Support4Demos/src/main/res/layout/file_provider_example.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/file_provider_example.xml
rename to samples/Support4Demos/src/main/res/layout/file_provider_example.xml
diff --git a/samples/Support4Demos/res/layout/fragment_arguments_support.xml b/samples/Support4Demos/src/main/res/layout/fragment_arguments_support.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/fragment_arguments_support.xml
rename to samples/Support4Demos/src/main/res/layout/fragment_arguments_support.xml
diff --git a/samples/Support4Demos/res/layout/fragment_context_menu.xml b/samples/Support4Demos/src/main/res/layout/fragment_context_menu.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/fragment_context_menu.xml
rename to samples/Support4Demos/src/main/res/layout/fragment_context_menu.xml
diff --git a/samples/Support4Demos/res/layout/fragment_dialog.xml b/samples/Support4Demos/src/main/res/layout/fragment_dialog.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/fragment_dialog.xml
rename to samples/Support4Demos/src/main/res/layout/fragment_dialog.xml
diff --git a/samples/Support4Demos/res/layout/fragment_dialog_or_activity.xml b/samples/Support4Demos/src/main/res/layout/fragment_dialog_or_activity.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/fragment_dialog_or_activity.xml
rename to samples/Support4Demos/src/main/res/layout/fragment_dialog_or_activity.xml
diff --git a/samples/Support4Demos/res/layout/fragment_hide_show_support.xml b/samples/Support4Demos/src/main/res/layout/fragment_hide_show_support.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/fragment_hide_show_support.xml
rename to samples/Support4Demos/src/main/res/layout/fragment_hide_show_support.xml
diff --git a/samples/Support4Demos/res/layout/fragment_layout_support.xml b/samples/Support4Demos/src/main/res/layout/fragment_layout_support.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/fragment_layout_support.xml
rename to samples/Support4Demos/src/main/res/layout/fragment_layout_support.xml
diff --git a/samples/Support4Demos/res/layout/fragment_list.xml b/samples/Support4Demos/src/main/res/layout/fragment_list.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/fragment_list.xml
rename to samples/Support4Demos/src/main/res/layout/fragment_list.xml
diff --git a/samples/Support4Demos/res/layout/fragment_menu.xml b/samples/Support4Demos/src/main/res/layout/fragment_menu.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/fragment_menu.xml
rename to samples/Support4Demos/src/main/res/layout/fragment_menu.xml
diff --git a/samples/Support4Demos/res/layout/fragment_pager.xml b/samples/Support4Demos/src/main/res/layout/fragment_pager.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/fragment_pager.xml
rename to samples/Support4Demos/src/main/res/layout/fragment_pager.xml
diff --git a/samples/Support4Demos/res/layout/fragment_pager_list.xml b/samples/Support4Demos/src/main/res/layout/fragment_pager_list.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/fragment_pager_list.xml
rename to samples/Support4Demos/src/main/res/layout/fragment_pager_list.xml
diff --git a/samples/Support4Demos/res/layout/fragment_retain_instance.xml b/samples/Support4Demos/src/main/res/layout/fragment_retain_instance.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/fragment_retain_instance.xml
rename to samples/Support4Demos/src/main/res/layout/fragment_retain_instance.xml
diff --git a/samples/Support4Demos/res/layout/fragment_stack.xml b/samples/Support4Demos/src/main/res/layout/fragment_stack.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/fragment_stack.xml
rename to samples/Support4Demos/src/main/res/layout/fragment_stack.xml
diff --git a/samples/Support4Demos/res/layout/fragment_tabs.xml b/samples/Support4Demos/src/main/res/layout/fragment_tabs.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/fragment_tabs.xml
rename to samples/Support4Demos/src/main/res/layout/fragment_tabs.xml
diff --git a/samples/Support4Demos/res/layout/fragment_tabs_pager.xml b/samples/Support4Demos/src/main/res/layout/fragment_tabs_pager.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/fragment_tabs_pager.xml
rename to samples/Support4Demos/src/main/res/layout/fragment_tabs_pager.xml
diff --git a/samples/Support4Demos/res/layout/hello_world.xml b/samples/Support4Demos/src/main/res/layout/hello_world.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/hello_world.xml
rename to samples/Support4Demos/src/main/res/layout/hello_world.xml
diff --git a/samples/Support4Demos/res/layout/labeled_text_edit.xml b/samples/Support4Demos/src/main/res/layout/labeled_text_edit.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/labeled_text_edit.xml
rename to samples/Support4Demos/src/main/res/layout/labeled_text_edit.xml
diff --git a/samples/Support4Demos/res/layout/list_item_icon_text.xml b/samples/Support4Demos/src/main/res/layout/list_item_icon_text.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/list_item_icon_text.xml
rename to samples/Support4Demos/src/main/res/layout/list_item_icon_text.xml
diff --git a/samples/Support4Demos/res/layout/local_service_broadcaster.xml b/samples/Support4Demos/src/main/res/layout/local_service_broadcaster.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/local_service_broadcaster.xml
rename to samples/Support4Demos/src/main/res/layout/local_service_broadcaster.xml
diff --git a/samples/Support4Demos/res/layout/media_list_item.xml b/samples/Support4Demos/src/main/res/layout/media_list_item.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/media_list_item.xml
rename to samples/Support4Demos/src/main/res/layout/media_list_item.xml
diff --git a/samples/Support4Demos/res/layout/nested_scroll.xml b/samples/Support4Demos/src/main/res/layout/nested_scroll.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/nested_scroll.xml
rename to samples/Support4Demos/src/main/res/layout/nested_scroll.xml
diff --git a/samples/Support4Demos/res/layout/receive_result.xml b/samples/Support4Demos/src/main/res/layout/receive_result.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/receive_result.xml
rename to samples/Support4Demos/src/main/res/layout/receive_result.xml
diff --git a/samples/Support4Demos/res/layout/send_result.xml b/samples/Support4Demos/src/main/res/layout/send_result.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/send_result.xml
rename to samples/Support4Demos/src/main/res/layout/send_result.xml
diff --git a/samples/Support4Demos/res/layout/sharing_receiver_support.xml b/samples/Support4Demos/src/main/res/layout/sharing_receiver_support.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/sharing_receiver_support.xml
rename to samples/Support4Demos/src/main/res/layout/sharing_receiver_support.xml
diff --git a/samples/Support4Demos/res/layout/sharing_support.xml b/samples/Support4Demos/src/main/res/layout/sharing_support.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/sharing_support.xml
rename to samples/Support4Demos/src/main/res/layout/sharing_support.xml
diff --git a/samples/Support4Demos/res/layout/simple_job_intent_controller.xml b/samples/Support4Demos/src/main/res/layout/simple_job_intent_controller.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/simple_job_intent_controller.xml
rename to samples/Support4Demos/src/main/res/layout/simple_job_intent_controller.xml
diff --git a/samples/Support4Demos/res/layout/simple_list_item_checkable_1.xml b/samples/Support4Demos/src/main/res/layout/simple_list_item_checkable_1.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/simple_list_item_checkable_1.xml
rename to samples/Support4Demos/src/main/res/layout/simple_list_item_checkable_1.xml
diff --git a/samples/Support4Demos/res/layout/sliding_pane_layout.xml b/samples/Support4Demos/src/main/res/layout/sliding_pane_layout.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/sliding_pane_layout.xml
rename to samples/Support4Demos/src/main/res/layout/sliding_pane_layout.xml
diff --git a/samples/Support4Demos/res/layout/swipe_refresh_widget_listview.xml b/samples/Support4Demos/src/main/res/layout/swipe_refresh_widget_listview.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/swipe_refresh_widget_listview.xml
rename to samples/Support4Demos/src/main/res/layout/swipe_refresh_widget_listview.xml
diff --git a/samples/Support4Demos/res/layout/swipe_refresh_widget_nestedscrolling.xml b/samples/Support4Demos/src/main/res/layout/swipe_refresh_widget_nestedscrolling.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/swipe_refresh_widget_nestedscrolling.xml
rename to samples/Support4Demos/src/main/res/layout/swipe_refresh_widget_nestedscrolling.xml
diff --git a/samples/Support4Demos/res/layout/swipe_refresh_widget_textview.xml b/samples/Support4Demos/src/main/res/layout/swipe_refresh_widget_textview.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/swipe_refresh_widget_textview.xml
rename to samples/Support4Demos/src/main/res/layout/swipe_refresh_widget_textview.xml
diff --git a/samples/Support4Demos/res/layout/view_pager_layout.xml b/samples/Support4Demos/src/main/res/layout/view_pager_layout.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/view_pager_layout.xml
rename to samples/Support4Demos/src/main/res/layout/view_pager_layout.xml
diff --git a/samples/Support4Demos/res/layout/wakeful_alarm_controller.xml b/samples/Support4Demos/src/main/res/layout/wakeful_alarm_controller.xml
similarity index 100%
rename from samples/Support4Demos/res/layout/wakeful_alarm_controller.xml
rename to samples/Support4Demos/src/main/res/layout/wakeful_alarm_controller.xml
diff --git a/samples/Support4Demos/res/menu/shortcuts.xml b/samples/Support4Demos/src/main/res/menu/shortcuts.xml
similarity index 100%
rename from samples/Support4Demos/res/menu/shortcuts.xml
rename to samples/Support4Demos/src/main/res/menu/shortcuts.xml
diff --git a/samples/Support4Demos/res/menu/swipe_refresh_menu.xml b/samples/Support4Demos/src/main/res/menu/swipe_refresh_menu.xml
similarity index 100%
rename from samples/Support4Demos/res/menu/swipe_refresh_menu.xml
rename to samples/Support4Demos/src/main/res/menu/swipe_refresh_menu.xml
diff --git a/samples/Support4Demos/res/values-v11/styles.xml b/samples/Support4Demos/src/main/res/values-v11/styles.xml
similarity index 100%
rename from samples/Support4Demos/res/values-v11/styles.xml
rename to samples/Support4Demos/src/main/res/values-v11/styles.xml
diff --git a/samples/Support4Demos/res/values-v21/styles.xml b/samples/Support4Demos/src/main/res/values-v21/styles.xml
similarity index 100%
rename from samples/Support4Demos/res/values-v21/styles.xml
rename to samples/Support4Demos/src/main/res/values-v21/styles.xml
diff --git a/samples/Support4Demos/res/values/attrs.xml b/samples/Support4Demos/src/main/res/values/attrs.xml
similarity index 100%
rename from samples/Support4Demos/res/values/attrs.xml
rename to samples/Support4Demos/src/main/res/values/attrs.xml
diff --git a/samples/Support4Demos/res/values/colors.xml b/samples/Support4Demos/src/main/res/values/colors.xml
similarity index 100%
rename from samples/Support4Demos/res/values/colors.xml
rename to samples/Support4Demos/src/main/res/values/colors.xml
diff --git a/samples/Support4Demos/res/values/dimens.xml b/samples/Support4Demos/src/main/res/values/dimens.xml
similarity index 100%
rename from samples/Support4Demos/res/values/dimens.xml
rename to samples/Support4Demos/src/main/res/values/dimens.xml
diff --git a/samples/Support4Demos/res/values/strings.xml b/samples/Support4Demos/src/main/res/values/strings.xml
similarity index 100%
rename from samples/Support4Demos/res/values/strings.xml
rename to samples/Support4Demos/src/main/res/values/strings.xml
diff --git a/samples/Support4Demos/res/values/styles.xml b/samples/Support4Demos/src/main/res/values/styles.xml
similarity index 100%
rename from samples/Support4Demos/res/values/styles.xml
rename to samples/Support4Demos/src/main/res/values/styles.xml
diff --git a/samples/Support4Demos/res/xml/allowed_media_browser_callers.xml b/samples/Support4Demos/src/main/res/xml/allowed_media_browser_callers.xml
similarity index 100%
rename from samples/Support4Demos/res/xml/allowed_media_browser_callers.xml
rename to samples/Support4Demos/src/main/res/xml/allowed_media_browser_callers.xml
diff --git a/samples/Support4Demos/res/xml/my_paths.xml b/samples/Support4Demos/src/main/res/xml/my_paths.xml
similarity index 100%
rename from samples/Support4Demos/res/xml/my_paths.xml
rename to samples/Support4Demos/src/main/res/xml/my_paths.xml
diff --git a/samples/Support7Demos/build.gradle b/samples/Support7Demos/build.gradle
index 65b19ea..0b562c8 100644
--- a/samples/Support7Demos/build.gradle
+++ b/samples/Support7Demos/build.gradle
@@ -18,12 +18,6 @@
         vectorDrawables.useSupportLibrary = true
     }
 
-    sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['src']
-        main.res.srcDirs = ['res']
-    }
-
     signingConfigs {
         debug {
             // Use a local debug keystore to avoid build server issues.
diff --git a/samples/Support7Demos/res/layout/appcompat_widgets_buttons.xml b/samples/Support7Demos/res/layout/appcompat_widgets_buttons.xml
deleted file mode 100644
index 517f4fa..0000000
--- a/samples/Support7Demos/res/layout/appcompat_widgets_buttons.xml
+++ /dev/null
@@ -1,117 +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.
--->
-
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
-
-    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-                  android:layout_width="match_parent"
-                  android:layout_height="wrap_content"
-                  android:orientation="vertical"
-                  android:padding="16dp">
-
-        <android.support.v7.widget.SwitchCompat
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:text="SwitchCompat"/>
-
-        <android.support.v7.widget.SwitchCompat
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:enabled="false"
-                android:text="SwitchCompat disabled"/>
-
-        <Switch
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:text="Switch"/>
-
-        <Switch
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:enabled="false"
-                android:text="Switch disabled"/>
-
-        <CheckBox
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="CheckBox"/>
-
-        <RadioGroup
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal">
-
-            <RadioButton
-                    android:id="@+id/radiobutton_1"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="RadioButton"/>
-
-            <RadioButton
-                    android:id="@+id/radiobutton_2"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="RadioButton"/>
-
-        </RadioGroup>
-
-        <Button
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="Button"/>
-
-        <Button
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="Button (small)"
-                style="@style/Widget.AppCompat.Button.Small"/>
-
-        <Button
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="Button (borderless)"
-                style="@style/Widget.AppCompat.Button.Borderless"/>
-
-        <Button
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="Button (borderless + colored)"
-                style="@style/Widget.AppCompat.Button.Borderless.Colored"/>
-
-        <Button
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="Button (colored)"
-                style="@style/Widget.AppCompat.Button.Colored"/>
-
-        <Button
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="Button (colored + tinted)"
-                app:backgroundTint="#00FF00"
-                style="@style/Widget.AppCompat.Button.Colored"/>
-
-        <RatingBar
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"/>
-
-    </LinearLayout>
-
-</ScrollView>
\ No newline at end of file
diff --git a/samples/Support7Demos/AndroidManifest.xml b/samples/Support7Demos/src/main/AndroidManifest.xml
similarity index 100%
rename from samples/Support7Demos/AndroidManifest.xml
rename to samples/Support7Demos/src/main/AndroidManifest.xml
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/Cheeses.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/Cheeses.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/Cheeses.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/Cheeses.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/Shakespeare.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/Shakespeare.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/Shakespeare.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/Shakespeare.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/Support7Demos.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/Support7Demos.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/Support7Demos.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/Support7Demos.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/_package.html b/samples/Support7Demos/src/main/java/com/example/android/supportv7/_package.html
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/_package.html
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/_package.html
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarActionMode.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarActionMode.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarActionMode.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarActionMode.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarDisplayOptions.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarDisplayOptions.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarDisplayOptions.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarDisplayOptions.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarFragmentMenu.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarFragmentMenu.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarFragmentMenu.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarFragmentMenu.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarHideOnScroll.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarHideOnScroll.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarHideOnScroll.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarHideOnScroll.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarMechanics.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarMechanics.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarMechanics.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarMechanics.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarPreferences.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarPreferences.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarPreferences.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarPreferences.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarShareActionProvider.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarShareActionProvider.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarShareActionProvider.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarShareActionProvider.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarUsage.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarUsage.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarUsage.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ActionBarUsage.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AlertDialogUsage.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AlertDialogUsage.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/AlertDialogUsage.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AlertDialogUsage.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatAnimatedVector.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatAnimatedVector.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatAnimatedVector.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatAnimatedVector.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeDialog.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeDialog.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatPreferenceActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatPreferenceActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsButtons.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsButtons.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsButtons.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsButtons.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsTextViews.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsTextViews.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsTextViews.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/AppCompatWidgetsTextViews.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/DialogFragmentUsage.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/DialogFragmentUsage.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/DialogFragmentUsage.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/DialogFragmentUsage.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/DialogUsage.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/DialogUsage.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/DialogUsage.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/DialogUsage.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/MenuItemIconTinting.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/MenuItemIconTinting.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/MenuItemIconTinting.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/MenuItemIconTinting.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/RecentSuggestionsProvider.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/RecentSuggestionsProvider.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/RecentSuggestionsProvider.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/RecentSuggestionsProvider.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/SearchActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/SearchActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/SearchActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/SearchActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarActionMode.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarActionMode.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarActionMode.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarActionMode.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarDisplayOptions.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarDisplayOptions.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarDisplayOptions.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarDisplayOptions.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarUsage.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarUsage.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarUsage.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarUsage.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/_index.html b/samples/Support7Demos/src/main/java/com/example/android/supportv7/app/_index.html
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/app/_index.html
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/app/_index.html
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/graphics/ImageLoader.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/ImageLoader.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/graphics/ImageLoader.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/ImageLoader.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteDetailActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/PaletteDetailActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteDetailActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/graphics/PaletteDetailActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/LocalPlayer.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/LocalPlayer.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/media/LocalPlayer.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/media/LocalPlayer.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/OverlayDisplayWindow.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/media/OverlayDisplayWindow.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/media/OverlayDisplayWindow.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/Player.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/Player.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/media/Player.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/media/Player.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/PlaylistItem.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/PlaylistItem.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/media/PlaylistItem.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/media/PlaylistItem.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/RemotePlayer.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/RemotePlayer.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/media/RemotePlayer.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/media/RemotePlayer.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaButtonReceiver.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaButtonReceiver.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaButtonReceiver.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaButtonReceiver.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProvider.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteProvider.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProvider.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteProvider.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProviderService.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteProviderService.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProviderService.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteProviderService.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteSettingsActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteSettingsActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteSettingsActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouteSettingsActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouterActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SampleMediaRouterActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SessionManager.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SessionManager.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/media/SessionManager.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/media/SessionManager.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/_index.html b/samples/Support7Demos/src/main/java/com/example/android/supportv7/media/_index.html
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/media/_index.html
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/media/_index.html
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/util/DiffUtilActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/util/DiffUtilActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/util/DiffUtilActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/util/DiffUtilActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/util/SortedListActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/util/SortedListActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/view/CardViewActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/CardViewActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/view/CardViewActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/view/CardViewActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout1.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout1.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout1.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout1.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout2.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout2.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout2.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout2.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout3.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout3.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout3.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/view/GridLayout3.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/view/_index.html b/samples/Support7Demos/src/main/java/com/example/android/supportv7/view/_index.html
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/view/_index.html
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/view/_index.html
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/AnimatedRecyclerView.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/AnimatedRecyclerView.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/AsyncListUtilActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/AsyncListUtilActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/AsyncListUtilActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/AsyncListUtilActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/DrawerLayoutActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/DrawerLayoutActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/DrawerLayoutActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/DrawerLayoutActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/GridLayoutManagerActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/GridLayoutManagerActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/GridLayoutManagerActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/GridLayoutManagerActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/LinearLayoutManagerJankActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerJankActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/LinearLayoutManagerJankActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/LinearLayoutManagerJankActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/ListPopupWindowActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/ListPopupWindowActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/ListPopupWindowActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/ListPopupWindowActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/ListViewActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/ListViewActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/ListViewActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/ListViewActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/NestedRecyclerViewActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/PagerRecyclerViewActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/PagerRecyclerViewActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/PagerRecyclerViewActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/PagerRecyclerViewActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/PopupMenuActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/PopupMenuActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/PopupMenuActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/PopupMenuActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/RecyclerViewActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RecyclerViewActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/RecyclerViewActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/RecyclerViewActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/StableIdActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/StableIdActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/StableIdActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/StableIdActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/StaggeredGridLayoutManagerActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/StaggeredGridLayoutManagerActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/StaggeredGridLayoutManagerActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/StaggeredGridLayoutManagerActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/touch/DragAndDropActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/DragAndDropActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/touch/DragAndDropActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/DragAndDropActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/util/ConfigToggle.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/util/ConfigToggle.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/util/ConfigToggle.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/util/ConfigToggle.java
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/util/ConfigViewHolder.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/util/ConfigViewHolder.java
similarity index 100%
rename from samples/Support7Demos/src/com/example/android/supportv7/widget/util/ConfigViewHolder.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/util/ConfigViewHolder.java
diff --git a/samples/Support7Demos/res/anim/animation_grouping_1_01.xml b/samples/Support7Demos/src/main/res/anim/animation_grouping_1_01.xml
similarity index 100%
rename from samples/Support7Demos/res/anim/animation_grouping_1_01.xml
rename to samples/Support7Demos/src/main/res/anim/animation_grouping_1_01.xml
diff --git a/samples/Support7Demos/res/color/card_selector.xml b/samples/Support7Demos/src/main/res/color/card_selector.xml
similarity index 100%
rename from samples/Support7Demos/res/color/card_selector.xml
rename to samples/Support7Demos/src/main/res/color/card_selector.xml
diff --git a/samples/Support7Demos/res/color/link_color.xml b/samples/Support7Demos/src/main/res/color/link_color.xml
similarity index 100%
rename from samples/Support7Demos/res/color/link_color.xml
rename to samples/Support7Demos/src/main/res/color/link_color.xml
diff --git a/samples/Support7Demos/res/drawable-hdpi/apidemo_androidlogo.png b/samples/Support7Demos/src/main/res/drawable-hdpi/apidemo_androidlogo.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-hdpi/apidemo_androidlogo.png
rename to samples/Support7Demos/src/main/res/drawable-hdpi/apidemo_androidlogo.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/app_sample_code.png b/samples/Support7Demos/src/main/res/drawable-hdpi/app_sample_code.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-hdpi/app_sample_code.png
rename to samples/Support7Demos/src/main/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/drawer_shadow.9.png b/samples/Support7Demos/src/main/res/drawable-hdpi/drawer_shadow.9.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-hdpi/drawer_shadow.9.png
rename to samples/Support7Demos/src/main/res/drawable-hdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/drawer_shadow_end.9.png b/samples/Support7Demos/src/main/res/drawable-hdpi/drawer_shadow_end.9.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-hdpi/drawer_shadow_end.9.png
rename to samples/Support7Demos/src/main/res/drawable-hdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_android.png b/samples/Support7Demos/src/main/res/drawable-hdpi/ic_android.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-hdpi/ic_android.png
rename to samples/Support7Demos/src/main/res/drawable-hdpi/ic_android.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_launcher_settings.png b/samples/Support7Demos/src/main/res/drawable-hdpi/ic_launcher_settings.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-hdpi/ic_launcher_settings.png
rename to samples/Support7Demos/src/main/res/drawable-hdpi/ic_launcher_settings.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_media_pause.png b/samples/Support7Demos/src/main/res/drawable-hdpi/ic_media_pause.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-hdpi/ic_media_pause.png
rename to samples/Support7Demos/src/main/res/drawable-hdpi/ic_media_pause.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_media_play.png b/samples/Support7Demos/src/main/res/drawable-hdpi/ic_media_play.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-hdpi/ic_media_play.png
rename to samples/Support7Demos/src/main/res/drawable-hdpi/ic_media_play.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_media_stop.png b/samples/Support7Demos/src/main/res/drawable-hdpi/ic_media_stop.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-hdpi/ic_media_stop.png
rename to samples/Support7Demos/src/main/res/drawable-hdpi/ic_media_stop.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_menu_add.png b/samples/Support7Demos/src/main/res/drawable-hdpi/ic_menu_add.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-hdpi/ic_menu_add.png
rename to samples/Support7Demos/src/main/res/drawable-hdpi/ic_menu_add.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_menu_delete.png b/samples/Support7Demos/src/main/res/drawable-hdpi/ic_menu_delete.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-hdpi/ic_menu_delete.png
rename to samples/Support7Demos/src/main/res/drawable-hdpi/ic_menu_delete.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-ldrtl-hdpi/drawer_shadow.9.png b/samples/Support7Demos/src/main/res/drawable-ldrtl-hdpi/drawer_shadow.9.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-ldrtl-hdpi/drawer_shadow.9.png
rename to samples/Support7Demos/src/main/res/drawable-ldrtl-hdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-ldrtl-hdpi/drawer_shadow_end.9.png b/samples/Support7Demos/src/main/res/drawable-ldrtl-hdpi/drawer_shadow_end.9.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-ldrtl-hdpi/drawer_shadow_end.9.png
rename to samples/Support7Demos/src/main/res/drawable-ldrtl-hdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-ldrtl-mdpi/drawer_shadow.9.png b/samples/Support7Demos/src/main/res/drawable-ldrtl-mdpi/drawer_shadow.9.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-ldrtl-mdpi/drawer_shadow.9.png
rename to samples/Support7Demos/src/main/res/drawable-ldrtl-mdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-ldrtl-mdpi/drawer_shadow_end.9.png b/samples/Support7Demos/src/main/res/drawable-ldrtl-mdpi/drawer_shadow_end.9.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-ldrtl-mdpi/drawer_shadow_end.9.png
rename to samples/Support7Demos/src/main/res/drawable-ldrtl-mdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-ldrtl-xhdpi/drawer_shadow.9.png b/samples/Support7Demos/src/main/res/drawable-ldrtl-xhdpi/drawer_shadow.9.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-ldrtl-xhdpi/drawer_shadow.9.png
rename to samples/Support7Demos/src/main/res/drawable-ldrtl-xhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-ldrtl-xhdpi/drawer_shadow_end.9.png b/samples/Support7Demos/src/main/res/drawable-ldrtl-xhdpi/drawer_shadow_end.9.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-ldrtl-xhdpi/drawer_shadow_end.9.png
rename to samples/Support7Demos/src/main/res/drawable-ldrtl-xhdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/apidemo_androidlogo.png b/samples/Support7Demos/src/main/res/drawable-mdpi/apidemo_androidlogo.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-mdpi/apidemo_androidlogo.png
rename to samples/Support7Demos/src/main/res/drawable-mdpi/apidemo_androidlogo.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/app_sample_code.png b/samples/Support7Demos/src/main/res/drawable-mdpi/app_sample_code.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-mdpi/app_sample_code.png
rename to samples/Support7Demos/src/main/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/drawer_shadow.9.png b/samples/Support7Demos/src/main/res/drawable-mdpi/drawer_shadow.9.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-mdpi/drawer_shadow.9.png
rename to samples/Support7Demos/src/main/res/drawable-mdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/drawer_shadow_end.9.png b/samples/Support7Demos/src/main/res/drawable-mdpi/drawer_shadow_end.9.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-mdpi/drawer_shadow_end.9.png
rename to samples/Support7Demos/src/main/res/drawable-mdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_android.png b/samples/Support7Demos/src/main/res/drawable-mdpi/ic_android.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-mdpi/ic_android.png
rename to samples/Support7Demos/src/main/res/drawable-mdpi/ic_android.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_launcher_settings.png b/samples/Support7Demos/src/main/res/drawable-mdpi/ic_launcher_settings.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-mdpi/ic_launcher_settings.png
rename to samples/Support7Demos/src/main/res/drawable-mdpi/ic_launcher_settings.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_media_pause.png b/samples/Support7Demos/src/main/res/drawable-mdpi/ic_media_pause.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-mdpi/ic_media_pause.png
rename to samples/Support7Demos/src/main/res/drawable-mdpi/ic_media_pause.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_media_play.png b/samples/Support7Demos/src/main/res/drawable-mdpi/ic_media_play.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-mdpi/ic_media_play.png
rename to samples/Support7Demos/src/main/res/drawable-mdpi/ic_media_play.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_media_stop.png b/samples/Support7Demos/src/main/res/drawable-mdpi/ic_media_stop.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-mdpi/ic_media_stop.png
rename to samples/Support7Demos/src/main/res/drawable-mdpi/ic_media_stop.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_menu_add.png b/samples/Support7Demos/src/main/res/drawable-mdpi/ic_menu_add.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-mdpi/ic_menu_add.png
rename to samples/Support7Demos/src/main/res/drawable-mdpi/ic_menu_add.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_menu_delete.png b/samples/Support7Demos/src/main/res/drawable-mdpi/ic_menu_delete.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-mdpi/ic_menu_delete.png
rename to samples/Support7Demos/src/main/res/drawable-mdpi/ic_menu_delete.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-xhdpi/drawer_shadow.9.png b/samples/Support7Demos/src/main/res/drawable-xhdpi/drawer_shadow.9.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-xhdpi/drawer_shadow.9.png
rename to samples/Support7Demos/src/main/res/drawable-xhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-xhdpi/drawer_shadow_end.9.png b/samples/Support7Demos/src/main/res/drawable-xhdpi/drawer_shadow_end.9.png
similarity index 100%
rename from samples/Support7Demos/res/drawable-xhdpi/drawer_shadow_end.9.png
rename to samples/Support7Demos/src/main/res/drawable-xhdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable/animation_vector_drawable_grouping_1.xml b/samples/Support7Demos/src/main/res/drawable/animation_vector_drawable_grouping_1.xml
similarity index 100%
rename from samples/Support7Demos/res/drawable/animation_vector_drawable_grouping_1.xml
rename to samples/Support7Demos/src/main/res/drawable/animation_vector_drawable_grouping_1.xml
diff --git a/samples/Support7Demos/res/drawable/gradient.xml b/samples/Support7Demos/src/main/res/drawable/gradient.xml
similarity index 100%
rename from samples/Support7Demos/res/drawable/gradient.xml
rename to samples/Support7Demos/src/main/res/drawable/gradient.xml
diff --git a/samples/Support7Demos/res/drawable/ic_search.xml b/samples/Support7Demos/src/main/res/drawable/ic_search.xml
similarity index 100%
rename from samples/Support7Demos/res/drawable/ic_search.xml
rename to samples/Support7Demos/src/main/res/drawable/ic_search.xml
diff --git a/samples/Support7Demos/res/drawable/test_night_color_conversion_background.xml b/samples/Support7Demos/src/main/res/drawable/test_night_color_conversion_background.xml
similarity index 100%
rename from samples/Support7Demos/res/drawable/test_night_color_conversion_background.xml
rename to samples/Support7Demos/src/main/res/drawable/test_night_color_conversion_background.xml
diff --git a/samples/Support7Demos/res/drawable/vector_drawable_grouping_1.xml b/samples/Support7Demos/src/main/res/drawable/vector_drawable_grouping_1.xml
similarity index 100%
rename from samples/Support7Demos/res/drawable/vector_drawable_grouping_1.xml
rename to samples/Support7Demos/src/main/res/drawable/vector_drawable_grouping_1.xml
diff --git a/samples/Support7Demos/res/layout-land/grid_layout_2.xml b/samples/Support7Demos/src/main/res/layout-land/grid_layout_2.xml
similarity index 100%
rename from samples/Support7Demos/res/layout-land/grid_layout_2.xml
rename to samples/Support7Demos/src/main/res/layout-land/grid_layout_2.xml
diff --git a/samples/Support7Demos/res/layout-v11/appcompat_animated_vector.xml b/samples/Support7Demos/src/main/res/layout-v11/appcompat_animated_vector.xml
similarity index 100%
rename from samples/Support7Demos/res/layout-v11/appcompat_animated_vector.xml
rename to samples/Support7Demos/src/main/res/layout-v11/appcompat_animated_vector.xml
diff --git a/samples/Support7Demos/res/layout/action_bar_action_mode.xml b/samples/Support7Demos/src/main/res/layout/action_bar_action_mode.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/action_bar_action_mode.xml
rename to samples/Support7Demos/src/main/res/layout/action_bar_action_mode.xml
diff --git a/samples/Support7Demos/res/layout/action_bar_display_options.xml b/samples/Support7Demos/src/main/res/layout/action_bar_display_options.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/action_bar_display_options.xml
rename to samples/Support7Demos/src/main/res/layout/action_bar_display_options.xml
diff --git a/samples/Support7Demos/res/layout/action_bar_display_options_custom.xml b/samples/Support7Demos/src/main/res/layout/action_bar_display_options_custom.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/action_bar_display_options_custom.xml
rename to samples/Support7Demos/src/main/res/layout/action_bar_display_options_custom.xml
diff --git a/samples/Support7Demos/res/layout/action_bar_fragment_menu.xml b/samples/Support7Demos/src/main/res/layout/action_bar_fragment_menu.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/action_bar_fragment_menu.xml
rename to samples/Support7Demos/src/main/res/layout/action_bar_fragment_menu.xml
diff --git a/samples/Support7Demos/res/layout/action_bar_hide_scroll.xml b/samples/Support7Demos/src/main/res/layout/action_bar_hide_scroll.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/action_bar_hide_scroll.xml
rename to samples/Support7Demos/src/main/res/layout/action_bar_hide_scroll.xml
diff --git a/samples/Support7Demos/res/layout/action_bar_settings_action_provider.xml b/samples/Support7Demos/src/main/res/layout/action_bar_settings_action_provider.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/action_bar_settings_action_provider.xml
rename to samples/Support7Demos/src/main/res/layout/action_bar_settings_action_provider.xml
diff --git a/samples/Support7Demos/res/layout/action_bar_tab_content.xml b/samples/Support7Demos/src/main/res/layout/action_bar_tab_content.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/action_bar_tab_content.xml
rename to samples/Support7Demos/src/main/res/layout/action_bar_tab_content.xml
diff --git a/samples/Support7Demos/res/layout/action_bar_tabs.xml b/samples/Support7Demos/src/main/res/layout/action_bar_tabs.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/action_bar_tabs.xml
rename to samples/Support7Demos/src/main/res/layout/action_bar_tabs.xml
diff --git a/samples/Support7Demos/res/layout/activity_base_layout_manager.xml b/samples/Support7Demos/src/main/res/layout/activity_base_layout_manager.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/activity_base_layout_manager.xml
rename to samples/Support7Demos/src/main/res/layout/activity_base_layout_manager.xml
diff --git a/samples/Support7Demos/res/layout/activity_card_view.xml b/samples/Support7Demos/src/main/res/layout/activity_card_view.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/activity_card_view.xml
rename to samples/Support7Demos/src/main/res/layout/activity_card_view.xml
diff --git a/samples/Support7Demos/res/layout/activity_item_touch.xml b/samples/Support7Demos/src/main/res/layout/activity_item_touch.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/activity_item_touch.xml
rename to samples/Support7Demos/src/main/res/layout/activity_item_touch.xml
diff --git a/samples/Support7Demos/res/layout/alert_dialog_usage.xml b/samples/Support7Demos/src/main/res/layout/alert_dialog_usage.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/alert_dialog_usage.xml
rename to samples/Support7Demos/src/main/res/layout/alert_dialog_usage.xml
diff --git a/samples/Support7Demos/res/layout/animated_recycler_view.xml b/samples/Support7Demos/src/main/res/layout/animated_recycler_view.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/animated_recycler_view.xml
rename to samples/Support7Demos/src/main/res/layout/animated_recycler_view.xml
diff --git a/samples/Support7Demos/res/layout/appcompat_animated_vector.xml b/samples/Support7Demos/src/main/res/layout/appcompat_animated_vector.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/appcompat_animated_vector.xml
rename to samples/Support7Demos/src/main/res/layout/appcompat_animated_vector.xml
diff --git a/samples/Support7Demos/res/layout/appcompat_night_mode.xml b/samples/Support7Demos/src/main/res/layout/appcompat_night_mode.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/appcompat_night_mode.xml
rename to samples/Support7Demos/src/main/res/layout/appcompat_night_mode.xml
diff --git a/samples/Support7Demos/src/main/res/layout/appcompat_widgets_buttons.xml b/samples/Support7Demos/src/main/res/layout/appcompat_widgets_buttons.xml
new file mode 100644
index 0000000..ba4c045
--- /dev/null
+++ b/samples/Support7Demos/src/main/res/layout/appcompat_widgets_buttons.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:orientation="vertical"
+                  android:padding="16dp">
+
+        <android.support.v7.widget.SwitchCompat
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="SwitchCompat"/>
+
+        <android.support.v7.widget.SwitchCompat
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:enabled="false"
+                android:text="SwitchCompat disabled"/>
+
+        <Switch
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="Switch"/>
+
+        <Switch
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:enabled="false"
+                android:text="Switch disabled"/>
+
+        <CheckBox
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="CheckBox"/>
+
+        <RadioGroup
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+
+            <RadioButton
+                    android:id="@+id/radiobutton_1"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="RadioButton"/>
+
+            <RadioButton
+                    android:id="@+id/radiobutton_2"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="RadioButton"/>
+
+        </RadioGroup>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Button"/>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:enabled="false"
+            android:text="Button disabled"/>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Button (small)"
+            style="@style/Widget.AppCompat.Button.Small"/>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:enabled="false"
+            android:text="Button (small) disabled"
+            style="@style/Widget.AppCompat.Button.Small"/>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Button (borderless)"
+            style="@style/Widget.AppCompat.Button.Borderless"/>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:enabled="false"
+            android:text="Button (borderless) disabled"
+            style="@style/Widget.AppCompat.Button.Borderless"/>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Button (borderless + colored)"
+            style="@style/Widget.AppCompat.Button.Borderless.Colored"/>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:enabled="false"
+            android:text="Button (borderless + colored) disabled"
+            style="@style/Widget.AppCompat.Button.Borderless.Colored"/>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Button (colored)"
+            style="@style/Widget.AppCompat.Button.Colored"/>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:enabled="false"
+            android:text="Button (colored) disabled"
+            style="@style/Widget.AppCompat.Button.Colored"/>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Button (colored + tinted)"
+            app:backgroundTint="#00FF00"
+            style="@style/Widget.AppCompat.Button.Colored"/>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:enabled="false"
+            android:text="Button (colored + tinted) disabled"
+            app:backgroundTint="#00FF00"
+            style="@style/Widget.AppCompat.Button.Colored"/>
+
+        <RatingBar
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"/>
+
+    </LinearLayout>
+
+</ScrollView>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/appcompat_widgets_text_input.xml b/samples/Support7Demos/src/main/res/layout/appcompat_widgets_text_input.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/appcompat_widgets_text_input.xml
rename to samples/Support7Demos/src/main/res/layout/appcompat_widgets_text_input.xml
diff --git a/samples/Support7Demos/res/layout/appcompat_widgets_text_spinners.xml b/samples/Support7Demos/src/main/res/layout/appcompat_widgets_text_spinners.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/appcompat_widgets_text_spinners.xml
rename to samples/Support7Demos/src/main/res/layout/appcompat_widgets_text_spinners.xml
diff --git a/samples/Support7Demos/res/layout/appcompat_widgets_text_views.xml b/samples/Support7Demos/src/main/res/layout/appcompat_widgets_text_views.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/appcompat_widgets_text_views.xml
rename to samples/Support7Demos/src/main/res/layout/appcompat_widgets_text_views.xml
diff --git a/samples/Support7Demos/res/layout/config_view_toggle.xml b/samples/Support7Demos/src/main/res/layout/config_view_toggle.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/config_view_toggle.xml
rename to samples/Support7Demos/src/main/res/layout/config_view_toggle.xml
diff --git a/samples/Support7Demos/res/layout/dialog_content.xml b/samples/Support7Demos/src/main/res/layout/dialog_content.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/dialog_content.xml
rename to samples/Support7Demos/src/main/res/layout/dialog_content.xml
diff --git a/samples/Support7Demos/res/layout/dialog_content_buttons.xml b/samples/Support7Demos/src/main/res/layout/dialog_content_buttons.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/dialog_content_buttons.xml
rename to samples/Support7Demos/src/main/res/layout/dialog_content_buttons.xml
diff --git a/samples/Support7Demos/res/layout/dialog_usage.xml b/samples/Support7Demos/src/main/res/layout/dialog_usage.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/dialog_usage.xml
rename to samples/Support7Demos/src/main/res/layout/dialog_usage.xml
diff --git a/samples/Support7Demos/res/layout/drawer_layout.xml b/samples/Support7Demos/src/main/res/layout/drawer_layout.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/drawer_layout.xml
rename to samples/Support7Demos/src/main/res/layout/drawer_layout.xml
diff --git a/samples/Support7Demos/res/layout/grid_layout_1.xml b/samples/Support7Demos/src/main/res/layout/grid_layout_1.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/grid_layout_1.xml
rename to samples/Support7Demos/src/main/res/layout/grid_layout_1.xml
diff --git a/samples/Support7Demos/res/layout/grid_layout_2.xml b/samples/Support7Demos/src/main/res/layout/grid_layout_2.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/grid_layout_2.xml
rename to samples/Support7Demos/src/main/res/layout/grid_layout_2.xml
diff --git a/samples/Support7Demos/res/layout/list_popup_window_activity.xml b/samples/Support7Demos/src/main/res/layout/list_popup_window_activity.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/list_popup_window_activity.xml
rename to samples/Support7Demos/src/main/res/layout/list_popup_window_activity.xml
diff --git a/samples/Support7Demos/res/layout/list_view_activity.xml b/samples/Support7Demos/src/main/res/layout/list_view_activity.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/list_view_activity.xml
rename to samples/Support7Demos/src/main/res/layout/list_view_activity.xml
diff --git a/samples/Support7Demos/res/layout/list_view_item.xml b/samples/Support7Demos/src/main/res/layout/list_view_item.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/list_view_item.xml
rename to samples/Support7Demos/src/main/res/layout/list_view_item.xml
diff --git a/samples/Support7Demos/res/layout/media_item.xml b/samples/Support7Demos/src/main/res/layout/media_item.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/media_item.xml
rename to samples/Support7Demos/src/main/res/layout/media_item.xml
diff --git a/samples/Support7Demos/res/layout/nested_item.xml b/samples/Support7Demos/src/main/res/layout/nested_item.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/nested_item.xml
rename to samples/Support7Demos/src/main/res/layout/nested_item.xml
diff --git a/samples/Support7Demos/res/layout/overlay_display_window.xml b/samples/Support7Demos/src/main/res/layout/overlay_display_window.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/overlay_display_window.xml
rename to samples/Support7Demos/src/main/res/layout/overlay_display_window.xml
diff --git a/samples/Support7Demos/res/layout/palette_activity_detail.xml b/samples/Support7Demos/src/main/res/layout/palette_activity_detail.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/palette_activity_detail.xml
rename to samples/Support7Demos/src/main/res/layout/palette_activity_detail.xml
diff --git a/samples/Support7Demos/res/layout/palette_grid_item.xml b/samples/Support7Demos/src/main/res/layout/palette_grid_item.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/palette_grid_item.xml
rename to samples/Support7Demos/src/main/res/layout/palette_grid_item.xml
diff --git a/samples/Support7Demos/res/layout/palette_list_item.xml b/samples/Support7Demos/src/main/res/layout/palette_list_item.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/palette_list_item.xml
rename to samples/Support7Demos/src/main/res/layout/palette_list_item.xml
diff --git a/samples/Support7Demos/res/layout/popup_menu_activity.xml b/samples/Support7Demos/src/main/res/layout/popup_menu_activity.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/popup_menu_activity.xml
rename to samples/Support7Demos/src/main/res/layout/popup_menu_activity.xml
diff --git a/samples/Support7Demos/res/layout/sample_media_controller.xml b/samples/Support7Demos/src/main/res/layout/sample_media_controller.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/sample_media_controller.xml
rename to samples/Support7Demos/src/main/res/layout/sample_media_controller.xml
diff --git a/samples/Support7Demos/res/layout/sample_media_router.xml b/samples/Support7Demos/src/main/res/layout/sample_media_router.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/sample_media_router.xml
rename to samples/Support7Demos/src/main/res/layout/sample_media_router.xml
diff --git a/samples/Support7Demos/res/layout/sample_media_router_presentation.xml b/samples/Support7Demos/src/main/res/layout/sample_media_router_presentation.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/sample_media_router_presentation.xml
rename to samples/Support7Demos/src/main/res/layout/sample_media_router_presentation.xml
diff --git a/samples/Support7Demos/res/layout/selectable_item.xml b/samples/Support7Demos/src/main/res/layout/selectable_item.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/selectable_item.xml
rename to samples/Support7Demos/src/main/res/layout/selectable_item.xml
diff --git a/samples/Support7Demos/res/layout/sorted_list_activity.xml b/samples/Support7Demos/src/main/res/layout/sorted_list_activity.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/sorted_list_activity.xml
rename to samples/Support7Demos/src/main/res/layout/sorted_list_activity.xml
diff --git a/samples/Support7Demos/res/layout/sorted_list_item_view.xml b/samples/Support7Demos/src/main/res/layout/sorted_list_item_view.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/sorted_list_item_view.xml
rename to samples/Support7Demos/src/main/res/layout/sorted_list_item_view.xml
diff --git a/samples/Support7Demos/res/layout/stable_id_item.xml b/samples/Support7Demos/src/main/res/layout/stable_id_item.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/stable_id_item.xml
rename to samples/Support7Demos/src/main/res/layout/stable_id_item.xml
diff --git a/samples/Support7Demos/res/layout/toolbar_action_mode.xml b/samples/Support7Demos/src/main/res/layout/toolbar_action_mode.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/toolbar_action_mode.xml
rename to samples/Support7Demos/src/main/res/layout/toolbar_action_mode.xml
diff --git a/samples/Support7Demos/res/layout/toolbar_display_options.xml b/samples/Support7Demos/src/main/res/layout/toolbar_display_options.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/toolbar_display_options.xml
rename to samples/Support7Demos/src/main/res/layout/toolbar_display_options.xml
diff --git a/samples/Support7Demos/res/layout/toolbar_fragment_pager.xml b/samples/Support7Demos/src/main/res/layout/toolbar_fragment_pager.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/toolbar_fragment_pager.xml
rename to samples/Support7Demos/src/main/res/layout/toolbar_fragment_pager.xml
diff --git a/samples/Support7Demos/res/layout/toolbar_usage.xml b/samples/Support7Demos/src/main/res/layout/toolbar_usage.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/toolbar_usage.xml
rename to samples/Support7Demos/src/main/res/layout/toolbar_usage.xml
diff --git a/samples/Support7Demos/res/layout/touch_item.xml b/samples/Support7Demos/src/main/res/layout/touch_item.xml
similarity index 100%
rename from samples/Support7Demos/res/layout/touch_item.xml
rename to samples/Support7Demos/src/main/res/layout/touch_item.xml
diff --git a/samples/Support7Demos/res/menu/action_bar_settings_action_provider.xml b/samples/Support7Demos/src/main/res/menu/action_bar_settings_action_provider.xml
similarity index 100%
rename from samples/Support7Demos/res/menu/action_bar_settings_action_provider.xml
rename to samples/Support7Demos/src/main/res/menu/action_bar_settings_action_provider.xml
diff --git a/samples/Support7Demos/res/menu/action_bar_share_action_provider.xml b/samples/Support7Demos/src/main/res/menu/action_bar_share_action_provider.xml
similarity index 100%
rename from samples/Support7Demos/res/menu/action_bar_share_action_provider.xml
rename to samples/Support7Demos/src/main/res/menu/action_bar_share_action_provider.xml
diff --git a/samples/Support7Demos/res/menu/actions.xml b/samples/Support7Demos/src/main/res/menu/actions.xml
similarity index 100%
rename from samples/Support7Demos/res/menu/actions.xml
rename to samples/Support7Demos/src/main/res/menu/actions.xml
diff --git a/samples/Support7Demos/res/menu/display_options_actions.xml b/samples/Support7Demos/src/main/res/menu/display_options_actions.xml
similarity index 100%
rename from samples/Support7Demos/res/menu/display_options_actions.xml
rename to samples/Support7Demos/src/main/res/menu/display_options_actions.xml
diff --git a/samples/Support7Demos/res/menu/menu_with_tinted_icons.xml b/samples/Support7Demos/src/main/res/menu/menu_with_tinted_icons.xml
similarity index 100%
rename from samples/Support7Demos/res/menu/menu_with_tinted_icons.xml
rename to samples/Support7Demos/src/main/res/menu/menu_with_tinted_icons.xml
diff --git a/samples/Support7Demos/res/menu/popup_menu.xml b/samples/Support7Demos/src/main/res/menu/popup_menu.xml
similarity index 100%
rename from samples/Support7Demos/res/menu/popup_menu.xml
rename to samples/Support7Demos/src/main/res/menu/popup_menu.xml
diff --git a/samples/Support7Demos/res/menu/sample_media_router_menu.xml b/samples/Support7Demos/src/main/res/menu/sample_media_router_menu.xml
similarity index 100%
rename from samples/Support7Demos/res/menu/sample_media_router_menu.xml
rename to samples/Support7Demos/src/main/res/menu/sample_media_router_menu.xml
diff --git a/samples/Support7Demos/res/menu/sample_palette_actions.xml b/samples/Support7Demos/src/main/res/menu/sample_palette_actions.xml
similarity index 100%
rename from samples/Support7Demos/res/menu/sample_palette_actions.xml
rename to samples/Support7Demos/src/main/res/menu/sample_palette_actions.xml
diff --git a/samples/Support7Demos/res/values-night/colors.xml b/samples/Support7Demos/src/main/res/values-night/colors.xml
similarity index 100%
rename from samples/Support7Demos/res/values-night/colors.xml
rename to samples/Support7Demos/src/main/res/values-night/colors.xml
diff --git a/samples/Support7Demos/res/values-night/strings.xml b/samples/Support7Demos/src/main/res/values-night/strings.xml
similarity index 100%
rename from samples/Support7Demos/res/values-night/strings.xml
rename to samples/Support7Demos/src/main/res/values-night/strings.xml
diff --git a/samples/Support7Demos/res/values-v21/styles.xml b/samples/Support7Demos/src/main/res/values-v21/styles.xml
similarity index 100%
rename from samples/Support7Demos/res/values-v21/styles.xml
rename to samples/Support7Demos/src/main/res/values-v21/styles.xml
diff --git a/samples/Support7Demos/res/values/arrays.xml b/samples/Support7Demos/src/main/res/values/arrays.xml
similarity index 100%
rename from samples/Support7Demos/res/values/arrays.xml
rename to samples/Support7Demos/src/main/res/values/arrays.xml
diff --git a/samples/Support7Demos/res/values/colors.xml b/samples/Support7Demos/src/main/res/values/colors.xml
similarity index 100%
rename from samples/Support7Demos/res/values/colors.xml
rename to samples/Support7Demos/src/main/res/values/colors.xml
diff --git a/samples/Support7Demos/res/values/dimens.xml b/samples/Support7Demos/src/main/res/values/dimens.xml
similarity index 100%
rename from samples/Support7Demos/res/values/dimens.xml
rename to samples/Support7Demos/src/main/res/values/dimens.xml
diff --git a/samples/Support7Demos/res/values/strings.xml b/samples/Support7Demos/src/main/res/values/strings.xml
similarity index 100%
rename from samples/Support7Demos/res/values/strings.xml
rename to samples/Support7Demos/src/main/res/values/strings.xml
diff --git a/samples/Support7Demos/res/values/styles.xml b/samples/Support7Demos/src/main/res/values/styles.xml
similarity index 100%
rename from samples/Support7Demos/res/values/styles.xml
rename to samples/Support7Demos/src/main/res/values/styles.xml
diff --git a/samples/Support7Demos/res/xml/preferences.xml b/samples/Support7Demos/src/main/res/xml/preferences.xml
similarity index 100%
rename from samples/Support7Demos/res/xml/preferences.xml
rename to samples/Support7Demos/src/main/res/xml/preferences.xml
diff --git a/samples/Support7Demos/res/xml/searchable.xml b/samples/Support7Demos/src/main/res/xml/searchable.xml
similarity index 100%
rename from samples/Support7Demos/res/xml/searchable.xml
rename to samples/Support7Demos/src/main/res/xml/searchable.xml
diff --git a/samples/SupportAnimationDemos/build.gradle b/samples/SupportAnimationDemos/build.gradle
index ea8038e..23e5030 100644
--- a/samples/SupportAnimationDemos/build.gradle
+++ b/samples/SupportAnimationDemos/build.gradle
@@ -12,12 +12,6 @@
         targetSdkVersion project.ext.currentSdk
     }
 
-    sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['src']
-        main.res.srcDirs = ['res']
-    }
-
     signingConfigs {
         debug {
             // Use a local debug keystore to avoid build server issues.
diff --git a/samples/SupportAnimationDemos/AndroidManifest.xml b/samples/SupportAnimationDemos/src/main/AndroidManifest.xml
similarity index 100%
rename from samples/SupportAnimationDemos/AndroidManifest.xml
rename to samples/SupportAnimationDemos/src/main/AndroidManifest.xml
diff --git a/samples/SupportAnimationDemos/src/com/example/android/support/animation/BrowseActivity.java b/samples/SupportAnimationDemos/src/main/java/com/example/android/support/animation/BrowseActivity.java
similarity index 100%
rename from samples/SupportAnimationDemos/src/com/example/android/support/animation/BrowseActivity.java
rename to samples/SupportAnimationDemos/src/main/java/com/example/android/support/animation/BrowseActivity.java
diff --git a/samples/SupportAnimationDemos/src/com/example/android/support/animation/MainActivity.java b/samples/SupportAnimationDemos/src/main/java/com/example/android/support/animation/MainActivity.java
similarity index 100%
rename from samples/SupportAnimationDemos/src/com/example/android/support/animation/MainActivity.java
rename to samples/SupportAnimationDemos/src/main/java/com/example/android/support/animation/MainActivity.java
diff --git a/samples/SupportAnimationDemos/src/com/example/android/support/animation/SpringActivity.java b/samples/SupportAnimationDemos/src/main/java/com/example/android/support/animation/SpringActivity.java
similarity index 100%
rename from samples/SupportAnimationDemos/src/com/example/android/support/animation/SpringActivity.java
rename to samples/SupportAnimationDemos/src/main/java/com/example/android/support/animation/SpringActivity.java
diff --git a/samples/SupportAnimationDemos/src/com/example/android/support/animation/SpringView.java b/samples/SupportAnimationDemos/src/main/java/com/example/android/support/animation/SpringView.java
similarity index 100%
rename from samples/SupportAnimationDemos/src/com/example/android/support/animation/SpringView.java
rename to samples/SupportAnimationDemos/src/main/java/com/example/android/support/animation/SpringView.java
diff --git a/samples/SupportAnimationDemos/res/drawable-hdpi/app_sample_code.png b/samples/SupportAnimationDemos/src/main/res/drawable-hdpi/app_sample_code.png
similarity index 100%
rename from samples/SupportAnimationDemos/res/drawable-hdpi/app_sample_code.png
rename to samples/SupportAnimationDemos/src/main/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportAnimationDemos/res/drawable-mdpi/app_sample_code.png b/samples/SupportAnimationDemos/src/main/res/drawable-mdpi/app_sample_code.png
similarity index 100%
rename from samples/SupportAnimationDemos/res/drawable-mdpi/app_sample_code.png
rename to samples/SupportAnimationDemos/src/main/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportAnimationDemos/res/drawable/circle.xml b/samples/SupportAnimationDemos/src/main/res/drawable/circle.xml
similarity index 100%
rename from samples/SupportAnimationDemos/res/drawable/circle.xml
rename to samples/SupportAnimationDemos/src/main/res/drawable/circle.xml
diff --git a/samples/SupportAnimationDemos/res/drawable/green_circle.xml b/samples/SupportAnimationDemos/src/main/res/drawable/green_circle.xml
similarity index 100%
rename from samples/SupportAnimationDemos/res/drawable/green_circle.xml
rename to samples/SupportAnimationDemos/src/main/res/drawable/green_circle.xml
diff --git a/samples/SupportAnimationDemos/res/drawable/light_green_circle.xml b/samples/SupportAnimationDemos/src/main/res/drawable/light_green_circle.xml
similarity index 100%
rename from samples/SupportAnimationDemos/res/drawable/light_green_circle.xml
rename to samples/SupportAnimationDemos/src/main/res/drawable/light_green_circle.xml
diff --git a/samples/SupportAnimationDemos/res/drawable/spring_demo_circle.xml b/samples/SupportAnimationDemos/src/main/res/drawable/spring_demo_circle.xml
similarity index 100%
rename from samples/SupportAnimationDemos/res/drawable/spring_demo_circle.xml
rename to samples/SupportAnimationDemos/src/main/res/drawable/spring_demo_circle.xml
diff --git a/samples/SupportAnimationDemos/res/layout/activity_chained_springs.xml b/samples/SupportAnimationDemos/src/main/res/layout/activity_chained_springs.xml
similarity index 100%
rename from samples/SupportAnimationDemos/res/layout/activity_chained_springs.xml
rename to samples/SupportAnimationDemos/src/main/res/layout/activity_chained_springs.xml
diff --git a/samples/SupportAnimationDemos/res/layout/activity_main.xml b/samples/SupportAnimationDemos/src/main/res/layout/activity_main.xml
similarity index 100%
rename from samples/SupportAnimationDemos/res/layout/activity_main.xml
rename to samples/SupportAnimationDemos/src/main/res/layout/activity_main.xml
diff --git a/samples/SupportAnimationDemos/res/values-w820dp/dimens.xml b/samples/SupportAnimationDemos/src/main/res/values-w820dp/dimens.xml
similarity index 100%
rename from samples/SupportAnimationDemos/res/values-w820dp/dimens.xml
rename to samples/SupportAnimationDemos/src/main/res/values-w820dp/dimens.xml
diff --git a/samples/SupportAnimationDemos/res/values/colors.xml b/samples/SupportAnimationDemos/src/main/res/values/colors.xml
similarity index 100%
rename from samples/SupportAnimationDemos/res/values/colors.xml
rename to samples/SupportAnimationDemos/src/main/res/values/colors.xml
diff --git a/samples/SupportAnimationDemos/res/values/dimens.xml b/samples/SupportAnimationDemos/src/main/res/values/dimens.xml
similarity index 100%
rename from samples/SupportAnimationDemos/res/values/dimens.xml
rename to samples/SupportAnimationDemos/src/main/res/values/dimens.xml
diff --git a/samples/SupportAnimationDemos/res/values/strings.xml b/samples/SupportAnimationDemos/src/main/res/values/strings.xml
similarity index 100%
rename from samples/SupportAnimationDemos/res/values/strings.xml
rename to samples/SupportAnimationDemos/src/main/res/values/strings.xml
diff --git a/samples/SupportAppNavigation/build.gradle b/samples/SupportAppNavigation/build.gradle
index fdd72b6..35a9d73 100644
--- a/samples/SupportAppNavigation/build.gradle
+++ b/samples/SupportAppNavigation/build.gradle
@@ -28,12 +28,6 @@
         targetSdkVersion project.ext.currentSdk
     }
 
-    sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['src']
-        main.res.srcDirs = ['res']
-    }
-
     signingConfigs {
         debug {
             // Use a local debug keystore to avoid build server issues.
diff --git a/samples/SupportAppNavigation/AndroidManifest.xml b/samples/SupportAppNavigation/src/main/AndroidManifest.xml
similarity index 100%
rename from samples/SupportAppNavigation/AndroidManifest.xml
rename to samples/SupportAppNavigation/src/main/AndroidManifest.xml
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ActionBarCompat.java b/samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/ActionBarCompat.java
similarity index 100%
rename from samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ActionBarCompat.java
rename to samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/ActionBarCompat.java
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/AppNavHomeActivity.java b/samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/AppNavHomeActivity.java
similarity index 100%
rename from samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/AppNavHomeActivity.java
rename to samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/AppNavHomeActivity.java
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ContentCategoryActivity.java b/samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/ContentCategoryActivity.java
similarity index 100%
rename from samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ContentCategoryActivity.java
rename to samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/ContentCategoryActivity.java
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ContentViewActivity.java b/samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/ContentViewActivity.java
similarity index 100%
rename from samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ContentViewActivity.java
rename to samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/ContentViewActivity.java
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/InterstitialMessageActivity.java b/samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/InterstitialMessageActivity.java
similarity index 100%
rename from samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/InterstitialMessageActivity.java
rename to samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/InterstitialMessageActivity.java
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/NotificationsActivity.java b/samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/NotificationsActivity.java
similarity index 100%
rename from samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/NotificationsActivity.java
rename to samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/NotificationsActivity.java
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/OutsideTaskActivity.java b/samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/OutsideTaskActivity.java
similarity index 100%
rename from samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/OutsideTaskActivity.java
rename to samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/OutsideTaskActivity.java
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/PeerActivity.java b/samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/PeerActivity.java
similarity index 100%
rename from samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/PeerActivity.java
rename to samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/PeerActivity.java
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/SimpleUpActivity.java b/samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/SimpleUpActivity.java
similarity index 100%
rename from samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/SimpleUpActivity.java
rename to samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/SimpleUpActivity.java
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ViewFromOtherTaskActivity.java b/samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/ViewFromOtherTaskActivity.java
similarity index 100%
rename from samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ViewFromOtherTaskActivity.java
rename to samples/SupportAppNavigation/src/main/java/com/example/android/support/appnavigation/app/ViewFromOtherTaskActivity.java
diff --git a/samples/SupportAppNavigation/res/layout/content_category.xml b/samples/SupportAppNavigation/src/main/res/layout/content_category.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/layout/content_category.xml
rename to samples/SupportAppNavigation/src/main/res/layout/content_category.xml
diff --git a/samples/SupportAppNavigation/res/layout/content_view.xml b/samples/SupportAppNavigation/src/main/res/layout/content_view.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/layout/content_view.xml
rename to samples/SupportAppNavigation/src/main/res/layout/content_view.xml
diff --git a/samples/SupportAppNavigation/res/layout/interstitial_message.xml b/samples/SupportAppNavigation/src/main/res/layout/interstitial_message.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/layout/interstitial_message.xml
rename to samples/SupportAppNavigation/src/main/res/layout/interstitial_message.xml
diff --git a/samples/SupportAppNavigation/res/layout/notifications.xml b/samples/SupportAppNavigation/src/main/res/layout/notifications.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/layout/notifications.xml
rename to samples/SupportAppNavigation/src/main/res/layout/notifications.xml
diff --git a/samples/SupportAppNavigation/res/layout/outside_task.xml b/samples/SupportAppNavigation/src/main/res/layout/outside_task.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/layout/outside_task.xml
rename to samples/SupportAppNavigation/src/main/res/layout/outside_task.xml
diff --git a/samples/SupportAppNavigation/res/layout/peer.xml b/samples/SupportAppNavigation/src/main/res/layout/peer.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/layout/peer.xml
rename to samples/SupportAppNavigation/src/main/res/layout/peer.xml
diff --git a/samples/SupportAppNavigation/res/layout/simple_up.xml b/samples/SupportAppNavigation/src/main/res/layout/simple_up.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/layout/simple_up.xml
rename to samples/SupportAppNavigation/src/main/res/layout/simple_up.xml
diff --git a/samples/SupportAppNavigation/res/layout/view_from_other_task.xml b/samples/SupportAppNavigation/src/main/res/layout/view_from_other_task.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/layout/view_from_other_task.xml
rename to samples/SupportAppNavigation/src/main/res/layout/view_from_other_task.xml
diff --git a/samples/SupportAppNavigation/res/values-v11/styles.xml b/samples/SupportAppNavigation/src/main/res/values-v11/styles.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/values-v11/styles.xml
rename to samples/SupportAppNavigation/src/main/res/values-v11/styles.xml
diff --git a/samples/SupportAppNavigation/res/values-v11/themes.xml b/samples/SupportAppNavigation/src/main/res/values-v11/themes.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/values-v11/themes.xml
rename to samples/SupportAppNavigation/src/main/res/values-v11/themes.xml
diff --git a/samples/SupportAppNavigation/res/values-v14/themes.xml b/samples/SupportAppNavigation/src/main/res/values-v14/themes.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/values-v14/themes.xml
rename to samples/SupportAppNavigation/src/main/res/values-v14/themes.xml
diff --git a/samples/SupportAppNavigation/res/values/ids.xml b/samples/SupportAppNavigation/src/main/res/values/ids.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/values/ids.xml
rename to samples/SupportAppNavigation/src/main/res/values/ids.xml
diff --git a/samples/SupportAppNavigation/res/values/strings.xml b/samples/SupportAppNavigation/src/main/res/values/strings.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/values/strings.xml
rename to samples/SupportAppNavigation/src/main/res/values/strings.xml
diff --git a/samples/SupportAppNavigation/res/values/styles.xml b/samples/SupportAppNavigation/src/main/res/values/styles.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/values/styles.xml
rename to samples/SupportAppNavigation/src/main/res/values/styles.xml
diff --git a/samples/SupportAppNavigation/res/values/themes.xml b/samples/SupportAppNavigation/src/main/res/values/themes.xml
similarity index 100%
rename from samples/SupportAppNavigation/res/values/themes.xml
rename to samples/SupportAppNavigation/src/main/res/values/themes.xml
diff --git a/samples/SupportDesignDemos/build.gradle b/samples/SupportDesignDemos/build.gradle
index ca4c12d..7abaa0e 100644
--- a/samples/SupportDesignDemos/build.gradle
+++ b/samples/SupportDesignDemos/build.gradle
@@ -13,12 +13,6 @@
         vectorDrawables.useSupportLibrary = true
     }
 
-    sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['src']
-        main.res.srcDirs = ['res']
-    }
-
     signingConfigs {
         debug {
             // Use a local debug keystore to avoid build server issues.
diff --git a/samples/SupportDesignDemos/AndroidManifest.xml b/samples/SupportDesignDemos/src/main/AndroidManifest.xml
similarity index 100%
rename from samples/SupportDesignDemos/AndroidManifest.xml
rename to samples/SupportDesignDemos/src/main/AndroidManifest.xml
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/Cheeses.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/Cheeses.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/Cheeses.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/Cheeses.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/Shakespeare.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/Shakespeare.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/Shakespeare.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/Shakespeare.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/SupportDesignDemos.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/SupportDesignDemos.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/SupportDesignDemos.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/SupportDesignDemos.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPin.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPin.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPin.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPin.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPinNested.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPinNested.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPinNested.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPinNested.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPinWithFab.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPinWithFab.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPinWithFab.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPinWithFab.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenScroll.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenScroll.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenScroll.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenScroll.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenScrollWithSwipeRefresh.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenScrollWithSwipeRefresh.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenScrollWithSwipeRefresh.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenScrollWithSwipeRefresh.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseWithImage.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseWithImage.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseWithImage.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseWithImage.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseWithImageWithInsets.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseWithImageWithInsets.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseWithImageWithInsets.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseWithImageWithInsets.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarParallaxOverlapContent.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarParallaxOverlapContent.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarParallaxOverlapContent.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarParallaxOverlapContent.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsPin.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsPin.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsPin.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsPin.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsPinWithSwipeRefresh.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsPinWithSwipeRefresh.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsPinWithSwipeRefresh.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsPinWithSwipeRefresh.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsScroll.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsScroll.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsScroll.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsScroll.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsScrollSnap.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsScrollSnap.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsScrollSnap.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsScrollSnap.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutUsageBase.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutUsageBase.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutUsageBase.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/AppBarLayoutUsageBase.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomNavigationViewUsage.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomNavigationViewUsage.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomNavigationViewUsage.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomNavigationViewUsage.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetDynamicContent.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetDynamicContent.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetDynamicContent.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetDynamicContent.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetHideable.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetHideable.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetHideable.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetHideable.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModal.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetModal.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModal.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetModal.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModalBase.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetModalBase.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModalBase.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetModalBase.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModalSkipCollapsed.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetModalSkipCollapsed.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModalSkipCollapsed.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetModalSkipCollapsed.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetPersistent.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetPersistent.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetPersistent.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetPersistent.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetScrollView.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetScrollView.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetScrollView.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetScrollView.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetUsageBase.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetUsageBase.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetUsageBase.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetUsageBase.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetWithFab.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetWithFab.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetWithFab.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetWithFab.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetWithFragment.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetWithFragment.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetWithFragment.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/BottomSheetWithFragment.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/CoordinatorLayoutInset.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/CoordinatorLayoutInset.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/CoordinatorLayoutInset.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/CoordinatorLayoutInset.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/CustomSnackbar.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/CustomSnackbar.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/CustomSnackbar.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/CustomSnackbar.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/CustomSnackbarMainContent.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/CustomSnackbarMainContent.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/CustomSnackbarMainContent.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/CustomSnackbarMainContent.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/CustomSnackbarUsage.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/CustomSnackbarUsage.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/CustomSnackbarUsage.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/CustomSnackbarUsage.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/FloatingActionButtonUsage.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/FloatingActionButtonUsage.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/FloatingActionButtonUsage.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/FloatingActionButtonUsage.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewUsage.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/NavigationViewUsage.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewUsage.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/NavigationViewUsage.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewUsageBase.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/NavigationViewUsageBase.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewUsageBase.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/NavigationViewUsageBase.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewWithoutDrawer.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/NavigationViewWithoutDrawer.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewWithoutDrawer.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/NavigationViewWithoutDrawer.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SimpleStringRecyclerViewAdapter.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/SimpleStringRecyclerViewAdapter.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/SimpleStringRecyclerViewAdapter.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/SimpleStringRecyclerViewAdapter.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarUsage.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/SnackbarUsage.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarUsage.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/SnackbarUsage.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarWithFloatingActionButton.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/SnackbarWithFloatingActionButton.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarWithFloatingActionButton.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/SnackbarWithFloatingActionButton.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarWithoutCoordinatorLayout.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/SnackbarWithoutCoordinatorLayout.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarWithoutCoordinatorLayout.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/SnackbarWithoutCoordinatorLayout.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutCustomItemsUsage.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/TabLayoutCustomItemsUsage.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutCustomItemsUsage.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/TabLayoutCustomItemsUsage.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutLayoutItemsUsage.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/TabLayoutLayoutItemsUsage.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutLayoutItemsUsage.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/TabLayoutLayoutItemsUsage.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutPreselectedUsage.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/TabLayoutPreselectedUsage.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutPreselectedUsage.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/TabLayoutPreselectedUsage.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutUsage.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/TabLayoutUsage.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutUsage.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/TabLayoutUsage.java
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TextInputLayoutUsage.java b/samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/TextInputLayoutUsage.java
similarity index 100%
rename from samples/SupportDesignDemos/src/com/example/android/support/design/widget/TextInputLayoutUsage.java
rename to samples/SupportDesignDemos/src/main/java/com/example/android/support/design/widget/TextInputLayoutUsage.java
diff --git a/samples/SupportDesignDemos/res/drawable-hdpi/app_sample_code.png b/samples/SupportDesignDemos/src/main/res/drawable-hdpi/app_sample_code.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-hdpi/app_sample_code.png
rename to samples/SupportDesignDemos/src/main/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-hdpi/ic_account_circle_white_48dp.png b/samples/SupportDesignDemos/src/main/res/drawable-hdpi/ic_account_circle_white_48dp.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-hdpi/ic_account_circle_white_48dp.png
rename to samples/SupportDesignDemos/src/main/res/drawable-hdpi/ic_account_circle_white_48dp.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-hdpi/ic_action_navigation_menu.png b/samples/SupportDesignDemos/src/main/res/drawable-hdpi/ic_action_navigation_menu.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-hdpi/ic_action_navigation_menu.png
rename to samples/SupportDesignDemos/src/main/res/drawable-hdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-hdpi/ic_android.png b/samples/SupportDesignDemos/src/main/res/drawable-hdpi/ic_android.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-hdpi/ic_android.png
rename to samples/SupportDesignDemos/src/main/res/drawable-hdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-hdpi/ic_lightbulb_outline_white_24dp.png b/samples/SupportDesignDemos/src/main/res/drawable-hdpi/ic_lightbulb_outline_white_24dp.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-hdpi/ic_lightbulb_outline_white_24dp.png
rename to samples/SupportDesignDemos/src/main/res/drawable-hdpi/ic_lightbulb_outline_white_24dp.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-mdpi/app_sample_code.png b/samples/SupportDesignDemos/src/main/res/drawable-mdpi/app_sample_code.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-mdpi/app_sample_code.png
rename to samples/SupportDesignDemos/src/main/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-mdpi/ic_account_circle_white_48dp.png b/samples/SupportDesignDemos/src/main/res/drawable-mdpi/ic_account_circle_white_48dp.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-mdpi/ic_account_circle_white_48dp.png
rename to samples/SupportDesignDemos/src/main/res/drawable-mdpi/ic_account_circle_white_48dp.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-mdpi/ic_action_navigation_menu.png b/samples/SupportDesignDemos/src/main/res/drawable-mdpi/ic_action_navigation_menu.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-mdpi/ic_action_navigation_menu.png
rename to samples/SupportDesignDemos/src/main/res/drawable-mdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-mdpi/ic_android.png b/samples/SupportDesignDemos/src/main/res/drawable-mdpi/ic_android.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-mdpi/ic_android.png
rename to samples/SupportDesignDemos/src/main/res/drawable-mdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-mdpi/ic_lightbulb_outline_white_24dp.png b/samples/SupportDesignDemos/src/main/res/drawable-mdpi/ic_lightbulb_outline_white_24dp.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-mdpi/ic_lightbulb_outline_white_24dp.png
rename to samples/SupportDesignDemos/src/main/res/drawable-mdpi/ic_lightbulb_outline_white_24dp.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-nodpi/photo.jpg b/samples/SupportDesignDemos/src/main/res/drawable-nodpi/photo.jpg
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-nodpi/photo.jpg
rename to samples/SupportDesignDemos/src/main/res/drawable-nodpi/photo.jpg
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xhdpi/ic_account_circle_white_48dp.png b/samples/SupportDesignDemos/src/main/res/drawable-xhdpi/ic_account_circle_white_48dp.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-xhdpi/ic_account_circle_white_48dp.png
rename to samples/SupportDesignDemos/src/main/res/drawable-xhdpi/ic_account_circle_white_48dp.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xhdpi/ic_action_navigation_menu.png b/samples/SupportDesignDemos/src/main/res/drawable-xhdpi/ic_action_navigation_menu.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-xhdpi/ic_action_navigation_menu.png
rename to samples/SupportDesignDemos/src/main/res/drawable-xhdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xhdpi/ic_android.png b/samples/SupportDesignDemos/src/main/res/drawable-xhdpi/ic_android.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-xhdpi/ic_android.png
rename to samples/SupportDesignDemos/src/main/res/drawable-xhdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xhdpi/ic_lightbulb_outline_white_24dp.png b/samples/SupportDesignDemos/src/main/res/drawable-xhdpi/ic_lightbulb_outline_white_24dp.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-xhdpi/ic_lightbulb_outline_white_24dp.png
rename to samples/SupportDesignDemos/src/main/res/drawable-xhdpi/ic_lightbulb_outline_white_24dp.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xxhdpi/ic_account_circle_white_48dp.png b/samples/SupportDesignDemos/src/main/res/drawable-xxhdpi/ic_account_circle_white_48dp.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-xxhdpi/ic_account_circle_white_48dp.png
rename to samples/SupportDesignDemos/src/main/res/drawable-xxhdpi/ic_account_circle_white_48dp.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xxhdpi/ic_action_navigation_menu.png b/samples/SupportDesignDemos/src/main/res/drawable-xxhdpi/ic_action_navigation_menu.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-xxhdpi/ic_action_navigation_menu.png
rename to samples/SupportDesignDemos/src/main/res/drawable-xxhdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xxhdpi/ic_add.png b/samples/SupportDesignDemos/src/main/res/drawable-xxhdpi/ic_add.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-xxhdpi/ic_add.png
rename to samples/SupportDesignDemos/src/main/res/drawable-xxhdpi/ic_add.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xxhdpi/ic_android.png b/samples/SupportDesignDemos/src/main/res/drawable-xxhdpi/ic_android.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-xxhdpi/ic_android.png
rename to samples/SupportDesignDemos/src/main/res/drawable-xxhdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xxhdpi/ic_lightbulb_outline_white_24dp.png b/samples/SupportDesignDemos/src/main/res/drawable-xxhdpi/ic_lightbulb_outline_white_24dp.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-xxhdpi/ic_lightbulb_outline_white_24dp.png
rename to samples/SupportDesignDemos/src/main/res/drawable-xxhdpi/ic_lightbulb_outline_white_24dp.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xxxhdpi/ic_account_circle_white_48dp.png b/samples/SupportDesignDemos/src/main/res/drawable-xxxhdpi/ic_account_circle_white_48dp.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-xxxhdpi/ic_account_circle_white_48dp.png
rename to samples/SupportDesignDemos/src/main/res/drawable-xxxhdpi/ic_account_circle_white_48dp.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xxxhdpi/ic_android.png b/samples/SupportDesignDemos/src/main/res/drawable-xxxhdpi/ic_android.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-xxxhdpi/ic_android.png
rename to samples/SupportDesignDemos/src/main/res/drawable-xxxhdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xxxhdpi/ic_lightbulb_outline_white_24dp.png b/samples/SupportDesignDemos/src/main/res/drawable-xxxhdpi/ic_lightbulb_outline_white_24dp.png
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable-xxxhdpi/ic_lightbulb_outline_white_24dp.png
rename to samples/SupportDesignDemos/src/main/res/drawable-xxxhdpi/ic_lightbulb_outline_white_24dp.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable/custom_tab_indicator.xml b/samples/SupportDesignDemos/src/main/res/drawable/custom_tab_indicator.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable/custom_tab_indicator.xml
rename to samples/SupportDesignDemos/src/main/res/drawable/custom_tab_indicator.xml
diff --git a/samples/SupportDesignDemos/res/drawable/custom_tab_indicator_default.xml b/samples/SupportDesignDemos/src/main/res/drawable/custom_tab_indicator_default.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable/custom_tab_indicator_default.xml
rename to samples/SupportDesignDemos/src/main/res/drawable/custom_tab_indicator_default.xml
diff --git a/samples/SupportDesignDemos/res/drawable/custom_tab_indicator_selected.xml b/samples/SupportDesignDemos/src/main/res/drawable/custom_tab_indicator_selected.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable/custom_tab_indicator_selected.xml
rename to samples/SupportDesignDemos/src/main/res/drawable/custom_tab_indicator_selected.xml
diff --git a/samples/SupportDesignDemos/res/drawable/ic_search.xml b/samples/SupportDesignDemos/src/main/res/drawable/ic_search.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/drawable/ic_search.xml
rename to samples/SupportDesignDemos/src/main/res/drawable/ic_search.xml
diff --git a/samples/SupportDesignDemos/res/layout/action_layout.xml b/samples/SupportDesignDemos/src/main/res/layout/action_layout.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/action_layout.xml
rename to samples/SupportDesignDemos/src/main/res/layout/action_layout.xml
diff --git a/samples/SupportDesignDemos/res/layout/action_layout_custom.xml b/samples/SupportDesignDemos/src/main/res/layout/action_layout_custom.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/action_layout_custom.xml
rename to samples/SupportDesignDemos/src/main/res/layout/action_layout_custom.xml
diff --git a/samples/SupportDesignDemos/res/layout/custom_snackbar_include.xml b/samples/SupportDesignDemos/src/main/res/layout/custom_snackbar_include.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/custom_snackbar_include.xml
rename to samples/SupportDesignDemos/src/main/res/layout/custom_snackbar_include.xml
diff --git a/samples/SupportDesignDemos/res/layout/custom_snackbar_with_fab.xml b/samples/SupportDesignDemos/src/main/res/layout/custom_snackbar_with_fab.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/custom_snackbar_with_fab.xml
rename to samples/SupportDesignDemos/src/main/res/layout/custom_snackbar_with_fab.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin.xml b/samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_collapse_pin.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_collapse_pin.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin_nested.xml b/samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_collapse_pin_nested.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin_nested.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_collapse_pin_nested.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin_with_fab.xml b/samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_collapse_pin_with_fab.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin_with_fab.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_collapse_pin_with_fab.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_scroll.xml b/samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_collapse_scroll.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_scroll.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_collapse_scroll.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_scroll_with_swiperefresh.xml b/samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_collapse_scroll_with_swiperefresh.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_scroll_with_swiperefresh.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_collapse_scroll_with_swiperefresh.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_with_image.xml b/samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_collapse_with_image.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_with_image.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_collapse_with_image.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_with_image_insets.xml b/samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_collapse_with_image_insets.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_with_image_insets.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_collapse_with_image_insets.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_parallax_overlap.xml b/samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_parallax_overlap.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_appbar_toolbar_parallax_overlap.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_parallax_overlap.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_pinned.xml b/samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_scroll_tabs_pinned.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_pinned.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_scroll_tabs_pinned.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_pinned_with_swiperefres.xml b/samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_scroll_tabs_pinned_with_swiperefres.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_pinned_with_swiperefres.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_scroll_tabs_pinned_with_swiperefres.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_scroll.xml b/samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_scroll_tabs_scroll.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_scroll.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_scroll_tabs_scroll.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_scroll_snap.xml b/samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_scroll_tabs_scroll_snap.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_scroll_snap.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_appbar_toolbar_scroll_tabs_scroll_snap.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_navigation_view.xml b/samples/SupportDesignDemos/src/main/res/layout/design_bottom_navigation_view.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_bottom_navigation_view.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_bottom_navigation_view.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_dynamic.xml b/samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_dynamic.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_bottom_sheet_dynamic.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_dynamic.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_fragment.xml b/samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_fragment.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_bottom_sheet_fragment.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_fragment.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_hideable.xml b/samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_hideable.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_bottom_sheet_hideable.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_hideable.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_modal.xml b/samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_modal.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_bottom_sheet_modal.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_modal.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_persistent.xml b/samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_persistent.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_bottom_sheet_persistent.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_persistent.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_recyclerview.xml b/samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_recyclerview.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_bottom_sheet_recyclerview.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_recyclerview.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_scroll.xml b/samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_scroll.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_bottom_sheet_scroll.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_scroll.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_with_fab.xml b/samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_with_fab.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_bottom_sheet_with_fab.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_with_fab.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_with_fragment.xml b/samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_with_fragment.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_bottom_sheet_with_fragment.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_bottom_sheet_with_fragment.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_coordinatorlayout_inset.xml b/samples/SupportDesignDemos/src/main/res/layout/design_coordinatorlayout_inset.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_coordinatorlayout_inset.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_coordinatorlayout_inset.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_fab.xml b/samples/SupportDesignDemos/src/main/res/layout/design_fab.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_fab.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_fab.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_navigation.xml b/samples/SupportDesignDemos/src/main/res/layout/design_navigation.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_navigation.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_navigation.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_navigation_header.xml b/samples/SupportDesignDemos/src/main/res/layout/design_navigation_header.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_navigation_header.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_navigation_header.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_navigation_without_drawer.xml b/samples/SupportDesignDemos/src/main/res/layout/design_navigation_without_drawer.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_navigation_without_drawer.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_navigation_without_drawer.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_snackbar.xml b/samples/SupportDesignDemos/src/main/res/layout/design_snackbar.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_snackbar.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_snackbar.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_snackbar_with_fab.xml b/samples/SupportDesignDemos/src/main/res/layout/design_snackbar_with_fab.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_snackbar_with_fab.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_snackbar_with_fab.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_snackbar_without_col.xml b/samples/SupportDesignDemos/src/main/res/layout/design_snackbar_without_col.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_snackbar_without_col.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_snackbar_without_col.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_tab_custom.xml b/samples/SupportDesignDemos/src/main/res/layout/design_tab_custom.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_tab_custom.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_tab_custom.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_tabs_custom.xml b/samples/SupportDesignDemos/src/main/res/layout/design_tabs_custom.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_tabs_custom.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_tabs_custom.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_tabs_item.xml b/samples/SupportDesignDemos/src/main/res/layout/design_tabs_item.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_tabs_item.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_tabs_item.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_tabs_viewpager.xml b/samples/SupportDesignDemos/src/main/res/layout/design_tabs_viewpager.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_tabs_viewpager.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_tabs_viewpager.xml
diff --git a/samples/SupportDesignDemos/res/layout/design_text_input.xml b/samples/SupportDesignDemos/src/main/res/layout/design_text_input.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/design_text_input.xml
rename to samples/SupportDesignDemos/src/main/res/layout/design_text_input.xml
diff --git a/samples/SupportDesignDemos/res/layout/include_appbar_recyclerview.xml b/samples/SupportDesignDemos/src/main/res/layout/include_appbar_recyclerview.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/include_appbar_recyclerview.xml
rename to samples/SupportDesignDemos/src/main/res/layout/include_appbar_recyclerview.xml
diff --git a/samples/SupportDesignDemos/res/layout/include_appbar_recyclerview_swiperefresh.xml b/samples/SupportDesignDemos/src/main/res/layout/include_appbar_recyclerview_swiperefresh.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/include_appbar_recyclerview_swiperefresh.xml
rename to samples/SupportDesignDemos/src/main/res/layout/include_appbar_recyclerview_swiperefresh.xml
diff --git a/samples/SupportDesignDemos/res/layout/include_appbar_scrollview.xml b/samples/SupportDesignDemos/src/main/res/layout/include_appbar_scrollview.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/include_appbar_scrollview.xml
rename to samples/SupportDesignDemos/src/main/res/layout/include_appbar_scrollview.xml
diff --git a/samples/SupportDesignDemos/res/layout/include_appbar_scrollview_with_image.xml b/samples/SupportDesignDemos/src/main/res/layout/include_appbar_scrollview_with_image.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/include_appbar_scrollview_with_image.xml
rename to samples/SupportDesignDemos/src/main/res/layout/include_appbar_scrollview_with_image.xml
diff --git a/samples/SupportDesignDemos/res/layout/include_bottom_sheet.xml b/samples/SupportDesignDemos/src/main/res/layout/include_bottom_sheet.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/layout/include_bottom_sheet.xml
rename to samples/SupportDesignDemos/src/main/res/layout/include_bottom_sheet.xml
diff --git a/samples/SupportDesignDemos/res/menu/navigation.xml b/samples/SupportDesignDemos/src/main/res/menu/navigation.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/menu/navigation.xml
rename to samples/SupportDesignDemos/src/main/res/menu/navigation.xml
diff --git a/samples/SupportDesignDemos/res/menu/sample_actions.xml b/samples/SupportDesignDemos/src/main/res/menu/sample_actions.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/menu/sample_actions.xml
rename to samples/SupportDesignDemos/src/main/res/menu/sample_actions.xml
diff --git a/samples/SupportDesignDemos/res/menu/sample_bottom_menu.xml b/samples/SupportDesignDemos/src/main/res/menu/sample_bottom_menu.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/menu/sample_bottom_menu.xml
rename to samples/SupportDesignDemos/src/main/res/menu/sample_bottom_menu.xml
diff --git a/samples/SupportDesignDemos/res/values-sw600dp/dimens.xml b/samples/SupportDesignDemos/src/main/res/values-sw600dp/dimens.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/values-sw600dp/dimens.xml
rename to samples/SupportDesignDemos/src/main/res/values-sw600dp/dimens.xml
diff --git a/samples/SupportDesignDemos/res/values-v21/styles.xml b/samples/SupportDesignDemos/src/main/res/values-v21/styles.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/values-v21/styles.xml
rename to samples/SupportDesignDemos/src/main/res/values-v21/styles.xml
diff --git a/samples/SupportDesignDemos/res/values-w540dp/dimens.xml b/samples/SupportDesignDemos/src/main/res/values-w540dp/dimens.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/values-w540dp/dimens.xml
rename to samples/SupportDesignDemos/src/main/res/values-w540dp/dimens.xml
diff --git a/samples/SupportDesignDemos/res/values/dimens.xml b/samples/SupportDesignDemos/src/main/res/values/dimens.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/values/dimens.xml
rename to samples/SupportDesignDemos/src/main/res/values/dimens.xml
diff --git a/samples/SupportDesignDemos/res/values/strings.xml b/samples/SupportDesignDemos/src/main/res/values/strings.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/values/strings.xml
rename to samples/SupportDesignDemos/src/main/res/values/strings.xml
diff --git a/samples/SupportDesignDemos/res/values/styles.xml b/samples/SupportDesignDemos/src/main/res/values/styles.xml
similarity index 100%
rename from samples/SupportDesignDemos/res/values/styles.xml
rename to samples/SupportDesignDemos/src/main/res/values/styles.xml
diff --git a/samples/SupportEmojiDemos/build.gradle b/samples/SupportEmojiDemos/build.gradle
index 70b2909..abc8328 100644
--- a/samples/SupportEmojiDemos/build.gradle
+++ b/samples/SupportEmojiDemos/build.gradle
@@ -35,9 +35,6 @@
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['src']
-        main.res.srcDirs = ['res']
         main.assets.srcDirs = [new File(fontDir, "supported-emojis").getAbsolutePath()]
     }
 
diff --git a/samples/SupportEmojiDemos/AndroidManifest.xml b/samples/SupportEmojiDemos/src/main/AndroidManifest.xml
similarity index 100%
rename from samples/SupportEmojiDemos/AndroidManifest.xml
rename to samples/SupportEmojiDemos/src/main/AndroidManifest.xml
diff --git a/samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/Config.java b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/Config.java
similarity index 100%
rename from samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/Config.java
rename to samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/Config.java
diff --git a/samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/ConfigLayout.java b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/ConfigLayout.java
similarity index 100%
rename from samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/ConfigLayout.java
rename to samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/ConfigLayout.java
diff --git a/samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/CustomTextView.java b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/CustomTextView.java
similarity index 100%
rename from samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/CustomTextView.java
rename to samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/CustomTextView.java
diff --git a/samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/EmojiCompatApplication.java b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/EmojiCompatApplication.java
similarity index 100%
rename from samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/EmojiCompatApplication.java
rename to samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/EmojiCompatApplication.java
diff --git a/samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/EmojiRepo.java b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/EmojiRepo.java
similarity index 100%
rename from samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/EmojiRepo.java
rename to samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/EmojiRepo.java
diff --git a/samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/ListFragment.java b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/ListFragment.java
similarity index 100%
rename from samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/ListFragment.java
rename to samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/ListFragment.java
diff --git a/samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/MainActivity.java b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/MainActivity.java
similarity index 100%
rename from samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/MainActivity.java
rename to samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/MainActivity.java
diff --git a/samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/MainFragment.java b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/MainFragment.java
similarity index 100%
rename from samples/SupportEmojiDemos/src/com/example/android/support/text/emoji/MainFragment.java
rename to samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/MainFragment.java
diff --git a/samples/SupportEmojiDemos/res/layout/activity_main.xml b/samples/SupportEmojiDemos/src/main/res/layout/activity_main.xml
similarity index 100%
rename from samples/SupportEmojiDemos/res/layout/activity_main.xml
rename to samples/SupportEmojiDemos/src/main/res/layout/activity_main.xml
diff --git a/samples/SupportEmojiDemos/res/layout/fragment_list.xml b/samples/SupportEmojiDemos/src/main/res/layout/fragment_list.xml
similarity index 100%
rename from samples/SupportEmojiDemos/res/layout/fragment_list.xml
rename to samples/SupportEmojiDemos/src/main/res/layout/fragment_list.xml
diff --git a/samples/SupportEmojiDemos/res/layout/fragment_main.xml b/samples/SupportEmojiDemos/src/main/res/layout/fragment_main.xml
similarity index 100%
rename from samples/SupportEmojiDemos/res/layout/fragment_main.xml
rename to samples/SupportEmojiDemos/src/main/res/layout/fragment_main.xml
diff --git a/samples/SupportEmojiDemos/res/layout/layout_config.xml b/samples/SupportEmojiDemos/src/main/res/layout/layout_config.xml
similarity index 100%
rename from samples/SupportEmojiDemos/res/layout/layout_config.xml
rename to samples/SupportEmojiDemos/src/main/res/layout/layout_config.xml
diff --git a/samples/SupportEmojiDemos/res/layout/list_item_emoji.xml b/samples/SupportEmojiDemos/src/main/res/layout/list_item_emoji.xml
similarity index 100%
rename from samples/SupportEmojiDemos/res/layout/list_item_emoji.xml
rename to samples/SupportEmojiDemos/src/main/res/layout/list_item_emoji.xml
diff --git a/samples/SupportEmojiDemos/res/mipmap-hdpi/ic_launcher.png b/samples/SupportEmojiDemos/src/main/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from samples/SupportEmojiDemos/res/mipmap-hdpi/ic_launcher.png
rename to samples/SupportEmojiDemos/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportEmojiDemos/res/mipmap-mdpi/ic_launcher.png b/samples/SupportEmojiDemos/src/main/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from samples/SupportEmojiDemos/res/mipmap-mdpi/ic_launcher.png
rename to samples/SupportEmojiDemos/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportEmojiDemos/res/mipmap-xhdpi/ic_launcher.png b/samples/SupportEmojiDemos/src/main/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from samples/SupportEmojiDemos/res/mipmap-xhdpi/ic_launcher.png
rename to samples/SupportEmojiDemos/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportEmojiDemos/res/mipmap-xxhdpi/ic_launcher.png b/samples/SupportEmojiDemos/src/main/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from samples/SupportEmojiDemos/res/mipmap-xxhdpi/ic_launcher.png
rename to samples/SupportEmojiDemos/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportEmojiDemos/res/mipmap-xxxhdpi/ic_launcher.png b/samples/SupportEmojiDemos/src/main/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from samples/SupportEmojiDemos/res/mipmap-xxxhdpi/ic_launcher.png
rename to samples/SupportEmojiDemos/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportEmojiDemos/res/values/colors.xml b/samples/SupportEmojiDemos/src/main/res/values/colors.xml
similarity index 100%
rename from samples/SupportEmojiDemos/res/values/colors.xml
rename to samples/SupportEmojiDemos/src/main/res/values/colors.xml
diff --git a/samples/SupportEmojiDemos/res/values/dimens.xml b/samples/SupportEmojiDemos/src/main/res/values/dimens.xml
similarity index 100%
rename from samples/SupportEmojiDemos/res/values/dimens.xml
rename to samples/SupportEmojiDemos/src/main/res/values/dimens.xml
diff --git a/samples/SupportEmojiDemos/res/values/font_certs.xml b/samples/SupportEmojiDemos/src/main/res/values/font_certs.xml
similarity index 100%
rename from samples/SupportEmojiDemos/res/values/font_certs.xml
rename to samples/SupportEmojiDemos/src/main/res/values/font_certs.xml
diff --git a/samples/SupportEmojiDemos/res/values/strings.xml b/samples/SupportEmojiDemos/src/main/res/values/strings.xml
similarity index 100%
rename from samples/SupportEmojiDemos/res/values/strings.xml
rename to samples/SupportEmojiDemos/src/main/res/values/strings.xml
diff --git a/samples/SupportEmojiDemos/res/values/styles.xml b/samples/SupportEmojiDemos/src/main/res/values/styles.xml
similarity index 100%
rename from samples/SupportEmojiDemos/res/values/styles.xml
rename to samples/SupportEmojiDemos/src/main/res/values/styles.xml
diff --git a/samples/SupportLeanbackDemos/build.gradle b/samples/SupportLeanbackDemos/build.gradle
index 025842b..61d0209 100644
--- a/samples/SupportLeanbackDemos/build.gradle
+++ b/samples/SupportLeanbackDemos/build.gradle
@@ -14,12 +14,6 @@
         targetSdkVersion project.ext.currentSdk
     }
 
-    sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['src']
-        main.res.srcDirs = ['res']
-    }
-
     signingConfigs {
         debug {
             // Use a local debug keystore to avoid build server issues.
diff --git a/samples/SupportLeanbackDemos/AndroidManifest.xml b/samples/SupportLeanbackDemos/src/main/AndroidManifest.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/AndroidManifest.xml
rename to samples/SupportLeanbackDemos/src/main/AndroidManifest.xml
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BackgroundHelper.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BackgroundHelper.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseAnimationActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseAnimationActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseAnimationActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseAnimationActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseAnimationFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseAnimationFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseAnimationFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseAnimationFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseErrorActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseErrorActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseErrorActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseErrorActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseErrorSupportActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseErrorSupportActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseErrorSupportActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseErrorSupportActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseSupportActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseSupportActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseSupportFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/BrowseSupportFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/CardPresenter.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/CardPresenter.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/CardPresenter.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/CardPresenter.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/CustomTitleView.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/CustomTitleView.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/CustomTitleView.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/CustomTitleView.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsCustomTitleActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsCustomTitleActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsCustomTitleActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsCustomTitleActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsCustomTitleSupportActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsCustomTitleSupportActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsCustomTitleSupportActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsCustomTitleSupportActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsDescriptionPresenter.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsDescriptionPresenter.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsDescriptionPresenter.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsDescriptionPresenter.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsPresenterSelectionActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsPresenterSelectionActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsSupportActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsSupportActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsSupportActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsSupportActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsSupportFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsSupportFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsSupportFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsSupportFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsVideoActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsVideoActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsVideoActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsVideoActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsVideoSupportActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsVideoSupportActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsVideoSupportActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/DetailsVideoSupportActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/ErrorFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/ErrorFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/ErrorFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/ErrorFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/ErrorSupportFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/ErrorSupportFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/ErrorSupportFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/ErrorSupportFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/GuidedStepActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/GuidedStepActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepHalfScreenActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepHalfScreenActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepSupportActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepSupportActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/HorizontalGridTestActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/HorizontalGridTestActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/MainActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/MainActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/MediaSessionService.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/MediaSessionService.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/MediaSessionService.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/MediaSessionService.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/MovieData.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/MovieData.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/MovieData.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/MovieData.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/MusicExampleActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/MusicExampleActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/MusicExampleActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/MusicExampleActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/MusicItem.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/MusicItem.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/MusicItem.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/MusicItem.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/MusicPlayerFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/MusicPlayerFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/MusicPlayerFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/MusicPlayerFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/NewDetailsFragment.java
similarity index 97%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/NewDetailsFragment.java
index 6524243..0afe524 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsFragment.java
+++ b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/NewDetailsFragment.java
@@ -16,6 +16,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
@@ -306,6 +307,10 @@
                         adapter.set(ACTION_BUY, mActionBuy);
                         break;
                 }
+                // one line text with icon
+                Drawable d = ResourcesCompat.getDrawable(context.getResources(),
+                        R.drawable.ic_action_a, context.getTheme());
+                adapter.set(202, new Action(202, "Top", null, d));
                 dor.setActionsAdapter(adapter);
                 mRowsAdapter.add(0, dor);
                 setSelectedPosition(0, true);
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsSupportFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java
similarity index 97%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsSupportFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java
index f8570aa..6002cf3 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsSupportFragment.java
+++ b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
@@ -309,6 +310,10 @@
                         adapter.set(ACTION_BUY, mActionBuy);
                         break;
                 }
+                // one line text with icon
+                Drawable d = ResourcesCompat.getDrawable(context.getResources(),
+                        R.drawable.ic_action_a, context.getTheme());
+                adapter.set(202, new Action(202, "Top", null, d));
                 dor.setActionsAdapter(adapter);
                 mRowsAdapter.add(0, dor);
                 setSelectedPosition(0, true);
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/OnboardingActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/OnboardingActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingDemoFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/OnboardingDemoFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingDemoFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/OnboardingDemoFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingDemoSupportFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingDemoSupportFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingSupportActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/OnboardingSupportActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingSupportActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/OnboardingSupportActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PhotoItem.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PhotoItem.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PhotoItem.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PhotoItem.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackControlGlue.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackControlGlue.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackControlGlue.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackControlGlue.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackSeekDataProviderSample.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackSeekDataProviderSample.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackSeekDataProviderSample.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackSeekDataProviderSample.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackSeekDiskDataProvider.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackSeekDiskDataProvider.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackSeekDiskDataProvider.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackSeekDiskDataProvider.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackSupportActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackSupportActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackSupportActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackSupportActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackSupportFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackSupportFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackSupportFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackSupportFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackTransportControlActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackTransportControlActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackTransportControlActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackTransportControlActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackTransportControlFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackTransportControlFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackTransportControlFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackTransportControlFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackTransportControlGlueSample.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackTransportControlGlueSample.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackTransportControlGlueSample.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackTransportControlGlueSample.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackTransportControlSupportActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackTransportControlSupportActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackTransportControlSupportActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackTransportControlSupportActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackTransportControlSupportFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackTransportControlSupportFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackTransportControlSupportFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlaybackTransportControlSupportFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlayerAdapter.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlayerAdapter.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/PlayerAdapter.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/PlayerAdapter.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/RowsActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/RowsActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/RowsFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/RowsFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsSupportActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/RowsSupportActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsSupportActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/RowsSupportActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsSupportFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/RowsSupportFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsSupportFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/RowsSupportFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SampleVideoFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SampleVideoFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/SampleVideoFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SampleVideoFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SampleVideoSupportFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SampleVideoSupportFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/SampleVideoSupportFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SampleVideoSupportFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SearchActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SearchActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchDetailsActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SearchDetailsActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchDetailsActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SearchDetailsActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchDetailsSupportActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SearchDetailsSupportActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchDetailsSupportActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SearchDetailsSupportActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SearchFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SearchFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchSupportActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SearchSupportActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchSupportActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SearchSupportActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchSupportFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SearchSupportFragment.java
similarity index 88%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchSupportFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SearchSupportFragment.java
index b4e9b69..b638344 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchSupportFragment.java
+++ b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SearchSupportFragment.java
@@ -73,11 +73,13 @@
                 diff.putLong(IMAGE, newItem.getImageResourceId());
             }
 
-            if (!oldItem.getTitle().equals(newItem.getTitle())) {
+            if (oldItem.getTitle() != null && newItem.getTitle() != null
+                    && !oldItem.getTitle().equals(newItem.getTitle())) {
                 diff.putString(TITLE, newItem.getTitle());
             }
 
-            if (!oldItem.getContent().equals(newItem.getContent())) {
+            if (oldItem.getContent() != null && newItem.getContent() != null
+                    && !oldItem.getContent().equals(newItem.getContent())) {
                 diff.putString(CONTENT, newItem.getContent());
             }
             return diff;
@@ -138,11 +140,11 @@
             if (mFirstRowAdapter == null) {
                 mFirstRowAdapter = createFirstListRowAdapter();
             } else {
-                mFirstRowAdapter.setItems(createDataSetOne(), mDiffCallback);
+                mFirstRowAdapter.setItems(createDataSetOneDebug(), mDiffCallback);
             }
             mIsDataSetOnePresented = true;
         } else {
-            mFirstRowAdapter.setItems(createDataSetTwo(), mDiffCallback);
+            mFirstRowAdapter.setItems(createDataSetTwoDebug(), mDiffCallback);
             mIsDataSetOnePresented = false;
         }
         mRowsAdapter.add(new ListRow(header, mFirstRowAdapter));
@@ -180,7 +182,7 @@
 
     private ArrayObjectAdapter createFirstListRowAdapter() {
         ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());
-        listRowAdapter.setItems(createDataSetOne(), mDiffCallback);
+        listRowAdapter.setItems(createDataSetOneDebug(), mDiffCallback);
         mIsDataSetOnePresented = true;
         return listRowAdapter;
     }
@@ -322,4 +324,31 @@
         return photoItems;
     }
 
+
+    private ArrayList<PhotoItem> createDataSetOneDebug() {
+        ArrayList<PhotoItem> photoItems = new ArrayList<>();
+        photoItems.add(new PhotoItem(
+                "Hello world",
+                R.drawable.gallery_photo_1,
+                1));
+        return photoItems;
+    }
+
+    /**
+     * Create a new data set (data set one) for the last row of this browse fragment. It will be
+     * changed by another set of data when user click one of the photo items in the list.
+     * Different with other rows in the browsing fragment, the photo item in last row all have been
+     * allocated with a unique id. And the id will be used to jduge if two photo items are the same
+     * or not.
+     *
+     * @return List of photoItem
+     */
+    private ArrayList<PhotoItem> createDataSetTwoDebug() {
+        ArrayList<PhotoItem> photoItems = new ArrayList<>();
+        photoItems.add(new PhotoItem(
+                "Hello world Hello world",
+                R.drawable.gallery_photo_1,
+                1));
+        return photoItems;
+    }
 }
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SettingsActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SettingsActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/SettingsActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SettingsActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SettingsFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SettingsFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/SettingsFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/SettingsFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/StringPresenter.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/StringPresenter.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/StringPresenter.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/StringPresenter.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VerticalGridActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VerticalGridActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VerticalGridFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VerticalGridFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridSupportActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VerticalGridSupportActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridSupportActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VerticalGridSupportActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridSupportFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VerticalGridSupportFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridSupportFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VerticalGridSupportFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VideoActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VideoActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/VideoActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VideoActivity.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VideoActivityWithDetailedCard.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VideoActivityWithDetailedCard.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/VideoActivityWithDetailedCard.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VideoActivityWithDetailedCard.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VideoConsumptionWithDetailCardFragment.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VideoConsumptionWithDetailCardFragment.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/VideoConsumptionWithDetailCardFragment.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VideoConsumptionWithDetailCardFragment.java
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VideoSupportActivity.java b/samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VideoSupportActivity.java
similarity index 100%
rename from samples/SupportLeanbackDemos/src/com/example/android/leanback/VideoSupportActivity.java
rename to samples/SupportLeanbackDemos/src/main/java/com/example/android/leanback/VideoSupportActivity.java
diff --git a/samples/SupportLeanbackDemos/res/drawable-hdpi/ic_launcher.png b/samples/SupportLeanbackDemos/src/main/res/drawable-hdpi/ic_launcher.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-hdpi/ic_launcher.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-hdpi/ic_main_icon.png b/samples/SupportLeanbackDemos/src/main/res/drawable-hdpi/ic_main_icon.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-hdpi/ic_main_icon.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-hdpi/ic_main_icon.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-ldpi/ic_launcher.png b/samples/SupportLeanbackDemos/src/main/res/drawable-ldpi/ic_launcher.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-ldpi/ic_launcher.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-mdpi/ic_launcher.png b/samples/SupportLeanbackDemos/src/main/res/drawable-mdpi/ic_launcher.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-mdpi/ic_launcher.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-mdpi/ic_main_icon.png b/samples/SupportLeanbackDemos/src/main/res/drawable-mdpi/ic_main_icon.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-mdpi/ic_main_icon.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-mdpi/ic_main_icon.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/bg.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/bg.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/bg.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/bg.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_launcher.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/ic_launcher.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_launcher.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_main_icon.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/ic_main_icon.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_main_icon.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/ic_main_icon.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_settings_apps.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/ic_settings_apps.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_settings_apps.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/ic_settings_apps.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_settings_parental_control.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/ic_settings_parental_control.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_settings_parental_control.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/ic_settings_parental_control.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_settings_time.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/ic_settings_time.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_settings_time.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/ic_settings_time.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_settings_wifi_3_bar.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/ic_settings_wifi_3_bar.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_settings_wifi_3_bar.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/ic_settings_wifi_3_bar.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_settings_wifi_4_bar.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/ic_settings_wifi_4_bar.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_settings_wifi_4_bar.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/ic_settings_wifi_4_bar.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_bg.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_bg.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_bg.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_bg.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_1.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_1.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_1.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_1.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_10.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_10.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_10.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_10.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_11.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_11.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_11.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_11.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_12.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_12.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_12.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_12.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_13.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_13.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_13.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_13.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_14.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_14.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_14.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_14.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_15.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_15.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_15.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_15.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_16.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_16.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_16.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_16.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_17.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_17.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_17.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_17.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_18.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_18.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_18.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_18.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_19.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_19.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_19.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_19.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_2.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_2.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_2.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_2.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_20.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_20.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_20.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_20.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_21.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_21.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_21.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_21.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_22.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_22.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_22.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_22.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_23.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_23.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_23.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_23.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_24.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_24.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_24.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_24.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_25.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_25.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_25.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_25.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_26.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_26.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_26.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_26.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_27.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_27.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_27.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_27.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_28.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_28.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_28.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_28.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_29.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_29.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_29.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_29.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_3.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_3.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_3.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_3.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_30.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_30.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_30.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_30.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_31.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_31.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_31.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_31.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_32.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_32.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_32.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_32.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_33.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_33.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_33.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_33.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_34.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_34.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_34.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_34.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_35.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_35.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_35.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_35.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_36.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_36.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_36.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_36.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_37.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_37.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_37.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_37.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_38.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_38.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_38.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_38.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_39.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_39.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_39.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_39.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_4.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_4.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_4.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_4.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_40.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_40.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_40.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_40.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_41.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_41.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_41.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_41.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_42.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_42.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_42.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_42.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_43.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_43.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_43.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_43.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_44.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_44.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_44.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_44.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_5.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_5.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_5.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_5.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_6.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_6.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_6.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_6.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_7.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_7.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_7.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_7.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_8.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_8.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_8.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_8.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_9.png b/samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_9.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_9.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable-xhdpi/tv_content_9.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/details_img.png b/samples/SupportLeanbackDemos/src/main/res/drawable/details_img.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/details_img.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable/details_img.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/details_img_16x9.png b/samples/SupportLeanbackDemos/src/main/res/drawable/details_img_16x9.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/details_img_16x9.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable/details_img_16x9.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_1.jpg b/samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_1.jpg
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/gallery_photo_1.jpg
rename to samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_1.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_2.jpg b/samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_2.jpg
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/gallery_photo_2.jpg
rename to samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_2.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_3.jpg b/samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_3.jpg
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/gallery_photo_3.jpg
rename to samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_3.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_4.jpg b/samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_4.jpg
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/gallery_photo_4.jpg
rename to samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_4.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_5.jpg b/samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_5.jpg
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/gallery_photo_5.jpg
rename to samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_5.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_6.jpg b/samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_6.jpg
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/gallery_photo_6.jpg
rename to samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_6.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_7.jpg b/samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_7.jpg
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/gallery_photo_7.jpg
rename to samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_7.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_8.jpg b/samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_8.jpg
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/gallery_photo_8.jpg
rename to samples/SupportLeanbackDemos/src/main/res/drawable/gallery_photo_8.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/google_android.png b/samples/SupportLeanbackDemos/src/main/res/drawable/google_android.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/google_android.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable/google_android.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/google_logo.png b/samples/SupportLeanbackDemos/src/main/res/drawable/google_logo.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/google_logo.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable/google_logo.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/google_map.jpg b/samples/SupportLeanbackDemos/src/main/res/drawable/google_map.jpg
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/google_map.jpg
rename to samples/SupportLeanbackDemos/src/main/res/drawable/google_map.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/google_photo.jpeg b/samples/SupportLeanbackDemos/src/main/res/drawable/google_photo.jpeg
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/google_photo.jpeg
rename to samples/SupportLeanbackDemos/src/main/res/drawable/google_photo.jpeg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_action_a.png b/samples/SupportLeanbackDemos/src/main/res/drawable/ic_action_a.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/ic_action_a.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable/ic_action_a.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_a.png b/samples/SupportLeanbackDemos/src/main/res/drawable/ic_guidedstep_option_a.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_a.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable/ic_guidedstep_option_a.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_b.png b/samples/SupportLeanbackDemos/src/main/res/drawable/ic_guidedstep_option_b.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_b.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable/ic_guidedstep_option_b.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_c.png b/samples/SupportLeanbackDemos/src/main/res/drawable/ic_guidedstep_option_c.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_c.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable/ic_guidedstep_option_c.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_title.png b/samples/SupportLeanbackDemos/src/main/res/drawable/ic_title.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/ic_title.png
rename to samples/SupportLeanbackDemos/src/main/res/drawable/ic_title.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/spiderman.jpg b/samples/SupportLeanbackDemos/src/main/res/drawable/spiderman.jpg
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/spiderman.jpg
rename to samples/SupportLeanbackDemos/src/main/res/drawable/spiderman.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/text_bg.xml b/samples/SupportLeanbackDemos/src/main/res/drawable/text_bg.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/text_bg.xml
rename to samples/SupportLeanbackDemos/src/main/res/drawable/text_bg.xml
diff --git a/samples/SupportLeanbackDemos/res/drawable/tv_content.xml b/samples/SupportLeanbackDemos/src/main/res/drawable/tv_content.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/drawable/tv_content.xml
rename to samples/SupportLeanbackDemos/src/main/res/drawable/tv_content.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/activity_music_example.xml b/samples/SupportLeanbackDemos/src/main/res/layout/activity_music_example.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/activity_music_example.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/activity_music_example.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/browse.xml b/samples/SupportLeanbackDemos/src/main/res/layout/browse.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/browse.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/browse.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/browse_animation.xml b/samples/SupportLeanbackDemos/src/main/res/layout/browse_animation.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/browse_animation.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/browse_animation.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/browse_support.xml b/samples/SupportLeanbackDemos/src/main/res/layout/browse_support.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/browse_support.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/browse_support.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/custom_title.xml b/samples/SupportLeanbackDemos/src/main/res/layout/custom_title.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/custom_title.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/custom_title.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/details_activity.xml b/samples/SupportLeanbackDemos/src/main/res/layout/details_activity.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/details_activity.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/details_activity.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/guided_step_activity.xml b/samples/SupportLeanbackDemos/src/main/res/layout/guided_step_activity.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/guided_step_activity.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/guided_step_activity.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/guidedstep_second_guidance.xml b/samples/SupportLeanbackDemos/src/main/res/layout/guidedstep_second_guidance.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/guidedstep_second_guidance.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/guidedstep_second_guidance.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/horizontal_grid.xml b/samples/SupportLeanbackDemos/src/main/res/layout/horizontal_grid.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/horizontal_grid.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/horizontal_grid.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/onboarding.xml b/samples/SupportLeanbackDemos/src/main/res/layout/onboarding.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/onboarding.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/onboarding.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/onboarding_content.xml b/samples/SupportLeanbackDemos/src/main/res/layout/onboarding_content.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/onboarding_content.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/onboarding_content.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/onboarding_image.xml b/samples/SupportLeanbackDemos/src/main/res/layout/onboarding_image.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/onboarding_image.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/onboarding_image.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/page_fragment.xml b/samples/SupportLeanbackDemos/src/main/res/layout/page_fragment.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/page_fragment.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/page_fragment.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/playback_activity.xml b/samples/SupportLeanbackDemos/src/main/res/layout/playback_activity.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/playback_activity.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/playback_activity.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/playback_activity_support.xml b/samples/SupportLeanbackDemos/src/main/res/layout/playback_activity_support.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/playback_activity_support.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/playback_activity_support.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/playback_controls.xml b/samples/SupportLeanbackDemos/src/main/res/layout/playback_controls.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/playback_controls.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/playback_controls.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/playback_controls_support.xml b/samples/SupportLeanbackDemos/src/main/res/layout/playback_controls_support.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/playback_controls_support.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/playback_controls_support.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/playback_transportcontrol_activity.xml b/samples/SupportLeanbackDemos/src/main/res/layout/playback_transportcontrol_activity.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/playback_transportcontrol_activity.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/playback_transportcontrol_activity.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/playback_transportcontrol_activity_support.xml b/samples/SupportLeanbackDemos/src/main/res/layout/playback_transportcontrol_activity_support.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/playback_transportcontrol_activity_support.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/playback_transportcontrol_activity_support.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/rows.xml b/samples/SupportLeanbackDemos/src/main/res/layout/rows.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/rows.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/rows.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/rows_support.xml b/samples/SupportLeanbackDemos/src/main/res/layout/rows_support.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/rows_support.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/rows_support.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/search.xml b/samples/SupportLeanbackDemos/src/main/res/layout/search.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/search.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/search.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/search_support.xml b/samples/SupportLeanbackDemos/src/main/res/layout/search_support.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/search_support.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/search_support.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/settings.xml b/samples/SupportLeanbackDemos/src/main/res/layout/settings.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/settings.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/settings.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/vertical_grid.xml b/samples/SupportLeanbackDemos/src/main/res/layout/vertical_grid.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/vertical_grid.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/vertical_grid.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/vertical_grid_support.xml b/samples/SupportLeanbackDemos/src/main/res/layout/vertical_grid_support.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/vertical_grid_support.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/vertical_grid_support.xml
diff --git a/samples/SupportLeanbackDemos/res/layout/video_activity_detailed_card.xml b/samples/SupportLeanbackDemos/src/main/res/layout/video_activity_detailed_card.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/layout/video_activity_detailed_card.xml
rename to samples/SupportLeanbackDemos/src/main/res/layout/video_activity_detailed_card.xml
diff --git a/samples/SupportLeanbackDemos/res/mipmap-xhdpi/app_banner_sample_app.png b/samples/SupportLeanbackDemos/src/main/res/mipmap-xhdpi/app_banner_sample_app.png
similarity index 100%
rename from samples/SupportLeanbackDemos/res/mipmap-xhdpi/app_banner_sample_app.png
rename to samples/SupportLeanbackDemos/src/main/res/mipmap-xhdpi/app_banner_sample_app.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/raw/browse.mp4 b/samples/SupportLeanbackDemos/src/main/res/raw/browse.mp4
similarity index 100%
rename from samples/SupportLeanbackDemos/res/raw/browse.mp4
rename to samples/SupportLeanbackDemos/src/main/res/raw/browse.mp4
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/raw/media.json b/samples/SupportLeanbackDemos/src/main/res/raw/media.json
similarity index 100%
rename from samples/SupportLeanbackDemos/res/raw/media.json
rename to samples/SupportLeanbackDemos/src/main/res/raw/media.json
diff --git a/samples/SupportLeanbackDemos/res/raw/media0.mp3 b/samples/SupportLeanbackDemos/src/main/res/raw/media0.mp3
similarity index 100%
rename from samples/SupportLeanbackDemos/res/raw/media0.mp3
rename to samples/SupportLeanbackDemos/src/main/res/raw/media0.mp3
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/raw/media1.mp3 b/samples/SupportLeanbackDemos/src/main/res/raw/media1.mp3
similarity index 100%
rename from samples/SupportLeanbackDemos/res/raw/media1.mp3
rename to samples/SupportLeanbackDemos/src/main/res/raw/media1.mp3
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/values/arrays.xml b/samples/SupportLeanbackDemos/src/main/res/values/arrays.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/values/arrays.xml
rename to samples/SupportLeanbackDemos/src/main/res/values/arrays.xml
diff --git a/samples/SupportLeanbackDemos/res/values/colors.xml b/samples/SupportLeanbackDemos/src/main/res/values/colors.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/values/colors.xml
rename to samples/SupportLeanbackDemos/src/main/res/values/colors.xml
diff --git a/samples/SupportLeanbackDemos/res/values/strings.xml b/samples/SupportLeanbackDemos/src/main/res/values/strings.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/values/strings.xml
rename to samples/SupportLeanbackDemos/src/main/res/values/strings.xml
diff --git a/samples/SupportLeanbackDemos/res/values/styles.xml b/samples/SupportLeanbackDemos/src/main/res/values/styles.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/values/styles.xml
rename to samples/SupportLeanbackDemos/src/main/res/values/styles.xml
diff --git a/samples/SupportLeanbackDemos/res/values/themes.xml b/samples/SupportLeanbackDemos/src/main/res/values/themes.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/values/themes.xml
rename to samples/SupportLeanbackDemos/src/main/res/values/themes.xml
diff --git a/samples/SupportLeanbackDemos/res/xml/prefs.xml b/samples/SupportLeanbackDemos/src/main/res/xml/prefs.xml
similarity index 100%
rename from samples/SupportLeanbackDemos/res/xml/prefs.xml
rename to samples/SupportLeanbackDemos/src/main/res/xml/prefs.xml
diff --git a/samples/SupportLeanbackJank/build.gradle b/samples/SupportLeanbackJank/build.gradle
index 2d40ef3..eef9986 100644
--- a/samples/SupportLeanbackJank/build.gradle
+++ b/samples/SupportLeanbackJank/build.gradle
@@ -21,13 +21,6 @@
         }
     }
 
-    sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['src']
-        main.aidl.srcDirs = ['src']
-        main.res.srcDirs = ['res']
-    }
-
     signingConfigs {
         debug {
             // Use a local debug keystore to avoid build server issues.
diff --git a/samples/SupportLeanbackJank/AndroidManifest.xml b/samples/SupportLeanbackJank/src/main/AndroidManifest.xml
similarity index 100%
rename from samples/SupportLeanbackJank/AndroidManifest.xml
rename to samples/SupportLeanbackJank/src/main/AndroidManifest.xml
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/IntentDefaults.java b/samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/IntentDefaults.java
similarity index 100%
rename from samples/SupportLeanbackJank/src/com/google/android/leanbackjank/IntentDefaults.java
rename to samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/IntentDefaults.java
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/IntentKeys.java b/samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/IntentKeys.java
similarity index 100%
rename from samples/SupportLeanbackJank/src/com/google/android/leanbackjank/IntentKeys.java
rename to samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/IntentKeys.java
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/data/VideoProvider.java b/samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/data/VideoProvider.java
similarity index 100%
rename from samples/SupportLeanbackJank/src/com/google/android/leanbackjank/data/VideoProvider.java
rename to samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/data/VideoProvider.java
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/model/VideoInfo.java b/samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/model/VideoInfo.java
similarity index 100%
rename from samples/SupportLeanbackJank/src/com/google/android/leanbackjank/model/VideoInfo.java
rename to samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/model/VideoInfo.java
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/presenter/CardPresenter.java b/samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/presenter/CardPresenter.java
similarity index 100%
rename from samples/SupportLeanbackJank/src/com/google/android/leanbackjank/presenter/CardPresenter.java
rename to samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/presenter/CardPresenter.java
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/presenter/GridItemPresenter.java b/samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/presenter/GridItemPresenter.java
similarity index 100%
rename from samples/SupportLeanbackJank/src/com/google/android/leanbackjank/presenter/GridItemPresenter.java
rename to samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/presenter/GridItemPresenter.java
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/presenter/HeaderItemPresenter.java b/samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/presenter/HeaderItemPresenter.java
similarity index 100%
rename from samples/SupportLeanbackJank/src/com/google/android/leanbackjank/presenter/HeaderItemPresenter.java
rename to samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/presenter/HeaderItemPresenter.java
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/ui/MainActivity.java b/samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/ui/MainActivity.java
similarity index 100%
rename from samples/SupportLeanbackJank/src/com/google/android/leanbackjank/ui/MainActivity.java
rename to samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/ui/MainActivity.java
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/ui/MainFragment.java b/samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/ui/MainFragment.java
similarity index 100%
rename from samples/SupportLeanbackJank/src/com/google/android/leanbackjank/ui/MainFragment.java
rename to samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/ui/MainFragment.java
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/ui/VideoActivity.java b/samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/ui/VideoActivity.java
similarity index 100%
rename from samples/SupportLeanbackJank/src/com/google/android/leanbackjank/ui/VideoActivity.java
rename to samples/SupportLeanbackJank/src/main/java/com/google/android/leanbackjank/ui/VideoActivity.java
diff --git a/samples/SupportLeanbackJank/res/drawable/android_header.png b/samples/SupportLeanbackJank/src/main/res/drawable/android_header.png
similarity index 100%
rename from samples/SupportLeanbackJank/res/drawable/android_header.png
rename to samples/SupportLeanbackJank/src/main/res/drawable/android_header.png
Binary files differ
diff --git a/samples/SupportLeanbackJank/res/drawable/app_banner.png b/samples/SupportLeanbackJank/src/main/res/drawable/app_banner.png
similarity index 100%
rename from samples/SupportLeanbackJank/res/drawable/app_banner.png
rename to samples/SupportLeanbackJank/src/main/res/drawable/app_banner.png
Binary files differ
diff --git a/samples/SupportLeanbackJank/res/drawable/default_background.xml b/samples/SupportLeanbackJank/src/main/res/drawable/default_background.xml
similarity index 100%
rename from samples/SupportLeanbackJank/res/drawable/default_background.xml
rename to samples/SupportLeanbackJank/src/main/res/drawable/default_background.xml
diff --git a/samples/SupportLeanbackJank/res/drawable/movie.png b/samples/SupportLeanbackJank/src/main/res/drawable/movie.png
similarity index 100%
rename from samples/SupportLeanbackJank/res/drawable/movie.png
rename to samples/SupportLeanbackJank/src/main/res/drawable/movie.png
Binary files differ
diff --git a/samples/SupportLeanbackJank/res/layout/header_item.xml b/samples/SupportLeanbackJank/src/main/res/layout/header_item.xml
similarity index 100%
rename from samples/SupportLeanbackJank/res/layout/header_item.xml
rename to samples/SupportLeanbackJank/src/main/res/layout/header_item.xml
diff --git a/samples/SupportLeanbackJank/res/layout/main.xml b/samples/SupportLeanbackJank/src/main/res/layout/main.xml
similarity index 100%
rename from samples/SupportLeanbackJank/res/layout/main.xml
rename to samples/SupportLeanbackJank/src/main/res/layout/main.xml
diff --git a/samples/SupportLeanbackJank/res/raw/bbb_360p.mp4 b/samples/SupportLeanbackJank/src/main/res/raw/bbb_360p.mp4
similarity index 100%
rename from samples/SupportLeanbackJank/res/raw/bbb_360p.mp4
rename to samples/SupportLeanbackJank/src/main/res/raw/bbb_360p.mp4
Binary files differ
diff --git a/samples/SupportLeanbackJank/res/raw/bbb_480p.mp4 b/samples/SupportLeanbackJank/src/main/res/raw/bbb_480p.mp4
similarity index 100%
rename from samples/SupportLeanbackJank/res/raw/bbb_480p.mp4
rename to samples/SupportLeanbackJank/src/main/res/raw/bbb_480p.mp4
Binary files differ
diff --git a/samples/SupportLeanbackJank/res/raw/bbb_sunflower_2160p_60fps.mp4 b/samples/SupportLeanbackJank/src/main/res/raw/bbb_sunflower_2160p_60fps.mp4
similarity index 100%
rename from samples/SupportLeanbackJank/res/raw/bbb_sunflower_2160p_60fps.mp4
rename to samples/SupportLeanbackJank/src/main/res/raw/bbb_sunflower_2160p_60fps.mp4
Binary files differ
diff --git a/samples/SupportLeanbackJank/res/raw/testvideo_1080p_60fps.mp4 b/samples/SupportLeanbackJank/src/main/res/raw/testvideo_1080p_60fps.mp4
similarity index 100%
rename from samples/SupportLeanbackJank/res/raw/testvideo_1080p_60fps.mp4
rename to samples/SupportLeanbackJank/src/main/res/raw/testvideo_1080p_60fps.mp4
Binary files differ
diff --git a/samples/SupportLeanbackJank/res/values-v21/styles.xml b/samples/SupportLeanbackJank/src/main/res/values-v21/styles.xml
similarity index 100%
rename from samples/SupportLeanbackJank/res/values-v21/styles.xml
rename to samples/SupportLeanbackJank/src/main/res/values-v21/styles.xml
diff --git a/samples/SupportLeanbackJank/res/values/colors.xml b/samples/SupportLeanbackJank/src/main/res/values/colors.xml
similarity index 100%
rename from samples/SupportLeanbackJank/res/values/colors.xml
rename to samples/SupportLeanbackJank/src/main/res/values/colors.xml
diff --git a/samples/SupportLeanbackJank/res/values/dimens.xml b/samples/SupportLeanbackJank/src/main/res/values/dimens.xml
similarity index 100%
rename from samples/SupportLeanbackJank/res/values/dimens.xml
rename to samples/SupportLeanbackJank/src/main/res/values/dimens.xml
diff --git a/samples/SupportLeanbackJank/res/values/strings.xml b/samples/SupportLeanbackJank/src/main/res/values/strings.xml
similarity index 100%
rename from samples/SupportLeanbackJank/res/values/strings.xml
rename to samples/SupportLeanbackJank/src/main/res/values/strings.xml
diff --git a/samples/SupportLeanbackJank/res/values/styles.xml b/samples/SupportLeanbackJank/src/main/res/values/styles.xml
similarity index 100%
rename from samples/SupportLeanbackJank/res/values/styles.xml
rename to samples/SupportLeanbackJank/src/main/res/values/styles.xml
diff --git a/samples/SupportPercentDemos/build.gradle b/samples/SupportPercentDemos/build.gradle
index 251678d..cec4b03 100644
--- a/samples/SupportPercentDemos/build.gradle
+++ b/samples/SupportPercentDemos/build.gradle
@@ -12,12 +12,6 @@
         targetSdkVersion project.ext.currentSdk
     }
 
-    sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['src']
-        main.res.srcDirs = ['res']
-    }
-
     lintOptions {
         abortOnError true
         check 'NewApi'
diff --git a/samples/SupportPercentDemos/AndroidManifest.xml b/samples/SupportPercentDemos/src/main/AndroidManifest.xml
similarity index 100%
rename from samples/SupportPercentDemos/AndroidManifest.xml
rename to samples/SupportPercentDemos/src/main/AndroidManifest.xml
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/IncludePercentFrameLayoutActivity.java b/samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/IncludePercentFrameLayoutActivity.java
similarity index 100%
rename from samples/SupportPercentDemos/src/com/example/android/support/percent/IncludePercentFrameLayoutActivity.java
rename to samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/IncludePercentFrameLayoutActivity.java
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentFrameLayoutActivityHPaddings.java b/samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/PercentFrameLayoutActivityHPaddings.java
similarity index 100%
rename from samples/SupportPercentDemos/src/com/example/android/support/percent/PercentFrameLayoutActivityHPaddings.java
rename to samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/PercentFrameLayoutActivityHPaddings.java
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentFrameLayoutActivityVPaddings.java b/samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/PercentFrameLayoutActivityVPaddings.java
similarity index 100%
rename from samples/SupportPercentDemos/src/com/example/android/support/percent/PercentFrameLayoutActivityVPaddings.java
rename to samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/PercentFrameLayoutActivityVPaddings.java
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentRelativeLayoutActivityHPaddings.java b/samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/PercentRelativeLayoutActivityHPaddings.java
similarity index 100%
rename from samples/SupportPercentDemos/src/com/example/android/support/percent/PercentRelativeLayoutActivityHPaddings.java
rename to samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/PercentRelativeLayoutActivityHPaddings.java
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentRelativeLayoutActivityVPaddings.java b/samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/PercentRelativeLayoutActivityVPaddings.java
similarity index 100%
rename from samples/SupportPercentDemos/src/com/example/android/support/percent/PercentRelativeLayoutActivityVPaddings.java
rename to samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/PercentRelativeLayoutActivityVPaddings.java
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/SimplePercentFrameLayoutActivity.java b/samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/SimplePercentFrameLayoutActivity.java
similarity index 100%
rename from samples/SupportPercentDemos/src/com/example/android/support/percent/SimplePercentFrameLayoutActivity.java
rename to samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/SimplePercentFrameLayoutActivity.java
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/SimplePercentRelativeLayoutActivity.java b/samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/SimplePercentRelativeLayoutActivity.java
similarity index 100%
rename from samples/SupportPercentDemos/src/com/example/android/support/percent/SimplePercentRelativeLayoutActivity.java
rename to samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/SimplePercentRelativeLayoutActivity.java
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/SupportPercentDemos.java b/samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/SupportPercentDemos.java
similarity index 100%
rename from samples/SupportPercentDemos/src/com/example/android/support/percent/SupportPercentDemos.java
rename to samples/SupportPercentDemos/src/main/java/com/example/android/support/percent/SupportPercentDemos.java
diff --git a/samples/SupportPercentDemos/res/drawable-hdpi/app_sample_code.png b/samples/SupportPercentDemos/src/main/res/drawable-hdpi/app_sample_code.png
similarity index 100%
rename from samples/SupportPercentDemos/res/drawable-hdpi/app_sample_code.png
rename to samples/SupportPercentDemos/src/main/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportPercentDemos/res/drawable-mdpi/app_sample_code.png b/samples/SupportPercentDemos/src/main/res/drawable-mdpi/app_sample_code.png
similarity index 100%
rename from samples/SupportPercentDemos/res/drawable-mdpi/app_sample_code.png
rename to samples/SupportPercentDemos/src/main/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportPercentDemos/res/layout/include_percent_frame_layout_activity.xml b/samples/SupportPercentDemos/src/main/res/layout/include_percent_frame_layout_activity.xml
similarity index 100%
rename from samples/SupportPercentDemos/res/layout/include_percent_frame_layout_activity.xml
rename to samples/SupportPercentDemos/src/main/res/layout/include_percent_frame_layout_activity.xml
diff --git a/samples/SupportPercentDemos/res/layout/include_percent_frame_layout_content.xml b/samples/SupportPercentDemos/src/main/res/layout/include_percent_frame_layout_content.xml
similarity index 100%
rename from samples/SupportPercentDemos/res/layout/include_percent_frame_layout_content.xml
rename to samples/SupportPercentDemos/src/main/res/layout/include_percent_frame_layout_content.xml
diff --git a/samples/SupportPercentDemos/res/layout/percent_frame_layout_activity_hpaddings.xml b/samples/SupportPercentDemos/src/main/res/layout/percent_frame_layout_activity_hpaddings.xml
similarity index 100%
rename from samples/SupportPercentDemos/res/layout/percent_frame_layout_activity_hpaddings.xml
rename to samples/SupportPercentDemos/src/main/res/layout/percent_frame_layout_activity_hpaddings.xml
diff --git a/samples/SupportPercentDemos/res/layout/percent_frame_layout_activity_vpaddings.xml b/samples/SupportPercentDemos/src/main/res/layout/percent_frame_layout_activity_vpaddings.xml
similarity index 100%
rename from samples/SupportPercentDemos/res/layout/percent_frame_layout_activity_vpaddings.xml
rename to samples/SupportPercentDemos/src/main/res/layout/percent_frame_layout_activity_vpaddings.xml
diff --git a/samples/SupportPercentDemos/res/layout/percent_relative_layout_activity_hpaddings.xml b/samples/SupportPercentDemos/src/main/res/layout/percent_relative_layout_activity_hpaddings.xml
similarity index 100%
rename from samples/SupportPercentDemos/res/layout/percent_relative_layout_activity_hpaddings.xml
rename to samples/SupportPercentDemos/src/main/res/layout/percent_relative_layout_activity_hpaddings.xml
diff --git a/samples/SupportPercentDemos/res/layout/percent_relative_layout_activity_vpaddings.xml b/samples/SupportPercentDemos/src/main/res/layout/percent_relative_layout_activity_vpaddings.xml
similarity index 100%
rename from samples/SupportPercentDemos/res/layout/percent_relative_layout_activity_vpaddings.xml
rename to samples/SupportPercentDemos/src/main/res/layout/percent_relative_layout_activity_vpaddings.xml
diff --git a/samples/SupportPercentDemos/res/layout/simple_percent_frame_layout_activity.xml b/samples/SupportPercentDemos/src/main/res/layout/simple_percent_frame_layout_activity.xml
similarity index 100%
rename from samples/SupportPercentDemos/res/layout/simple_percent_frame_layout_activity.xml
rename to samples/SupportPercentDemos/src/main/res/layout/simple_percent_frame_layout_activity.xml
diff --git a/samples/SupportPercentDemos/res/layout/simple_percent_relative_layout_activity.xml b/samples/SupportPercentDemos/src/main/res/layout/simple_percent_relative_layout_activity.xml
similarity index 100%
rename from samples/SupportPercentDemos/res/layout/simple_percent_relative_layout_activity.xml
rename to samples/SupportPercentDemos/src/main/res/layout/simple_percent_relative_layout_activity.xml
diff --git a/samples/SupportPercentDemos/res/values/strings.xml b/samples/SupportPercentDemos/src/main/res/values/strings.xml
similarity index 100%
rename from samples/SupportPercentDemos/res/values/strings.xml
rename to samples/SupportPercentDemos/src/main/res/values/strings.xml
diff --git a/samples/SupportPreferenceDemos/build.gradle b/samples/SupportPreferenceDemos/build.gradle
index 6e78088..f720b92 100644
--- a/samples/SupportPreferenceDemos/build.gradle
+++ b/samples/SupportPreferenceDemos/build.gradle
@@ -17,12 +17,6 @@
         targetSdkVersion project.ext.currentSdk
     }
 
-    sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['src']
-        main.res.srcDirs = ['res']
-    }
-
     signingConfigs {
         debug {
             // Use a local debug keystore to avoid build server issues.
diff --git a/samples/SupportPreferenceDemos/AndroidManifest.xml b/samples/SupportPreferenceDemos/src/main/AndroidManifest.xml
similarity index 100%
rename from samples/SupportPreferenceDemos/AndroidManifest.xml
rename to samples/SupportPreferenceDemos/src/main/AndroidManifest.xml
diff --git a/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferences.java b/samples/SupportPreferenceDemos/src/main/java/com/example/android/supportpreference/FragmentSupportPreferences.java
similarity index 100%
rename from samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferences.java
rename to samples/SupportPreferenceDemos/src/main/java/com/example/android/supportpreference/FragmentSupportPreferences.java
diff --git a/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesCompat.java b/samples/SupportPreferenceDemos/src/main/java/com/example/android/supportpreference/FragmentSupportPreferencesCompat.java
similarity index 100%
rename from samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesCompat.java
rename to samples/SupportPreferenceDemos/src/main/java/com/example/android/supportpreference/FragmentSupportPreferencesCompat.java
diff --git a/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java b/samples/SupportPreferenceDemos/src/main/java/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java
similarity index 100%
rename from samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java
rename to samples/SupportPreferenceDemos/src/main/java/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java
diff --git a/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/SupportPreferenceDemos.java b/samples/SupportPreferenceDemos/src/main/java/com/example/android/supportpreference/SupportPreferenceDemos.java
similarity index 100%
rename from samples/SupportPreferenceDemos/src/com/example/android/supportpreference/SupportPreferenceDemos.java
rename to samples/SupportPreferenceDemos/src/main/java/com/example/android/supportpreference/SupportPreferenceDemos.java
diff --git a/samples/SupportPreferenceDemos/res/drawable-hdpi/app_sample_code.png b/samples/SupportPreferenceDemos/src/main/res/drawable-hdpi/app_sample_code.png
similarity index 100%
rename from samples/SupportPreferenceDemos/res/drawable-hdpi/app_sample_code.png
rename to samples/SupportPreferenceDemos/src/main/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportPreferenceDemos/res/drawable-mdpi/app_sample_code.png b/samples/SupportPreferenceDemos/src/main/res/drawable-mdpi/app_sample_code.png
similarity index 100%
rename from samples/SupportPreferenceDemos/res/drawable-mdpi/app_sample_code.png
rename to samples/SupportPreferenceDemos/src/main/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportPreferenceDemos/res/values-v17/bools.xml b/samples/SupportPreferenceDemos/src/main/res/values-v17/bools.xml
similarity index 100%
rename from samples/SupportPreferenceDemos/res/values-v17/bools.xml
rename to samples/SupportPreferenceDemos/src/main/res/values-v17/bools.xml
diff --git a/samples/SupportPreferenceDemos/res/values-v21/styles.xml b/samples/SupportPreferenceDemos/src/main/res/values-v21/styles.xml
similarity index 100%
rename from samples/SupportPreferenceDemos/res/values-v21/styles.xml
rename to samples/SupportPreferenceDemos/src/main/res/values-v21/styles.xml
diff --git a/samples/SupportPreferenceDemos/res/values/arrays.xml b/samples/SupportPreferenceDemos/src/main/res/values/arrays.xml
similarity index 100%
rename from samples/SupportPreferenceDemos/res/values/arrays.xml
rename to samples/SupportPreferenceDemos/src/main/res/values/arrays.xml
diff --git a/samples/SupportPreferenceDemos/res/values/bools.xml b/samples/SupportPreferenceDemos/src/main/res/values/bools.xml
similarity index 100%
rename from samples/SupportPreferenceDemos/res/values/bools.xml
rename to samples/SupportPreferenceDemos/src/main/res/values/bools.xml
diff --git a/samples/SupportPreferenceDemos/res/values/strings.xml b/samples/SupportPreferenceDemos/src/main/res/values/strings.xml
similarity index 100%
rename from samples/SupportPreferenceDemos/res/values/strings.xml
rename to samples/SupportPreferenceDemos/src/main/res/values/strings.xml
diff --git a/samples/SupportPreferenceDemos/res/values/styles.xml b/samples/SupportPreferenceDemos/src/main/res/values/styles.xml
similarity index 100%
rename from samples/SupportPreferenceDemos/res/values/styles.xml
rename to samples/SupportPreferenceDemos/src/main/res/values/styles.xml
diff --git a/samples/SupportPreferenceDemos/res/xml/preferences.xml b/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml
similarity index 100%
rename from samples/SupportPreferenceDemos/res/xml/preferences.xml
rename to samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml
diff --git a/samples/SupportTransitionDemos/build.gradle b/samples/SupportTransitionDemos/build.gradle
index 6b34453..8719221 100644
--- a/samples/SupportTransitionDemos/build.gradle
+++ b/samples/SupportTransitionDemos/build.gradle
@@ -13,12 +13,6 @@
         targetSdkVersion project.ext.currentSdk
     }
 
-    sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['src']
-        main.res.srcDirs = ['res']
-    }
-
     lintOptions {
         abortOnError true
         check 'NewApi'
diff --git a/samples/SupportTransitionDemos/AndroidManifest.xml b/samples/SupportTransitionDemos/src/main/AndroidManifest.xml
similarity index 100%
rename from samples/SupportTransitionDemos/AndroidManifest.xml
rename to samples/SupportTransitionDemos/src/main/AndroidManifest.xml
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/SupportTransitionDemos.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/SupportTransitionDemos.java
similarity index 100%
rename from samples/SupportTransitionDemos/src/com/example/android/support/transition/SupportTransitionDemos.java
rename to samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/SupportTransitionDemos.java
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ArcMotionUsage.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ArcMotionUsage.java
similarity index 100%
rename from samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ArcMotionUsage.java
rename to samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ArcMotionUsage.java
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/BeginDelayedUsage.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/BeginDelayedUsage.java
similarity index 100%
rename from samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/BeginDelayedUsage.java
rename to samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/BeginDelayedUsage.java
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeClipBoundsUsage.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeClipBoundsUsage.java
similarity index 100%
rename from samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeClipBoundsUsage.java
rename to samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeClipBoundsUsage.java
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeColor.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeColor.java
similarity index 100%
rename from samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeColor.java
rename to samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeColor.java
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeImageTransformUsage.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeImageTransformUsage.java
similarity index 100%
rename from samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeImageTransformUsage.java
rename to samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeImageTransformUsage.java
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeTransformUsage.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeTransformUsage.java
similarity index 100%
rename from samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ChangeTransformUsage.java
rename to samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeTransformUsage.java
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/CustomUsage.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/CustomUsage.java
similarity index 100%
rename from samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/CustomUsage.java
rename to samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/CustomUsage.java
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ExplodeUsage.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ExplodeUsage.java
similarity index 100%
rename from samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ExplodeUsage.java
rename to samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ExplodeUsage.java
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/FragmentTransitionUsage.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/FragmentTransitionUsage.java
similarity index 100%
rename from samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/FragmentTransitionUsage.java
rename to samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/FragmentTransitionUsage.java
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ReparentImageUsage.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ReparentImageUsage.java
similarity index 100%
rename from samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/ReparentImageUsage.java
rename to samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ReparentImageUsage.java
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/SceneUsage.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/SceneUsage.java
similarity index 100%
rename from samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/SceneUsage.java
rename to samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/SceneUsage.java
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/SceneUsageBase.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/SceneUsageBase.java
similarity index 100%
rename from samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/SceneUsageBase.java
rename to samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/SceneUsageBase.java
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/TransitionUsageBase.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/TransitionUsageBase.java
similarity index 100%
rename from samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/TransitionUsageBase.java
rename to samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/TransitionUsageBase.java
diff --git a/samples/SupportTransitionDemos/res/drawable-hdpi/app_sample_code.png b/samples/SupportTransitionDemos/src/main/res/drawable-hdpi/app_sample_code.png
similarity index 100%
rename from samples/SupportTransitionDemos/res/drawable-hdpi/app_sample_code.png
rename to samples/SupportTransitionDemos/src/main/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-hdpi/ic_action_navigation_menu.png b/samples/SupportTransitionDemos/src/main/res/drawable-hdpi/ic_action_navigation_menu.png
similarity index 100%
rename from samples/SupportTransitionDemos/res/drawable-hdpi/ic_action_navigation_menu.png
rename to samples/SupportTransitionDemos/src/main/res/drawable-hdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-hdpi/ic_android.png b/samples/SupportTransitionDemos/src/main/res/drawable-hdpi/ic_android.png
similarity index 100%
rename from samples/SupportTransitionDemos/res/drawable-hdpi/ic_android.png
rename to samples/SupportTransitionDemos/src/main/res/drawable-hdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-mdpi/app_sample_code.png b/samples/SupportTransitionDemos/src/main/res/drawable-mdpi/app_sample_code.png
similarity index 100%
rename from samples/SupportTransitionDemos/res/drawable-mdpi/app_sample_code.png
rename to samples/SupportTransitionDemos/src/main/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-mdpi/ic_action_navigation_menu.png b/samples/SupportTransitionDemos/src/main/res/drawable-mdpi/ic_action_navigation_menu.png
similarity index 100%
rename from samples/SupportTransitionDemos/res/drawable-mdpi/ic_action_navigation_menu.png
rename to samples/SupportTransitionDemos/src/main/res/drawable-mdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-mdpi/ic_android.png b/samples/SupportTransitionDemos/src/main/res/drawable-mdpi/ic_android.png
similarity index 100%
rename from samples/SupportTransitionDemos/res/drawable-mdpi/ic_android.png
rename to samples/SupportTransitionDemos/src/main/res/drawable-mdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-nodpi/photo.jpg b/samples/SupportTransitionDemos/src/main/res/drawable-nodpi/photo.jpg
similarity index 100%
rename from samples/SupportTransitionDemos/res/drawable-nodpi/photo.jpg
rename to samples/SupportTransitionDemos/src/main/res/drawable-nodpi/photo.jpg
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-xhdpi/ic_action_navigation_menu.png b/samples/SupportTransitionDemos/src/main/res/drawable-xhdpi/ic_action_navigation_menu.png
similarity index 100%
rename from samples/SupportTransitionDemos/res/drawable-xhdpi/ic_action_navigation_menu.png
rename to samples/SupportTransitionDemos/src/main/res/drawable-xhdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-xhdpi/ic_android.png b/samples/SupportTransitionDemos/src/main/res/drawable-xhdpi/ic_android.png
similarity index 100%
rename from samples/SupportTransitionDemos/res/drawable-xhdpi/ic_android.png
rename to samples/SupportTransitionDemos/src/main/res/drawable-xhdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_action_navigation_menu.png b/samples/SupportTransitionDemos/src/main/res/drawable-xxhdpi/ic_action_navigation_menu.png
similarity index 100%
rename from samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_action_navigation_menu.png
rename to samples/SupportTransitionDemos/src/main/res/drawable-xxhdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_add.png b/samples/SupportTransitionDemos/src/main/res/drawable-xxhdpi/ic_add.png
similarity index 100%
rename from samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_add.png
rename to samples/SupportTransitionDemos/src/main/res/drawable-xxhdpi/ic_add.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_android.png b/samples/SupportTransitionDemos/src/main/res/drawable-xxhdpi/ic_android.png
similarity index 100%
rename from samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_android.png
rename to samples/SupportTransitionDemos/src/main/res/drawable-xxhdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-xxxhdpi/ic_android.png b/samples/SupportTransitionDemos/src/main/res/drawable-xxxhdpi/ic_android.png
similarity index 100%
rename from samples/SupportTransitionDemos/res/drawable-xxxhdpi/ic_android.png
rename to samples/SupportTransitionDemos/src/main/res/drawable-xxxhdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/layout/arc_motion.xml b/samples/SupportTransitionDemos/src/main/res/layout/arc_motion.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/arc_motion.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/arc_motion.xml
diff --git a/samples/SupportTransitionDemos/res/layout/begin_delayed.xml b/samples/SupportTransitionDemos/src/main/res/layout/begin_delayed.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/begin_delayed.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/begin_delayed.xml
diff --git a/samples/SupportTransitionDemos/res/layout/change_transform.xml b/samples/SupportTransitionDemos/src/main/res/layout/change_transform.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/change_transform.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/change_transform.xml
diff --git a/samples/SupportTransitionDemos/res/layout/clip_bounds.xml b/samples/SupportTransitionDemos/src/main/res/layout/clip_bounds.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/clip_bounds.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/clip_bounds.xml
diff --git a/samples/SupportTransitionDemos/res/layout/custom0.xml b/samples/SupportTransitionDemos/src/main/res/layout/custom0.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/custom0.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/custom0.xml
diff --git a/samples/SupportTransitionDemos/res/layout/custom1.xml b/samples/SupportTransitionDemos/src/main/res/layout/custom1.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/custom1.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/custom1.xml
diff --git a/samples/SupportTransitionDemos/res/layout/custom2.xml b/samples/SupportTransitionDemos/src/main/res/layout/custom2.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/custom2.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/custom2.xml
diff --git a/samples/SupportTransitionDemos/res/layout/explode.xml b/samples/SupportTransitionDemos/src/main/res/layout/explode.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/explode.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/explode.xml
diff --git a/samples/SupportTransitionDemos/res/layout/fragment_transition.xml b/samples/SupportTransitionDemos/src/main/res/layout/fragment_transition.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/fragment_transition.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/fragment_transition.xml
diff --git a/samples/SupportTransitionDemos/res/layout/fragment_transition_first.xml b/samples/SupportTransitionDemos/src/main/res/layout/fragment_transition_first.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/fragment_transition_first.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/fragment_transition_first.xml
diff --git a/samples/SupportTransitionDemos/res/layout/fragment_transition_second.xml b/samples/SupportTransitionDemos/src/main/res/layout/fragment_transition_second.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/fragment_transition_second.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/fragment_transition_second.xml
diff --git a/samples/SupportTransitionDemos/res/layout/image_transform.xml b/samples/SupportTransitionDemos/src/main/res/layout/image_transform.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/image_transform.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/image_transform.xml
diff --git a/samples/SupportTransitionDemos/res/layout/red_square.xml b/samples/SupportTransitionDemos/src/main/res/layout/red_square.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/red_square.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/red_square.xml
diff --git a/samples/SupportTransitionDemos/res/layout/reparent_image.xml b/samples/SupportTransitionDemos/src/main/res/layout/reparent_image.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/reparent_image.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/reparent_image.xml
diff --git a/samples/SupportTransitionDemos/res/layout/scene0.xml b/samples/SupportTransitionDemos/src/main/res/layout/scene0.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/scene0.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/scene0.xml
diff --git a/samples/SupportTransitionDemos/res/layout/scene1.xml b/samples/SupportTransitionDemos/src/main/res/layout/scene1.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/scene1.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/scene1.xml
diff --git a/samples/SupportTransitionDemos/res/layout/scene_usage.xml b/samples/SupportTransitionDemos/src/main/res/layout/scene_usage.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/layout/scene_usage.xml
rename to samples/SupportTransitionDemos/src/main/res/layout/scene_usage.xml
diff --git a/samples/SupportTransitionDemos/res/menu/basic_usage.xml b/samples/SupportTransitionDemos/src/main/res/menu/basic_usage.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/menu/basic_usage.xml
rename to samples/SupportTransitionDemos/src/main/res/menu/basic_usage.xml
diff --git a/samples/SupportTransitionDemos/res/values/dimens.xml b/samples/SupportTransitionDemos/src/main/res/values/dimens.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/values/dimens.xml
rename to samples/SupportTransitionDemos/src/main/res/values/dimens.xml
diff --git a/samples/SupportTransitionDemos/res/values/strings.xml b/samples/SupportTransitionDemos/src/main/res/values/strings.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/values/strings.xml
rename to samples/SupportTransitionDemos/src/main/res/values/strings.xml
diff --git a/samples/SupportTransitionDemos/res/values/styles.xml b/samples/SupportTransitionDemos/src/main/res/values/styles.xml
similarity index 100%
rename from samples/SupportTransitionDemos/res/values/styles.xml
rename to samples/SupportTransitionDemos/src/main/res/values/styles.xml
diff --git a/samples/SupportVectorDrawableDemos/build.gradle b/samples/SupportVectorDrawableDemos/build.gradle
index c47967c..e9c9d2c 100644
--- a/samples/SupportVectorDrawableDemos/build.gradle
+++ b/samples/SupportVectorDrawableDemos/build.gradle
@@ -31,12 +31,6 @@
         vectorDrawables.useSupportLibrary = true
     }
 
-    sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['src']
-        main.res.srcDirs = ['res']
-    }
-
     signingConfigs {
         debug {
             // Use a local debug keystore to avoid build server issues.
diff --git a/samples/SupportVectorDrawableDemos/AndroidManifest.xml b/samples/SupportVectorDrawableDemos/src/main/AndroidManifest.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/AndroidManifest.xml
rename to samples/SupportVectorDrawableDemos/src/main/AndroidManifest.xml
diff --git a/samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/AVDCListenerDemo.java b/samples/SupportVectorDrawableDemos/src/main/java/com/example/android/support/vectordrawable/app/AVDCListenerDemo.java
similarity index 100%
rename from samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/AVDCListenerDemo.java
rename to samples/SupportVectorDrawableDemos/src/main/java/com/example/android/support/vectordrawable/app/AVDCListenerDemo.java
diff --git a/samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/SimpleAnimatedVectorDrawable.java b/samples/SupportVectorDrawableDemos/src/main/java/com/example/android/support/vectordrawable/app/SimpleAnimatedVectorDrawable.java
similarity index 100%
rename from samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/SimpleAnimatedVectorDrawable.java
rename to samples/SupportVectorDrawableDemos/src/main/java/com/example/android/support/vectordrawable/app/SimpleAnimatedVectorDrawable.java
diff --git a/samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/SimpleStaticVectorDrawable.java b/samples/SupportVectorDrawableDemos/src/main/java/com/example/android/support/vectordrawable/app/SimpleStaticVectorDrawable.java
similarity index 100%
rename from samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/SimpleStaticVectorDrawable.java
rename to samples/SupportVectorDrawableDemos/src/main/java/com/example/android/support/vectordrawable/app/SimpleStaticVectorDrawable.java
diff --git a/samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java b/samples/SupportVectorDrawableDemos/src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java
similarity index 100%
rename from samples/SupportVectorDrawableDemos/src/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java
rename to samples/SupportVectorDrawableDemos/src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java
diff --git a/samples/SupportVectorDrawableDemos/res/anim/alpha_animation_progress_bar.xml b/samples/SupportVectorDrawableDemos/src/main/res/anim/alpha_animation_progress_bar.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/anim/alpha_animation_progress_bar.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/anim/alpha_animation_progress_bar.xml
diff --git a/samples/SupportVectorDrawableDemos/res/anim/animation_grouping_1_control_points_interpolator.xml b/samples/SupportVectorDrawableDemos/src/main/res/anim/animation_grouping_1_control_points_interpolator.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/anim/animation_grouping_1_control_points_interpolator.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/anim/animation_grouping_1_control_points_interpolator.xml
diff --git a/samples/SupportVectorDrawableDemos/res/anim/animation_grouping_1_path_interpolator.xml b/samples/SupportVectorDrawableDemos/src/main/res/anim/animation_grouping_1_path_interpolator.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/anim/animation_grouping_1_path_interpolator.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/anim/animation_grouping_1_path_interpolator.xml
diff --git a/samples/SupportVectorDrawableDemos/res/anim/animation_grouping_1_single_control_point_interpolator.xml b/samples/SupportVectorDrawableDemos/src/main/res/anim/animation_grouping_1_single_control_point_interpolator.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/anim/animation_grouping_1_single_control_point_interpolator.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/anim/animation_grouping_1_single_control_point_interpolator.xml
diff --git a/samples/SupportVectorDrawableDemos/res/anim/ic_hourglass_animation_fill_outlines.xml b/samples/SupportVectorDrawableDemos/src/main/res/anim/ic_hourglass_animation_fill_outlines.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/anim/ic_hourglass_animation_fill_outlines.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/anim/ic_hourglass_animation_fill_outlines.xml
diff --git a/samples/SupportVectorDrawableDemos/res/anim/ic_hourglass_animation_hourglass_frame.xml b/samples/SupportVectorDrawableDemos/src/main/res/anim/ic_hourglass_animation_hourglass_frame.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/anim/ic_hourglass_animation_hourglass_frame.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/anim/ic_hourglass_animation_hourglass_frame.xml
diff --git a/samples/SupportVectorDrawableDemos/res/anim/ic_hourglass_animation_mask_1.xml b/samples/SupportVectorDrawableDemos/src/main/res/anim/ic_hourglass_animation_mask_1.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/anim/ic_hourglass_animation_mask_1.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/anim/ic_hourglass_animation_mask_1.xml
diff --git a/samples/SupportVectorDrawableDemos/res/anim/ic_signal_airplane_v2_animation_cross_1.xml b/samples/SupportVectorDrawableDemos/src/main/res/anim/ic_signal_airplane_v2_animation_cross_1.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/anim/ic_signal_airplane_v2_animation_cross_1.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/anim/ic_signal_airplane_v2_animation_cross_1.xml
diff --git a/samples/SupportVectorDrawableDemos/res/anim/ic_signal_airplane_v2_animation_ic_signal_airplane.xml b/samples/SupportVectorDrawableDemos/src/main/res/anim/ic_signal_airplane_v2_animation_ic_signal_airplane.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/anim/ic_signal_airplane_v2_animation_ic_signal_airplane.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/anim/ic_signal_airplane_v2_animation_ic_signal_airplane.xml
diff --git a/samples/SupportVectorDrawableDemos/res/anim/ic_signal_airplane_v2_animation_mask_2.xml b/samples/SupportVectorDrawableDemos/src/main/res/anim/ic_signal_airplane_v2_animation_mask_2.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/anim/ic_signal_airplane_v2_animation_mask_2.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/anim/ic_signal_airplane_v2_animation_mask_2.xml
diff --git a/samples/SupportVectorDrawableDemos/res/anim/ic_signal_airplane_v2_animation_path_1_1.xml b/samples/SupportVectorDrawableDemos/src/main/res/anim/ic_signal_airplane_v2_animation_path_1_1.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/anim/ic_signal_airplane_v2_animation_path_1_1.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/anim/ic_signal_airplane_v2_animation_path_1_1.xml
diff --git a/samples/SupportVectorDrawableDemos/res/anim/path_motion.xml b/samples/SupportVectorDrawableDemos/src/main/res/anim/path_motion.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/anim/path_motion.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/anim/path_motion.xml
diff --git a/samples/SupportVectorDrawableDemos/res/anim/path_motion_object.xml b/samples/SupportVectorDrawableDemos/src/main/res/anim/path_motion_object.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/anim/path_motion_object.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/anim/path_motion_object.xml
diff --git a/samples/SupportVectorDrawableDemos/res/anim/trim_path_animation_progress_bar.xml b/samples/SupportVectorDrawableDemos/src/main/res/anim/trim_path_animation_progress_bar.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/anim/trim_path_animation_progress_bar.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/anim/trim_path_animation_progress_bar.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_1.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/animation_vector_drawable_grouping_1.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_1.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/animation_vector_drawable_grouping_1.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_1_path_motion.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/animation_vector_drawable_grouping_1_path_motion.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_1_path_motion.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/animation_vector_drawable_grouping_1_path_motion.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_1_path_motion_object.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/animation_vector_drawable_grouping_1_path_motion_object.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_1_path_motion_object.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/animation_vector_drawable_grouping_1_path_motion_object.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_accelerate.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/animation_vector_drawable_grouping_accelerate.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_accelerate.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/animation_vector_drawable_grouping_accelerate.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_decelerate.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/animation_vector_drawable_grouping_decelerate.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/animation_vector_drawable_grouping_decelerate.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/animation_vector_drawable_grouping_decelerate.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/animation_vector_progress_bar.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/animation_vector_progress_bar.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/animation_vector_progress_bar.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/animation_vector_progress_bar.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/app_sample_code.png b/samples/SupportVectorDrawableDemos/src/main/res/drawable/app_sample_code.png
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/app_sample_code.png
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/app_sample_code.png
Binary files differ
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/btn_radio_on_to_off_bundle.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/btn_radio_on_to_off_bundle.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/btn_radio_on_to_off_bundle.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/btn_radio_on_to_off_bundle.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/ic_hourglass.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/ic_hourglass.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/ic_hourglass.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/ic_hourglass.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/ic_hourglass_animation.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/ic_hourglass_animation.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/ic_hourglass_animation.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/ic_hourglass_animation.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/ic_signal_airplane_v2.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/ic_signal_airplane_v2.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/ic_signal_airplane_v2.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/ic_signal_airplane_v2.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/ic_signal_airplane_v2_animation.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/ic_signal_airplane_v2_animation.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/ic_signal_airplane_v2_animation.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/ic_signal_airplane_v2_animation.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable01.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable01.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable01.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable01.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable02.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable02.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable02.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable02.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable03.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable03.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable03.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable03.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable04.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable04.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable04.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable04.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable05.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable05.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable05.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable05.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable06.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable06.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable06.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable06.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable07.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable07.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable07.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable07.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable08.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable08.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable08.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable08.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable09.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable09.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable09.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable09.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable10.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable10.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable10.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable10.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable11.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable11.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable11.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable11.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable12.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable12.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable12.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable12.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable13.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable13.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable13.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable13.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable14.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable14.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable14.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable14.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable15.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable15.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable15.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable15.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable16.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable16.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable16.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable16.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable17.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable17.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable17.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable17.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable18.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable18.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable18.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable18.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable19.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable19.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable19.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable19.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable20.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable20.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable20.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable20.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable21.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable21.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable21.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable21.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable22.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable22.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable22.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable22.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable23.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable23.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable23.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable23.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable24.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable24.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable24.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable24.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable25.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable25.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable25.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable25.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable26.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable26.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable26.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable26.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable27.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable27.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable27.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable27.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable28.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable28.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable28.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable28.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable29.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable29.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable29.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable29.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable30.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable30.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable30.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable30.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable_grouping_1.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable_grouping_1.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable_grouping_1.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable_grouping_1.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable_progress_bar.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable_progress_bar.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable_progress_bar.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable_progress_bar.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable_scale0.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable_scale0.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable_scale0.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable_scale0.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable_scale1.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable_scale1.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable_scale1.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable_scale1.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable_scale2.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable_scale2.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable_scale2.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable_scale2.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_drawable_scale3.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable_scale3.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_drawable_scale3.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_drawable_scale3.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_test01.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_test01.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_test01.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_test01.xml
diff --git a/samples/SupportVectorDrawableDemos/res/drawable/vector_test02.xml b/samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_test02.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/drawable/vector_test02.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/drawable/vector_test02.xml
diff --git a/samples/SupportVectorDrawableDemos/res/interpolator/control_points_interpolator.xml b/samples/SupportVectorDrawableDemos/src/main/res/interpolator/control_points_interpolator.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/interpolator/control_points_interpolator.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/interpolator/control_points_interpolator.xml
diff --git a/samples/SupportVectorDrawableDemos/res/interpolator/path_interpolator.xml b/samples/SupportVectorDrawableDemos/src/main/res/interpolator/path_interpolator.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/interpolator/path_interpolator.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/interpolator/path_interpolator.xml
diff --git a/samples/SupportVectorDrawableDemos/res/interpolator/single_control_point_interpolator.xml b/samples/SupportVectorDrawableDemos/src/main/res/interpolator/single_control_point_interpolator.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/interpolator/single_control_point_interpolator.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/interpolator/single_control_point_interpolator.xml
diff --git a/samples/SupportVectorDrawableDemos/res/layout/avdc_listener.xml b/samples/SupportVectorDrawableDemos/src/main/res/layout/avdc_listener.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/layout/avdc_listener.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/layout/avdc_listener.xml
diff --git a/samples/SupportVectorDrawableDemos/res/raw/vector_drawable01.xml b/samples/SupportVectorDrawableDemos/src/main/res/raw/vector_drawable01.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/raw/vector_drawable01.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/raw/vector_drawable01.xml
diff --git a/samples/SupportVectorDrawableDemos/res/values/colors.xml b/samples/SupportVectorDrawableDemos/src/main/res/values/colors.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/values/colors.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/values/colors.xml
diff --git a/samples/SupportVectorDrawableDemos/res/values/strings.xml b/samples/SupportVectorDrawableDemos/src/main/res/values/strings.xml
similarity index 100%
rename from samples/SupportVectorDrawableDemos/res/values/strings.xml
rename to samples/SupportVectorDrawableDemos/src/main/res/values/strings.xml
diff --git a/samples/SupportWearDemos/build.gradle b/samples/SupportWearDemos/build.gradle
index e980793..99223f9 100644
--- a/samples/SupportWearDemos/build.gradle
+++ b/samples/SupportWearDemos/build.gradle
@@ -28,12 +28,6 @@
         targetSdkVersion project.ext.currentSdk
     }
 
-    sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['src']
-        main.res.srcDirs = ['res']
-    }
-
     signingConfigs {
         debug {
             // Use a local debug keystore to avoid build server issues.
diff --git a/samples/SupportWearDemos/AndroidManifest.xml b/samples/SupportWearDemos/src/main/AndroidManifest.xml
similarity index 86%
rename from samples/SupportWearDemos/AndroidManifest.xml
rename to samples/SupportWearDemos/src/main/AndroidManifest.xml
index e1309ae9..957a539 100644
--- a/samples/SupportWearDemos/AndroidManifest.xml
+++ b/samples/SupportWearDemos/src/main/AndroidManifest.xml
@@ -18,6 +18,9 @@
     package="com.example.android.support.wear" >
     <uses-feature android:name="android.hardware.type.watch" />
 
+    <!-- Required for ambient mode support. -->
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
+
     <application android:icon="@drawable/app_sample_code" android:label="SupportWearDemos"
             android:theme="@android:style/Theme.DeviceDefault">
         <activity android:name=".app.SimpleWearableRecyclerViewDemo" />
@@ -25,12 +28,15 @@
         <activity android:name=".app.CircularProgressLayoutDemo" />
         <activity android:name=".app.RoundedDrawableDemo" />
         <activity android:name=".app.drawers.WearableDrawersDemo" android:exported="true" />
+        <activity android:name=".app.AmbientModeDemo" />
         <activity android:name=".app.MainDemoActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+
+        <uses-library android:name="com.google.android.wearable" android:required="true" />
     </application>
 
 </manifest>
diff --git a/samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/AmbientModeDemo.java b/samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/AmbientModeDemo.java
new file mode 100644
index 0000000..0e7d3de
--- /dev/null
+++ b/samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/AmbientModeDemo.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.wear.app;
+
+import android.graphics.Color;
+import android.os.Bundle;
+import android.support.v4.app.FragmentActivity;
+import android.support.wear.ambient.AmbientMode;
+import android.widget.TextView;
+
+import com.example.android.support.wear.R;
+
+/**
+ * Main activity for the AmbientMode demo.
+ */
+public class AmbientModeDemo extends FragmentActivity implements
+        AmbientMode.AmbientCallbackProvider {
+    private TextView mStateTextView;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.ambient_demo);
+        mStateTextView = findViewById(R.id.ambient_text);
+        AmbientMode.AmbientController controller = AmbientMode.attachAmbientSupport(this);
+    }
+
+    @Override
+    public AmbientMode.AmbientCallback getAmbientCallback() {
+        return new MyAmbientCallback();
+    }
+
+    private class MyAmbientCallback extends AmbientMode.AmbientCallback {
+
+        @Override
+        public void onEnterAmbient(Bundle ambientDetails) {
+            // Handle entering ambient mode
+            mStateTextView.setText("Ambient");
+            mStateTextView.setTextColor(Color.WHITE);
+            mStateTextView.getPaint().setAntiAlias(false);
+        }
+
+        @Override
+        public void onExitAmbient() {
+            // Handle exiting ambient mode
+            mStateTextView.setText("Interactive");
+            mStateTextView.setTextColor(Color.GREEN);
+            mStateTextView.getPaint().setAntiAlias(true);
+        }
+    }
+}
diff --git a/samples/SupportWearDemos/src/com/example/android/support/wear/app/CircularProgressLayoutDemo.java b/samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/CircularProgressLayoutDemo.java
similarity index 100%
rename from samples/SupportWearDemos/src/com/example/android/support/wear/app/CircularProgressLayoutDemo.java
rename to samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/CircularProgressLayoutDemo.java
diff --git a/samples/SupportWearDemos/src/com/example/android/support/wear/app/MainDemoActivity.java b/samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/MainDemoActivity.java
similarity index 97%
rename from samples/SupportWearDemos/src/com/example/android/support/wear/app/MainDemoActivity.java
rename to samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/MainDemoActivity.java
index 398adc1..0227559 100644
--- a/samples/SupportWearDemos/src/com/example/android/support/wear/app/MainDemoActivity.java
+++ b/samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/MainDemoActivity.java
@@ -62,6 +62,8 @@
                 this, WearableDrawersDemo.class));
         contentMap.put("Rounded Drawable", new Intent(
                 this, RoundedDrawableDemo.class));
+        contentMap.put("Ambient Fragment", new Intent(
+                this, AmbientModeDemo.class));
 
         return contentMap;
     }
diff --git a/samples/SupportWearDemos/src/com/example/android/support/wear/app/RoundedDrawableDemo.java b/samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/RoundedDrawableDemo.java
similarity index 100%
rename from samples/SupportWearDemos/src/com/example/android/support/wear/app/RoundedDrawableDemo.java
rename to samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/RoundedDrawableDemo.java
diff --git a/samples/SupportWearDemos/src/com/example/android/support/wear/app/SimpleWearableRecyclerViewDemo.java b/samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/SimpleWearableRecyclerViewDemo.java
similarity index 100%
rename from samples/SupportWearDemos/src/com/example/android/support/wear/app/SimpleWearableRecyclerViewDemo.java
rename to samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/SimpleWearableRecyclerViewDemo.java
diff --git a/samples/SupportWearDemos/src/com/example/android/support/wear/app/WearableSwitchDemo.java b/samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/WearableSwitchDemo.java
similarity index 100%
rename from samples/SupportWearDemos/src/com/example/android/support/wear/app/WearableSwitchDemo.java
rename to samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/WearableSwitchDemo.java
diff --git a/samples/SupportWearDemos/src/com/example/android/support/wear/app/drawers/DemoNavDrawerAdapter.java b/samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/drawers/DemoNavDrawerAdapter.java
similarity index 100%
rename from samples/SupportWearDemos/src/com/example/android/support/wear/app/drawers/DemoNavDrawerAdapter.java
rename to samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/drawers/DemoNavDrawerAdapter.java
diff --git a/samples/SupportWearDemos/src/com/example/android/support/wear/app/drawers/FrameLayoutFragment.java b/samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/drawers/FrameLayoutFragment.java
similarity index 100%
rename from samples/SupportWearDemos/src/com/example/android/support/wear/app/drawers/FrameLayoutFragment.java
rename to samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/drawers/FrameLayoutFragment.java
diff --git a/samples/SupportWearDemos/src/com/example/android/support/wear/app/drawers/NavItem.java b/samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/drawers/NavItem.java
similarity index 100%
rename from samples/SupportWearDemos/src/com/example/android/support/wear/app/drawers/NavItem.java
rename to samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/drawers/NavItem.java
diff --git a/samples/SupportWearDemos/src/com/example/android/support/wear/app/drawers/ScrollViewFragment.java b/samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/drawers/ScrollViewFragment.java
similarity index 100%
rename from samples/SupportWearDemos/src/com/example/android/support/wear/app/drawers/ScrollViewFragment.java
rename to samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/drawers/ScrollViewFragment.java
diff --git a/samples/SupportWearDemos/src/com/example/android/support/wear/app/drawers/WearableDrawersDemo.java b/samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/drawers/WearableDrawersDemo.java
similarity index 100%
rename from samples/SupportWearDemos/src/com/example/android/support/wear/app/drawers/WearableDrawersDemo.java
rename to samples/SupportWearDemos/src/main/java/com/example/android/support/wear/app/drawers/WearableDrawersDemo.java
diff --git a/samples/SupportWearDemos/res/drawable/app_sample_code.png b/samples/SupportWearDemos/src/main/res/drawable/app_sample_code.png
similarity index 100%
rename from samples/SupportWearDemos/res/drawable/app_sample_code.png
rename to samples/SupportWearDemos/src/main/res/drawable/app_sample_code.png
Binary files differ
diff --git a/samples/SupportWearDemos/res/drawable/rd_example.xml b/samples/SupportWearDemos/src/main/res/drawable/rd_example.xml
similarity index 100%
rename from samples/SupportWearDemos/res/drawable/rd_example.xml
rename to samples/SupportWearDemos/src/main/res/drawable/rd_example.xml
diff --git a/samples/SupportWearDemos/res/drawable/rd_inner_drawable.xml b/samples/SupportWearDemos/src/main/res/drawable/rd_inner_drawable.xml
similarity index 100%
rename from samples/SupportWearDemos/res/drawable/rd_inner_drawable.xml
rename to samples/SupportWearDemos/src/main/res/drawable/rd_inner_drawable.xml
diff --git a/samples/SupportWearDemos/src/main/res/layout/ambient_demo.xml b/samples/SupportWearDemos/src/main/res/layout/ambient_demo.xml
new file mode 100644
index 0000000..ed7c01f
--- /dev/null
+++ b/samples/SupportWearDemos/src/main/res/layout/ambient_demo.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" >
+    <TextView
+        android:id="@+id/ambient_text"
+        android:layout_gravity="center"
+        android:layout_height="wrap_content"
+        android:layout_width="wrap_content"
+        android:textColor="@android:color/holo_orange_dark"
+        android:text="hello world!!"/>
+</merge>
diff --git a/samples/SupportWearDemos/res/layout/cpl_demo.xml b/samples/SupportWearDemos/src/main/res/layout/cpl_demo.xml
similarity index 100%
rename from samples/SupportWearDemos/res/layout/cpl_demo.xml
rename to samples/SupportWearDemos/src/main/res/layout/cpl_demo.xml
diff --git a/samples/SupportWearDemos/res/layout/rd_demo.xml b/samples/SupportWearDemos/src/main/res/layout/rd_demo.xml
similarity index 100%
rename from samples/SupportWearDemos/res/layout/rd_demo.xml
rename to samples/SupportWearDemos/src/main/res/layout/rd_demo.xml
diff --git a/samples/SupportWearDemos/res/layout/switch_demo.xml b/samples/SupportWearDemos/src/main/res/layout/switch_demo.xml
similarity index 100%
rename from samples/SupportWearDemos/res/layout/switch_demo.xml
rename to samples/SupportWearDemos/src/main/res/layout/switch_demo.xml
diff --git a/samples/SupportWearDemos/res/layout/wearable_drawers_demo.xml b/samples/SupportWearDemos/src/main/res/layout/wearable_drawers_demo.xml
similarity index 100%
rename from samples/SupportWearDemos/res/layout/wearable_drawers_demo.xml
rename to samples/SupportWearDemos/src/main/res/layout/wearable_drawers_demo.xml
diff --git a/samples/SupportWearDemos/res/layout/wearable_drawers_frame_layout_demo.xml b/samples/SupportWearDemos/src/main/res/layout/wearable_drawers_frame_layout_demo.xml
similarity index 100%
rename from samples/SupportWearDemos/res/layout/wearable_drawers_frame_layout_demo.xml
rename to samples/SupportWearDemos/src/main/res/layout/wearable_drawers_frame_layout_demo.xml
diff --git a/samples/SupportWearDemos/res/layout/wearable_drawers_scroll_view_demo.xml b/samples/SupportWearDemos/src/main/res/layout/wearable_drawers_scroll_view_demo.xml
similarity index 100%
rename from samples/SupportWearDemos/res/layout/wearable_drawers_scroll_view_demo.xml
rename to samples/SupportWearDemos/src/main/res/layout/wearable_drawers_scroll_view_demo.xml
diff --git a/samples/SupportWearDemos/res/layout/wrv_demo.xml b/samples/SupportWearDemos/src/main/res/layout/wrv_demo.xml
similarity index 100%
rename from samples/SupportWearDemos/res/layout/wrv_demo.xml
rename to samples/SupportWearDemos/src/main/res/layout/wrv_demo.xml
diff --git a/samples/SupportWearDemos/res/menu/action_drawer_menu.xml b/samples/SupportWearDemos/src/main/res/menu/action_drawer_menu.xml
similarity index 100%
rename from samples/SupportWearDemos/res/menu/action_drawer_menu.xml
rename to samples/SupportWearDemos/src/main/res/menu/action_drawer_menu.xml
diff --git a/samples/SupportWearDemos/res/values/colors.xml b/samples/SupportWearDemos/src/main/res/values/colors.xml
similarity index 100%
rename from samples/SupportWearDemos/res/values/colors.xml
rename to samples/SupportWearDemos/src/main/res/values/colors.xml
diff --git a/samples/SupportWearDemos/res/values/dimens.xml b/samples/SupportWearDemos/src/main/res/values/dimens.xml
similarity index 100%
rename from samples/SupportWearDemos/res/values/dimens.xml
rename to samples/SupportWearDemos/src/main/res/values/dimens.xml
diff --git a/samples/SupportWearDemos/res/values/strings.xml b/samples/SupportWearDemos/src/main/res/values/strings.xml
similarity index 100%
rename from samples/SupportWearDemos/res/values/strings.xml
rename to samples/SupportWearDemos/src/main/res/values/strings.xml
diff --git a/transition/AndroidManifest.xml b/transition/AndroidManifest.xml
index 1b70510..40b77e2 100644
--- a/transition/AndroidManifest.xml
+++ b/transition/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.transition">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.transition.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/transition/OWNERS b/transition/OWNERS
new file mode 100644
index 0000000..7bb4398
--- /dev/null
+++ b/transition/OWNERS
@@ -0,0 +1 @@
+yaraki@google.com
\ No newline at end of file
diff --git a/transition/api/26.1.0.txt b/transition/api/26.1.0.txt
new file mode 100644
index 0000000..805fcfc
--- /dev/null
+++ b/transition/api/26.1.0.txt
@@ -0,0 +1,280 @@
+package android.support.transition {
+
+  public class ArcMotion extends android.support.transition.PathMotion {
+    ctor public ArcMotion();
+    ctor public ArcMotion(android.content.Context, android.util.AttributeSet);
+    method public float getMaximumAngle();
+    method public float getMinimumHorizontalAngle();
+    method public float getMinimumVerticalAngle();
+    method public android.graphics.Path getPath(float, float, float, float);
+    method public void setMaximumAngle(float);
+    method public void setMinimumHorizontalAngle(float);
+    method public void setMinimumVerticalAngle(float);
+  }
+
+  public class AutoTransition extends android.support.transition.TransitionSet {
+    ctor public AutoTransition();
+    ctor public AutoTransition(android.content.Context, android.util.AttributeSet);
+  }
+
+  public class ChangeBounds extends android.support.transition.Transition {
+    ctor public ChangeBounds();
+    ctor public ChangeBounds(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public boolean getResizeClip();
+    method public void setResizeClip(boolean);
+  }
+
+  public class ChangeClipBounds extends android.support.transition.Transition {
+    ctor public ChangeClipBounds();
+    ctor public ChangeClipBounds(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+  }
+
+  public class ChangeImageTransform extends android.support.transition.Transition {
+    ctor public ChangeImageTransform();
+    ctor public ChangeImageTransform(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+  }
+
+  public class ChangeScroll extends android.support.transition.Transition {
+    ctor public ChangeScroll();
+    ctor public ChangeScroll(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+  }
+
+  public class ChangeTransform extends android.support.transition.Transition {
+    ctor public ChangeTransform();
+    ctor public ChangeTransform(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public boolean getReparent();
+    method public boolean getReparentWithOverlay();
+    method public void setReparent(boolean);
+    method public void setReparentWithOverlay(boolean);
+  }
+
+  public class CircularPropagation extends android.support.transition.VisibilityPropagation {
+    ctor public CircularPropagation();
+    method public long getStartDelay(android.view.ViewGroup, android.support.transition.Transition, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public void setPropagationSpeed(float);
+  }
+
+  public class Explode extends android.support.transition.Visibility {
+    ctor public Explode();
+    ctor public Explode(android.content.Context, android.util.AttributeSet);
+  }
+
+  public class Fade extends android.support.transition.Visibility {
+    ctor public Fade(int);
+    ctor public Fade();
+    ctor public Fade(android.content.Context, android.util.AttributeSet);
+    field public static final int IN = 1; // 0x1
+    field public static final int OUT = 2; // 0x2
+  }
+
+  public abstract class PathMotion {
+    ctor public PathMotion();
+    ctor public PathMotion(android.content.Context, android.util.AttributeSet);
+    method public abstract android.graphics.Path getPath(float, float, float, float);
+  }
+
+  public class PatternPathMotion extends android.support.transition.PathMotion {
+    ctor public PatternPathMotion();
+    ctor public PatternPathMotion(android.content.Context, android.util.AttributeSet);
+    ctor public PatternPathMotion(android.graphics.Path);
+    method public android.graphics.Path getPath(float, float, float, float);
+    method public android.graphics.Path getPatternPath();
+    method public void setPatternPath(android.graphics.Path);
+  }
+
+  public class Scene {
+    ctor public Scene(android.view.ViewGroup);
+    ctor public Scene(android.view.ViewGroup, android.view.View);
+    method public void enter();
+    method public void exit();
+    method public static android.support.transition.Scene getSceneForLayout(android.view.ViewGroup, int, android.content.Context);
+    method public android.view.ViewGroup getSceneRoot();
+    method public void setEnterAction(java.lang.Runnable);
+    method public void setExitAction(java.lang.Runnable);
+  }
+
+  public class SidePropagation extends android.support.transition.VisibilityPropagation {
+    ctor public SidePropagation();
+    method public long getStartDelay(android.view.ViewGroup, android.support.transition.Transition, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public void setPropagationSpeed(float);
+    method public void setSide(int);
+  }
+
+  public class Slide extends android.support.transition.Visibility {
+    ctor public Slide();
+    ctor public Slide(int);
+    ctor public Slide(android.content.Context, android.util.AttributeSet);
+    method public int getSlideEdge();
+    method public void setSlideEdge(int);
+  }
+
+  public abstract class Transition {
+    ctor public Transition();
+    ctor public Transition(android.content.Context, android.util.AttributeSet);
+    method public android.support.transition.Transition addListener(android.support.transition.Transition.TransitionListener);
+    method public android.support.transition.Transition addTarget(android.view.View);
+    method public android.support.transition.Transition addTarget(int);
+    method public android.support.transition.Transition addTarget(java.lang.String);
+    method public android.support.transition.Transition addTarget(java.lang.Class);
+    method public abstract void captureEndValues(android.support.transition.TransitionValues);
+    method public abstract void captureStartValues(android.support.transition.TransitionValues);
+    method public android.support.transition.Transition clone();
+    method public android.animation.Animator createAnimator(android.view.ViewGroup, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public android.support.transition.Transition excludeChildren(android.view.View, boolean);
+    method public android.support.transition.Transition excludeChildren(int, boolean);
+    method public android.support.transition.Transition excludeChildren(java.lang.Class, boolean);
+    method public android.support.transition.Transition excludeTarget(android.view.View, boolean);
+    method public android.support.transition.Transition excludeTarget(int, boolean);
+    method public android.support.transition.Transition excludeTarget(java.lang.String, boolean);
+    method public android.support.transition.Transition excludeTarget(java.lang.Class, boolean);
+    method public long getDuration();
+    method public android.graphics.Rect getEpicenter();
+    method public android.support.transition.Transition.EpicenterCallback getEpicenterCallback();
+    method public android.animation.TimeInterpolator getInterpolator();
+    method public java.lang.String getName();
+    method public android.support.transition.PathMotion getPathMotion();
+    method public android.support.transition.TransitionPropagation getPropagation();
+    method public long getStartDelay();
+    method public java.util.List<java.lang.Integer> getTargetIds();
+    method public java.util.List<java.lang.String> getTargetNames();
+    method public java.util.List<java.lang.Class> getTargetTypes();
+    method public java.util.List<android.view.View> getTargets();
+    method public java.lang.String[] getTransitionProperties();
+    method public android.support.transition.TransitionValues getTransitionValues(android.view.View, boolean);
+    method public boolean isTransitionRequired(android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public android.support.transition.Transition removeListener(android.support.transition.Transition.TransitionListener);
+    method public android.support.transition.Transition removeTarget(android.view.View);
+    method public android.support.transition.Transition removeTarget(int);
+    method public android.support.transition.Transition removeTarget(java.lang.String);
+    method public android.support.transition.Transition removeTarget(java.lang.Class);
+    method public android.support.transition.Transition setDuration(long);
+    method public void setEpicenterCallback(android.support.transition.Transition.EpicenterCallback);
+    method public android.support.transition.Transition setInterpolator(android.animation.TimeInterpolator);
+    method public void setMatchOrder(int...);
+    method public void setPathMotion(android.support.transition.PathMotion);
+    method public void setPropagation(android.support.transition.TransitionPropagation);
+    method public android.support.transition.Transition setStartDelay(long);
+    field public static final int MATCH_ID = 3; // 0x3
+    field public static final int MATCH_INSTANCE = 1; // 0x1
+    field public static final int MATCH_ITEM_ID = 4; // 0x4
+    field public static final int MATCH_NAME = 2; // 0x2
+  }
+
+  public static abstract class Transition.EpicenterCallback {
+    ctor public Transition.EpicenterCallback();
+    method public abstract android.graphics.Rect onGetEpicenter(android.support.transition.Transition);
+  }
+
+  public static abstract interface Transition.TransitionListener {
+    method public abstract void onTransitionCancel(android.support.transition.Transition);
+    method public abstract void onTransitionEnd(android.support.transition.Transition);
+    method public abstract void onTransitionPause(android.support.transition.Transition);
+    method public abstract void onTransitionResume(android.support.transition.Transition);
+    method public abstract void onTransitionStart(android.support.transition.Transition);
+  }
+
+  public class TransitionInflater {
+    method public static android.support.transition.TransitionInflater from(android.content.Context);
+    method public android.support.transition.Transition inflateTransition(int);
+    method public android.support.transition.TransitionManager inflateTransitionManager(int, android.view.ViewGroup);
+  }
+
+  public class TransitionListenerAdapter implements android.support.transition.Transition.TransitionListener {
+    ctor public TransitionListenerAdapter();
+    method public void onTransitionCancel(android.support.transition.Transition);
+    method public void onTransitionEnd(android.support.transition.Transition);
+    method public void onTransitionPause(android.support.transition.Transition);
+    method public void onTransitionResume(android.support.transition.Transition);
+    method public void onTransitionStart(android.support.transition.Transition);
+  }
+
+  public class TransitionManager {
+    ctor public TransitionManager();
+    method public static void beginDelayedTransition(android.view.ViewGroup);
+    method public static void beginDelayedTransition(android.view.ViewGroup, android.support.transition.Transition);
+    method public static void endTransitions(android.view.ViewGroup);
+    method public static void go(android.support.transition.Scene);
+    method public static void go(android.support.transition.Scene, android.support.transition.Transition);
+    method public void setTransition(android.support.transition.Scene, android.support.transition.Transition);
+    method public void setTransition(android.support.transition.Scene, android.support.transition.Scene, android.support.transition.Transition);
+    method public void transitionTo(android.support.transition.Scene);
+  }
+
+  public abstract class TransitionPropagation {
+    ctor public TransitionPropagation();
+    method public abstract void captureValues(android.support.transition.TransitionValues);
+    method public abstract java.lang.String[] getPropagationProperties();
+    method public abstract long getStartDelay(android.view.ViewGroup, android.support.transition.Transition, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+  }
+
+  public class TransitionSet extends android.support.transition.Transition {
+    ctor public TransitionSet();
+    ctor public TransitionSet(android.content.Context, android.util.AttributeSet);
+    method public android.support.transition.TransitionSet addListener(android.support.transition.Transition.TransitionListener);
+    method public android.support.transition.TransitionSet addTarget(android.view.View);
+    method public android.support.transition.TransitionSet addTarget(int);
+    method public android.support.transition.TransitionSet addTarget(java.lang.String);
+    method public android.support.transition.TransitionSet addTarget(java.lang.Class);
+    method public android.support.transition.TransitionSet addTransition(android.support.transition.Transition);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public int getOrdering();
+    method public android.support.transition.Transition getTransitionAt(int);
+    method public int getTransitionCount();
+    method public android.support.transition.TransitionSet removeListener(android.support.transition.Transition.TransitionListener);
+    method public android.support.transition.TransitionSet removeTarget(int);
+    method public android.support.transition.TransitionSet removeTarget(android.view.View);
+    method public android.support.transition.TransitionSet removeTarget(java.lang.Class);
+    method public android.support.transition.TransitionSet removeTarget(java.lang.String);
+    method public android.support.transition.TransitionSet removeTransition(android.support.transition.Transition);
+    method public android.support.transition.TransitionSet setDuration(long);
+    method public android.support.transition.TransitionSet setInterpolator(android.animation.TimeInterpolator);
+    method public android.support.transition.TransitionSet setOrdering(int);
+    method public android.support.transition.TransitionSet setStartDelay(long);
+    field public static final int ORDERING_SEQUENTIAL = 1; // 0x1
+    field public static final int ORDERING_TOGETHER = 0; // 0x0
+  }
+
+  public class TransitionValues {
+    ctor public TransitionValues();
+    field public final java.util.Map<java.lang.String, java.lang.Object> values;
+    field public android.view.View view;
+  }
+
+  public abstract class Visibility extends android.support.transition.Transition {
+    ctor public Visibility();
+    ctor public Visibility(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public int getMode();
+    method public boolean isVisible(android.support.transition.TransitionValues);
+    method public android.animation.Animator onAppear(android.view.ViewGroup, android.support.transition.TransitionValues, int, android.support.transition.TransitionValues, int);
+    method public android.animation.Animator onAppear(android.view.ViewGroup, android.view.View, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public android.animation.Animator onDisappear(android.view.ViewGroup, android.support.transition.TransitionValues, int, android.support.transition.TransitionValues, int);
+    method public android.animation.Animator onDisappear(android.view.ViewGroup, android.view.View, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public void setMode(int);
+    field public static final int MODE_IN = 1; // 0x1
+    field public static final int MODE_OUT = 2; // 0x2
+  }
+
+  public abstract class VisibilityPropagation extends android.support.transition.TransitionPropagation {
+    ctor public VisibilityPropagation();
+    method public void captureValues(android.support.transition.TransitionValues);
+    method public java.lang.String[] getPropagationProperties();
+    method public int getViewVisibility(android.support.transition.TransitionValues);
+    method public int getViewX(android.support.transition.TransitionValues);
+    method public int getViewY(android.support.transition.TransitionValues);
+  }
+
+}
+
diff --git a/transition/api/27.0.0.txt b/transition/api/27.0.0.txt
new file mode 100644
index 0000000..805fcfc
--- /dev/null
+++ b/transition/api/27.0.0.txt
@@ -0,0 +1,280 @@
+package android.support.transition {
+
+  public class ArcMotion extends android.support.transition.PathMotion {
+    ctor public ArcMotion();
+    ctor public ArcMotion(android.content.Context, android.util.AttributeSet);
+    method public float getMaximumAngle();
+    method public float getMinimumHorizontalAngle();
+    method public float getMinimumVerticalAngle();
+    method public android.graphics.Path getPath(float, float, float, float);
+    method public void setMaximumAngle(float);
+    method public void setMinimumHorizontalAngle(float);
+    method public void setMinimumVerticalAngle(float);
+  }
+
+  public class AutoTransition extends android.support.transition.TransitionSet {
+    ctor public AutoTransition();
+    ctor public AutoTransition(android.content.Context, android.util.AttributeSet);
+  }
+
+  public class ChangeBounds extends android.support.transition.Transition {
+    ctor public ChangeBounds();
+    ctor public ChangeBounds(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public boolean getResizeClip();
+    method public void setResizeClip(boolean);
+  }
+
+  public class ChangeClipBounds extends android.support.transition.Transition {
+    ctor public ChangeClipBounds();
+    ctor public ChangeClipBounds(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+  }
+
+  public class ChangeImageTransform extends android.support.transition.Transition {
+    ctor public ChangeImageTransform();
+    ctor public ChangeImageTransform(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+  }
+
+  public class ChangeScroll extends android.support.transition.Transition {
+    ctor public ChangeScroll();
+    ctor public ChangeScroll(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+  }
+
+  public class ChangeTransform extends android.support.transition.Transition {
+    ctor public ChangeTransform();
+    ctor public ChangeTransform(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public boolean getReparent();
+    method public boolean getReparentWithOverlay();
+    method public void setReparent(boolean);
+    method public void setReparentWithOverlay(boolean);
+  }
+
+  public class CircularPropagation extends android.support.transition.VisibilityPropagation {
+    ctor public CircularPropagation();
+    method public long getStartDelay(android.view.ViewGroup, android.support.transition.Transition, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public void setPropagationSpeed(float);
+  }
+
+  public class Explode extends android.support.transition.Visibility {
+    ctor public Explode();
+    ctor public Explode(android.content.Context, android.util.AttributeSet);
+  }
+
+  public class Fade extends android.support.transition.Visibility {
+    ctor public Fade(int);
+    ctor public Fade();
+    ctor public Fade(android.content.Context, android.util.AttributeSet);
+    field public static final int IN = 1; // 0x1
+    field public static final int OUT = 2; // 0x2
+  }
+
+  public abstract class PathMotion {
+    ctor public PathMotion();
+    ctor public PathMotion(android.content.Context, android.util.AttributeSet);
+    method public abstract android.graphics.Path getPath(float, float, float, float);
+  }
+
+  public class PatternPathMotion extends android.support.transition.PathMotion {
+    ctor public PatternPathMotion();
+    ctor public PatternPathMotion(android.content.Context, android.util.AttributeSet);
+    ctor public PatternPathMotion(android.graphics.Path);
+    method public android.graphics.Path getPath(float, float, float, float);
+    method public android.graphics.Path getPatternPath();
+    method public void setPatternPath(android.graphics.Path);
+  }
+
+  public class Scene {
+    ctor public Scene(android.view.ViewGroup);
+    ctor public Scene(android.view.ViewGroup, android.view.View);
+    method public void enter();
+    method public void exit();
+    method public static android.support.transition.Scene getSceneForLayout(android.view.ViewGroup, int, android.content.Context);
+    method public android.view.ViewGroup getSceneRoot();
+    method public void setEnterAction(java.lang.Runnable);
+    method public void setExitAction(java.lang.Runnable);
+  }
+
+  public class SidePropagation extends android.support.transition.VisibilityPropagation {
+    ctor public SidePropagation();
+    method public long getStartDelay(android.view.ViewGroup, android.support.transition.Transition, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public void setPropagationSpeed(float);
+    method public void setSide(int);
+  }
+
+  public class Slide extends android.support.transition.Visibility {
+    ctor public Slide();
+    ctor public Slide(int);
+    ctor public Slide(android.content.Context, android.util.AttributeSet);
+    method public int getSlideEdge();
+    method public void setSlideEdge(int);
+  }
+
+  public abstract class Transition {
+    ctor public Transition();
+    ctor public Transition(android.content.Context, android.util.AttributeSet);
+    method public android.support.transition.Transition addListener(android.support.transition.Transition.TransitionListener);
+    method public android.support.transition.Transition addTarget(android.view.View);
+    method public android.support.transition.Transition addTarget(int);
+    method public android.support.transition.Transition addTarget(java.lang.String);
+    method public android.support.transition.Transition addTarget(java.lang.Class);
+    method public abstract void captureEndValues(android.support.transition.TransitionValues);
+    method public abstract void captureStartValues(android.support.transition.TransitionValues);
+    method public android.support.transition.Transition clone();
+    method public android.animation.Animator createAnimator(android.view.ViewGroup, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public android.support.transition.Transition excludeChildren(android.view.View, boolean);
+    method public android.support.transition.Transition excludeChildren(int, boolean);
+    method public android.support.transition.Transition excludeChildren(java.lang.Class, boolean);
+    method public android.support.transition.Transition excludeTarget(android.view.View, boolean);
+    method public android.support.transition.Transition excludeTarget(int, boolean);
+    method public android.support.transition.Transition excludeTarget(java.lang.String, boolean);
+    method public android.support.transition.Transition excludeTarget(java.lang.Class, boolean);
+    method public long getDuration();
+    method public android.graphics.Rect getEpicenter();
+    method public android.support.transition.Transition.EpicenterCallback getEpicenterCallback();
+    method public android.animation.TimeInterpolator getInterpolator();
+    method public java.lang.String getName();
+    method public android.support.transition.PathMotion getPathMotion();
+    method public android.support.transition.TransitionPropagation getPropagation();
+    method public long getStartDelay();
+    method public java.util.List<java.lang.Integer> getTargetIds();
+    method public java.util.List<java.lang.String> getTargetNames();
+    method public java.util.List<java.lang.Class> getTargetTypes();
+    method public java.util.List<android.view.View> getTargets();
+    method public java.lang.String[] getTransitionProperties();
+    method public android.support.transition.TransitionValues getTransitionValues(android.view.View, boolean);
+    method public boolean isTransitionRequired(android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public android.support.transition.Transition removeListener(android.support.transition.Transition.TransitionListener);
+    method public android.support.transition.Transition removeTarget(android.view.View);
+    method public android.support.transition.Transition removeTarget(int);
+    method public android.support.transition.Transition removeTarget(java.lang.String);
+    method public android.support.transition.Transition removeTarget(java.lang.Class);
+    method public android.support.transition.Transition setDuration(long);
+    method public void setEpicenterCallback(android.support.transition.Transition.EpicenterCallback);
+    method public android.support.transition.Transition setInterpolator(android.animation.TimeInterpolator);
+    method public void setMatchOrder(int...);
+    method public void setPathMotion(android.support.transition.PathMotion);
+    method public void setPropagation(android.support.transition.TransitionPropagation);
+    method public android.support.transition.Transition setStartDelay(long);
+    field public static final int MATCH_ID = 3; // 0x3
+    field public static final int MATCH_INSTANCE = 1; // 0x1
+    field public static final int MATCH_ITEM_ID = 4; // 0x4
+    field public static final int MATCH_NAME = 2; // 0x2
+  }
+
+  public static abstract class Transition.EpicenterCallback {
+    ctor public Transition.EpicenterCallback();
+    method public abstract android.graphics.Rect onGetEpicenter(android.support.transition.Transition);
+  }
+
+  public static abstract interface Transition.TransitionListener {
+    method public abstract void onTransitionCancel(android.support.transition.Transition);
+    method public abstract void onTransitionEnd(android.support.transition.Transition);
+    method public abstract void onTransitionPause(android.support.transition.Transition);
+    method public abstract void onTransitionResume(android.support.transition.Transition);
+    method public abstract void onTransitionStart(android.support.transition.Transition);
+  }
+
+  public class TransitionInflater {
+    method public static android.support.transition.TransitionInflater from(android.content.Context);
+    method public android.support.transition.Transition inflateTransition(int);
+    method public android.support.transition.TransitionManager inflateTransitionManager(int, android.view.ViewGroup);
+  }
+
+  public class TransitionListenerAdapter implements android.support.transition.Transition.TransitionListener {
+    ctor public TransitionListenerAdapter();
+    method public void onTransitionCancel(android.support.transition.Transition);
+    method public void onTransitionEnd(android.support.transition.Transition);
+    method public void onTransitionPause(android.support.transition.Transition);
+    method public void onTransitionResume(android.support.transition.Transition);
+    method public void onTransitionStart(android.support.transition.Transition);
+  }
+
+  public class TransitionManager {
+    ctor public TransitionManager();
+    method public static void beginDelayedTransition(android.view.ViewGroup);
+    method public static void beginDelayedTransition(android.view.ViewGroup, android.support.transition.Transition);
+    method public static void endTransitions(android.view.ViewGroup);
+    method public static void go(android.support.transition.Scene);
+    method public static void go(android.support.transition.Scene, android.support.transition.Transition);
+    method public void setTransition(android.support.transition.Scene, android.support.transition.Transition);
+    method public void setTransition(android.support.transition.Scene, android.support.transition.Scene, android.support.transition.Transition);
+    method public void transitionTo(android.support.transition.Scene);
+  }
+
+  public abstract class TransitionPropagation {
+    ctor public TransitionPropagation();
+    method public abstract void captureValues(android.support.transition.TransitionValues);
+    method public abstract java.lang.String[] getPropagationProperties();
+    method public abstract long getStartDelay(android.view.ViewGroup, android.support.transition.Transition, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+  }
+
+  public class TransitionSet extends android.support.transition.Transition {
+    ctor public TransitionSet();
+    ctor public TransitionSet(android.content.Context, android.util.AttributeSet);
+    method public android.support.transition.TransitionSet addListener(android.support.transition.Transition.TransitionListener);
+    method public android.support.transition.TransitionSet addTarget(android.view.View);
+    method public android.support.transition.TransitionSet addTarget(int);
+    method public android.support.transition.TransitionSet addTarget(java.lang.String);
+    method public android.support.transition.TransitionSet addTarget(java.lang.Class);
+    method public android.support.transition.TransitionSet addTransition(android.support.transition.Transition);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public int getOrdering();
+    method public android.support.transition.Transition getTransitionAt(int);
+    method public int getTransitionCount();
+    method public android.support.transition.TransitionSet removeListener(android.support.transition.Transition.TransitionListener);
+    method public android.support.transition.TransitionSet removeTarget(int);
+    method public android.support.transition.TransitionSet removeTarget(android.view.View);
+    method public android.support.transition.TransitionSet removeTarget(java.lang.Class);
+    method public android.support.transition.TransitionSet removeTarget(java.lang.String);
+    method public android.support.transition.TransitionSet removeTransition(android.support.transition.Transition);
+    method public android.support.transition.TransitionSet setDuration(long);
+    method public android.support.transition.TransitionSet setInterpolator(android.animation.TimeInterpolator);
+    method public android.support.transition.TransitionSet setOrdering(int);
+    method public android.support.transition.TransitionSet setStartDelay(long);
+    field public static final int ORDERING_SEQUENTIAL = 1; // 0x1
+    field public static final int ORDERING_TOGETHER = 0; // 0x0
+  }
+
+  public class TransitionValues {
+    ctor public TransitionValues();
+    field public final java.util.Map<java.lang.String, java.lang.Object> values;
+    field public android.view.View view;
+  }
+
+  public abstract class Visibility extends android.support.transition.Transition {
+    ctor public Visibility();
+    ctor public Visibility(android.content.Context, android.util.AttributeSet);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public int getMode();
+    method public boolean isVisible(android.support.transition.TransitionValues);
+    method public android.animation.Animator onAppear(android.view.ViewGroup, android.support.transition.TransitionValues, int, android.support.transition.TransitionValues, int);
+    method public android.animation.Animator onAppear(android.view.ViewGroup, android.view.View, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public android.animation.Animator onDisappear(android.view.ViewGroup, android.support.transition.TransitionValues, int, android.support.transition.TransitionValues, int);
+    method public android.animation.Animator onDisappear(android.view.ViewGroup, android.view.View, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public void setMode(int);
+    field public static final int MODE_IN = 1; // 0x1
+    field public static final int MODE_OUT = 2; // 0x2
+  }
+
+  public abstract class VisibilityPropagation extends android.support.transition.TransitionPropagation {
+    ctor public VisibilityPropagation();
+    method public void captureValues(android.support.transition.TransitionValues);
+    method public java.lang.String[] getPropagationProperties();
+    method public int getViewVisibility(android.support.transition.TransitionValues);
+    method public int getViewX(android.support.transition.TransitionValues);
+    method public int getViewY(android.support.transition.TransitionValues);
+  }
+
+}
+
diff --git a/transition/proguard-rules.pro b/transition/proguard-rules.pro
index 6e193b4..6cae5e6 100644
--- a/transition/proguard-rules.pro
+++ b/transition/proguard-rules.pro
@@ -15,3 +15,8 @@
 # FragmentTransitionSupport is instantiated in support-fragment via reflection.
 -keep public class android.support.transition.FragmentTransitionSupport {
 }
+
+# Keep a field in transition that is used to keep a reference to weakly-referenced object
+-keepclassmembers class android.support.transition.ChangeBounds$* extends android.animation.AnimatorListenerAdapter {
+  android.support.transition.ChangeBounds$ViewBounds mViewBounds;
+}
diff --git a/tv-provider/Android.mk b/tv-provider/Android.mk
index 4fa8af4..9427d0d 100644
--- a/tv-provider/Android.mk
+++ b/tv-provider/Android.mk
@@ -23,7 +23,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-tv-provider
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-compat \
diff --git a/tv-provider/AndroidManifest.xml b/tv-provider/AndroidManifest.xml
index f7569a6..05af532 100644
--- a/tv-provider/AndroidManifest.xml
+++ b/tv-provider/AndroidManifest.xml
@@ -18,8 +18,4 @@
     <uses-sdk android:minSdkVersion="21"/>
     <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
     <uses-permission android:name="com.android.providers.tv.permission.READ_EPG_DATA" />
-    <application>
-        <meta-data android:name="android.support.media.tv.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/tv-provider/api/26.1.0.txt b/tv-provider/api/26.1.0.txt
new file mode 100644
index 0000000..aa288f0
--- /dev/null
+++ b/tv-provider/api/26.1.0.txt
@@ -0,0 +1,527 @@
+package android.support.media.tv {
+
+  public final class Channel {
+    method public static android.support.media.tv.Channel fromCursor(android.database.Cursor);
+    method public int getAppLinkColor();
+    method public android.net.Uri getAppLinkIconUri();
+    method public android.content.Intent getAppLinkIntent() throws java.net.URISyntaxException;
+    method public android.net.Uri getAppLinkIntentUri();
+    method public android.net.Uri getAppLinkPosterArtUri();
+    method public java.lang.String getAppLinkText();
+    method public java.lang.String getDescription();
+    method public java.lang.String getDisplayName();
+    method public java.lang.String getDisplayNumber();
+    method public long getId();
+    method public java.lang.String getInputId();
+    method public byte[] getInternalProviderDataByteArray();
+    method public java.lang.Long getInternalProviderFlag1();
+    method public java.lang.Long getInternalProviderFlag2();
+    method public java.lang.Long getInternalProviderFlag3();
+    method public java.lang.Long getInternalProviderFlag4();
+    method public java.lang.String getInternalProviderId();
+    method public java.lang.String getNetworkAffiliation();
+    method public int getOriginalNetworkId();
+    method public java.lang.String getPackageName();
+    method public int getServiceId();
+    method public java.lang.String getServiceType();
+    method public int getTransportStreamId();
+    method public java.lang.String getType();
+    method public java.lang.String getVideoFormat();
+    method public boolean isBrowsable();
+    method public boolean isLocked();
+    method public boolean isSearchable();
+    method public boolean isTransient();
+    method public android.content.ContentValues toContentValues();
+  }
+
+  public static final class Channel.Builder {
+    ctor public Channel.Builder();
+    ctor public Channel.Builder(android.support.media.tv.Channel);
+    method public android.support.media.tv.Channel build();
+    method public android.support.media.tv.Channel.Builder setAppLinkColor(int);
+    method public android.support.media.tv.Channel.Builder setAppLinkIconUri(android.net.Uri);
+    method public android.support.media.tv.Channel.Builder setAppLinkIntent(android.content.Intent);
+    method public android.support.media.tv.Channel.Builder setAppLinkIntentUri(android.net.Uri);
+    method public android.support.media.tv.Channel.Builder setAppLinkPosterArtUri(android.net.Uri);
+    method public android.support.media.tv.Channel.Builder setAppLinkText(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setDescription(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setDisplayName(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setDisplayNumber(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setInputId(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setInternalProviderData(byte[]);
+    method public android.support.media.tv.Channel.Builder setInternalProviderData(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setInternalProviderFlag1(long);
+    method public android.support.media.tv.Channel.Builder setInternalProviderFlag2(long);
+    method public android.support.media.tv.Channel.Builder setInternalProviderFlag3(long);
+    method public android.support.media.tv.Channel.Builder setInternalProviderFlag4(long);
+    method public android.support.media.tv.Channel.Builder setInternalProviderId(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setNetworkAffiliation(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setOriginalNetworkId(int);
+    method public android.support.media.tv.Channel.Builder setSearchable(boolean);
+    method public android.support.media.tv.Channel.Builder setServiceId(int);
+    method public android.support.media.tv.Channel.Builder setServiceType(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setTransient(boolean);
+    method public android.support.media.tv.Channel.Builder setTransportStreamId(int);
+    method public android.support.media.tv.Channel.Builder setType(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setVideoFormat(java.lang.String);
+  }
+
+  public class ChannelLogoUtils {
+    ctor public ChannelLogoUtils();
+    method public static android.graphics.Bitmap loadChannelLogo(android.content.Context, long);
+    method public static boolean storeChannelLogo(android.content.Context, long, android.net.Uri);
+    method public static boolean storeChannelLogo(android.content.Context, long, android.graphics.Bitmap);
+  }
+
+  public final class PreviewProgram {
+    method public boolean equals(java.lang.Object);
+    method public static android.support.media.tv.PreviewProgram fromCursor(android.database.Cursor);
+    method public long getChannelId();
+    method public int getWeight();
+    method public android.content.ContentValues toContentValues();
+    method public java.lang.String toString();
+  }
+
+  public static final class PreviewProgram.Builder {
+    ctor public PreviewProgram.Builder();
+    ctor public PreviewProgram.Builder(android.support.media.tv.PreviewProgram);
+    method public android.support.media.tv.PreviewProgram build();
+    method public android.support.media.tv.PreviewProgram.Builder setChannelId(long);
+    method public android.support.media.tv.PreviewProgram.Builder setWeight(int);
+  }
+
+  public final class Program implements java.lang.Comparable {
+    method public int compareTo(android.support.media.tv.Program);
+    method public boolean equals(java.lang.Object);
+    method public static android.support.media.tv.Program fromCursor(android.database.Cursor);
+    method public java.lang.String[] getBroadcastGenres();
+    method public long getChannelId();
+    method public long getEndTimeUtcMillis();
+    method public long getStartTimeUtcMillis();
+    method public int hashCode();
+    method public boolean isRecordingProhibited();
+    method public android.content.ContentValues toContentValues();
+    method public java.lang.String toString();
+  }
+
+  public static class Program.Builder {
+    ctor public Program.Builder();
+    ctor public Program.Builder(android.support.media.tv.Program);
+    method public android.support.media.tv.Program build();
+    method public android.support.media.tv.Program.Builder setBroadcastGenres(java.lang.String[]);
+    method public android.support.media.tv.Program.Builder setChannelId(long);
+    method public android.support.media.tv.Program.Builder setEndTimeUtcMillis(long);
+    method public android.support.media.tv.Program.Builder setRecordingProhibited(boolean);
+    method public android.support.media.tv.Program.Builder setStartTimeUtcMillis(long);
+  }
+
+  public final class TvContractCompat {
+    method public static android.net.Uri buildChannelLogoUri(long);
+    method public static android.net.Uri buildChannelLogoUri(android.net.Uri);
+    method public static android.net.Uri buildChannelUri(long);
+    method public static android.net.Uri buildChannelUriForPassthroughInput(java.lang.String);
+    method public static android.net.Uri buildChannelsUriForInput(java.lang.String);
+    method public static java.lang.String buildInputId(android.content.ComponentName);
+    method public static android.net.Uri buildPreviewProgramUri(long);
+    method public static android.net.Uri buildPreviewProgramsUriForChannel(long);
+    method public static android.net.Uri buildPreviewProgramsUriForChannel(android.net.Uri);
+    method public static android.net.Uri buildProgramUri(long);
+    method public static android.net.Uri buildProgramsUriForChannel(long);
+    method public static android.net.Uri buildProgramsUriForChannel(android.net.Uri);
+    method public static android.net.Uri buildProgramsUriForChannel(long, long, long);
+    method public static android.net.Uri buildProgramsUriForChannel(android.net.Uri, long, long);
+    method public static android.net.Uri buildRecordedProgramUri(long);
+    method public static android.net.Uri buildWatchNextProgramUri(long);
+    method public static boolean isChannelUri(android.net.Uri);
+    method public static boolean isChannelUriForPassthroughInput(android.net.Uri);
+    method public static boolean isChannelUriForTunerInput(android.net.Uri);
+    method public static boolean isProgramUri(android.net.Uri);
+    method public static boolean isRecordedProgramUri(android.net.Uri);
+    method public static void requestChannelBrowsable(android.content.Context, long);
+    field public static final java.lang.String ACTION_INITIALIZE_PROGRAMS = "android.media.tv.action.INITIALIZE_PROGRAMS";
+    field public static final java.lang.String ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT = "android.media.tv.action.PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT";
+    field public static final java.lang.String ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.PREVIEW_PROGRAM_BROWSABLE_DISABLED";
+    field public static final java.lang.String ACTION_REQUEST_CHANNEL_BROWSABLE = "android.media.tv.action.REQUEST_CHANNEL_BROWSABLE";
+    field public static final java.lang.String ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED";
+    field public static final java.lang.String AUTHORITY = "android.media.tv";
+    field public static final java.lang.String EXTRA_CHANNEL_ID = "android.media.tv.extra.CHANNEL_ID";
+    field public static final java.lang.String EXTRA_PREVIEW_PROGRAM_ID = "android.media.tv.extra.PREVIEW_PROGRAM_ID";
+    field public static final java.lang.String EXTRA_WATCH_NEXT_PROGRAM_ID = "android.media.tv.extra.WATCH_NEXT_PROGRAM_ID";
+  }
+
+  public static abstract interface TvContractCompat.BaseTvColumns {
+    field public static final java.lang.String COLUMN_PACKAGE_NAME = "package_name";
+  }
+
+  public static final class TvContractCompat.Channels implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    method public static java.lang.String getVideoResolution(java.lang.String);
+    field public static final java.lang.String COLUMN_APP_LINK_COLOR = "app_link_color";
+    field public static final java.lang.String COLUMN_APP_LINK_ICON_URI = "app_link_icon_uri";
+    field public static final java.lang.String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri";
+    field public static final java.lang.String COLUMN_APP_LINK_POSTER_ART_URI = "app_link_poster_art_uri";
+    field public static final java.lang.String COLUMN_APP_LINK_TEXT = "app_link_text";
+    field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
+    field public static final java.lang.String COLUMN_DESCRIPTION = "description";
+    field public static final java.lang.String COLUMN_DISPLAY_NAME = "display_name";
+    field public static final java.lang.String COLUMN_DISPLAY_NUMBER = "display_number";
+    field public static final java.lang.String COLUMN_INPUT_ID = "input_id";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+    field public static final java.lang.String COLUMN_LOCKED = "locked";
+    field public static final java.lang.String COLUMN_NETWORK_AFFILIATION = "network_affiliation";
+    field public static final java.lang.String COLUMN_ORIGINAL_NETWORK_ID = "original_network_id";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SERVICE_ID = "service_id";
+    field public static final java.lang.String COLUMN_SERVICE_TYPE = "service_type";
+    field public static final java.lang.String COLUMN_TRANSIENT = "transient";
+    field public static final java.lang.String COLUMN_TRANSPORT_STREAM_ID = "transport_stream_id";
+    field public static final java.lang.String COLUMN_TYPE = "type";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_FORMAT = "video_format";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/channel";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/channel";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final java.lang.String SERVICE_TYPE_AUDIO = "SERVICE_TYPE_AUDIO";
+    field public static final java.lang.String SERVICE_TYPE_AUDIO_VIDEO = "SERVICE_TYPE_AUDIO_VIDEO";
+    field public static final java.lang.String SERVICE_TYPE_OTHER = "SERVICE_TYPE_OTHER";
+    field public static final java.lang.String TYPE_1SEG = "TYPE_1SEG";
+    field public static final java.lang.String TYPE_ATSC_C = "TYPE_ATSC_C";
+    field public static final java.lang.String TYPE_ATSC_M_H = "TYPE_ATSC_M_H";
+    field public static final java.lang.String TYPE_ATSC_T = "TYPE_ATSC_T";
+    field public static final java.lang.String TYPE_CMMB = "TYPE_CMMB";
+    field public static final java.lang.String TYPE_DTMB = "TYPE_DTMB";
+    field public static final java.lang.String TYPE_DVB_C = "TYPE_DVB_C";
+    field public static final java.lang.String TYPE_DVB_C2 = "TYPE_DVB_C2";
+    field public static final java.lang.String TYPE_DVB_H = "TYPE_DVB_H";
+    field public static final java.lang.String TYPE_DVB_S = "TYPE_DVB_S";
+    field public static final java.lang.String TYPE_DVB_S2 = "TYPE_DVB_S2";
+    field public static final java.lang.String TYPE_DVB_SH = "TYPE_DVB_SH";
+    field public static final java.lang.String TYPE_DVB_T = "TYPE_DVB_T";
+    field public static final java.lang.String TYPE_DVB_T2 = "TYPE_DVB_T2";
+    field public static final java.lang.String TYPE_ISDB_C = "TYPE_ISDB_C";
+    field public static final java.lang.String TYPE_ISDB_S = "TYPE_ISDB_S";
+    field public static final java.lang.String TYPE_ISDB_T = "TYPE_ISDB_T";
+    field public static final java.lang.String TYPE_ISDB_TB = "TYPE_ISDB_TB";
+    field public static final java.lang.String TYPE_NTSC = "TYPE_NTSC";
+    field public static final java.lang.String TYPE_OTHER = "TYPE_OTHER";
+    field public static final java.lang.String TYPE_PAL = "TYPE_PAL";
+    field public static final java.lang.String TYPE_PREVIEW = "TYPE_PREVIEW";
+    field public static final java.lang.String TYPE_SECAM = "TYPE_SECAM";
+    field public static final java.lang.String TYPE_S_DMB = "TYPE_S_DMB";
+    field public static final java.lang.String TYPE_T_DMB = "TYPE_T_DMB";
+    field public static final java.lang.String VIDEO_FORMAT_1080I = "VIDEO_FORMAT_1080I";
+    field public static final java.lang.String VIDEO_FORMAT_1080P = "VIDEO_FORMAT_1080P";
+    field public static final java.lang.String VIDEO_FORMAT_2160P = "VIDEO_FORMAT_2160P";
+    field public static final java.lang.String VIDEO_FORMAT_240P = "VIDEO_FORMAT_240P";
+    field public static final java.lang.String VIDEO_FORMAT_360P = "VIDEO_FORMAT_360P";
+    field public static final java.lang.String VIDEO_FORMAT_4320P = "VIDEO_FORMAT_4320P";
+    field public static final java.lang.String VIDEO_FORMAT_480I = "VIDEO_FORMAT_480I";
+    field public static final java.lang.String VIDEO_FORMAT_480P = "VIDEO_FORMAT_480P";
+    field public static final java.lang.String VIDEO_FORMAT_576I = "VIDEO_FORMAT_576I";
+    field public static final java.lang.String VIDEO_FORMAT_576P = "VIDEO_FORMAT_576P";
+    field public static final java.lang.String VIDEO_FORMAT_720P = "VIDEO_FORMAT_720P";
+    field public static final java.lang.String VIDEO_RESOLUTION_ED = "VIDEO_RESOLUTION_ED";
+    field public static final java.lang.String VIDEO_RESOLUTION_FHD = "VIDEO_RESOLUTION_FHD";
+    field public static final java.lang.String VIDEO_RESOLUTION_HD = "VIDEO_RESOLUTION_HD";
+    field public static final java.lang.String VIDEO_RESOLUTION_SD = "VIDEO_RESOLUTION_SD";
+    field public static final java.lang.String VIDEO_RESOLUTION_UHD = "VIDEO_RESOLUTION_UHD";
+  }
+
+  public static final class TvContractCompat.Channels.Logo {
+    field public static final java.lang.String CONTENT_DIRECTORY = "logo";
+  }
+
+  public static final class TvContractCompat.PreviewPrograms implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final int ASPECT_RATIO_16_9 = 0; // 0x0
+    field public static final int ASPECT_RATIO_1_1 = 3; // 0x3
+    field public static final int ASPECT_RATIO_2_3 = 4; // 0x4
+    field public static final int ASPECT_RATIO_3_2 = 1; // 0x1
+    field public static final int ASPECT_RATIO_4_3 = 2; // 0x2
+    field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0
+    field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1
+    field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+    field public static final java.lang.String COLUMN_AUTHOR = "author";
+    field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
+    field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+    field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+    field public static final java.lang.String COLUMN_CONTENT_ID = "content_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+    field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_INTENT_URI = "intent_uri";
+    field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
+    field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+    field public static final java.lang.String COLUMN_ITEM_COUNT = "item_count";
+    field public static final java.lang.String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
+    field public static final java.lang.String COLUMN_LIVE = "live";
+    field public static final java.lang.String COLUMN_LOGO_URI = "logo_uri";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
+    field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+    field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
+    field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+    field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
+    field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_TRANSIENT = "transient";
+    field public static final java.lang.String COLUMN_TYPE = "type";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+    field public static final java.lang.String COLUMN_WEIGHT = "weight";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/preview_program";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/preview_program";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final int INTERACTION_TYPE_FANS = 3; // 0x3
+    field public static final int INTERACTION_TYPE_FOLLOWERS = 2; // 0x2
+    field public static final int INTERACTION_TYPE_LIKES = 4; // 0x4
+    field public static final int INTERACTION_TYPE_LISTENS = 1; // 0x1
+    field public static final int INTERACTION_TYPE_THUMBS = 5; // 0x5
+    field public static final int INTERACTION_TYPE_VIEWERS = 6; // 0x6
+    field public static final int INTERACTION_TYPE_VIEWS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+    field public static final int TYPE_ALBUM = 8; // 0x8
+    field public static final int TYPE_ARTIST = 9; // 0x9
+    field public static final int TYPE_CHANNEL = 6; // 0x6
+    field public static final int TYPE_CLIP = 4; // 0x4
+    field public static final int TYPE_EVENT = 5; // 0x5
+    field public static final int TYPE_MOVIE = 0; // 0x0
+    field public static final int TYPE_PLAYLIST = 10; // 0xa
+    field public static final int TYPE_STATION = 11; // 0xb
+    field public static final int TYPE_TRACK = 7; // 0x7
+    field public static final int TYPE_TV_EPISODE = 3; // 0x3
+    field public static final int TYPE_TV_SEASON = 2; // 0x2
+    field public static final int TYPE_TV_SERIES = 1; // 0x1
+  }
+
+  public static final class TvContractCompat.Programs implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+    field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+    field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+    field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final deprecated java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+    field public static final java.lang.String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final deprecated java.lang.String COLUMN_SEASON_NUMBER = "season_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+    field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/program";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+  }
+
+  public static final class TvContractCompat.Programs.Genres {
+    method public static java.lang.String[] decode(java.lang.String);
+    method public static java.lang.String encode(java.lang.String...);
+    method public static boolean isCanonical(java.lang.String);
+    field public static final java.lang.String ANIMAL_WILDLIFE = "ANIMAL_WILDLIFE";
+    field public static final java.lang.String ARTS = "ARTS";
+    field public static final java.lang.String COMEDY = "COMEDY";
+    field public static final java.lang.String DRAMA = "DRAMA";
+    field public static final java.lang.String EDUCATION = "EDUCATION";
+    field public static final java.lang.String ENTERTAINMENT = "ENTERTAINMENT";
+    field public static final java.lang.String FAMILY_KIDS = "FAMILY_KIDS";
+    field public static final java.lang.String GAMING = "GAMING";
+    field public static final java.lang.String LIFE_STYLE = "LIFE_STYLE";
+    field public static final java.lang.String MOVIES = "MOVIES";
+    field public static final java.lang.String MUSIC = "MUSIC";
+    field public static final java.lang.String NEWS = "NEWS";
+    field public static final java.lang.String PREMIER = "PREMIER";
+    field public static final java.lang.String SHOPPING = "SHOPPING";
+    field public static final java.lang.String SPORTS = "SPORTS";
+    field public static final java.lang.String TECH_SCIENCE = "TECH_SCIENCE";
+    field public static final java.lang.String TRAVEL = "TRAVEL";
+  }
+
+  public static final class TvContractCompat.RecordedPrograms implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+    field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+    field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+    field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_INPUT_ID = "input_id";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+    field public static final java.lang.String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes";
+    field public static final java.lang.String COLUMN_RECORDING_DATA_URI = "recording_data_uri";
+    field public static final java.lang.String COLUMN_RECORDING_DURATION_MILLIS = "recording_duration_millis";
+    field public static final java.lang.String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS = "recording_expire_time_utc_millis";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+    field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/recorded_program";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/recorded_program";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+  }
+
+  public static final class TvContractCompat.WatchNextPrograms implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final int ASPECT_RATIO_16_9 = 0; // 0x0
+    field public static final int ASPECT_RATIO_1_1 = 3; // 0x3
+    field public static final int ASPECT_RATIO_2_3 = 4; // 0x4
+    field public static final int ASPECT_RATIO_3_2 = 1; // 0x1
+    field public static final int ASPECT_RATIO_4_3 = 2; // 0x2
+    field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0
+    field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1
+    field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+    field public static final java.lang.String COLUMN_AUTHOR = "author";
+    field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
+    field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+    field public static final java.lang.String COLUMN_CONTENT_ID = "content_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+    field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_INTENT_URI = "intent_uri";
+    field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
+    field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+    field public static final java.lang.String COLUMN_ITEM_COUNT = "item_count";
+    field public static final java.lang.String COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS = "last_engagement_time_utc_millis";
+    field public static final java.lang.String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
+    field public static final java.lang.String COLUMN_LIVE = "live";
+    field public static final java.lang.String COLUMN_LOGO_URI = "logo_uri";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
+    field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+    field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
+    field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+    field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
+    field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_TRANSIENT = "transient";
+    field public static final java.lang.String COLUMN_TYPE = "type";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+    field public static final java.lang.String COLUMN_WATCH_NEXT_TYPE = "watch_next_type";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/watch_next_program";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/watch_next_program";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final int INTERACTION_TYPE_FANS = 3; // 0x3
+    field public static final int INTERACTION_TYPE_FOLLOWERS = 2; // 0x2
+    field public static final int INTERACTION_TYPE_LIKES = 4; // 0x4
+    field public static final int INTERACTION_TYPE_LISTENS = 1; // 0x1
+    field public static final int INTERACTION_TYPE_THUMBS = 5; // 0x5
+    field public static final int INTERACTION_TYPE_VIEWERS = 6; // 0x6
+    field public static final int INTERACTION_TYPE_VIEWS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+    field public static final int TYPE_ALBUM = 8; // 0x8
+    field public static final int TYPE_ARTIST = 9; // 0x9
+    field public static final int TYPE_CHANNEL = 6; // 0x6
+    field public static final int TYPE_CLIP = 4; // 0x4
+    field public static final int TYPE_EVENT = 5; // 0x5
+    field public static final int TYPE_MOVIE = 0; // 0x0
+    field public static final int TYPE_PLAYLIST = 10; // 0xa
+    field public static final int TYPE_STATION = 11; // 0xb
+    field public static final int TYPE_TRACK = 7; // 0x7
+    field public static final int TYPE_TV_EPISODE = 3; // 0x3
+    field public static final int TYPE_TV_SEASON = 2; // 0x2
+    field public static final int TYPE_TV_SERIES = 1; // 0x1
+    field public static final int WATCH_NEXT_TYPE_CONTINUE = 0; // 0x0
+    field public static final int WATCH_NEXT_TYPE_NEW = 2; // 0x2
+    field public static final int WATCH_NEXT_TYPE_NEXT = 1; // 0x1
+    field public static final int WATCH_NEXT_TYPE_WATCHLIST = 3; // 0x3
+  }
+
+  public final class WatchNextProgram {
+    method public boolean equals(java.lang.Object);
+    method public static android.support.media.tv.WatchNextProgram fromCursor(android.database.Cursor);
+    method public long getLastEngagementTimeUtcMillis();
+    method public int getWatchNextType();
+    method public android.content.ContentValues toContentValues();
+    method public java.lang.String toString();
+  }
+
+  public static final class WatchNextProgram.Builder {
+    ctor public WatchNextProgram.Builder();
+    ctor public WatchNextProgram.Builder(android.support.media.tv.WatchNextProgram);
+    method public android.support.media.tv.WatchNextProgram build();
+    method public android.support.media.tv.WatchNextProgram.Builder setLastEngagementTimeUtcMillis(long);
+    method public android.support.media.tv.WatchNextProgram.Builder setWatchNextType(int);
+  }
+
+}
+
diff --git a/tv-provider/api/27.0.0.txt b/tv-provider/api/27.0.0.txt
new file mode 100644
index 0000000..42cad9f
--- /dev/null
+++ b/tv-provider/api/27.0.0.txt
@@ -0,0 +1,545 @@
+package android.support.media.tv {
+
+  public final class Channel {
+    method public static android.support.media.tv.Channel fromCursor(android.database.Cursor);
+    method public int getAppLinkColor();
+    method public android.net.Uri getAppLinkIconUri();
+    method public android.content.Intent getAppLinkIntent() throws java.net.URISyntaxException;
+    method public android.net.Uri getAppLinkIntentUri();
+    method public android.net.Uri getAppLinkPosterArtUri();
+    method public java.lang.String getAppLinkText();
+    method public java.lang.String getDescription();
+    method public java.lang.String getDisplayName();
+    method public java.lang.String getDisplayNumber();
+    method public long getId();
+    method public java.lang.String getInputId();
+    method public byte[] getInternalProviderDataByteArray();
+    method public java.lang.Long getInternalProviderFlag1();
+    method public java.lang.Long getInternalProviderFlag2();
+    method public java.lang.Long getInternalProviderFlag3();
+    method public java.lang.Long getInternalProviderFlag4();
+    method public java.lang.String getInternalProviderId();
+    method public java.lang.String getNetworkAffiliation();
+    method public int getOriginalNetworkId();
+    method public java.lang.String getPackageName();
+    method public int getServiceId();
+    method public java.lang.String getServiceType();
+    method public int getTransportStreamId();
+    method public java.lang.String getType();
+    method public java.lang.String getVideoFormat();
+    method public boolean isBrowsable();
+    method public boolean isLocked();
+    method public boolean isSearchable();
+    method public boolean isTransient();
+    method public android.content.ContentValues toContentValues();
+  }
+
+  public static final class Channel.Builder {
+    ctor public Channel.Builder();
+    ctor public Channel.Builder(android.support.media.tv.Channel);
+    method public android.support.media.tv.Channel build();
+    method public android.support.media.tv.Channel.Builder setAppLinkColor(int);
+    method public android.support.media.tv.Channel.Builder setAppLinkIconUri(android.net.Uri);
+    method public android.support.media.tv.Channel.Builder setAppLinkIntent(android.content.Intent);
+    method public android.support.media.tv.Channel.Builder setAppLinkIntentUri(android.net.Uri);
+    method public android.support.media.tv.Channel.Builder setAppLinkPosterArtUri(android.net.Uri);
+    method public android.support.media.tv.Channel.Builder setAppLinkText(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setDescription(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setDisplayName(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setDisplayNumber(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setInputId(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setInternalProviderData(byte[]);
+    method public android.support.media.tv.Channel.Builder setInternalProviderData(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setInternalProviderFlag1(long);
+    method public android.support.media.tv.Channel.Builder setInternalProviderFlag2(long);
+    method public android.support.media.tv.Channel.Builder setInternalProviderFlag3(long);
+    method public android.support.media.tv.Channel.Builder setInternalProviderFlag4(long);
+    method public android.support.media.tv.Channel.Builder setInternalProviderId(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setNetworkAffiliation(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setOriginalNetworkId(int);
+    method public android.support.media.tv.Channel.Builder setSearchable(boolean);
+    method public android.support.media.tv.Channel.Builder setServiceId(int);
+    method public android.support.media.tv.Channel.Builder setServiceType(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setTransient(boolean);
+    method public android.support.media.tv.Channel.Builder setTransportStreamId(int);
+    method public android.support.media.tv.Channel.Builder setType(java.lang.String);
+    method public android.support.media.tv.Channel.Builder setVideoFormat(java.lang.String);
+  }
+
+  public class ChannelLogoUtils {
+    ctor public ChannelLogoUtils();
+    method public static android.graphics.Bitmap loadChannelLogo(android.content.Context, long);
+    method public static boolean storeChannelLogo(android.content.Context, long, android.net.Uri);
+    method public static boolean storeChannelLogo(android.content.Context, long, android.graphics.Bitmap);
+  }
+
+  public final class PreviewProgram {
+    method public boolean equals(java.lang.Object);
+    method public static android.support.media.tv.PreviewProgram fromCursor(android.database.Cursor);
+    method public long getChannelId();
+    method public int getWeight();
+    method public android.content.ContentValues toContentValues();
+    method public java.lang.String toString();
+  }
+
+  public static final class PreviewProgram.Builder {
+    ctor public PreviewProgram.Builder();
+    ctor public PreviewProgram.Builder(android.support.media.tv.PreviewProgram);
+    method public android.support.media.tv.PreviewProgram build();
+    method public android.support.media.tv.PreviewProgram.Builder setChannelId(long);
+    method public android.support.media.tv.PreviewProgram.Builder setWeight(int);
+  }
+
+  public final class Program implements java.lang.Comparable {
+    method public int compareTo(android.support.media.tv.Program);
+    method public boolean equals(java.lang.Object);
+    method public static android.support.media.tv.Program fromCursor(android.database.Cursor);
+    method public java.lang.String[] getBroadcastGenres();
+    method public long getChannelId();
+    method public long getEndTimeUtcMillis();
+    method public long getStartTimeUtcMillis();
+    method public int hashCode();
+    method public boolean isRecordingProhibited();
+    method public android.content.ContentValues toContentValues();
+    method public java.lang.String toString();
+  }
+
+  public static class Program.Builder {
+    ctor public Program.Builder();
+    ctor public Program.Builder(android.support.media.tv.Program);
+    method public android.support.media.tv.Program build();
+    method public android.support.media.tv.Program.Builder setBroadcastGenres(java.lang.String[]);
+    method public android.support.media.tv.Program.Builder setChannelId(long);
+    method public android.support.media.tv.Program.Builder setEndTimeUtcMillis(long);
+    method public android.support.media.tv.Program.Builder setRecordingProhibited(boolean);
+    method public android.support.media.tv.Program.Builder setStartTimeUtcMillis(long);
+  }
+
+  public final class TvContractCompat {
+    method public static android.net.Uri buildChannelLogoUri(long);
+    method public static android.net.Uri buildChannelLogoUri(android.net.Uri);
+    method public static android.net.Uri buildChannelUri(long);
+    method public static android.net.Uri buildChannelUriForPassthroughInput(java.lang.String);
+    method public static android.net.Uri buildChannelsUriForInput(java.lang.String);
+    method public static java.lang.String buildInputId(android.content.ComponentName);
+    method public static android.net.Uri buildPreviewProgramUri(long);
+    method public static android.net.Uri buildPreviewProgramsUriForChannel(long);
+    method public static android.net.Uri buildPreviewProgramsUriForChannel(android.net.Uri);
+    method public static android.net.Uri buildProgramUri(long);
+    method public static android.net.Uri buildProgramsUriForChannel(long);
+    method public static android.net.Uri buildProgramsUriForChannel(android.net.Uri);
+    method public static android.net.Uri buildProgramsUriForChannel(long, long, long);
+    method public static android.net.Uri buildProgramsUriForChannel(android.net.Uri, long, long);
+    method public static android.net.Uri buildRecordedProgramUri(long);
+    method public static android.net.Uri buildWatchNextProgramUri(long);
+    method public static boolean isChannelUri(android.net.Uri);
+    method public static boolean isChannelUriForPassthroughInput(android.net.Uri);
+    method public static boolean isChannelUriForTunerInput(android.net.Uri);
+    method public static boolean isProgramUri(android.net.Uri);
+    method public static boolean isRecordedProgramUri(android.net.Uri);
+    method public static void requestChannelBrowsable(android.content.Context, long);
+    field public static final java.lang.String ACTION_INITIALIZE_PROGRAMS = "android.media.tv.action.INITIALIZE_PROGRAMS";
+    field public static final java.lang.String ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT = "android.media.tv.action.PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT";
+    field public static final java.lang.String ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.PREVIEW_PROGRAM_BROWSABLE_DISABLED";
+    field public static final java.lang.String ACTION_REQUEST_CHANNEL_BROWSABLE = "android.media.tv.action.REQUEST_CHANNEL_BROWSABLE";
+    field public static final java.lang.String ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED = "android.media.tv.action.WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED";
+    field public static final java.lang.String AUTHORITY = "android.media.tv";
+    field public static final java.lang.String EXTRA_CHANNEL_ID = "android.media.tv.extra.CHANNEL_ID";
+    field public static final java.lang.String EXTRA_PREVIEW_PROGRAM_ID = "android.media.tv.extra.PREVIEW_PROGRAM_ID";
+    field public static final java.lang.String EXTRA_WATCH_NEXT_PROGRAM_ID = "android.media.tv.extra.WATCH_NEXT_PROGRAM_ID";
+  }
+
+  public static abstract interface TvContractCompat.BaseTvColumns {
+    field public static final java.lang.String COLUMN_PACKAGE_NAME = "package_name";
+  }
+
+  public static final class TvContractCompat.Channels implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    method public static java.lang.String getVideoResolution(java.lang.String);
+    field public static final java.lang.String COLUMN_APP_LINK_COLOR = "app_link_color";
+    field public static final java.lang.String COLUMN_APP_LINK_ICON_URI = "app_link_icon_uri";
+    field public static final java.lang.String COLUMN_APP_LINK_INTENT_URI = "app_link_intent_uri";
+    field public static final java.lang.String COLUMN_APP_LINK_POSTER_ART_URI = "app_link_poster_art_uri";
+    field public static final java.lang.String COLUMN_APP_LINK_TEXT = "app_link_text";
+    field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
+    field public static final java.lang.String COLUMN_DESCRIPTION = "description";
+    field public static final java.lang.String COLUMN_DISPLAY_NAME = "display_name";
+    field public static final java.lang.String COLUMN_DISPLAY_NUMBER = "display_number";
+    field public static final java.lang.String COLUMN_INPUT_ID = "input_id";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+    field public static final java.lang.String COLUMN_LOCKED = "locked";
+    field public static final java.lang.String COLUMN_NETWORK_AFFILIATION = "network_affiliation";
+    field public static final java.lang.String COLUMN_ORIGINAL_NETWORK_ID = "original_network_id";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SERVICE_ID = "service_id";
+    field public static final java.lang.String COLUMN_SERVICE_TYPE = "service_type";
+    field public static final java.lang.String COLUMN_TRANSIENT = "transient";
+    field public static final java.lang.String COLUMN_TRANSPORT_STREAM_ID = "transport_stream_id";
+    field public static final java.lang.String COLUMN_TYPE = "type";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_FORMAT = "video_format";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/channel";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/channel";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final java.lang.String SERVICE_TYPE_AUDIO = "SERVICE_TYPE_AUDIO";
+    field public static final java.lang.String SERVICE_TYPE_AUDIO_VIDEO = "SERVICE_TYPE_AUDIO_VIDEO";
+    field public static final java.lang.String SERVICE_TYPE_OTHER = "SERVICE_TYPE_OTHER";
+    field public static final java.lang.String TYPE_1SEG = "TYPE_1SEG";
+    field public static final java.lang.String TYPE_ATSC_C = "TYPE_ATSC_C";
+    field public static final java.lang.String TYPE_ATSC_M_H = "TYPE_ATSC_M_H";
+    field public static final java.lang.String TYPE_ATSC_T = "TYPE_ATSC_T";
+    field public static final java.lang.String TYPE_CMMB = "TYPE_CMMB";
+    field public static final java.lang.String TYPE_DTMB = "TYPE_DTMB";
+    field public static final java.lang.String TYPE_DVB_C = "TYPE_DVB_C";
+    field public static final java.lang.String TYPE_DVB_C2 = "TYPE_DVB_C2";
+    field public static final java.lang.String TYPE_DVB_H = "TYPE_DVB_H";
+    field public static final java.lang.String TYPE_DVB_S = "TYPE_DVB_S";
+    field public static final java.lang.String TYPE_DVB_S2 = "TYPE_DVB_S2";
+    field public static final java.lang.String TYPE_DVB_SH = "TYPE_DVB_SH";
+    field public static final java.lang.String TYPE_DVB_T = "TYPE_DVB_T";
+    field public static final java.lang.String TYPE_DVB_T2 = "TYPE_DVB_T2";
+    field public static final java.lang.String TYPE_ISDB_C = "TYPE_ISDB_C";
+    field public static final java.lang.String TYPE_ISDB_S = "TYPE_ISDB_S";
+    field public static final java.lang.String TYPE_ISDB_T = "TYPE_ISDB_T";
+    field public static final java.lang.String TYPE_ISDB_TB = "TYPE_ISDB_TB";
+    field public static final java.lang.String TYPE_NTSC = "TYPE_NTSC";
+    field public static final java.lang.String TYPE_OTHER = "TYPE_OTHER";
+    field public static final java.lang.String TYPE_PAL = "TYPE_PAL";
+    field public static final java.lang.String TYPE_PREVIEW = "TYPE_PREVIEW";
+    field public static final java.lang.String TYPE_SECAM = "TYPE_SECAM";
+    field public static final java.lang.String TYPE_S_DMB = "TYPE_S_DMB";
+    field public static final java.lang.String TYPE_T_DMB = "TYPE_T_DMB";
+    field public static final java.lang.String VIDEO_FORMAT_1080I = "VIDEO_FORMAT_1080I";
+    field public static final java.lang.String VIDEO_FORMAT_1080P = "VIDEO_FORMAT_1080P";
+    field public static final java.lang.String VIDEO_FORMAT_2160P = "VIDEO_FORMAT_2160P";
+    field public static final java.lang.String VIDEO_FORMAT_240P = "VIDEO_FORMAT_240P";
+    field public static final java.lang.String VIDEO_FORMAT_360P = "VIDEO_FORMAT_360P";
+    field public static final java.lang.String VIDEO_FORMAT_4320P = "VIDEO_FORMAT_4320P";
+    field public static final java.lang.String VIDEO_FORMAT_480I = "VIDEO_FORMAT_480I";
+    field public static final java.lang.String VIDEO_FORMAT_480P = "VIDEO_FORMAT_480P";
+    field public static final java.lang.String VIDEO_FORMAT_576I = "VIDEO_FORMAT_576I";
+    field public static final java.lang.String VIDEO_FORMAT_576P = "VIDEO_FORMAT_576P";
+    field public static final java.lang.String VIDEO_FORMAT_720P = "VIDEO_FORMAT_720P";
+    field public static final java.lang.String VIDEO_RESOLUTION_ED = "VIDEO_RESOLUTION_ED";
+    field public static final java.lang.String VIDEO_RESOLUTION_FHD = "VIDEO_RESOLUTION_FHD";
+    field public static final java.lang.String VIDEO_RESOLUTION_HD = "VIDEO_RESOLUTION_HD";
+    field public static final java.lang.String VIDEO_RESOLUTION_SD = "VIDEO_RESOLUTION_SD";
+    field public static final java.lang.String VIDEO_RESOLUTION_UHD = "VIDEO_RESOLUTION_UHD";
+  }
+
+  public static final class TvContractCompat.Channels.Logo {
+    field public static final java.lang.String CONTENT_DIRECTORY = "logo";
+  }
+
+  public static final class TvContractCompat.PreviewPrograms implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final int ASPECT_RATIO_16_9 = 0; // 0x0
+    field public static final int ASPECT_RATIO_1_1 = 3; // 0x3
+    field public static final int ASPECT_RATIO_2_3 = 4; // 0x4
+    field public static final int ASPECT_RATIO_3_2 = 1; // 0x1
+    field public static final int ASPECT_RATIO_4_3 = 2; // 0x2
+    field public static final int ASPECT_RATIO_MOVIE_POSTER = 5; // 0x5
+    field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0
+    field public static final int AVAILABILITY_FREE = 4; // 0x4
+    field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1
+    field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2
+    field public static final int AVAILABILITY_PURCHASED = 3; // 0x3
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+    field public static final java.lang.String COLUMN_AUTHOR = "author";
+    field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
+    field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+    field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+    field public static final java.lang.String COLUMN_CONTENT_ID = "content_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+    field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
+    field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_GENRE = "genre";
+    field public static final java.lang.String COLUMN_INTENT_URI = "intent_uri";
+    field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
+    field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+    field public static final java.lang.String COLUMN_ITEM_COUNT = "item_count";
+    field public static final java.lang.String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
+    field public static final java.lang.String COLUMN_LIVE = "live";
+    field public static final java.lang.String COLUMN_LOGO_CONTENT_DESCRIPTION = "logo_content_description";
+    field public static final java.lang.String COLUMN_LOGO_URI = "logo_uri";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
+    field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+    field public static final java.lang.String COLUMN_PREVIEW_AUDIO_URI = "preview_audio_uri";
+    field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
+    field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+    field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
+    field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+    field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_TRANSIENT = "transient";
+    field public static final java.lang.String COLUMN_TYPE = "type";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+    field public static final java.lang.String COLUMN_WEIGHT = "weight";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/preview_program";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/preview_program";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final int INTERACTION_TYPE_FANS = 3; // 0x3
+    field public static final int INTERACTION_TYPE_FOLLOWERS = 2; // 0x2
+    field public static final int INTERACTION_TYPE_LIKES = 4; // 0x4
+    field public static final int INTERACTION_TYPE_LISTENS = 1; // 0x1
+    field public static final int INTERACTION_TYPE_THUMBS = 5; // 0x5
+    field public static final int INTERACTION_TYPE_VIEWERS = 6; // 0x6
+    field public static final int INTERACTION_TYPE_VIEWS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+    field public static final int TYPE_ALBUM = 8; // 0x8
+    field public static final int TYPE_ARTIST = 9; // 0x9
+    field public static final int TYPE_CHANNEL = 6; // 0x6
+    field public static final int TYPE_CLIP = 4; // 0x4
+    field public static final int TYPE_EVENT = 5; // 0x5
+    field public static final int TYPE_GAME = 12; // 0xc
+    field public static final int TYPE_MOVIE = 0; // 0x0
+    field public static final int TYPE_PLAYLIST = 10; // 0xa
+    field public static final int TYPE_STATION = 11; // 0xb
+    field public static final int TYPE_TRACK = 7; // 0x7
+    field public static final int TYPE_TV_EPISODE = 3; // 0x3
+    field public static final int TYPE_TV_SEASON = 2; // 0x2
+    field public static final int TYPE_TV_SERIES = 1; // 0x1
+  }
+
+  public static final class TvContractCompat.Programs implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+    field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+    field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+    field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final deprecated java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+    field public static final java.lang.String COLUMN_RECORDING_PROHIBITED = "recording_prohibited";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final deprecated java.lang.String COLUMN_SEASON_NUMBER = "season_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+    field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/program";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/program";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+  }
+
+  public static final class TvContractCompat.Programs.Genres {
+    method public static java.lang.String[] decode(java.lang.String);
+    method public static java.lang.String encode(java.lang.String...);
+    method public static boolean isCanonical(java.lang.String);
+    field public static final java.lang.String ANIMAL_WILDLIFE = "ANIMAL_WILDLIFE";
+    field public static final java.lang.String ARTS = "ARTS";
+    field public static final java.lang.String COMEDY = "COMEDY";
+    field public static final java.lang.String DRAMA = "DRAMA";
+    field public static final java.lang.String EDUCATION = "EDUCATION";
+    field public static final java.lang.String ENTERTAINMENT = "ENTERTAINMENT";
+    field public static final java.lang.String FAMILY_KIDS = "FAMILY_KIDS";
+    field public static final java.lang.String GAMING = "GAMING";
+    field public static final java.lang.String LIFE_STYLE = "LIFE_STYLE";
+    field public static final java.lang.String MOVIES = "MOVIES";
+    field public static final java.lang.String MUSIC = "MUSIC";
+    field public static final java.lang.String NEWS = "NEWS";
+    field public static final java.lang.String PREMIER = "PREMIER";
+    field public static final java.lang.String SHOPPING = "SHOPPING";
+    field public static final java.lang.String SPORTS = "SPORTS";
+    field public static final java.lang.String TECH_SCIENCE = "TECH_SCIENCE";
+    field public static final java.lang.String TRAVEL = "TRAVEL";
+  }
+
+  public static final class TvContractCompat.RecordedPrograms implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+    field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+    field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+    field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_INPUT_ID = "input_id";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+    field public static final java.lang.String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes";
+    field public static final java.lang.String COLUMN_RECORDING_DATA_URI = "recording_data_uri";
+    field public static final java.lang.String COLUMN_RECORDING_DURATION_MILLIS = "recording_duration_millis";
+    field public static final java.lang.String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS = "recording_expire_time_utc_millis";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+    field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/recorded_program";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/recorded_program";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+  }
+
+  public static final class TvContractCompat.WatchNextPrograms implements android.support.media.tv.TvContractCompat.BaseTvColumns {
+    field public static final int ASPECT_RATIO_16_9 = 0; // 0x0
+    field public static final int ASPECT_RATIO_1_1 = 3; // 0x3
+    field public static final int ASPECT_RATIO_2_3 = 4; // 0x4
+    field public static final int ASPECT_RATIO_3_2 = 1; // 0x1
+    field public static final int ASPECT_RATIO_4_3 = 2; // 0x2
+    field public static final int ASPECT_RATIO_MOVIE_POSTER = 5; // 0x5
+    field public static final int AVAILABILITY_AVAILABLE = 0; // 0x0
+    field public static final int AVAILABILITY_FREE = 4; // 0x4
+    field public static final int AVAILABILITY_FREE_WITH_SUBSCRIPTION = 1; // 0x1
+    field public static final int AVAILABILITY_PAID_CONTENT = 2; // 0x2
+    field public static final int AVAILABILITY_PURCHASED = 3; // 0x3
+    field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+    field public static final java.lang.String COLUMN_AUTHOR = "author";
+    field public static final java.lang.String COLUMN_AVAILABILITY = "availability";
+    field public static final java.lang.String COLUMN_BROWSABLE = "browsable";
+    field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+    field public static final java.lang.String COLUMN_CONTENT_ID = "content_id";
+    field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+    field public static final java.lang.String COLUMN_DURATION_MILLIS = "duration_millis";
+    field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+    field public static final java.lang.String COLUMN_EPISODE_DISPLAY_NUMBER = "episode_display_number";
+    field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+    field public static final java.lang.String COLUMN_GENRE = "genre";
+    field public static final java.lang.String COLUMN_INTENT_URI = "intent_uri";
+    field public static final java.lang.String COLUMN_INTERACTION_COUNT = "interaction_count";
+    field public static final java.lang.String COLUMN_INTERACTION_TYPE = "interaction_type";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+    field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id";
+    field public static final java.lang.String COLUMN_ITEM_COUNT = "item_count";
+    field public static final java.lang.String COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS = "last_engagement_time_utc_millis";
+    field public static final java.lang.String COLUMN_LAST_PLAYBACK_POSITION_MILLIS = "last_playback_position_millis";
+    field public static final java.lang.String COLUMN_LIVE = "live";
+    field public static final java.lang.String COLUMN_LOGO_CONTENT_DESCRIPTION = "logo_content_description";
+    field public static final java.lang.String COLUMN_LOGO_URI = "logo_uri";
+    field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+    field public static final java.lang.String COLUMN_OFFER_PRICE = "offer_price";
+    field public static final java.lang.String COLUMN_POSTER_ART_ASPECT_RATIO = "poster_art_aspect_ratio";
+    field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+    field public static final java.lang.String COLUMN_PREVIEW_AUDIO_URI = "preview_audio_uri";
+    field public static final java.lang.String COLUMN_PREVIEW_VIDEO_URI = "preview_video_uri";
+    field public static final java.lang.String COLUMN_RELEASE_DATE = "release_date";
+    field public static final java.lang.String COLUMN_REVIEW_RATING = "review_rating";
+    field public static final java.lang.String COLUMN_REVIEW_RATING_STYLE = "review_rating_style";
+    field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+    field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
+    field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+    field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+    field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
+    field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+    field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
+    field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+    field public static final java.lang.String COLUMN_TITLE = "title";
+    field public static final java.lang.String COLUMN_TRANSIENT = "transient";
+    field public static final java.lang.String COLUMN_TYPE = "type";
+    field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+    field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+    field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+    field public static final java.lang.String COLUMN_WATCH_NEXT_TYPE = "watch_next_type";
+    field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/watch_next_program";
+    field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/watch_next_program";
+    field public static final android.net.Uri CONTENT_URI;
+    field public static final int INTERACTION_TYPE_FANS = 3; // 0x3
+    field public static final int INTERACTION_TYPE_FOLLOWERS = 2; // 0x2
+    field public static final int INTERACTION_TYPE_LIKES = 4; // 0x4
+    field public static final int INTERACTION_TYPE_LISTENS = 1; // 0x1
+    field public static final int INTERACTION_TYPE_THUMBS = 5; // 0x5
+    field public static final int INTERACTION_TYPE_VIEWERS = 6; // 0x6
+    field public static final int INTERACTION_TYPE_VIEWS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_PERCENTAGE = 2; // 0x2
+    field public static final int REVIEW_RATING_STYLE_STARS = 0; // 0x0
+    field public static final int REVIEW_RATING_STYLE_THUMBS_UP_DOWN = 1; // 0x1
+    field public static final int TYPE_ALBUM = 8; // 0x8
+    field public static final int TYPE_ARTIST = 9; // 0x9
+    field public static final int TYPE_CHANNEL = 6; // 0x6
+    field public static final int TYPE_CLIP = 4; // 0x4
+    field public static final int TYPE_EVENT = 5; // 0x5
+    field public static final int TYPE_GAME = 12; // 0xc
+    field public static final int TYPE_MOVIE = 0; // 0x0
+    field public static final int TYPE_PLAYLIST = 10; // 0xa
+    field public static final int TYPE_STATION = 11; // 0xb
+    field public static final int TYPE_TRACK = 7; // 0x7
+    field public static final int TYPE_TV_EPISODE = 3; // 0x3
+    field public static final int TYPE_TV_SEASON = 2; // 0x2
+    field public static final int TYPE_TV_SERIES = 1; // 0x1
+    field public static final int WATCH_NEXT_TYPE_CONTINUE = 0; // 0x0
+    field public static final int WATCH_NEXT_TYPE_NEW = 2; // 0x2
+    field public static final int WATCH_NEXT_TYPE_NEXT = 1; // 0x1
+    field public static final int WATCH_NEXT_TYPE_WATCHLIST = 3; // 0x3
+  }
+
+  public final class WatchNextProgram {
+    method public boolean equals(java.lang.Object);
+    method public static android.support.media.tv.WatchNextProgram fromCursor(android.database.Cursor);
+    method public long getLastEngagementTimeUtcMillis();
+    method public int getWatchNextType();
+    method public android.content.ContentValues toContentValues();
+    method public java.lang.String toString();
+  }
+
+  public static final class WatchNextProgram.Builder {
+    ctor public WatchNextProgram.Builder();
+    ctor public WatchNextProgram.Builder(android.support.media.tv.WatchNextProgram);
+    method public android.support.media.tv.WatchNextProgram build();
+    method public android.support.media.tv.WatchNextProgram.Builder setLastEngagementTimeUtcMillis(long);
+    method public android.support.media.tv.WatchNextProgram.Builder setWatchNextType(int);
+  }
+
+}
+
diff --git a/tv-provider/build.gradle b/tv-provider/build.gradle
index 42d2d90..0545458 100644
--- a/tv-provider/build.gradle
+++ b/tv-provider/build.gradle
@@ -11,11 +11,6 @@
     defaultConfig {
         minSdkVersion 21
     }
-
-    sourceSets {
-        main.java.srcDirs = ['src']
-        main.res.srcDir 'res'
-    }
 }
 
 supportLibrary {
diff --git a/tv-provider/lint-baseline.xml b/tv-provider/lint-baseline.xml
index d5fde3a..9814796 100644
--- a/tv-provider/lint-baseline.xml
+++ b/tv-provider/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 3.0.0-alpha9">
+<issues format="4" by="lint 3.0.0-beta6">
 
     <issue
         id="WrongConstant"
@@ -7,8 +7,8 @@
         errorLine1="        return i == null ? INVALID_INT_VALUE : i;"
         errorLine2="                           ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/android/support/media/tv/BasePreviewProgram.java"
-            line="129"
+            file="src/main/java/android/support/media/tv/BasePreviewProgram.java"
+            line="130"
             column="28"/>
     </issue>
 
@@ -18,8 +18,8 @@
         errorLine1="        return i == null ? INVALID_INT_VALUE : i;"
         errorLine2="                           ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/android/support/media/tv/BasePreviewProgram.java"
-            line="139"
+            file="src/main/java/android/support/media/tv/BasePreviewProgram.java"
+            line="140"
             column="28"/>
     </issue>
 
@@ -29,8 +29,8 @@
         errorLine1="        return i == null ? INVALID_INT_VALUE : i;"
         errorLine2="                           ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/android/support/media/tv/BasePreviewProgram.java"
-            line="149"
+            file="src/main/java/android/support/media/tv/BasePreviewProgram.java"
+            line="150"
             column="28"/>
     </issue>
 
@@ -40,8 +40,8 @@
         errorLine1="        return i == null ? INVALID_INT_VALUE : i;"
         errorLine2="                           ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/android/support/media/tv/BasePreviewProgram.java"
-            line="167"
+            file="src/main/java/android/support/media/tv/BasePreviewProgram.java"
+            line="168"
             column="28"/>
     </issue>
 
@@ -51,8 +51,8 @@
         errorLine1="        return i == null ? INVALID_INT_VALUE : i;"
         errorLine2="                           ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/android/support/media/tv/BasePreviewProgram.java"
-            line="218"
+            file="src/main/java/android/support/media/tv/BasePreviewProgram.java"
+            line="219"
             column="28"/>
     </issue>
 
@@ -62,7 +62,7 @@
         errorLine1="        return i == null ? INVALID_INT_VALUE : i;"
         errorLine2="                           ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/android/support/media/tv/BaseProgram.java"
+            file="src/main/java/android/support/media/tv/BaseProgram.java"
             line="257"
             column="28"/>
     </issue>
@@ -73,7 +73,7 @@
         errorLine1="            mValues.put(Programs.COLUMN_BROADCAST_GENRE, Programs.Genres.encode(genres));"
         errorLine2="                                                                                ~~~~~~">
         <location
-            file="src/android/support/media/tv/Program.java"
+            file="src/main/java/android/support/media/tv/Program.java"
             line="286"
             column="81"/>
     </issue>
@@ -84,7 +84,7 @@
         errorLine1="        return i == null ? INVALID_INT_VALUE : i;"
         errorLine2="                           ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/android/support/media/tv/WatchNextProgram.java"
+            file="src/main/java/android/support/media/tv/WatchNextProgram.java"
             line="99"
             column="28"/>
     </issue>
diff --git a/tv-provider/src/android/support/media/tv/BasePreviewProgram.java b/tv-provider/src/main/java/android/support/media/tv/BasePreviewProgram.java
similarity index 100%
rename from tv-provider/src/android/support/media/tv/BasePreviewProgram.java
rename to tv-provider/src/main/java/android/support/media/tv/BasePreviewProgram.java
diff --git a/tv-provider/src/android/support/media/tv/BaseProgram.java b/tv-provider/src/main/java/android/support/media/tv/BaseProgram.java
similarity index 100%
rename from tv-provider/src/android/support/media/tv/BaseProgram.java
rename to tv-provider/src/main/java/android/support/media/tv/BaseProgram.java
diff --git a/tv-provider/src/android/support/media/tv/Channel.java b/tv-provider/src/main/java/android/support/media/tv/Channel.java
similarity index 100%
rename from tv-provider/src/android/support/media/tv/Channel.java
rename to tv-provider/src/main/java/android/support/media/tv/Channel.java
diff --git a/tv-provider/src/android/support/media/tv/ChannelLogoUtils.java b/tv-provider/src/main/java/android/support/media/tv/ChannelLogoUtils.java
similarity index 100%
rename from tv-provider/src/android/support/media/tv/ChannelLogoUtils.java
rename to tv-provider/src/main/java/android/support/media/tv/ChannelLogoUtils.java
diff --git a/tv-provider/src/android/support/media/tv/CollectionUtils.java b/tv-provider/src/main/java/android/support/media/tv/CollectionUtils.java
similarity index 100%
rename from tv-provider/src/android/support/media/tv/CollectionUtils.java
rename to tv-provider/src/main/java/android/support/media/tv/CollectionUtils.java
diff --git a/tv-provider/src/android/support/media/tv/PreviewProgram.java b/tv-provider/src/main/java/android/support/media/tv/PreviewProgram.java
similarity index 100%
rename from tv-provider/src/android/support/media/tv/PreviewProgram.java
rename to tv-provider/src/main/java/android/support/media/tv/PreviewProgram.java
diff --git a/tv-provider/src/android/support/media/tv/Program.java b/tv-provider/src/main/java/android/support/media/tv/Program.java
similarity index 100%
rename from tv-provider/src/android/support/media/tv/Program.java
rename to tv-provider/src/main/java/android/support/media/tv/Program.java
diff --git a/tv-provider/src/android/support/media/tv/TvContractCompat.java b/tv-provider/src/main/java/android/support/media/tv/TvContractCompat.java
similarity index 100%
rename from tv-provider/src/android/support/media/tv/TvContractCompat.java
rename to tv-provider/src/main/java/android/support/media/tv/TvContractCompat.java
diff --git a/tv-provider/src/android/support/media/tv/TvContractUtils.java b/tv-provider/src/main/java/android/support/media/tv/TvContractUtils.java
similarity index 100%
rename from tv-provider/src/android/support/media/tv/TvContractUtils.java
rename to tv-provider/src/main/java/android/support/media/tv/TvContractUtils.java
diff --git a/tv-provider/src/android/support/media/tv/WatchNextProgram.java b/tv-provider/src/main/java/android/support/media/tv/WatchNextProgram.java
similarity index 100%
rename from tv-provider/src/android/support/media/tv/WatchNextProgram.java
rename to tv-provider/src/main/java/android/support/media/tv/WatchNextProgram.java
diff --git a/v13/AndroidManifest.xml b/v13/AndroidManifest.xml
index 6f5a696..164f757 100644
--- a/v13/AndroidManifest.xml
+++ b/v13/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.v13">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.v13.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/v13/api/26.1.0.txt b/v13/api/26.1.0.txt
new file mode 100644
index 0000000..d309fdc
--- /dev/null
+++ b/v13/api/26.1.0.txt
@@ -0,0 +1,102 @@
+package android.support.v13.app {
+
+  public class ActivityCompat extends android.support.v4.app.ActivityCompat {
+    ctor protected ActivityCompat();
+    method public static android.support.v13.view.DragAndDropPermissionsCompat requestDragAndDropPermissions(android.app.Activity, android.view.DragEvent);
+  }
+
+  public class FragmentCompat {
+    ctor public FragmentCompat();
+    method public static void requestPermissions(android.app.Fragment, java.lang.String[], int);
+    method public static deprecated 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 deprecated void setup();
+    method public void setup(android.content.Context, android.app.FragmentManager);
+    method public void setup(android.content.Context, android.app.FragmentManager, int);
+  }
+
+}
+
+package android.support.v13.view {
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View, android.support.v13.view.DragStartHelper.OnDragStartListener);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point);
+    method public boolean onLongClick(android.view.View);
+    method public boolean onTouch(android.view.View, android.view.MotionEvent);
+  }
+
+  public static abstract interface DragStartHelper.OnDragStartListener {
+    method public abstract boolean onDragStart(android.view.View, android.support.v13.view.DragStartHelper);
+  }
+
+  public deprecated class ViewCompat extends android.support.v4.view.ViewCompat {
+  }
+
+}
+
+package android.support.v13.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor public EditorInfoCompat();
+    method public static java.lang.String[] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, java.lang.String[]);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, android.support.v13.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, android.support.v13.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    field public static int INPUT_CONTENT_GRANT_READ_URI_PERMISSION;
+  }
+
+  public static abstract interface InputConnectionCompat.OnCommitContentListener {
+    method public abstract boolean onCommitContent(android.support.v13.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public java.lang.Object unwrap();
+    method public static android.support.v13.view.inputmethod.InputContentInfoCompat wrap(java.lang.Object);
+  }
+
+}
+
diff --git a/v13/api/27.0.0.txt b/v13/api/27.0.0.txt
new file mode 100644
index 0000000..73871f6
--- /dev/null
+++ b/v13/api/27.0.0.txt
@@ -0,0 +1,107 @@
+package android.support.v13.app {
+
+  public class ActivityCompat extends android.support.v4.app.ActivityCompat {
+    ctor protected ActivityCompat();
+    method public static android.support.v13.view.DragAndDropPermissionsCompat requestDragAndDropPermissions(android.app.Activity, android.view.DragEvent);
+  }
+
+  public class FragmentCompat {
+    ctor public FragmentCompat();
+    method public static void requestPermissions(android.app.Fragment, java.lang.String[], int);
+    method public static deprecated void setMenuVisibility(android.app.Fragment, boolean);
+    method public static void setPermissionCompatDelegate(android.support.v13.app.FragmentCompat.PermissionCompatDelegate);
+    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 static abstract interface FragmentCompat.PermissionCompatDelegate {
+    method public abstract boolean requestPermissions(android.app.Fragment, 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 deprecated void setup();
+    method public void setup(android.content.Context, android.app.FragmentManager);
+    method public void setup(android.content.Context, android.app.FragmentManager, int);
+  }
+
+}
+
+package android.support.v13.view {
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View, android.support.v13.view.DragStartHelper.OnDragStartListener);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point);
+    method public boolean onLongClick(android.view.View);
+    method public boolean onTouch(android.view.View, android.view.MotionEvent);
+  }
+
+  public static abstract interface DragStartHelper.OnDragStartListener {
+    method public abstract boolean onDragStart(android.view.View, android.support.v13.view.DragStartHelper);
+  }
+
+  public deprecated class ViewCompat extends android.support.v4.view.ViewCompat {
+  }
+
+}
+
+package android.support.v13.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor public EditorInfoCompat();
+    method public static java.lang.String[] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, java.lang.String[]);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, android.support.v13.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, android.support.v13.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    field public static int INPUT_CONTENT_GRANT_READ_URI_PERMISSION;
+  }
+
+  public static abstract interface InputConnectionCompat.OnCommitContentListener {
+    method public abstract boolean onCommitContent(android.support.v13.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public java.lang.Object unwrap();
+    method public static android.support.v13.view.inputmethod.InputContentInfoCompat wrap(java.lang.Object);
+  }
+
+}
+
diff --git a/v13/api/current.txt b/v13/api/current.txt
index d309fdc..73871f6 100644
--- a/v13/api/current.txt
+++ b/v13/api/current.txt
@@ -9,6 +9,7 @@
     ctor public FragmentCompat();
     method public static void requestPermissions(android.app.Fragment, java.lang.String[], int);
     method public static deprecated void setMenuVisibility(android.app.Fragment, boolean);
+    method public static void setPermissionCompatDelegate(android.support.v13.app.FragmentCompat.PermissionCompatDelegate);
     method public static void setUserVisibleHint(android.app.Fragment, boolean);
     method public static boolean shouldShowRequestPermissionRationale(android.app.Fragment, java.lang.String);
   }
@@ -17,6 +18,10 @@
     method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
   }
 
+  public static abstract interface FragmentCompat.PermissionCompatDelegate {
+    method public abstract boolean requestPermissions(android.app.Fragment, 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);
diff --git a/v13/java/android/support/v13/app/FragmentCompat.java b/v13/java/android/support/v13/app/FragmentCompat.java
index 4f21052..31c2343 100644
--- a/v13/java/android/support/v13/app/FragmentCompat.java
+++ b/v13/java/android/support/v13/app/FragmentCompat.java
@@ -24,6 +24,7 @@
 import android.os.Looper;
 import android.support.annotation.NonNull;
 import android.support.annotation.RequiresApi;
+import android.support.annotation.RestrictTo;
 
 import java.util.Arrays;
 
@@ -37,6 +38,38 @@
         boolean shouldShowRequestPermissionRationale(Fragment fragment, String permission);
     }
 
+    /**
+     * Customizable delegate that allows delegating permission related compatibility methods
+     * to a custom implementation.
+     *
+     * <p>
+     *     To delegate fragment compatibility methods to a custom class, implement this interface,
+     *     and call {@code FragmentCompat.setPermissionCompatDelegate(delegate);}. All future calls
+     *     to the compatibility methods in this class will first check whether the delegate can
+     *     handle the method call, and invoke the corresponding method if it can.
+     * </p>
+     */
+    public interface PermissionCompatDelegate {
+
+        /**
+         * Determines whether the delegate should handle
+         * {@link FragmentCompat#requestPermissions(Fragment, String[], int)}, and request
+         * permissions if applicable. If this method returns true, it means that permission
+         * request is successfully handled by the delegate, and platform should not perform any
+         * further requests for permission.
+         *
+         * @param fragment The target fragment.
+         * @param permissions The requested permissions.
+         * @param requestCode Application specific request code to match with a result
+         *    reported to {@link OnRequestPermissionsResultCallback#onRequestPermissionsResult(
+         *    int, String[], int[])}.
+         *
+         * @return Whether the delegate has handled the permission request.
+         * @see FragmentCompat#requestPermissions(Fragment, String[], int)
+         */
+        boolean requestPermissions(Fragment fragment, String[] permissions, int requestCode);
+    }
+
     static class FragmentCompatBaseImpl implements FragmentCompatImpl {
         @Override
         public void setUserVisibleHint(Fragment f, boolean deferStart) {
@@ -117,6 +150,26 @@
         }
     }
 
+    private static PermissionCompatDelegate sDelegate;
+
+    /**
+     * Sets the permission delegate for {@code FragmentCompat}. Replaces the previously set
+     * delegate.
+     *
+     * @param delegate The delegate to be set. {@code null} to clear the set delegate.
+     */
+    public static void setPermissionCompatDelegate(PermissionCompatDelegate delegate) {
+        sDelegate = delegate;
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public static PermissionCompatDelegate getPermissionCompatDelegate() {
+        return sDelegate;
+    }
+
     /**
      * This interface is the contract for receiving the results for permission requests.
      */
@@ -212,6 +265,11 @@
      */
     public static void requestPermissions(@NonNull Fragment fragment,
             @NonNull String[] permissions, int requestCode) {
+        if (sDelegate != null && sDelegate.requestPermissions(fragment, permissions, requestCode)) {
+            // Delegate has handled the request.
+            return;
+        }
+
         IMPL.requestPermissions(fragment, permissions, requestCode);
     }
 
diff --git a/v13/java/android/support/v13/app/FragmentPagerAdapter.java b/v13/java/android/support/v13/app/FragmentPagerAdapter.java
index 082f883..e0b788a 100644
--- a/v13/java/android/support/v13/app/FragmentPagerAdapter.java
+++ b/v13/java/android/support/v13/app/FragmentPagerAdapter.java
@@ -48,18 +48,18 @@
  * <p>Here is an example implementation of a pager containing fragments of
  * lists:
  *
- * {@sample frameworks/support/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentPagerSupport.java
+ * {@sample frameworks/support/samples/Support13Demos/src/main/java/com/example/android/supportv13/app/FragmentPagerSupport.java
  *      complete}
  *
  * <p>The <code>R.layout.fragment_pager</code> resource of the top-level fragment is:
  *
- * {@sample frameworks/support/samples/Support13Demos/res/layout/fragment_pager.xml
+ * {@sample frameworks/support/samples/Support13Demos/src/main/res/layout/fragment_pager.xml
  *      complete}
  *
  * <p>The <code>R.layout.fragment_pager_list</code> resource containing each
  * individual fragment's layout is:
  *
- * {@sample frameworks/support/samples/Support13Demos/res/layout/fragment_pager_list.xml
+ * {@sample frameworks/support/samples/Support13Demos/src/main/res/layout/fragment_pager_list.xml
  *      complete}
  */
 public abstract class FragmentPagerAdapter extends PagerAdapter {
diff --git a/v13/java/android/support/v13/app/FragmentStatePagerAdapter.java b/v13/java/android/support/v13/app/FragmentStatePagerAdapter.java
index 8907fec..45a6bf5 100644
--- a/v13/java/android/support/v13/app/FragmentStatePagerAdapter.java
+++ b/v13/java/android/support/v13/app/FragmentStatePagerAdapter.java
@@ -51,18 +51,18 @@
  * <p>Here is an example implementation of a pager containing fragments of
  * lists:
  *
- * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStatePagerSupport.java
+ * {@sample frameworks/support/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentStatePagerSupport.java
  *      complete}
  *
  * <p>The <code>R.layout.fragment_pager</code> resource of the top-level fragment is:
  *
- * {@sample frameworks/support/samples/Support4Demos/res/layout/fragment_pager.xml
+ * {@sample frameworks/support/samples/Support4Demos/src/main/res/layout/fragment_pager.xml
  *      complete}
  *
  * <p>The <code>R.layout.fragment_pager_list</code> resource containing each
  * individual fragment's layout is:
  *
- * {@sample frameworks/support/samples/Support4Demos/res/layout/fragment_pager_list.xml
+ * {@sample frameworks/support/samples/Support4Demos/src/main/res/layout/fragment_pager_list.xml
  *      complete}
  */
 public abstract class FragmentStatePagerAdapter extends PagerAdapter {
diff --git a/v13/tests/AndroidManifest.xml b/v13/tests/AndroidManifest.xml
index b2d04c9..541a37f 100644
--- a/v13/tests/AndroidManifest.xml
+++ b/v13/tests/AndroidManifest.xml
@@ -19,6 +19,7 @@
     <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
 
     <application>
+        <activity android:name="android.support.v13.app.FragmentCompatTestActivity" />
         <activity android:name="android.support.v13.view.DragStartHelperTestActivity"/>
     </application>
 
diff --git a/v13/tests/java/android/support/v13/app/FragmentCompatTest.java b/v13/tests/java/android/support/v13/app/FragmentCompatTest.java
new file mode 100644
index 0000000..34b01f1
--- /dev/null
+++ b/v13/tests/java/android/support/v13/app/FragmentCompatTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v13.app;
+
+import static org.mockito.AdditionalMatchers.aryEq;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.same;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import android.Manifest;
+import android.app.Activity;
+import android.app.Fragment;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SdkSuppress;
+import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v13.app.FragmentCompat.PermissionCompatDelegate;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.HONEYCOMB)
+public class FragmentCompatTest {
+    @Rule
+    public ActivityTestRule<FragmentCompatTestActivity> mActivityRule =
+            new ActivityTestRule<>(FragmentCompatTestActivity.class);
+
+    private Activity mActivity;
+    private TestFragment mFragment;
+
+    @Before
+    public void setup() throws Throwable {
+        mActivity = mActivityRule.getActivity();
+        mFragment = attachTestFragment();
+    }
+
+    @SmallTest
+    @Test
+    public void testFragmentCompatDelegate() {
+        FragmentCompat.PermissionCompatDelegate delegate = mock(PermissionCompatDelegate.class);
+
+        // First test setting the delegate
+        FragmentCompat.setPermissionCompatDelegate(delegate);
+
+        FragmentCompat.requestPermissions(mFragment, new String[]{
+                Manifest.permission.ACCESS_FINE_LOCATION}, 42);
+        verify(delegate).requestPermissions(same(mFragment),
+                aryEq(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}), eq(42));
+
+        // Now test clearing the delegate
+        FragmentCompat.setPermissionCompatDelegate(null);
+
+        FragmentCompat.requestPermissions(mFragment, new String[]{
+                Manifest.permission.ACCESS_FINE_LOCATION}, 42);
+
+        verifyNoMoreInteractions(delegate);
+    }
+
+    private TestFragment attachTestFragment() throws Throwable {
+        final TestFragment fragment = new TestFragment();
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getFragmentManager().beginTransaction()
+                        .add(fragment, null)
+                        .addToBackStack(null)
+                        .commitAllowingStateLoss();
+                mActivity.getFragmentManager().executePendingTransactions();
+            }
+        });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+        return fragment;
+    }
+
+    /**
+     * Empty class to satisfy java class dependency.
+     */
+    public static class TestFragment extends Fragment implements
+            FragmentCompat.OnRequestPermissionsResultCallback {
+        @Override
+        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+                @NonNull int[] grantResults) {}
+    }
+}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java b/v13/tests/java/android/support/v13/app/FragmentCompatTestActivity.java
similarity index 69%
copy from paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
copy to v13/tests/java/android/support/v13/app/FragmentCompatTestActivity.java
index 5318d38..b3ab763 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/StringPagedList.java
+++ b/v13/tests/java/android/support/v13/app/FragmentCompatTestActivity.java
@@ -14,12 +14,9 @@
  * limitations under the License.
  */
 
-package android.arch.paging;
+package android.support.v13.app;
 
-import java.util.Arrays;
+import android.app.Activity;
 
-public class StringPagedList extends NullPaddedList<String> {
-    public StringPagedList(int leadingNulls, int trailingNulls, String... items) {
-        super(leadingNulls, Arrays.asList(items), trailingNulls);
-    }
+public class FragmentCompatTestActivity extends Activity {
 }
diff --git a/v14/preference/Android.mk b/v14/preference/Android.mk
index 7a0b846..4885c3e 100644
--- a/v14/preference/Android.mk
+++ b/v14/preference/Android.mk
@@ -29,7 +29,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-v14-preference
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under,src)
+LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-v7-preference \
diff --git a/v14/preference/AndroidManifest.xml b/v14/preference/AndroidManifest.xml
index 18cc666..28dabea 100644
--- a/v14/preference/AndroidManifest.xml
+++ b/v14/preference/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="android.support.v14.preference">
     <uses-sdk android:minSdkVersion="14" />
-    <application>
-        <meta-data android:name="android.support.v14.preference.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/v14/preference/OWNERS b/v14/preference/OWNERS
new file mode 100644
index 0000000..ddaac03
--- /dev/null
+++ b/v14/preference/OWNERS
@@ -0,0 +1 @@
+pavlis@google.com
\ No newline at end of file
diff --git a/v14/preference/api/26.1.0.txt b/v14/preference/api/26.1.0.txt
new file mode 100644
index 0000000..b92ccf9
--- /dev/null
+++ b/v14/preference/api/26.1.0.txt
@@ -0,0 +1,98 @@
+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.internal.AbstractMultiSelectListPreference {
+    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 scrollToPreference(java.lang.String);
+    method public void scrollToPreference(android.support.v7.preference.Preference);
+    method public void setDivider(android.graphics.drawable.Drawable);
+    method public void setDividerHeight(int);
+    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/api/27.0.0.txt b/v14/preference/api/27.0.0.txt
new file mode 100644
index 0000000..b92ccf9
--- /dev/null
+++ b/v14/preference/api/27.0.0.txt
@@ -0,0 +1,98 @@
+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.internal.AbstractMultiSelectListPreference {
+    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 scrollToPreference(java.lang.String);
+    method public void scrollToPreference(android.support.v7.preference.Preference);
+    method public void setDivider(android.graphics.drawable.Drawable);
+    method public void setDividerHeight(int);
+    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/build.gradle b/v14/preference/build.gradle
index cd3cc7e..8c66d6a 100644
--- a/v14/preference/build.gradle
+++ b/v14/preference/build.gradle
@@ -29,10 +29,7 @@
     }
 
     sourceSets {
-        main.java.srcDir 'src'
         main.res.srcDir 'res'
-        main.assets.srcDir 'assets'
-        main.resources.srcDir 'src'
     }
 }
 
diff --git a/v14/preference/src/android/support/v14/preference/EditTextPreferenceDialogFragment.java b/v14/preference/src/main/java/android/support/v14/preference/EditTextPreferenceDialogFragment.java
similarity index 100%
rename from v14/preference/src/android/support/v14/preference/EditTextPreferenceDialogFragment.java
rename to v14/preference/src/main/java/android/support/v14/preference/EditTextPreferenceDialogFragment.java
diff --git a/v14/preference/src/android/support/v14/preference/ListPreferenceDialogFragment.java b/v14/preference/src/main/java/android/support/v14/preference/ListPreferenceDialogFragment.java
similarity index 100%
rename from v14/preference/src/android/support/v14/preference/ListPreferenceDialogFragment.java
rename to v14/preference/src/main/java/android/support/v14/preference/ListPreferenceDialogFragment.java
diff --git a/v14/preference/src/android/support/v14/preference/MultiSelectListPreference.java b/v14/preference/src/main/java/android/support/v14/preference/MultiSelectListPreference.java
similarity index 100%
rename from v14/preference/src/android/support/v14/preference/MultiSelectListPreference.java
rename to v14/preference/src/main/java/android/support/v14/preference/MultiSelectListPreference.java
diff --git a/v14/preference/src/android/support/v14/preference/MultiSelectListPreferenceDialogFragment.java b/v14/preference/src/main/java/android/support/v14/preference/MultiSelectListPreferenceDialogFragment.java
similarity index 100%
rename from v14/preference/src/android/support/v14/preference/MultiSelectListPreferenceDialogFragment.java
rename to v14/preference/src/main/java/android/support/v14/preference/MultiSelectListPreferenceDialogFragment.java
diff --git a/v14/preference/src/android/support/v14/preference/PreferenceDialogFragment.java b/v14/preference/src/main/java/android/support/v14/preference/PreferenceDialogFragment.java
similarity index 100%
rename from v14/preference/src/android/support/v14/preference/PreferenceDialogFragment.java
rename to v14/preference/src/main/java/android/support/v14/preference/PreferenceDialogFragment.java
diff --git a/v14/preference/src/android/support/v14/preference/PreferenceFragment.java b/v14/preference/src/main/java/android/support/v14/preference/PreferenceFragment.java
similarity index 99%
rename from v14/preference/src/android/support/v14/preference/PreferenceFragment.java
rename to v14/preference/src/main/java/android/support/v14/preference/PreferenceFragment.java
index d1d9987..2421050 100644
--- a/v14/preference/src/android/support/v14/preference/PreferenceFragment.java
+++ b/v14/preference/src/main/java/android/support/v14/preference/PreferenceFragment.java
@@ -103,13 +103,13 @@
  * <p>The following sample code shows a simple preference fragment that is
  * populated from a resource.  The resource it loads is:</p>
  *
- * {@sample frameworks/support/samples/SupportPreferenceDemos/res/xml/preferences.xml preferences}
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml preferences}
  *
  * <p>The fragment implementation itself simply populates the preferences
  * when created.  Note that the preferences framework takes care of loading
  * the current values out of the app preferences and writing them when changed:</p>
  *
- * {@sample frameworks/support/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferences.java
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/java/com/example/android/supportpreference/FragmentSupportPreferences.java
  *      support_fragment}
  *
  * @see Preference
diff --git a/v14/preference/src/android/support/v14/preference/SwitchPreference.java b/v14/preference/src/main/java/android/support/v14/preference/SwitchPreference.java
similarity index 100%
rename from v14/preference/src/android/support/v14/preference/SwitchPreference.java
rename to v14/preference/src/main/java/android/support/v14/preference/SwitchPreference.java
diff --git a/v17/leanback/AndroidManifest.xml b/v17/leanback/AndroidManifest.xml
index 23c5c00..59ec5c0 100644
--- a/v17/leanback/AndroidManifest.xml
+++ b/v17/leanback/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.v17.leanback">
     <uses-sdk android:minSdkVersion="17"/>
-    <application>
-        <meta-data android:name="android.support.v17.leanback.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/v17/leanback/OWNERS b/v17/leanback/OWNERS
new file mode 100644
index 0000000..063702c
--- /dev/null
+++ b/v17/leanback/OWNERS
@@ -0,0 +1 @@
+dake@google.com
\ No newline at end of file
diff --git a/v17/leanback/api/26.1.0.ignore b/v17/leanback/api/26.1.0.ignore
new file mode 100644
index 0000000..81d1fe5
--- /dev/null
+++ b/v17/leanback/api/26.1.0.ignore
@@ -0,0 +1,2 @@
+036d6d4
+07abbac
diff --git a/v17/leanback/api/26.1.0.txt b/v17/leanback/api/26.1.0.txt
new file mode 100644
index 0000000..bc0eecc
--- /dev/null
+++ b/v17/leanback/api/26.1.0.txt
@@ -0,0 +1,3204 @@
+package android.support.v17.leanback.app {
+
+  public final class BackgroundManager {
+    method public void attach(android.view.Window);
+    method public void attachToView(android.view.View);
+    method public void clearDrawable();
+    method public final int getColor();
+    method public deprecated android.graphics.drawable.Drawable getDefaultDimLayer();
+    method public deprecated 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 boolean isAutoReleaseOnStop();
+    method public void release();
+    method public void setAutoReleaseOnStop(boolean);
+    method public void setBitmap(android.graphics.Bitmap);
+    method public void setColor(int);
+    method public deprecated void setDimLayer(android.graphics.drawable.Drawable);
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setThemeDrawableResourceId(int);
+  }
+
+  public class BaseFragment extends android.support.v17.leanback.app.BrandedFragment {
+    method protected java.lang.Object createEntranceTransition();
+    method public final android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+    method protected void onEntranceTransitionEnd();
+    method protected void onEntranceTransitionPrepare();
+    method protected void onEntranceTransitionStart();
+    method public void prepareEntranceTransition();
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void startEntranceTransition();
+  }
+
+   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.ItemBridgeAdapter getBridgeAdapter();
+    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
+    method public int getSelectedPosition();
+    method public final android.support.v17.leanback.widget.VerticalGridView getVerticalGridView();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void onTransitionStart();
+    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setAlignment(int);
+    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.ItemBridgeAdapter getBridgeAdapter();
+    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
+    method public int getSelectedPosition();
+    method public final android.support.v17.leanback.widget.VerticalGridView getVerticalGridView();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void onTransitionStart();
+    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setAlignment(int);
+    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+  }
+
+  public class BaseSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
+    method protected java.lang.Object createEntranceTransition();
+    method public final android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+    method protected void onEntranceTransitionEnd();
+    method protected void onEntranceTransitionPrepare();
+    method protected void onEntranceTransitionStart();
+    method public void prepareEntranceTransition();
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void startEntranceTransition();
+  }
+
+  public class BrandedFragment extends android.app.Fragment {
+    ctor public BrandedFragment();
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public int getSearchAffordanceColor();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public java.lang.CharSequence getTitle();
+    method public android.view.View getTitleView();
+    method public android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+    method public void installTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public final boolean isShowingTitle();
+    method public android.view.View onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
+    method public void setSearchAffordanceColor(int);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitleView(android.view.View);
+    method public void showTitle(boolean);
+    method public void showTitle(int);
+  }
+
+  public class BrandedSupportFragment extends android.support.v4.app.Fragment {
+    ctor public BrandedSupportFragment();
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public int getSearchAffordanceColor();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public java.lang.CharSequence getTitle();
+    method public android.view.View getTitleView();
+    method public android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+    method public void installTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public final boolean isShowingTitle();
+    method public android.view.View onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
+    method public void setSearchAffordanceColor(int);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitleView(android.view.View);
+    method public void showTitle(boolean);
+    method public void showTitle(int);
+  }
+
+  public class BrowseFragment extends android.support.v17.leanback.app.BaseFragment {
+    ctor public BrowseFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
+    method public void enableMainFragmentScaling(boolean);
+    method public deprecated 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.app.Fragment getMainFragment();
+    method public final android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapterRegistry getMainFragmentRegistry();
+    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();
+    method public android.support.v17.leanback.app.HeadersFragment onCreateHeadersFragment();
+    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 setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    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 static abstract class BrowseFragment.FragmentFactory<T extends android.app.Fragment> {
+    ctor public BrowseFragment.FragmentFactory();
+    method public abstract T createFragment(java.lang.Object);
+  }
+
+  public static abstract interface BrowseFragment.FragmentHost {
+    method public abstract void notifyDataReady(android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter);
+    method public abstract void notifyViewCreated(android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter);
+    method public abstract void showTitleView(boolean);
+  }
+
+  public static class BrowseFragment.ListRowFragmentFactory extends android.support.v17.leanback.app.BrowseFragment.FragmentFactory {
+    ctor public BrowseFragment.ListRowFragmentFactory();
+    method public android.support.v17.leanback.app.RowsFragment createFragment(java.lang.Object);
+  }
+
+  public static class BrowseFragment.MainFragmentAdapter<T extends android.app.Fragment> {
+    ctor public BrowseFragment.MainFragmentAdapter(T);
+    method public final T getFragment();
+    method public final android.support.v17.leanback.app.BrowseFragment.FragmentHost getFragmentHost();
+    method public boolean isScalingEnabled();
+    method public boolean isScrolling();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void onTransitionStart();
+    method public void setAlignment(int);
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setScalingEnabled(boolean);
+  }
+
+  public static abstract interface BrowseFragment.MainFragmentAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter getMainFragmentAdapter();
+  }
+
+  public static final class BrowseFragment.MainFragmentAdapterRegistry {
+    ctor public BrowseFragment.MainFragmentAdapterRegistry();
+    method public android.app.Fragment createFragment(java.lang.Object);
+    method public void registerFragment(java.lang.Class, android.support.v17.leanback.app.BrowseFragment.FragmentFactory);
+  }
+
+  public static class BrowseFragment.MainFragmentRowsAdapter<T extends android.app.Fragment> {
+    ctor public BrowseFragment.MainFragmentRowsAdapter(T);
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
+    method public final T getFragment();
+    method public int getSelectedPosition();
+    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, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void setSelectedPosition(int, boolean);
+  }
+
+  public static abstract interface BrowseFragment.MainFragmentRowsAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+  }
+
+  public class BrowseSupportFragment extends android.support.v17.leanback.app.BaseSupportFragment {
+    ctor public BrowseSupportFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
+    method public void enableMainFragmentScaling(boolean);
+    method public deprecated 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.app.HeadersSupportFragment getHeadersSupportFragment();
+    method public android.support.v4.app.Fragment getMainFragment();
+    method public final android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapterRegistry getMainFragmentRegistry();
+    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();
+    method public android.support.v17.leanback.app.HeadersSupportFragment onCreateHeadersSupportFragment();
+    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 setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    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 static abstract class BrowseSupportFragment.FragmentFactory<T extends android.support.v4.app.Fragment> {
+    ctor public BrowseSupportFragment.FragmentFactory();
+    method public abstract T createFragment(java.lang.Object);
+  }
+
+  public static abstract interface BrowseSupportFragment.FragmentHost {
+    method public abstract void notifyDataReady(android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter);
+    method public abstract void notifyViewCreated(android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter);
+    method public abstract void showTitleView(boolean);
+  }
+
+  public static class BrowseSupportFragment.ListRowFragmentFactory extends android.support.v17.leanback.app.BrowseSupportFragment.FragmentFactory {
+    ctor public BrowseSupportFragment.ListRowFragmentFactory();
+    method public android.support.v17.leanback.app.RowsSupportFragment createFragment(java.lang.Object);
+  }
+
+  public static class BrowseSupportFragment.MainFragmentAdapter<T extends android.support.v4.app.Fragment> {
+    ctor public BrowseSupportFragment.MainFragmentAdapter(T);
+    method public final T getFragment();
+    method public final android.support.v17.leanback.app.BrowseSupportFragment.FragmentHost getFragmentHost();
+    method public boolean isScalingEnabled();
+    method public boolean isScrolling();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void onTransitionStart();
+    method public void setAlignment(int);
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setScalingEnabled(boolean);
+  }
+
+  public static abstract interface BrowseSupportFragment.MainFragmentAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter getMainFragmentAdapter();
+  }
+
+  public static final class BrowseSupportFragment.MainFragmentAdapterRegistry {
+    ctor public BrowseSupportFragment.MainFragmentAdapterRegistry();
+    method public android.support.v4.app.Fragment createFragment(java.lang.Object);
+    method public void registerFragment(java.lang.Class, android.support.v17.leanback.app.BrowseSupportFragment.FragmentFactory);
+  }
+
+  public static class BrowseSupportFragment.MainFragmentRowsAdapter<T extends android.support.v4.app.Fragment> {
+    ctor public BrowseSupportFragment.MainFragmentRowsAdapter(T);
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
+    method public final T getFragment();
+    method public int getSelectedPosition();
+    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, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void setSelectedPosition(int, boolean);
+  }
+
+  public static abstract interface BrowseSupportFragment.MainFragmentRowsAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+  }
+
+  public class DetailsFragment extends android.support.v17.leanback.app.BaseFragment {
+    ctor public DetailsFragment();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.DetailsParallax getParallax();
+    method public android.support.v17.leanback.app.RowsFragment getRowsFragment();
+    method protected deprecated android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    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 setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    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 DetailsFragmentBackgroundController {
+    ctor public DetailsFragmentBackgroundController(android.support.v17.leanback.app.DetailsFragment);
+    method public boolean canNavigateToVideoFragment();
+    method public void enableParallax();
+    method public void enableParallax(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.support.v17.leanback.widget.ParallaxTarget.PropertyValuesHolderTarget);
+    method public final android.app.Fragment findOrCreateVideoFragment();
+    method public final android.graphics.drawable.Drawable getBottomDrawable();
+    method public final android.graphics.Bitmap getCoverBitmap();
+    method public final android.graphics.drawable.Drawable getCoverDrawable();
+    method public final int getParallaxDrawableMaxOffset();
+    method public final android.support.v17.leanback.media.PlaybackGlue getPlaybackGlue();
+    method public final int getSolidColor();
+    method public android.support.v17.leanback.media.PlaybackGlueHost onCreateGlueHost();
+    method public android.app.Fragment onCreateVideoFragment();
+    method public final void setCoverBitmap(android.graphics.Bitmap);
+    method public final void setParallaxDrawableMaxOffset(int);
+    method public final void setSolidColor(int);
+    method public void setupVideoPlayback(android.support.v17.leanback.media.PlaybackGlue);
+    method public final void switchToRows();
+    method public final void switchToVideo();
+  }
+
+  public class DetailsSupportFragment extends android.support.v17.leanback.app.BaseSupportFragment {
+    ctor public DetailsSupportFragment();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.DetailsParallax getParallax();
+    method public android.support.v17.leanback.app.RowsSupportFragment getRowsSupportFragment();
+    method protected deprecated android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    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 setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    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 DetailsSupportFragmentBackgroundController {
+    ctor public DetailsSupportFragmentBackgroundController(android.support.v17.leanback.app.DetailsSupportFragment);
+    method public boolean canNavigateToVideoSupportFragment();
+    method public void enableParallax();
+    method public void enableParallax(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.support.v17.leanback.widget.ParallaxTarget.PropertyValuesHolderTarget);
+    method public final android.support.v4.app.Fragment findOrCreateVideoSupportFragment();
+    method public final android.graphics.drawable.Drawable getBottomDrawable();
+    method public final android.graphics.Bitmap getCoverBitmap();
+    method public final android.graphics.drawable.Drawable getCoverDrawable();
+    method public final int getParallaxDrawableMaxOffset();
+    method public final android.support.v17.leanback.media.PlaybackGlue getPlaybackGlue();
+    method public final int getSolidColor();
+    method public android.support.v17.leanback.media.PlaybackGlueHost onCreateGlueHost();
+    method public android.support.v4.app.Fragment onCreateVideoSupportFragment();
+    method public final void setCoverBitmap(android.graphics.Bitmap);
+    method public final void setParallaxDrawableMaxOffset(int);
+    method public final void setSolidColor(int);
+    method public void setupVideoPlayback(android.support.v17.leanback.media.PlaybackGlue);
+    method public final void switchToRows();
+    method public final void switchToVideo();
+  }
+
+  public class ErrorFragment extends android.support.v17.leanback.app.BrandedFragment {
+    ctor public ErrorFragment();
+    method public android.graphics.drawable.Drawable getBackgroundDrawable();
+    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 boolean isBackgroundTranslucent();
+    method public void setBackgroundDrawable(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);
+  }
+
+  public class ErrorSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
+    ctor public ErrorSupportFragment();
+    method public android.graphics.drawable.Drawable getBackgroundDrawable();
+    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 boolean isBackgroundTranslucent();
+    method public void setBackgroundDrawable(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);
+  }
+
+  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 void collapseAction(boolean);
+    method public void collapseSubActions();
+    method public void expandAction(android.support.v17.leanback.widget.GuidedAction, boolean);
+    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);
+    method public int findButtonActionPositionById(long);
+    method public void finishGuidedStepFragments();
+    method public android.view.View getActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
+    method public android.view.View getButtonActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getButtonActions();
+    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 android.support.v17.leanback.widget.GuidedActionsStylist getGuidedButtonActionsStylist();
+    method public int getSelectedActionPosition();
+    method public int getSelectedButtonActionPosition();
+    method public int getUiStyle();
+    method public boolean isExpanded();
+    method public boolean isFocusOutEndAllowed();
+    method public boolean isFocusOutStartAllowed();
+    method public boolean isSubActionsExpanded();
+    method public void notifyActionChanged(int);
+    method public void notifyButtonActionChanged(int);
+    method protected void onAddSharedElementTransition(android.app.FragmentTransaction, android.support.v17.leanback.app.GuidedStepFragment);
+    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.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onCreateButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateButtonActionsStylist();
+    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 onGuidedActionEditCanceled(android.support.v17.leanback.widget.GuidedAction);
+    method public deprecated void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
+    method public long onGuidedActionEditedAndProceed(android.support.v17.leanback.widget.GuidedAction);
+    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 openInEditMode(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>);
+    method public void setSelectedActionPosition(int);
+    method public void setSelectedButtonActionPosition(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 deprecated int UI_STYLE_DEFAULT = 0; // 0x0
+    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
+    field public static final int UI_STYLE_REPLACE = 0; // 0x0
+  }
+
+  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 void collapseAction(boolean);
+    method public void collapseSubActions();
+    method public void expandAction(android.support.v17.leanback.widget.GuidedAction, boolean);
+    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);
+    method public int findButtonActionPositionById(long);
+    method public void finishGuidedStepSupportFragments();
+    method public android.view.View getActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
+    method public android.view.View getButtonActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getButtonActions();
+    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 android.support.v17.leanback.widget.GuidedActionsStylist getGuidedButtonActionsStylist();
+    method public int getSelectedActionPosition();
+    method public int getSelectedButtonActionPosition();
+    method public int getUiStyle();
+    method public boolean isExpanded();
+    method public boolean isFocusOutEndAllowed();
+    method public boolean isFocusOutStartAllowed();
+    method public boolean isSubActionsExpanded();
+    method public void notifyActionChanged(int);
+    method public void notifyButtonActionChanged(int);
+    method protected void onAddSharedElementTransition(android.support.v4.app.FragmentTransaction, android.support.v17.leanback.app.GuidedStepSupportFragment);
+    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.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onCreateButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateButtonActionsStylist();
+    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 onGuidedActionEditCanceled(android.support.v17.leanback.widget.GuidedAction);
+    method public deprecated void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
+    method public long onGuidedActionEditedAndProceed(android.support.v17.leanback.widget.GuidedAction);
+    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 openInEditMode(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>);
+    method public void setSelectedActionPosition(int);
+    method public void setSelectedButtonActionPosition(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 deprecated int UI_STYLE_DEFAULT = 0; // 0x0
+    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
+    field public static final int UI_STYLE_REPLACE = 0; // 0x0
+  }
+
+  public class HeadersFragment extends android.support.v17.leanback.app.BaseRowFragment {
+    ctor public HeadersFragment();
+    method public boolean isScrolling();
+    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener);
+    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener);
+  }
+
+  public static abstract interface HeadersFragment.OnHeaderClickedListener {
+    method public abstract void onHeaderClicked(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public 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 boolean isScrolling();
+    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener);
+    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener);
+  }
+
+  public static abstract interface HeadersSupportFragment.OnHeaderClickedListener {
+    method public abstract void onHeaderClicked(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public 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 deprecated 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 OnboardingFragment extends android.app.Fragment {
+    ctor public OnboardingFragment();
+    method public final int getArrowBackgroundColor();
+    method public final int getArrowColor();
+    method protected final int getCurrentPageIndex();
+    method public final int getDescriptionViewTextColor();
+    method public final int getDotBackgroundColor();
+    method public final int getIconResourceId();
+    method public final int getLogoResourceId();
+    method protected abstract int getPageCount();
+    method protected abstract java.lang.CharSequence getPageDescription(int);
+    method protected abstract java.lang.CharSequence getPageTitle(int);
+    method public final java.lang.CharSequence getStartButtonText();
+    method public final int getTitleViewTextColor();
+    method protected final boolean isLogoAnimationFinished();
+    method protected void moveToNextPage();
+    method protected void moveToPreviousPage();
+    method protected abstract android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected abstract android.view.View onCreateContentView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateDescriptionAnimator();
+    method protected android.animation.Animator onCreateEnterAnimation();
+    method protected abstract android.view.View onCreateForegroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateLogoAnimation();
+    method protected android.animation.Animator onCreateTitleAnimator();
+    method protected void onFinishFragment();
+    method protected void onLogoAnimationFinished();
+    method protected void onPageChanged(int, int);
+    method public int onProvideTheme();
+    method public void setArrowBackgroundColor(int);
+    method public void setArrowColor(int);
+    method public void setDescriptionViewTextColor(int);
+    method public void setDotBackgroundColor(int);
+    method public final void setIconResouceId(int);
+    method public final void setLogoResourceId(int);
+    method public void setStartButtonText(java.lang.CharSequence);
+    method public void setTitleViewTextColor(int);
+    method protected final void startEnterAnimation(boolean);
+  }
+
+  public abstract class OnboardingSupportFragment extends android.support.v4.app.Fragment {
+    ctor public OnboardingSupportFragment();
+    method public final int getArrowBackgroundColor();
+    method public final int getArrowColor();
+    method protected final int getCurrentPageIndex();
+    method public final int getDescriptionViewTextColor();
+    method public final int getDotBackgroundColor();
+    method public final int getIconResourceId();
+    method public final int getLogoResourceId();
+    method protected abstract int getPageCount();
+    method protected abstract java.lang.CharSequence getPageDescription(int);
+    method protected abstract java.lang.CharSequence getPageTitle(int);
+    method public final java.lang.CharSequence getStartButtonText();
+    method public final int getTitleViewTextColor();
+    method protected final boolean isLogoAnimationFinished();
+    method protected void moveToNextPage();
+    method protected void moveToPreviousPage();
+    method protected abstract android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected abstract android.view.View onCreateContentView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateDescriptionAnimator();
+    method protected android.animation.Animator onCreateEnterAnimation();
+    method protected abstract android.view.View onCreateForegroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateLogoAnimation();
+    method protected android.animation.Animator onCreateTitleAnimator();
+    method protected void onFinishFragment();
+    method protected void onLogoAnimationFinished();
+    method protected void onPageChanged(int, int);
+    method public int onProvideTheme();
+    method public void setArrowBackgroundColor(int);
+    method public void setArrowColor(int);
+    method public void setDescriptionViewTextColor(int);
+    method public void setDotBackgroundColor(int);
+    method public final void setIconResouceId(int);
+    method public final void setLogoResourceId(int);
+    method public void setStartButtonText(java.lang.CharSequence);
+    method public void setTitleViewTextColor(int);
+    method protected final void startEnterAnimation(boolean);
+  }
+
+  public abstract deprecated class PlaybackControlGlue extends android.support.v17.leanback.media.PlaybackControlGlue {
+    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 android.support.v17.leanback.app.PlaybackOverlayFragment getFragment();
+    method public deprecated android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public final void next();
+    method protected void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method public final void pause();
+    method protected deprecated void pausePlayback();
+    method public final void play(int);
+    method public final void previous();
+    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method protected deprecated void skipToNext();
+    method protected deprecated void skipToPrevious();
+    method protected deprecated void startPlayback(int);
+  }
+
+  public static abstract deprecated interface PlaybackControlGlue.InputEventHandler {
+    method public abstract boolean handleInputEvent(android.view.InputEvent);
+  }
+
+  public abstract deprecated class PlaybackControlSupportGlue extends android.support.v17.leanback.app.PlaybackControlGlue {
+    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[]);
+    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 PlaybackFragment extends android.app.Fragment {
+    ctor public PlaybackFragment();
+    method public deprecated void fadeOut();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public int getBackgroundType();
+    method public android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+    method public void hideControlsOverlay(boolean);
+    method public boolean isControlsOverlayAutoHideEnabled();
+    method public boolean isControlsOverlayVisible();
+    method public deprecated boolean isFadingEnabled();
+    method public void notifyPlaybackRowChanged();
+    method protected void onBufferingStateChanged(boolean);
+    method protected void onError(int, java.lang.CharSequence);
+    method protected void onVideoSizeChanged(int, int);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setBackgroundType(int);
+    method public void setControlsOverlayAutoHideEnabled(boolean);
+    method public deprecated void setFadingEnabled(boolean);
+    method public void setHostCallback(android.support.v17.leanback.media.PlaybackGlueHost.HostCallback);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public final void setOnKeyInterceptListener(android.view.View.OnKeyListener);
+    method public void setOnPlaybackItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setPlaybackRow(android.support.v17.leanback.widget.Row);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method public void showControlsOverlay(boolean);
+    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 class PlaybackFragmentGlueHost extends android.support.v17.leanback.media.PlaybackGlueHost implements android.support.v17.leanback.widget.PlaybackSeekUi {
+    ctor public PlaybackFragmentGlueHost(android.support.v17.leanback.app.PlaybackFragment);
+    method public void fadeOut();
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+  }
+
+  public deprecated class PlaybackOverlayFragment extends android.support.v17.leanback.app.DetailsFragment {
+    ctor public PlaybackOverlayFragment();
+    method public void fadeOut();
+    method public int getBackgroundType();
+    method public final android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler getEventHandler();
+    method public android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener getFadeCompleteListener();
+    method public final deprecated android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler getInputEventHandler();
+    method public boolean isFadingEnabled();
+    method public void setBackgroundType(int);
+    method public final void setEventHandler(android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler);
+    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener);
+    method public void setFadingEnabled(boolean);
+    method public final deprecated 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 deprecated interface PlaybackOverlayFragment.InputEventHandler implements android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler {
+  }
+
+  public static class PlaybackOverlayFragment.OnFadeCompleteListener {
+    ctor public PlaybackOverlayFragment.OnFadeCompleteListener();
+    method public void onFadeInComplete();
+    method public void onFadeOutComplete();
+  }
+
+  public deprecated class PlaybackOverlaySupportFragment extends android.support.v17.leanback.app.DetailsSupportFragment {
+    ctor public PlaybackOverlaySupportFragment();
+    method public void fadeOut();
+    method public int getBackgroundType();
+    method public final android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler getEventHandler();
+    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener getFadeCompleteListener();
+    method public final deprecated android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler getInputEventHandler();
+    method public boolean isFadingEnabled();
+    method public void setBackgroundType(int);
+    method public final void setEventHandler(android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler);
+    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener);
+    method public void setFadingEnabled(boolean);
+    method public final deprecated 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 deprecated interface PlaybackOverlaySupportFragment.InputEventHandler implements android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler {
+  }
+
+  public static class PlaybackOverlaySupportFragment.OnFadeCompleteListener {
+    ctor public PlaybackOverlaySupportFragment.OnFadeCompleteListener();
+    method public void onFadeInComplete();
+    method public void onFadeOutComplete();
+  }
+
+  public class PlaybackSupportFragment extends android.support.v4.app.Fragment {
+    ctor public PlaybackSupportFragment();
+    method public deprecated void fadeOut();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public int getBackgroundType();
+    method public android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+    method public void hideControlsOverlay(boolean);
+    method public boolean isControlsOverlayAutoHideEnabled();
+    method public boolean isControlsOverlayVisible();
+    method public deprecated boolean isFadingEnabled();
+    method public void notifyPlaybackRowChanged();
+    method protected void onBufferingStateChanged(boolean);
+    method protected void onError(int, java.lang.CharSequence);
+    method protected void onVideoSizeChanged(int, int);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setBackgroundType(int);
+    method public void setControlsOverlayAutoHideEnabled(boolean);
+    method public deprecated void setFadingEnabled(boolean);
+    method public void setHostCallback(android.support.v17.leanback.media.PlaybackGlueHost.HostCallback);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public final void setOnKeyInterceptListener(android.view.View.OnKeyListener);
+    method public void setOnPlaybackItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setPlaybackRow(android.support.v17.leanback.widget.Row);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method public void showControlsOverlay(boolean);
+    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 class PlaybackSupportFragmentGlueHost extends android.support.v17.leanback.media.PlaybackGlueHost implements android.support.v17.leanback.widget.PlaybackSeekUi {
+    ctor public PlaybackSupportFragmentGlueHost(android.support.v17.leanback.app.PlaybackSupportFragment);
+    method public void fadeOut();
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+  }
+
+  public final class ProgressBarManager {
+    ctor public ProgressBarManager();
+    method public void disableProgressBar();
+    method public void enableProgressBar();
+    method public long getInitialDelay();
+    method public void hide();
+    method public void setInitialDelay(long);
+    method public void setProgressBarView(android.view.View);
+    method public void setRootView(android.view.ViewGroup);
+    method public void show();
+  }
+
+  public class RowsFragment extends android.support.v17.leanback.app.BaseRowFragment implements android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapterProvider android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapterProvider {
+    ctor public RowsFragment();
+    method public deprecated void enableRowScaling(boolean);
+    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
+    method public android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter getMainFragmentAdapter();
+    method public android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(int);
+    method public boolean isScrolling();
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+  }
+
+  public static class RowsFragment.MainFragmentAdapter extends android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter {
+    ctor public RowsFragment.MainFragmentAdapter(android.support.v17.leanback.app.RowsFragment);
+  }
+
+  public static class RowsFragment.MainFragmentRowsAdapter extends android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter {
+    ctor public RowsFragment.MainFragmentRowsAdapter(android.support.v17.leanback.app.RowsFragment);
+  }
+
+  public class RowsSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment implements android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapterProvider android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapterProvider {
+    ctor public RowsSupportFragment();
+    method public deprecated void enableRowScaling(boolean);
+    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
+    method public android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter getMainFragmentAdapter();
+    method public android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(int);
+    method public boolean isScrolling();
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+  }
+
+  public static class RowsSupportFragment.MainFragmentAdapter extends android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter {
+    ctor public RowsSupportFragment.MainFragmentAdapter(android.support.v17.leanback.app.RowsSupportFragment);
+  }
+
+  public static class RowsSupportFragment.MainFragmentRowsAdapter extends android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter {
+    ctor public RowsSupportFragment.MainFragmentRowsAdapter(android.support.v17.leanback.app.RowsSupportFragment);
+  }
+
+  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 android.support.v17.leanback.app.RowsFragment getRowsFragment();
+    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 setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    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 android.support.v17.leanback.app.RowsSupportFragment getRowsSupportFragment();
+    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 setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    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.BaseFragment {
+    ctor public VerticalGridFragment();
+    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 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.BaseSupportFragment {
+    ctor public VerticalGridSupportFragment();
+    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 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 VideoFragment extends android.support.v17.leanback.app.PlaybackFragment {
+    ctor public VideoFragment();
+    method public android.view.SurfaceView getSurfaceView();
+    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+  public class VideoFragmentGlueHost extends android.support.v17.leanback.app.PlaybackFragmentGlueHost implements android.support.v17.leanback.media.SurfaceHolderGlueHost {
+    ctor public VideoFragmentGlueHost(android.support.v17.leanback.app.VideoFragment);
+    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+  public class VideoSupportFragment extends android.support.v17.leanback.app.PlaybackSupportFragment {
+    ctor public VideoSupportFragment();
+    method public android.view.SurfaceView getSurfaceView();
+    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+  public class VideoSupportFragmentGlueHost extends android.support.v17.leanback.app.PlaybackSupportFragmentGlueHost implements android.support.v17.leanback.media.SurfaceHolderGlueHost {
+    ctor public VideoSupportFragmentGlueHost(android.support.v17.leanback.app.VideoSupportFragment);
+    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+}
+
+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 class BoundsRule {
+    ctor public BoundsRule();
+    ctor public BoundsRule(android.support.v17.leanback.graphics.BoundsRule);
+    method public void calculateBounds(android.graphics.Rect, android.graphics.Rect);
+    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule bottom;
+    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule left;
+    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule right;
+    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule top;
+  }
+
+  public static final class BoundsRule.ValueRule {
+    method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule absoluteValue(int);
+    method public int getAbsoluteValue();
+    method public float getFraction();
+    method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule inheritFromParent(float);
+    method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule inheritFromParentWithOffset(float, int);
+    method public void setAbsoluteValue(int);
+    method public void setFraction(float);
+  }
+
+  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);
+  }
+
+  public class CompositeDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public CompositeDrawable();
+    method public void addChildDrawable(android.graphics.drawable.Drawable);
+    method public void draw(android.graphics.Canvas);
+    method public android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable getChildAt(int);
+    method public int getChildCount();
+    method public android.graphics.drawable.Drawable getDrawable(int);
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable);
+    method public void removeChild(int);
+    method public void removeDrawable(android.graphics.drawable.Drawable);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
+    method public void setAlpha(int);
+    method public void setChildDrawableAt(int, android.graphics.drawable.Drawable);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+  }
+
+  public static final class CompositeDrawable.ChildDrawable {
+    ctor public CompositeDrawable.ChildDrawable(android.graphics.drawable.Drawable, android.support.v17.leanback.graphics.CompositeDrawable);
+    method public android.support.v17.leanback.graphics.BoundsRule getBoundsRule();
+    method public android.graphics.drawable.Drawable getDrawable();
+    method public void recomputeBounds();
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> BOTTOM_ABSOLUTE;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> BOTTOM_FRACTION;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> LEFT_ABSOLUTE;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> LEFT_FRACTION;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> RIGHT_ABSOLUTE;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> RIGHT_FRACTION;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> TOP_ABSOLUTE;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> TOP_FRACTION;
+  }
+
+  public class FitWidthBitmapDrawable extends android.graphics.drawable.Drawable {
+    ctor public FitWidthBitmapDrawable();
+    method public void draw(android.graphics.Canvas);
+    method public android.graphics.Bitmap getBitmap();
+    method public int getOpacity();
+    method public android.graphics.Rect getSource();
+    method public int getVerticalOffset();
+    method public void setAlpha(int);
+    method public void setBitmap(android.graphics.Bitmap);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setSource(android.graphics.Rect);
+    method public void setVerticalOffset(int);
+    field public static final android.util.Property<android.support.v17.leanback.graphics.FitWidthBitmapDrawable, java.lang.Integer> PROPERTY_VERTICAL_OFFSET;
+  }
+
+}
+
+package android.support.v17.leanback.media {
+
+  public abstract class MediaControllerGlue extends android.support.v17.leanback.media.PlaybackControlGlue {
+    ctor public MediaControllerGlue(android.content.Context, 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();
+  }
+
+  public class MediaPlayerAdapter extends android.support.v17.leanback.media.PlayerAdapter {
+    ctor public MediaPlayerAdapter(android.content.Context);
+    method protected boolean onError(int, int);
+    method protected boolean onInfo(int, int);
+    method protected void onSeekComplete();
+    method public void pause();
+    method public void play();
+    method public void release();
+    method public void reset();
+    method public boolean setDataSource(android.net.Uri);
+  }
+
+  public class PlaybackBannerControlGlue<T extends android.support.v17.leanback.media.PlayerAdapter> extends android.support.v17.leanback.media.PlaybackBaseControlGlue {
+    ctor public PlaybackBannerControlGlue(android.content.Context, int[], T);
+    ctor public PlaybackBannerControlGlue(android.content.Context, int[], int[], T);
+    method public int[] getFastForwardSpeeds();
+    method public int[] getRewindSpeeds();
+    method public long getSupportedActions();
+    method public void onActionClicked(android.support.v17.leanback.widget.Action);
+    method protected android.support.v17.leanback.widget.PlaybackRowPresenter onCreateRowPresenter();
+    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+    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 PlaybackBaseControlGlue<T extends android.support.v17.leanback.media.PlayerAdapter> extends android.support.v17.leanback.media.PlaybackGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
+    ctor public PlaybackBaseControlGlue(android.content.Context, T);
+    method public android.graphics.drawable.Drawable getArt();
+    method public final long getBufferedPosition();
+    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
+    method public long getCurrentPosition();
+    method public final long getDuration();
+    method public android.support.v17.leanback.widget.PlaybackRowPresenter getPlaybackRowPresenter();
+    method public final T getPlayerAdapter();
+    method public java.lang.CharSequence getSubtitle();
+    method public java.lang.CharSequence getTitle();
+    method public boolean isControlsOverlayAutoHideEnabled();
+    method public final boolean isPlaying();
+    method public final boolean isPrepared();
+    method protected static void notifyItemChanged(android.support.v17.leanback.widget.ArrayObjectAdapter, java.lang.Object);
+    method public abstract void onActionClicked(android.support.v17.leanback.widget.Action);
+    method protected void onCreatePrimaryActions(android.support.v17.leanback.widget.ArrayObjectAdapter);
+    method protected abstract android.support.v17.leanback.widget.PlaybackRowPresenter onCreateRowPresenter();
+    method protected void onCreateSecondaryActions(android.support.v17.leanback.widget.ArrayObjectAdapter);
+    method public abstract boolean onKey(android.view.View, int, android.view.KeyEvent);
+    method protected void onPlayCompleted();
+    method protected void onPlayStateChanged();
+    method protected void onPreparedStateChanged();
+    method public final void seekTo(long);
+    method public void setArt(android.graphics.drawable.Drawable);
+    method public void setControlsOverlayAutoHideEnabled(boolean);
+    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    method public void setSubtitle(java.lang.CharSequence);
+    method public void setTitle(java.lang.CharSequence);
+  }
+
+  public abstract class PlaybackControlGlue extends android.support.v17.leanback.media.PlaybackGlue 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[]);
+    method public void enableProgressUpdating(boolean);
+    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
+    method public deprecated android.support.v17.leanback.widget.PlaybackControlsRowPresenter getControlsRowPresenter();
+    method public abstract int getCurrentPosition();
+    method public abstract int getCurrentSpeedId();
+    method public int[] getFastForwardSpeeds();
+    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.PlaybackRowPresenter getPlaybackRowPresenter();
+    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 protected void onCreateControlsRowAndPresenter();
+    method protected void onCreatePrimaryActions(android.support.v17.leanback.widget.SparseArrayObjectAdapter);
+    method protected void onCreateSecondaryActions(android.support.v17.leanback.widget.ArrayObjectAdapter);
+    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+    method protected void onMetadataChanged();
+    method protected void onStateChanged();
+    method public void play(int);
+    method public final void play();
+    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method public deprecated void setControlsRowPresenter(android.support.v17.leanback.widget.PlaybackControlsRowPresenter);
+    method public void setFadingEnabled(boolean);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    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 PlaybackGlue {
+    ctor public PlaybackGlue(android.content.Context);
+    method public void addPlayerCallback(android.support.v17.leanback.media.PlaybackGlue.PlayerCallback);
+    method public android.content.Context getContext();
+    method public android.support.v17.leanback.media.PlaybackGlueHost getHost();
+    method protected java.util.List<android.support.v17.leanback.media.PlaybackGlue.PlayerCallback> getPlayerCallbacks();
+    method public boolean isPlaying();
+    method public boolean isPrepared();
+    method public deprecated boolean isReadyForPlayback();
+    method public void next();
+    method protected void onAttachedToHost(android.support.v17.leanback.media.PlaybackGlueHost);
+    method protected void onDetachedFromHost();
+    method protected void onHostPause();
+    method protected void onHostResume();
+    method protected void onHostStart();
+    method protected void onHostStop();
+    method public void pause();
+    method public void play();
+    method public void previous();
+    method public void removePlayerCallback(android.support.v17.leanback.media.PlaybackGlue.PlayerCallback);
+    method public final void setHost(android.support.v17.leanback.media.PlaybackGlueHost);
+    method public deprecated void setPlayerCallback(android.support.v17.leanback.media.PlaybackGlue.PlayerCallback);
+  }
+
+  public static abstract class PlaybackGlue.PlayerCallback {
+    ctor public PlaybackGlue.PlayerCallback();
+    method public void onPlayCompleted(android.support.v17.leanback.media.PlaybackGlue);
+    method public void onPlayStateChanged(android.support.v17.leanback.media.PlaybackGlue);
+    method public void onPreparedStateChanged(android.support.v17.leanback.media.PlaybackGlue);
+    method public deprecated void onReadyForPlayback();
+  }
+
+  public abstract class PlaybackGlueHost {
+    ctor public PlaybackGlueHost();
+    method public deprecated void fadeOut();
+    method public android.support.v17.leanback.media.PlaybackGlueHost.PlayerCallback getPlayerCallback();
+    method public void hideControlsOverlay(boolean);
+    method public boolean isControlsOverlayAutoHideEnabled();
+    method public boolean isControlsOverlayVisible();
+    method public void notifyPlaybackRowChanged();
+    method public void setControlsOverlayAutoHideEnabled(boolean);
+    method public deprecated void setFadingEnabled(boolean);
+    method public void setHostCallback(android.support.v17.leanback.media.PlaybackGlueHost.HostCallback);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public void setOnKeyInterceptListener(android.view.View.OnKeyListener);
+    method public void setPlaybackRow(android.support.v17.leanback.widget.Row);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    method public void showControlsOverlay(boolean);
+  }
+
+  public static abstract class PlaybackGlueHost.HostCallback {
+    ctor public PlaybackGlueHost.HostCallback();
+    method public void onHostDestroy();
+    method public void onHostPause();
+    method public void onHostResume();
+    method public void onHostStart();
+    method public void onHostStop();
+  }
+
+  public static class PlaybackGlueHost.PlayerCallback {
+    ctor public PlaybackGlueHost.PlayerCallback();
+    method public void onBufferingStateChanged(boolean);
+    method public void onError(int, java.lang.CharSequence);
+    method public void onVideoSizeChanged(int, int);
+  }
+
+  public class PlaybackTransportControlGlue<T extends android.support.v17.leanback.media.PlayerAdapter> extends android.support.v17.leanback.media.PlaybackBaseControlGlue {
+    ctor public PlaybackTransportControlGlue(android.content.Context, T);
+    method public final android.support.v17.leanback.widget.PlaybackSeekDataProvider getSeekProvider();
+    method public final boolean isSeekEnabled();
+    method public void onActionClicked(android.support.v17.leanback.widget.Action);
+    method protected android.support.v17.leanback.widget.PlaybackRowPresenter onCreateRowPresenter();
+    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+    method public final void setSeekEnabled(boolean);
+    method public final void setSeekProvider(android.support.v17.leanback.widget.PlaybackSeekDataProvider);
+  }
+
+  public abstract class PlayerAdapter {
+    ctor public PlayerAdapter();
+    method public long getBufferedPosition();
+    method public final android.support.v17.leanback.media.PlayerAdapter.Callback getCallback();
+    method public long getCurrentPosition();
+    method public long getDuration();
+    method public boolean isPlaying();
+    method public boolean isPrepared();
+    method public void onAttachedToHost(android.support.v17.leanback.media.PlaybackGlueHost);
+    method public void onDetachedFromHost();
+    method public abstract void pause();
+    method public abstract void play();
+    method public void seekTo(long);
+    method public final void setCallback(android.support.v17.leanback.media.PlayerAdapter.Callback);
+    method public void setProgressUpdatingEnabled(boolean);
+  }
+
+  public static class PlayerAdapter.Callback {
+    ctor public PlayerAdapter.Callback();
+    method public void onBufferedPositionChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onBufferingStateChanged(android.support.v17.leanback.media.PlayerAdapter, boolean);
+    method public void onCurrentPositionChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onDurationChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onError(android.support.v17.leanback.media.PlayerAdapter, int, java.lang.String);
+    method public void onPlayCompleted(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onPlayStateChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onPreparedStateChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onVideoSizeChanged(android.support.v17.leanback.media.PlayerAdapter, int, int);
+  }
+
+  public abstract interface SurfaceHolderGlueHost {
+    method public abstract void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+}
+
+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 abstract class AbstractMediaItemPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public AbstractMediaItemPresenter();
+    ctor public AbstractMediaItemPresenter(int);
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public android.support.v17.leanback.widget.Presenter getActionPresenter();
+    method protected int getMediaPlayState(java.lang.Object);
+    method public int getThemeId();
+    method public boolean hasMediaRowSeparator();
+    method protected abstract void onBindMediaDetails(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder, java.lang.Object);
+    method public void onBindMediaPlayState(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
+    method protected void onBindRowActions(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
+    method protected void onUnbindMediaDetails(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
+    method public void onUnbindMediaPlayState(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
+    method public void setActionPresenter(android.support.v17.leanback.widget.Presenter);
+    method public void setBackgroundColor(int);
+    method public void setHasMediaRowSeparator(boolean);
+    method public void setThemeId(int);
+    field public static final int PLAY_STATE_INITIAL = 0; // 0x0
+    field public static final int PLAY_STATE_PAUSED = 1; // 0x1
+    field public static final int PLAY_STATE_PLAYING = 2; // 0x2
+  }
+
+  public static class AbstractMediaItemPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public AbstractMediaItemPresenter.ViewHolder(android.view.View);
+    method public android.view.ViewGroup getMediaItemActionsContainer();
+    method public android.view.View getMediaItemDetailsView();
+    method public android.widget.TextView getMediaItemDurationView();
+    method public android.widget.TextView getMediaItemNameView();
+    method public android.widget.TextView getMediaItemNumberView();
+    method public android.widget.ViewFlipper getMediaItemNumberViewFlipper();
+    method public android.view.View getMediaItemPausedView();
+    method public android.view.View getMediaItemPlayingView();
+    method public android.support.v17.leanback.widget.MultiActionsProvider.MultiAction[] getMediaItemRowActions();
+    method public android.view.View getMediaItemRowSeparator();
+    method public android.view.View getSelectorView();
+    method public void notifyActionChanged(android.support.v17.leanback.widget.MultiActionsProvider.MultiAction);
+    method public void notifyDetailsChanged();
+    method public void notifyPlayStateChanged();
+    method public void onBindRowActions();
+    method public void setSelectedMediaItemNumberView(int);
+  }
+
+  public abstract class AbstractMediaListHeaderPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public AbstractMediaListHeaderPresenter(android.content.Context, int);
+    ctor public AbstractMediaListHeaderPresenter();
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method protected abstract void onBindMediaListHeaderViewHolder(android.support.v17.leanback.widget.AbstractMediaListHeaderPresenter.ViewHolder, java.lang.Object);
+    method public void setBackgroundColor(int);
+  }
+
+  public static class AbstractMediaListHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public AbstractMediaListHeaderPresenter.ViewHolder(android.view.View);
+    method public android.widget.TextView getHeaderView();
+  }
+
+  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);
+    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
+  }
+
+  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 <E> 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 protected android.support.v17.leanback.widget.BaseCardView.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v17.leanback.widget.BaseCardView.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v17.leanback.widget.BaseCardView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getCardType();
+    method public deprecated int getExtraVisibility();
+    method public int getInfoVisibility();
+    method public boolean isSelectedAnimationDelayed();
+    method public void setCardType(int);
+    method public deprecated 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 abstract class BaseGridView extends android.support.v7.widget.RecyclerView {
+    method public void addOnChildViewHolderSelectedListener(android.support.v17.leanback.widget.OnChildViewHolderSelectedListener);
+    method public void animateIn();
+    method public void animateOut();
+    method public int getChildDrawingOrder(int, int);
+    method public deprecated int getHorizontalMargin();
+    method public int getHorizontalSpacing();
+    method public int getInitialPrefetchItemCount();
+    method public int getItemAlignmentOffset();
+    method public float getItemAlignmentOffsetPercent();
+    method public int getItemAlignmentViewId();
+    method public android.support.v17.leanback.widget.BaseGridView.OnUnhandledKeyListener getOnUnhandledKeyListener();
+    method public final int getSaveChildrenLimitNumber();
+    method public final int getSaveChildrenPolicy();
+    method public int getSelectedPosition();
+    method public deprecated int getVerticalMargin();
+    method public int getVerticalSpacing();
+    method public void getViewSelectedOffsets(android.view.View, int[]);
+    method public int getWindowAlignment();
+    method public int getWindowAlignmentOffset();
+    method public float getWindowAlignmentOffsetPercent();
+    method public boolean hasPreviousViewInSameRow(int);
+    method public boolean isChildLayoutAnimated();
+    method public boolean isFocusDrawingOrderEnabled();
+    method public final boolean isFocusSearchDisabled();
+    method public boolean isItemAlignmentOffsetWithPadding();
+    method public boolean isScrollEnabled();
+    method public boolean isWindowAlignmentPreferKeyLineOverHighEdge();
+    method public boolean isWindowAlignmentPreferKeyLineOverLowEdge();
+    method public boolean onRequestFocusInDescendants(int, android.graphics.Rect);
+    method public void removeOnChildViewHolderSelectedListener(android.support.v17.leanback.widget.OnChildViewHolderSelectedListener);
+    method public void setAnimateChildLayout(boolean);
+    method public void setChildrenVisibility(int);
+    method public void setFocusDrawingOrderEnabled(boolean);
+    method public final void setFocusSearchDisabled(boolean);
+    method public void setGravity(int);
+    method public void setHasOverlappingRendering(boolean);
+    method public deprecated void setHorizontalMargin(int);
+    method public void setHorizontalSpacing(int);
+    method public void setInitialPrefetchItemCount(int);
+    method public void setItemAlignmentOffset(int);
+    method public void setItemAlignmentOffsetPercent(float);
+    method public void setItemAlignmentOffsetWithPadding(boolean);
+    method public void setItemAlignmentViewId(int);
+    method public deprecated void setItemMargin(int);
+    method public void setItemSpacing(int);
+    method public void setLayoutEnabled(boolean);
+    method public void setOnChildLaidOutListener(android.support.v17.leanback.widget.OnChildLaidOutListener);
+    method public void setOnChildSelectedListener(android.support.v17.leanback.widget.OnChildSelectedListener);
+    method public void setOnChildViewHolderSelectedListener(android.support.v17.leanback.widget.OnChildViewHolderSelectedListener);
+    method public void setOnKeyInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnKeyInterceptListener);
+    method public void setOnMotionInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnMotionInterceptListener);
+    method public void setOnTouchInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnTouchInterceptListener);
+    method public void setOnUnhandledKeyListener(android.support.v17.leanback.widget.BaseGridView.OnUnhandledKeyListener);
+    method public void setPruneChild(boolean);
+    method public final void setSaveChildrenLimitNumber(int);
+    method public final void setSaveChildrenPolicy(int);
+    method public void setScrollEnabled(boolean);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, int);
+    method public void setSelectedPosition(int, android.support.v17.leanback.widget.ViewHolderTask);
+    method public void setSelectedPositionSmooth(int);
+    method public void setSelectedPositionSmooth(int, android.support.v17.leanback.widget.ViewHolderTask);
+    method public deprecated void setVerticalMargin(int);
+    method public void setVerticalSpacing(int);
+    method public void setWindowAlignment(int);
+    method public void setWindowAlignmentOffset(int);
+    method public void setWindowAlignmentOffsetPercent(float);
+    method public void setWindowAlignmentPreferKeyLineOverHighEdge(boolean);
+    method public void setWindowAlignmentPreferKeyLineOverLowEdge(boolean);
+    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+    field public static final int SAVE_ALL_CHILD = 3; // 0x3
+    field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
+    field public static final int SAVE_NO_CHILD = 0; // 0x0
+    field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
+    field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
+    field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
+    field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
+    field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
+    field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+  }
+
+  public static abstract interface BaseGridView.OnKeyInterceptListener {
+    method public abstract boolean onInterceptKeyEvent(android.view.KeyEvent);
+  }
+
+  public static abstract interface BaseGridView.OnMotionInterceptListener {
+    method public abstract boolean onInterceptMotionEvent(android.view.MotionEvent);
+  }
+
+  public static abstract interface BaseGridView.OnTouchInterceptListener {
+    method public abstract boolean onInterceptTouchEvent(android.view.MotionEvent);
+  }
+
+  public static abstract interface BaseGridView.OnUnhandledKeyListener {
+    method public abstract boolean onUnhandledKey(android.view.KeyEvent);
+  }
+
+  public abstract interface BaseOnItemViewClickedListener<T> {
+    method public abstract void onItemClicked(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, T);
+  }
+
+  public abstract interface BaseOnItemViewSelectedListener<T> {
+    method public abstract void onItemSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, T);
+  }
+
+  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 setOnDispatchKeyListener(android.view.View.OnKeyListener);
+    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 android.support.v17.leanback.widget.ClassPresenterSelector addClassPresenter(java.lang.Class<?>, android.support.v17.leanback.widget.Presenter);
+    method public android.support.v17.leanback.widget.ClassPresenterSelector addClassPresenterSelector(java.lang.Class<?>, android.support.v17.leanback.widget.PresenterSelector);
+    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.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);
+  }
+
+  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;
+  }
+
+  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 class DetailsParallax extends android.support.v17.leanback.widget.RecyclerViewParallax {
+    ctor public DetailsParallax();
+    method public android.support.v17.leanback.widget.Parallax.IntProperty getOverviewRowBottom();
+    method public android.support.v17.leanback.widget.Parallax.IntProperty getOverviewRowTop();
+  }
+
+  public class DividerPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public DividerPresenter();
+    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);
+  }
+
+  public class DividerRow extends android.support.v17.leanback.widget.Row {
+    ctor public DividerRow();
+    method public final boolean isRenderedAsRowView();
+  }
+
+  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 deprecated void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView);
+    method public static deprecated void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView, boolean);
+    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter);
+    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, boolean);
+  }
+
+  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 onDestroyView();
+    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 {
+    ctor protected GuidedAction();
+    method public int getCheckSetId();
+    method public java.lang.CharSequence getDescription();
+    method public int getDescriptionEditInputType();
+    method public int getDescriptionInputType();
+    method public java.lang.CharSequence getEditDescription();
+    method public int getEditInputType();
+    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 hasEditableActivatorView();
+    method public boolean hasMultilineDescription();
+    method public boolean hasNext();
+    method public boolean hasSubActions();
+    method public boolean hasTextEditable();
+    method public boolean infoOnly();
+    method public final boolean isAutoSaveRestoreEnabled();
+    method public boolean isChecked();
+    method public boolean isDescriptionEditable();
+    method public boolean isEditTitleUsed();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public void onRestoreInstanceState(android.os.Bundle, java.lang.String);
+    method public void onSaveInstanceState(android.os.Bundle, java.lang.String);
+    method public void setChecked(boolean);
+    method public void setDescription(java.lang.CharSequence);
+    method public void setEditDescription(java.lang.CharSequence);
+    method public void setEditTitle(java.lang.CharSequence);
+    method public void setEnabled(boolean);
+    method public void setFocusable(boolean);
+    method public void setIntent(android.content.Intent);
+    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
+    field public static final long ACTION_ID_CURRENT = -3L; // 0xfffffffffffffffdL
+    field public static final long ACTION_ID_FINISH = -6L; // 0xfffffffffffffffaL
+    field public static final long ACTION_ID_NEXT = -2L; // 0xfffffffffffffffeL
+    field public static final long ACTION_ID_NO = -9L; // 0xfffffffffffffff7L
+    field public static final long ACTION_ID_OK = -4L; // 0xfffffffffffffffcL
+    field public static final long ACTION_ID_YES = -8L; // 0xfffffffffffffff8L
+    field public static final int CHECKBOX_CHECK_SET_ID = -1; // 0xffffffff
+    field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
+    field public static final int NO_CHECK_SET = 0; // 0x0
+  }
+
+  public static class GuidedAction.Builder extends android.support.v17.leanback.widget.GuidedAction.BuilderBase {
+    ctor public deprecated GuidedAction.Builder();
+    ctor public GuidedAction.Builder(android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedAction build();
+  }
+
+  public static abstract class GuidedAction.BuilderBase<B extends android.support.v17.leanback.widget.GuidedAction.BuilderBase> {
+    ctor public GuidedAction.BuilderBase(android.content.Context);
+    method protected final void applyValues(android.support.v17.leanback.widget.GuidedAction);
+    method public B autoSaveRestoreEnabled(boolean);
+    method public B checkSetId(int);
+    method public B checked(boolean);
+    method public B clickAction(long);
+    method public B description(java.lang.CharSequence);
+    method public B description(int);
+    method public B descriptionEditInputType(int);
+    method public B descriptionEditable(boolean);
+    method public B descriptionInputType(int);
+    method public B editDescription(java.lang.CharSequence);
+    method public B editDescription(int);
+    method public B editInputType(int);
+    method public B editTitle(java.lang.CharSequence);
+    method public B editTitle(int);
+    method public B editable(boolean);
+    method public B enabled(boolean);
+    method public B focusable(boolean);
+    method public android.content.Context getContext();
+    method public B hasEditableActivatorView(boolean);
+    method public B hasNext(boolean);
+    method public B icon(android.graphics.drawable.Drawable);
+    method public B icon(int);
+    method public deprecated B iconResourceId(int, android.content.Context);
+    method public B id(long);
+    method public B infoOnly(boolean);
+    method public B inputType(int);
+    method public B intent(android.content.Intent);
+    method public B multilineDescription(boolean);
+    method public B subActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public B title(java.lang.CharSequence);
+    method public B title(int);
+  }
+
+  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 void collapseAction(boolean);
+    method public void expandAction(android.support.v17.leanback.widget.GuidedAction, boolean);
+    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 final boolean isBackKeyToCollapseActivatorView();
+    method public final boolean isBackKeyToCollapseSubActions();
+    method public boolean isButtonActions();
+    method public boolean isExpandTransitionSupported();
+    method public boolean isExpanded();
+    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);
+    method public void onAnimateItemPressedCancelled(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+    method public void onBindActivatorView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void onBindCheckMarkView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void onBindChevronView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    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 android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onDestroyView();
+    method protected deprecated void onEditingModeChange(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
+    method protected void onEditingModeChange(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean, boolean);
+    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 onProvideItemLayoutId(int);
+    method public int onProvideLayoutId();
+    method public boolean onUpdateActivatorView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void onUpdateExpandedViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+    method public void openInEditMode(android.support.v17.leanback.widget.GuidedAction);
+    method public void setAsButtonActions();
+    method public final void setBackKeyToCollapseActivatorView(boolean);
+    method public final void setBackKeyToCollapseSubActions(boolean);
+    method public deprecated void setEditingMode(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
+    method public deprecated 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 deprecated void startExpandedTransition(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+    field public static final int VIEW_TYPE_DATE_PICKER = 1; // 0x1
+    field public static final int VIEW_TYPE_DEFAULT = 0; // 0x0
+  }
+
+  public static class GuidedActionsStylist.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
+    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();
+    method public android.widget.TextView getDescriptionView();
+    method public android.widget.EditText getEditableDescriptionView();
+    method public android.widget.EditText getEditableTitleView();
+    method public android.view.View getEditingView();
+    method public java.lang.Object getFacet(java.lang.Class<?>);
+    method public android.widget.ImageView getIconView();
+    method public android.widget.TextView getTitleView();
+    method public boolean isInEditing();
+    method public boolean isInEditingActivatorView();
+    method public boolean isInEditingDescription();
+    method public boolean isInEditingText();
+    method public boolean isInEditingTitle();
+    method public boolean isSubAction();
+  }
+
+  public class GuidedDatePickerAction extends android.support.v17.leanback.widget.GuidedAction {
+    ctor public GuidedDatePickerAction();
+    method public long getDate();
+    method public java.lang.String getDatePickerFormat();
+    method public long getMaxDate();
+    method public long getMinDate();
+    method public void setDate(long);
+  }
+
+  public static final class GuidedDatePickerAction.Builder extends android.support.v17.leanback.widget.GuidedDatePickerAction.BuilderBase {
+    ctor public GuidedDatePickerAction.Builder(android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedDatePickerAction build();
+  }
+
+  public static abstract class GuidedDatePickerAction.BuilderBase<B extends android.support.v17.leanback.widget.GuidedDatePickerAction.BuilderBase> extends android.support.v17.leanback.widget.GuidedAction.BuilderBase {
+    ctor public GuidedDatePickerAction.BuilderBase(android.content.Context);
+    method protected final void applyDatePickerValues(android.support.v17.leanback.widget.GuidedDatePickerAction);
+    method public B date(long);
+    method public B datePickerFormat(java.lang.String);
+    method public B maxDate(long);
+    method public B minDate(long);
+  }
+
+  public class HeaderItem {
+    ctor public HeaderItem(long, java.lang.String);
+    ctor public HeaderItem(java.lang.String);
+    method public java.lang.CharSequence getContentDescription();
+    method public java.lang.CharSequence getDescription();
+    method public final long getId();
+    method public final java.lang.String getName();
+    method public void setContentDescription(java.lang.CharSequence);
+    method public void setDescription(java.lang.CharSequence);
+  }
+
+  public class HorizontalGridView extends android.support.v17.leanback.widget.BaseGridView {
+    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 deprecated 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 boolean isAlignedToTextViewBaseLine();
+    method public final boolean isItemAlignmentOffsetWithPadding();
+    method public final void setAlignedToTextViewBaseline(boolean);
+    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 setPresenter(android.support.v17.leanback.widget.PresenterSelector);
+    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();
+    method public java.lang.CharSequence getContentDescription();
+    method public void setContentDescription(java.lang.CharSequence);
+  }
+
+  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 protected void applySelectLevelToChild(android.support.v17.leanback.widget.ListRowPresenter.ViewHolder, android.view.View);
+    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 setNumRows(int);
+    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.SelectItemViewHolderTask extends android.support.v17.leanback.widget.Presenter.ViewHolderTask {
+    ctor public ListRowPresenter.SelectItemViewHolderTask(int);
+    method public int getItemPosition();
+    method public android.support.v17.leanback.widget.Presenter.ViewHolderTask getItemTask();
+    method public boolean isSmoothScroll();
+    method public void setItemPosition(int);
+    method public void setItemTask(android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void setSmoothScroll(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 android.support.v17.leanback.widget.Presenter.ViewHolder getItemViewHolder(int);
+    method public final android.support.v17.leanback.widget.ListRowPresenter getListRowPresenter();
+    method public int getSelectedPosition();
+  }
+
+  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 interface MultiActionsProvider {
+    method public abstract android.support.v17.leanback.widget.MultiActionsProvider.MultiAction[] getActions();
+  }
+
+  public static class MultiActionsProvider.MultiAction {
+    ctor public MultiActionsProvider.MultiAction(long);
+    method public android.graphics.drawable.Drawable getCurrentDrawable();
+    method public android.graphics.drawable.Drawable[] getDrawables();
+    method public long getId();
+    method public int getIndex();
+    method public void incrementIndex();
+    method public void setDrawables(android.graphics.drawable.Drawable[]);
+    method public void setIndex(int);
+  }
+
+  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 public boolean isImmediateNotifySupported();
+    method protected final void notifyChanged();
+    method public 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);
+    method public void onChildViewHolderSelectedAndPositioned(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, int);
+  }
+
+  public abstract interface OnItemViewClickedListener implements android.support.v17.leanback.widget.BaseOnItemViewClickedListener {
+  }
+
+  public abstract interface OnItemViewSelectedListener implements android.support.v17.leanback.widget.BaseOnItemViewSelectedListener {
+  }
+
+  public class PageRow extends android.support.v17.leanback.widget.Row {
+    ctor public PageRow(android.support.v17.leanback.widget.HeaderItem);
+    method public final boolean isRenderedAsRowView();
+  }
+
+  public abstract class Parallax<PropertyT extends android.util.Property> {
+    ctor public Parallax();
+    method public android.support.v17.leanback.widget.ParallaxEffect addEffect(android.support.v17.leanback.widget.Parallax.PropertyMarkerValue...);
+    method public final PropertyT addProperty(java.lang.String);
+    method public abstract PropertyT createProperty(java.lang.String, int);
+    method public java.util.List<android.support.v17.leanback.widget.ParallaxEffect> getEffects();
+    method public abstract float getMaxValue();
+    method public final java.util.List<PropertyT> getProperties();
+    method public void removeAllEffects();
+    method public void removeEffect(android.support.v17.leanback.widget.ParallaxEffect);
+    method public void updateValues();
+  }
+
+  public static class Parallax.FloatProperty extends android.util.Property {
+    ctor public Parallax.FloatProperty(java.lang.String, int);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue at(float, float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atAbsolute(float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atFraction(float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMax();
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMin();
+    method public final java.lang.Float get(android.support.v17.leanback.widget.Parallax);
+    method public final int getIndex();
+    method public final float getValue(android.support.v17.leanback.widget.Parallax);
+    method public final void set(android.support.v17.leanback.widget.Parallax, java.lang.Float);
+    method public final void setValue(android.support.v17.leanback.widget.Parallax, float);
+    field public static final float UNKNOWN_AFTER = 3.4028235E38f;
+    field public static final float UNKNOWN_BEFORE = -3.4028235E38f;
+  }
+
+  public static class Parallax.IntProperty extends android.util.Property {
+    ctor public Parallax.IntProperty(java.lang.String, int);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue at(int, float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atAbsolute(int);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atFraction(float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMax();
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMin();
+    method public final java.lang.Integer get(android.support.v17.leanback.widget.Parallax);
+    method public final int getIndex();
+    method public final int getValue(android.support.v17.leanback.widget.Parallax);
+    method public final void set(android.support.v17.leanback.widget.Parallax, java.lang.Integer);
+    method public final void setValue(android.support.v17.leanback.widget.Parallax, int);
+    field public static final int UNKNOWN_AFTER = 2147483647; // 0x7fffffff
+    field public static final int UNKNOWN_BEFORE = -2147483648; // 0x80000000
+  }
+
+  public static class Parallax.PropertyMarkerValue<PropertyT> {
+    ctor public Parallax.PropertyMarkerValue(PropertyT);
+    method public PropertyT getProperty();
+  }
+
+  public abstract class ParallaxEffect {
+    method public final void addTarget(android.support.v17.leanback.widget.ParallaxTarget);
+    method public final java.util.List<android.support.v17.leanback.widget.Parallax.PropertyMarkerValue> getPropertyRanges();
+    method public final java.util.List<android.support.v17.leanback.widget.ParallaxTarget> getTargets();
+    method public final void performMapping(android.support.v17.leanback.widget.Parallax);
+    method public final void removeTarget(android.support.v17.leanback.widget.ParallaxTarget);
+    method public final void setPropertyRanges(android.support.v17.leanback.widget.Parallax.PropertyMarkerValue...);
+    method public final android.support.v17.leanback.widget.ParallaxEffect target(android.support.v17.leanback.widget.ParallaxTarget);
+    method public final android.support.v17.leanback.widget.ParallaxEffect target(java.lang.Object, android.animation.PropertyValuesHolder);
+    method public final <T, V extends java.lang.Number> android.support.v17.leanback.widget.ParallaxEffect target(T, android.util.Property<T, V>);
+  }
+
+  public abstract class ParallaxTarget {
+    ctor public ParallaxTarget();
+    method public void directUpdate(java.lang.Number);
+    method public boolean isDirectMapping();
+    method public void update(float);
+  }
+
+  public static final class ParallaxTarget.DirectPropertyTarget<T, V extends java.lang.Number> extends android.support.v17.leanback.widget.ParallaxTarget {
+    ctor public ParallaxTarget.DirectPropertyTarget(java.lang.Object, android.util.Property<T, V>);
+  }
+
+  public static final class ParallaxTarget.PropertyValuesHolderTarget extends android.support.v17.leanback.widget.ParallaxTarget {
+    ctor public ParallaxTarget.PropertyValuesHolderTarget(java.lang.Object, android.animation.PropertyValuesHolder);
+  }
+
+  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 long getBufferedPosition();
+    method public deprecated int getBufferedProgress();
+    method public deprecated long getBufferedProgressLong();
+    method public long getCurrentPosition();
+    method public deprecated int getCurrentTime();
+    method public deprecated long getCurrentTimeLong();
+    method public long getDuration();
+    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 deprecated int getTotalTime();
+    method public deprecated long getTotalTimeLong();
+    method public void setBufferedPosition(long);
+    method public deprecated void setBufferedProgress(int);
+    method public deprecated void setBufferedProgressLong(long);
+    method public void setCurrentPosition(long);
+    method public deprecated void setCurrentTime(int);
+    method public deprecated void setCurrentTimeLong(long);
+    method public void setDuration(long);
+    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
+    method public final void setImageDrawable(android.graphics.drawable.Drawable);
+    method public void setOnPlaybackProgressChangedListener(android.support.v17.leanback.widget.PlaybackControlsRow.OnPlaybackProgressCallback);
+    method public final void setPrimaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public final void setSecondaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public deprecated void setTotalTime(int);
+    method public deprecated void setTotalTimeLong(long);
+  }
+
+  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 final int INDEX_OFF = 0; // 0x0
+    field public static final int INDEX_ON = 1; // 0x1
+    field public static deprecated int OFF;
+    field public static deprecated 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 final int INDEX_OFF = 0; // 0x0
+    field public static final int INDEX_ON = 1; // 0x1
+    field public static deprecated int OFF;
+    field public static deprecated 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.OnPlaybackProgressCallback {
+    ctor public PlaybackControlsRow.OnPlaybackProgressCallback();
+    method public void onBufferedPositionChanged(android.support.v17.leanback.widget.PlaybackControlsRow, long);
+    method public void onCurrentPositionChanged(android.support.v17.leanback.widget.PlaybackControlsRow, long);
+    method public void onDurationChanged(android.support.v17.leanback.widget.PlaybackControlsRow, long);
+  }
+
+  public static class PlaybackControlsRow.PictureInPictureAction extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.PictureInPictureAction(android.content.Context);
+  }
+
+  public static class PlaybackControlsRow.PlayPauseAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context);
+    field public static final int INDEX_PAUSE = 1; // 0x1
+    field public static final int INDEX_PLAY = 0; // 0x0
+    field public static deprecated int PAUSE;
+    field public static deprecated 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 deprecated int ALL;
+    field public static final int INDEX_ALL = 1; // 0x1
+    field public static final int INDEX_NONE = 0; // 0x0
+    field public static final int INDEX_ONE = 2; // 0x2
+    field public static deprecated int NONE;
+    field public static deprecated 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 final int INDEX_OFF = 0; // 0x0
+    field public static final int INDEX_ON = 1; // 0x1
+    field public static deprecated int OFF;
+    field public static deprecated 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 final int INDEX_OUTLINE = 1; // 0x1
+    field public static final int INDEX_SOLID = 0; // 0x0
+    field public static deprecated int OUTLINE;
+    field public static deprecated 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.PlaybackRowPresenter {
+    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.PlaybackRowPresenter.ViewHolder {
+    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDescriptionViewHolder;
+  }
+
+  public abstract class PlaybackRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public PlaybackRowPresenter();
+    method public void onReappear(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+  }
+
+  public static class PlaybackRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public PlaybackRowPresenter.ViewHolder(android.view.View);
+  }
+
+  public class PlaybackSeekDataProvider {
+    ctor public PlaybackSeekDataProvider();
+    method public long[] getSeekPositions();
+    method public void getThumbnail(int, android.support.v17.leanback.widget.PlaybackSeekDataProvider.ResultCallback);
+    method public void reset();
+  }
+
+  public static class PlaybackSeekDataProvider.ResultCallback {
+    ctor public PlaybackSeekDataProvider.ResultCallback();
+    method public void onThumbnailLoaded(android.graphics.Bitmap, int);
+  }
+
+  public abstract interface PlaybackSeekUi {
+    method public abstract void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+  }
+
+  public static class PlaybackSeekUi.Client {
+    ctor public PlaybackSeekUi.Client();
+    method public android.support.v17.leanback.widget.PlaybackSeekDataProvider getPlaybackSeekDataProvider();
+    method public boolean isSeekEnabled();
+    method public void onSeekFinished(boolean);
+    method public void onSeekPositionChanged(long);
+    method public void onSeekStarted();
+  }
+
+  public class PlaybackTransportRowPresenter extends android.support.v17.leanback.widget.PlaybackRowPresenter {
+    ctor public PlaybackTransportRowPresenter();
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public float getDefaultSeekIncrement();
+    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
+    method public int getProgressColor();
+    method protected void onProgressBarClicked(android.support.v17.leanback.widget.PlaybackTransportRowPresenter.ViewHolder);
+    method public void setDefaultSeekIncrement(float);
+    method public void setDescriptionPresenter(android.support.v17.leanback.widget.Presenter);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public void setProgressColor(int);
+  }
+
+  public class PlaybackTransportRowPresenter.ViewHolder extends android.support.v17.leanback.widget.PlaybackRowPresenter.ViewHolder implements android.support.v17.leanback.widget.PlaybackSeekUi {
+    ctor public PlaybackTransportRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
+    method public final android.widget.TextView getCurrentPositionView();
+    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getDescriptionViewHolder();
+    method public final android.widget.TextView getDurationView();
+    method protected void onSetCurrentPositionLabel(long);
+    method protected void onSetDurationLabel(long);
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+  }
+
+  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 static abstract class Presenter.ViewHolderTask {
+    ctor public Presenter.ViewHolderTask();
+    method public void run(android.support.v17.leanback.widget.Presenter.ViewHolder);
+  }
+
+  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 RecyclerViewParallax extends android.support.v17.leanback.widget.Parallax {
+    ctor public RecyclerViewParallax();
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty createProperty(java.lang.String, int);
+    method public float getMaxValue();
+    method public android.support.v7.widget.RecyclerView getRecyclerView();
+    method public void setRecyclerView(android.support.v7.widget.RecyclerView);
+  }
+
+  public static final class RecyclerViewParallax.ChildPositionProperty extends android.support.v17.leanback.widget.Parallax.IntProperty {
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty adapterPosition(int);
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty fraction(float);
+    method public int getAdapterPosition();
+    method public float getFraction();
+    method public int getOffset();
+    method public int getViewId();
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty offset(int);
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty viewId(int);
+  }
+
+  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 boolean isRenderedAsRowView();
+    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.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public final android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.view.View.OnKeyListener getOnKeyListener();
+    method public final android.support.v17.leanback.widget.Row getRow();
+    method public final java.lang.Object getRowObject();
+    method public final float getSelectLevel();
+    method public java.lang.Object getSelectedItem();
+    method public android.support.v17.leanback.widget.Presenter.ViewHolder getSelectedItemViewHolder();
+    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.BaseOnItemViewClickedListener);
+    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    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 boolean isRecognizing();
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setPermissionListener(android.support.v17.leanback.widget.SearchBar.SearchBarPermissionListener);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    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 static abstract interface SearchBar.SearchBarPermissionListener {
+    method public abstract void requestAudioPermission();
+  }
+
+  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 SectionRow extends android.support.v17.leanback.widget.Row {
+    ctor public SectionRow(android.support.v17.leanback.widget.HeaderItem);
+    ctor public SectionRow(long, java.lang.String);
+    ctor public SectionRow(java.lang.String);
+    method public final boolean isRenderedAsRowView();
+  }
+
+  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 setListeningOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setNotListeningOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    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.view.View);
+    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
+    method public android.view.ViewGroup getSceneRoot();
+    method public android.view.View getTitleView();
+    method public void showTitle(boolean);
+  }
+
+  public class TitleView extends android.widget.FrameLayout implements android.support.v17.leanback.widget.TitleViewAdapter.Provider {
+    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 android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+    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.CharSequence);
+    method public void updateComponentsVisibility(int);
+  }
+
+  public abstract class TitleViewAdapter {
+    ctor public TitleViewAdapter();
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public abstract android.view.View getSearchAffordanceView();
+    method public java.lang.CharSequence getTitle();
+    method public void setAnimationEnabled(boolean);
+    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.CharSequence);
+    method public void updateComponentsVisibility(int);
+    field public static final int BRANDING_VIEW_VISIBLE = 2; // 0x2
+    field public static final int FULL_VIEW_VISIBLE = 6; // 0x6
+    field public static final int SEARCH_VIEW_VISIBLE = 4; // 0x4
+  }
+
+  public static abstract interface TitleViewAdapter.Provider {
+    method public abstract android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+  }
+
+  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.v17.leanback.widget.BaseGridView {
+    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);
+  }
+
+  public abstract interface ViewHolderTask {
+    method public abstract void run(android.support.v7.widget.RecyclerView.ViewHolder);
+  }
+
+}
+
+package android.support.v17.leanback.widget.picker {
+
+  public class Picker extends android.widget.FrameLayout {
+    ctor public Picker(android.content.Context, android.util.AttributeSet, int);
+    method public void addOnValueChangedListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
+    method public float getActivatedVisibleItemCount();
+    method public android.support.v17.leanback.widget.picker.PickerColumn getColumnAt(int);
+    method public int getColumnsCount();
+    method protected int getPickerItemHeightPixels();
+    method public final int getPickerItemLayoutId();
+    method public final int getPickerItemTextViewId();
+    method public int getSelectedColumn();
+    method public final java.lang.CharSequence getSeparator();
+    method public float getVisibleItemCount();
+    method public void onColumnValueChanged(int, int);
+    method public void removeOnValueChangedListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
+    method public void setActivatedVisibleItemCount(float);
+    method public void setColumnAt(int, android.support.v17.leanback.widget.picker.PickerColumn);
+    method public void setColumnValue(int, int, boolean);
+    method public void setColumns(java.util.List<android.support.v17.leanback.widget.picker.PickerColumn>);
+    method public final void setPickerItemTextViewId(int);
+    method public void setSelectedColumn(int);
+    method public final void setSeparator(java.lang.CharSequence);
+    method public void setVisibleItemCount(float);
+  }
+
+  public static abstract interface Picker.PickerValueListener {
+    method public abstract void onValueChanged(android.support.v17.leanback.widget.picker.Picker, int);
+  }
+
+  public class PickerColumn {
+    ctor public PickerColumn();
+    method public int getCount();
+    method public int getCurrentValue();
+    method public java.lang.CharSequence getLabelFor(int);
+    method public java.lang.String getLabelFormat();
+    method public int getMaxValue();
+    method public int getMinValue();
+    method public java.lang.CharSequence[] getStaticLabels();
+    method public void setCurrentValue(int);
+    method public void setLabelFormat(java.lang.String);
+    method public void setMaxValue(int);
+    method public void setMinValue(int);
+    method public void setStaticLabels(java.lang.CharSequence[]);
+  }
+
+  public class TimePicker extends android.support.v17.leanback.widget.picker.Picker {
+    ctor public TimePicker(android.content.Context, android.util.AttributeSet);
+    ctor public TimePicker(android.content.Context, android.util.AttributeSet, int);
+    method public int getHour();
+    method public int getMinute();
+    method public boolean is24Hour();
+    method public boolean isPm();
+    method public void setHour(int);
+    method public void setIs24Hour(boolean);
+    method public void setMinute(int);
+  }
+
+}
+
diff --git a/v17/leanback/api/27.0.0.txt b/v17/leanback/api/27.0.0.txt
new file mode 100644
index 0000000..4ee4d94
--- /dev/null
+++ b/v17/leanback/api/27.0.0.txt
@@ -0,0 +1,3129 @@
+package android.support.v17.leanback.app {
+
+  public final class BackgroundManager {
+    method public void attach(android.view.Window);
+    method public void attachToView(android.view.View);
+    method public void clearDrawable();
+    method public final int getColor();
+    method public deprecated android.graphics.drawable.Drawable getDefaultDimLayer();
+    method public deprecated 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 boolean isAutoReleaseOnStop();
+    method public void release();
+    method public void setAutoReleaseOnStop(boolean);
+    method public void setBitmap(android.graphics.Bitmap);
+    method public void setColor(int);
+    method public deprecated void setDimLayer(android.graphics.drawable.Drawable);
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setThemeDrawableResourceId(int);
+  }
+
+  public class BaseFragment extends android.support.v17.leanback.app.BrandedFragment {
+    method protected java.lang.Object createEntranceTransition();
+    method public final android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+    method protected void onEntranceTransitionEnd();
+    method protected void onEntranceTransitionPrepare();
+    method protected void onEntranceTransitionStart();
+    method public void prepareEntranceTransition();
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void startEntranceTransition();
+  }
+
+   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.ItemBridgeAdapter getBridgeAdapter();
+    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
+    method public int getSelectedPosition();
+    method public final android.support.v17.leanback.widget.VerticalGridView getVerticalGridView();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void onTransitionStart();
+    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setAlignment(int);
+    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.ItemBridgeAdapter getBridgeAdapter();
+    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
+    method public int getSelectedPosition();
+    method public final android.support.v17.leanback.widget.VerticalGridView getVerticalGridView();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void onTransitionStart();
+    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setAlignment(int);
+    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+  }
+
+  public class BaseSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
+    method protected java.lang.Object createEntranceTransition();
+    method public final android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+    method protected void onEntranceTransitionEnd();
+    method protected void onEntranceTransitionPrepare();
+    method protected void onEntranceTransitionStart();
+    method public void prepareEntranceTransition();
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void startEntranceTransition();
+  }
+
+  public class BrandedFragment extends android.app.Fragment {
+    ctor public BrandedFragment();
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public int getSearchAffordanceColor();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public java.lang.CharSequence getTitle();
+    method public android.view.View getTitleView();
+    method public android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+    method public void installTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public final boolean isShowingTitle();
+    method public android.view.View onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
+    method public void setSearchAffordanceColor(int);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitleView(android.view.View);
+    method public void showTitle(boolean);
+    method public void showTitle(int);
+  }
+
+  public class BrandedSupportFragment extends android.support.v4.app.Fragment {
+    ctor public BrandedSupportFragment();
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public int getSearchAffordanceColor();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public java.lang.CharSequence getTitle();
+    method public android.view.View getTitleView();
+    method public android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+    method public void installTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public final boolean isShowingTitle();
+    method public android.view.View onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
+    method public void setSearchAffordanceColor(int);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitleView(android.view.View);
+    method public void showTitle(boolean);
+    method public void showTitle(int);
+  }
+
+  public class BrowseFragment extends android.support.v17.leanback.app.BaseFragment {
+    ctor public BrowseFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
+    method public void enableMainFragmentScaling(boolean);
+    method public deprecated 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.app.Fragment getMainFragment();
+    method public final android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapterRegistry getMainFragmentRegistry();
+    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();
+    method public android.support.v17.leanback.app.HeadersFragment onCreateHeadersFragment();
+    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 setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    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 static abstract class BrowseFragment.FragmentFactory<T extends android.app.Fragment> {
+    ctor public BrowseFragment.FragmentFactory();
+    method public abstract T createFragment(java.lang.Object);
+  }
+
+  public static abstract interface BrowseFragment.FragmentHost {
+    method public abstract void notifyDataReady(android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter);
+    method public abstract void notifyViewCreated(android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter);
+    method public abstract void showTitleView(boolean);
+  }
+
+  public static class BrowseFragment.ListRowFragmentFactory extends android.support.v17.leanback.app.BrowseFragment.FragmentFactory {
+    ctor public BrowseFragment.ListRowFragmentFactory();
+    method public android.support.v17.leanback.app.RowsFragment createFragment(java.lang.Object);
+  }
+
+  public static class BrowseFragment.MainFragmentAdapter<T extends android.app.Fragment> {
+    ctor public BrowseFragment.MainFragmentAdapter(T);
+    method public final T getFragment();
+    method public final android.support.v17.leanback.app.BrowseFragment.FragmentHost getFragmentHost();
+    method public boolean isScalingEnabled();
+    method public boolean isScrolling();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void onTransitionStart();
+    method public void setAlignment(int);
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setScalingEnabled(boolean);
+  }
+
+  public static abstract interface BrowseFragment.MainFragmentAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter getMainFragmentAdapter();
+  }
+
+  public static final class BrowseFragment.MainFragmentAdapterRegistry {
+    ctor public BrowseFragment.MainFragmentAdapterRegistry();
+    method public android.app.Fragment createFragment(java.lang.Object);
+    method public void registerFragment(java.lang.Class, android.support.v17.leanback.app.BrowseFragment.FragmentFactory);
+  }
+
+  public static class BrowseFragment.MainFragmentRowsAdapter<T extends android.app.Fragment> {
+    ctor public BrowseFragment.MainFragmentRowsAdapter(T);
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
+    method public final T getFragment();
+    method public int getSelectedPosition();
+    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, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void setSelectedPosition(int, boolean);
+  }
+
+  public static abstract interface BrowseFragment.MainFragmentRowsAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+  }
+
+  public class BrowseSupportFragment extends android.support.v17.leanback.app.BaseSupportFragment {
+    ctor public BrowseSupportFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
+    method public void enableMainFragmentScaling(boolean);
+    method public deprecated 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.app.HeadersSupportFragment getHeadersSupportFragment();
+    method public android.support.v4.app.Fragment getMainFragment();
+    method public final android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapterRegistry getMainFragmentRegistry();
+    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();
+    method public android.support.v17.leanback.app.HeadersSupportFragment onCreateHeadersSupportFragment();
+    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 setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    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 static abstract class BrowseSupportFragment.FragmentFactory<T extends android.support.v4.app.Fragment> {
+    ctor public BrowseSupportFragment.FragmentFactory();
+    method public abstract T createFragment(java.lang.Object);
+  }
+
+  public static abstract interface BrowseSupportFragment.FragmentHost {
+    method public abstract void notifyDataReady(android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter);
+    method public abstract void notifyViewCreated(android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter);
+    method public abstract void showTitleView(boolean);
+  }
+
+  public static class BrowseSupportFragment.ListRowFragmentFactory extends android.support.v17.leanback.app.BrowseSupportFragment.FragmentFactory {
+    ctor public BrowseSupportFragment.ListRowFragmentFactory();
+    method public android.support.v17.leanback.app.RowsSupportFragment createFragment(java.lang.Object);
+  }
+
+  public static class BrowseSupportFragment.MainFragmentAdapter<T extends android.support.v4.app.Fragment> {
+    ctor public BrowseSupportFragment.MainFragmentAdapter(T);
+    method public final T getFragment();
+    method public final android.support.v17.leanback.app.BrowseSupportFragment.FragmentHost getFragmentHost();
+    method public boolean isScalingEnabled();
+    method public boolean isScrolling();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void onTransitionStart();
+    method public void setAlignment(int);
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setScalingEnabled(boolean);
+  }
+
+  public static abstract interface BrowseSupportFragment.MainFragmentAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter getMainFragmentAdapter();
+  }
+
+  public static final class BrowseSupportFragment.MainFragmentAdapterRegistry {
+    ctor public BrowseSupportFragment.MainFragmentAdapterRegistry();
+    method public android.support.v4.app.Fragment createFragment(java.lang.Object);
+    method public void registerFragment(java.lang.Class, android.support.v17.leanback.app.BrowseSupportFragment.FragmentFactory);
+  }
+
+  public static class BrowseSupportFragment.MainFragmentRowsAdapter<T extends android.support.v4.app.Fragment> {
+    ctor public BrowseSupportFragment.MainFragmentRowsAdapter(T);
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
+    method public final T getFragment();
+    method public int getSelectedPosition();
+    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, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void setSelectedPosition(int, boolean);
+  }
+
+  public static abstract interface BrowseSupportFragment.MainFragmentRowsAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+  }
+
+  public class DetailsFragment extends android.support.v17.leanback.app.BaseFragment {
+    ctor public DetailsFragment();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.DetailsParallax getParallax();
+    method public android.support.v17.leanback.app.RowsFragment getRowsFragment();
+    method protected deprecated android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    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 setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    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 DetailsFragmentBackgroundController {
+    ctor public DetailsFragmentBackgroundController(android.support.v17.leanback.app.DetailsFragment);
+    method public boolean canNavigateToVideoFragment();
+    method public void enableParallax();
+    method public void enableParallax(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.support.v17.leanback.widget.ParallaxTarget.PropertyValuesHolderTarget);
+    method public final android.app.Fragment findOrCreateVideoFragment();
+    method public final android.graphics.drawable.Drawable getBottomDrawable();
+    method public final android.graphics.Bitmap getCoverBitmap();
+    method public final android.graphics.drawable.Drawable getCoverDrawable();
+    method public final int getParallaxDrawableMaxOffset();
+    method public final android.support.v17.leanback.media.PlaybackGlue getPlaybackGlue();
+    method public final int getSolidColor();
+    method public android.support.v17.leanback.media.PlaybackGlueHost onCreateGlueHost();
+    method public android.app.Fragment onCreateVideoFragment();
+    method public final void setCoverBitmap(android.graphics.Bitmap);
+    method public final void setParallaxDrawableMaxOffset(int);
+    method public final void setSolidColor(int);
+    method public void setupVideoPlayback(android.support.v17.leanback.media.PlaybackGlue);
+    method public final void switchToRows();
+    method public final void switchToVideo();
+  }
+
+  public class DetailsSupportFragment extends android.support.v17.leanback.app.BaseSupportFragment {
+    ctor public DetailsSupportFragment();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.DetailsParallax getParallax();
+    method public android.support.v17.leanback.app.RowsSupportFragment getRowsSupportFragment();
+    method protected deprecated android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    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 setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    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 DetailsSupportFragmentBackgroundController {
+    ctor public DetailsSupportFragmentBackgroundController(android.support.v17.leanback.app.DetailsSupportFragment);
+    method public boolean canNavigateToVideoSupportFragment();
+    method public void enableParallax();
+    method public void enableParallax(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.support.v17.leanback.widget.ParallaxTarget.PropertyValuesHolderTarget);
+    method public final android.support.v4.app.Fragment findOrCreateVideoSupportFragment();
+    method public final android.graphics.drawable.Drawable getBottomDrawable();
+    method public final android.graphics.Bitmap getCoverBitmap();
+    method public final android.graphics.drawable.Drawable getCoverDrawable();
+    method public final int getParallaxDrawableMaxOffset();
+    method public final android.support.v17.leanback.media.PlaybackGlue getPlaybackGlue();
+    method public final int getSolidColor();
+    method public android.support.v17.leanback.media.PlaybackGlueHost onCreateGlueHost();
+    method public android.support.v4.app.Fragment onCreateVideoSupportFragment();
+    method public final void setCoverBitmap(android.graphics.Bitmap);
+    method public final void setParallaxDrawableMaxOffset(int);
+    method public final void setSolidColor(int);
+    method public void setupVideoPlayback(android.support.v17.leanback.media.PlaybackGlue);
+    method public final void switchToRows();
+    method public final void switchToVideo();
+  }
+
+  public class ErrorFragment extends android.support.v17.leanback.app.BrandedFragment {
+    ctor public ErrorFragment();
+    method public android.graphics.drawable.Drawable getBackgroundDrawable();
+    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 boolean isBackgroundTranslucent();
+    method public void setBackgroundDrawable(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);
+  }
+
+  public class ErrorSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
+    ctor public ErrorSupportFragment();
+    method public android.graphics.drawable.Drawable getBackgroundDrawable();
+    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 boolean isBackgroundTranslucent();
+    method public void setBackgroundDrawable(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);
+  }
+
+  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 void collapseAction(boolean);
+    method public void collapseSubActions();
+    method public void expandAction(android.support.v17.leanback.widget.GuidedAction, boolean);
+    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);
+    method public int findButtonActionPositionById(long);
+    method public void finishGuidedStepFragments();
+    method public android.view.View getActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
+    method public android.view.View getButtonActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getButtonActions();
+    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 android.support.v17.leanback.widget.GuidedActionsStylist getGuidedButtonActionsStylist();
+    method public int getSelectedActionPosition();
+    method public int getSelectedButtonActionPosition();
+    method public int getUiStyle();
+    method public boolean isExpanded();
+    method public boolean isFocusOutEndAllowed();
+    method public boolean isFocusOutStartAllowed();
+    method public boolean isSubActionsExpanded();
+    method public void notifyActionChanged(int);
+    method public void notifyButtonActionChanged(int);
+    method protected void onAddSharedElementTransition(android.app.FragmentTransaction, android.support.v17.leanback.app.GuidedStepFragment);
+    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.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onCreateButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateButtonActionsStylist();
+    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 onGuidedActionEditCanceled(android.support.v17.leanback.widget.GuidedAction);
+    method public deprecated void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
+    method public long onGuidedActionEditedAndProceed(android.support.v17.leanback.widget.GuidedAction);
+    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 openInEditMode(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>);
+    method public void setSelectedActionPosition(int);
+    method public void setSelectedButtonActionPosition(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 deprecated int UI_STYLE_DEFAULT = 0; // 0x0
+    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
+    field public static final int UI_STYLE_REPLACE = 0; // 0x0
+  }
+
+  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 void collapseAction(boolean);
+    method public void collapseSubActions();
+    method public void expandAction(android.support.v17.leanback.widget.GuidedAction, boolean);
+    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);
+    method public int findButtonActionPositionById(long);
+    method public void finishGuidedStepSupportFragments();
+    method public android.view.View getActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
+    method public android.view.View getButtonActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getButtonActions();
+    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 android.support.v17.leanback.widget.GuidedActionsStylist getGuidedButtonActionsStylist();
+    method public int getSelectedActionPosition();
+    method public int getSelectedButtonActionPosition();
+    method public int getUiStyle();
+    method public boolean isExpanded();
+    method public boolean isFocusOutEndAllowed();
+    method public boolean isFocusOutStartAllowed();
+    method public boolean isSubActionsExpanded();
+    method public void notifyActionChanged(int);
+    method public void notifyButtonActionChanged(int);
+    method protected void onAddSharedElementTransition(android.support.v4.app.FragmentTransaction, android.support.v17.leanback.app.GuidedStepSupportFragment);
+    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.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onCreateButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateButtonActionsStylist();
+    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 onGuidedActionEditCanceled(android.support.v17.leanback.widget.GuidedAction);
+    method public deprecated void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
+    method public long onGuidedActionEditedAndProceed(android.support.v17.leanback.widget.GuidedAction);
+    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 openInEditMode(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>);
+    method public void setSelectedActionPosition(int);
+    method public void setSelectedButtonActionPosition(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 deprecated int UI_STYLE_DEFAULT = 0; // 0x0
+    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
+    field public static final int UI_STYLE_REPLACE = 0; // 0x0
+  }
+
+  public class HeadersFragment extends android.support.v17.leanback.app.BaseRowFragment {
+    ctor public HeadersFragment();
+    method public boolean isScrolling();
+    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener);
+    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener);
+  }
+
+  public static abstract interface HeadersFragment.OnHeaderClickedListener {
+    method public abstract void onHeaderClicked(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public 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 boolean isScrolling();
+    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener);
+    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener);
+  }
+
+  public static abstract interface HeadersSupportFragment.OnHeaderClickedListener {
+    method public abstract void onHeaderClicked(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public 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 OnboardingFragment extends android.app.Fragment {
+    ctor public OnboardingFragment();
+    method public final int getArrowBackgroundColor();
+    method public final int getArrowColor();
+    method protected final int getCurrentPageIndex();
+    method public final int getDescriptionViewTextColor();
+    method public final int getDotBackgroundColor();
+    method public final int getIconResourceId();
+    method public final int getLogoResourceId();
+    method protected abstract int getPageCount();
+    method protected abstract java.lang.CharSequence getPageDescription(int);
+    method protected abstract java.lang.CharSequence getPageTitle(int);
+    method public final java.lang.CharSequence getStartButtonText();
+    method public final int getTitleViewTextColor();
+    method protected final boolean isLogoAnimationFinished();
+    method protected void moveToNextPage();
+    method protected void moveToPreviousPage();
+    method protected abstract android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected abstract android.view.View onCreateContentView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateDescriptionAnimator();
+    method protected android.animation.Animator onCreateEnterAnimation();
+    method protected abstract android.view.View onCreateForegroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateLogoAnimation();
+    method protected android.animation.Animator onCreateTitleAnimator();
+    method protected void onFinishFragment();
+    method protected void onLogoAnimationFinished();
+    method protected void onPageChanged(int, int);
+    method public int onProvideTheme();
+    method public void setArrowBackgroundColor(int);
+    method public void setArrowColor(int);
+    method public void setDescriptionViewTextColor(int);
+    method public void setDotBackgroundColor(int);
+    method public final void setIconResouceId(int);
+    method public final void setLogoResourceId(int);
+    method public void setStartButtonText(java.lang.CharSequence);
+    method public void setTitleViewTextColor(int);
+    method protected final void startEnterAnimation(boolean);
+  }
+
+  public abstract class OnboardingSupportFragment extends android.support.v4.app.Fragment {
+    ctor public OnboardingSupportFragment();
+    method public final int getArrowBackgroundColor();
+    method public final int getArrowColor();
+    method protected final int getCurrentPageIndex();
+    method public final int getDescriptionViewTextColor();
+    method public final int getDotBackgroundColor();
+    method public final int getIconResourceId();
+    method public final int getLogoResourceId();
+    method protected abstract int getPageCount();
+    method protected abstract java.lang.CharSequence getPageDescription(int);
+    method protected abstract java.lang.CharSequence getPageTitle(int);
+    method public final java.lang.CharSequence getStartButtonText();
+    method public final int getTitleViewTextColor();
+    method protected final boolean isLogoAnimationFinished();
+    method protected void moveToNextPage();
+    method protected void moveToPreviousPage();
+    method protected abstract android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected abstract android.view.View onCreateContentView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateDescriptionAnimator();
+    method protected android.animation.Animator onCreateEnterAnimation();
+    method protected abstract android.view.View onCreateForegroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateLogoAnimation();
+    method protected android.animation.Animator onCreateTitleAnimator();
+    method protected void onFinishFragment();
+    method protected void onLogoAnimationFinished();
+    method protected void onPageChanged(int, int);
+    method public int onProvideTheme();
+    method public void setArrowBackgroundColor(int);
+    method public void setArrowColor(int);
+    method public void setDescriptionViewTextColor(int);
+    method public void setDotBackgroundColor(int);
+    method public final void setIconResouceId(int);
+    method public final void setLogoResourceId(int);
+    method public void setStartButtonText(java.lang.CharSequence);
+    method public void setTitleViewTextColor(int);
+    method protected final void startEnterAnimation(boolean);
+  }
+
+  public class PlaybackFragment extends android.app.Fragment {
+    ctor public PlaybackFragment();
+    method public deprecated void fadeOut();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public int getBackgroundType();
+    method public android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+    method public void hideControlsOverlay(boolean);
+    method public boolean isControlsOverlayAutoHideEnabled();
+    method public boolean isControlsOverlayVisible();
+    method public deprecated boolean isFadingEnabled();
+    method public void notifyPlaybackRowChanged();
+    method protected void onBufferingStateChanged(boolean);
+    method protected void onError(int, java.lang.CharSequence);
+    method protected void onVideoSizeChanged(int, int);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setBackgroundType(int);
+    method public void setControlsOverlayAutoHideEnabled(boolean);
+    method public deprecated void setFadingEnabled(boolean);
+    method public void setHostCallback(android.support.v17.leanback.media.PlaybackGlueHost.HostCallback);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public final void setOnKeyInterceptListener(android.view.View.OnKeyListener);
+    method public void setOnPlaybackItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setPlaybackRow(android.support.v17.leanback.widget.Row);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method public void showControlsOverlay(boolean);
+    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 class PlaybackFragmentGlueHost extends android.support.v17.leanback.media.PlaybackGlueHost implements android.support.v17.leanback.widget.PlaybackSeekUi {
+    ctor public PlaybackFragmentGlueHost(android.support.v17.leanback.app.PlaybackFragment);
+    method public void fadeOut();
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+  }
+
+  public class PlaybackSupportFragment extends android.support.v4.app.Fragment {
+    ctor public PlaybackSupportFragment();
+    method public deprecated void fadeOut();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public int getBackgroundType();
+    method public android.support.v17.leanback.app.ProgressBarManager getProgressBarManager();
+    method public void hideControlsOverlay(boolean);
+    method public boolean isControlsOverlayAutoHideEnabled();
+    method public boolean isControlsOverlayVisible();
+    method public deprecated boolean isFadingEnabled();
+    method public void notifyPlaybackRowChanged();
+    method protected void onBufferingStateChanged(boolean);
+    method protected void onError(int, java.lang.CharSequence);
+    method protected void onVideoSizeChanged(int, int);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setBackgroundType(int);
+    method public void setControlsOverlayAutoHideEnabled(boolean);
+    method public deprecated void setFadingEnabled(boolean);
+    method public void setHostCallback(android.support.v17.leanback.media.PlaybackGlueHost.HostCallback);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public final void setOnKeyInterceptListener(android.view.View.OnKeyListener);
+    method public void setOnPlaybackItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setPlaybackRow(android.support.v17.leanback.widget.Row);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method public void showControlsOverlay(boolean);
+    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 class PlaybackSupportFragmentGlueHost extends android.support.v17.leanback.media.PlaybackGlueHost implements android.support.v17.leanback.widget.PlaybackSeekUi {
+    ctor public PlaybackSupportFragmentGlueHost(android.support.v17.leanback.app.PlaybackSupportFragment);
+    method public void fadeOut();
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+  }
+
+  public final class ProgressBarManager {
+    ctor public ProgressBarManager();
+    method public void disableProgressBar();
+    method public void enableProgressBar();
+    method public long getInitialDelay();
+    method public void hide();
+    method public void setInitialDelay(long);
+    method public void setProgressBarView(android.view.View);
+    method public void setRootView(android.view.ViewGroup);
+    method public void show();
+  }
+
+  public class RowsFragment extends android.support.v17.leanback.app.BaseRowFragment implements android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapterProvider android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapterProvider {
+    ctor public RowsFragment();
+    method public deprecated void enableRowScaling(boolean);
+    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
+    method public android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter getMainFragmentAdapter();
+    method public android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(int);
+    method public boolean isScrolling();
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+  }
+
+  public static class RowsFragment.MainFragmentAdapter extends android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter {
+    ctor public RowsFragment.MainFragmentAdapter(android.support.v17.leanback.app.RowsFragment);
+  }
+
+  public static class RowsFragment.MainFragmentRowsAdapter extends android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter {
+    ctor public RowsFragment.MainFragmentRowsAdapter(android.support.v17.leanback.app.RowsFragment);
+  }
+
+  public class RowsSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment implements android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapterProvider android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapterProvider {
+    ctor public RowsSupportFragment();
+    method public deprecated void enableRowScaling(boolean);
+    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder findRowViewHolderByPosition(int);
+    method public android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter getMainFragmentAdapter();
+    method public android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(int);
+    method public boolean isScrolling();
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+  }
+
+  public static class RowsSupportFragment.MainFragmentAdapter extends android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter {
+    ctor public RowsSupportFragment.MainFragmentAdapter(android.support.v17.leanback.app.RowsSupportFragment);
+  }
+
+  public static class RowsSupportFragment.MainFragmentRowsAdapter extends android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter {
+    ctor public RowsSupportFragment.MainFragmentRowsAdapter(android.support.v17.leanback.app.RowsSupportFragment);
+  }
+
+  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 android.support.v17.leanback.app.RowsFragment getRowsFragment();
+    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 setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    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 deprecated 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 android.support.v17.leanback.app.RowsSupportFragment getRowsSupportFragment();
+    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 setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    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 deprecated 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.BaseFragment {
+    ctor public VerticalGridFragment();
+    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 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.BaseSupportFragment {
+    ctor public VerticalGridSupportFragment();
+    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 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 VideoFragment extends android.support.v17.leanback.app.PlaybackFragment {
+    ctor public VideoFragment();
+    method public android.view.SurfaceView getSurfaceView();
+    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+  public class VideoFragmentGlueHost extends android.support.v17.leanback.app.PlaybackFragmentGlueHost implements android.support.v17.leanback.media.SurfaceHolderGlueHost {
+    ctor public VideoFragmentGlueHost(android.support.v17.leanback.app.VideoFragment);
+    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+  public class VideoSupportFragment extends android.support.v17.leanback.app.PlaybackSupportFragment {
+    ctor public VideoSupportFragment();
+    method public android.view.SurfaceView getSurfaceView();
+    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+  public class VideoSupportFragmentGlueHost extends android.support.v17.leanback.app.PlaybackSupportFragmentGlueHost implements android.support.v17.leanback.media.SurfaceHolderGlueHost {
+    ctor public VideoSupportFragmentGlueHost(android.support.v17.leanback.app.VideoSupportFragment);
+    method public void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+}
+
+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 class BoundsRule {
+    ctor public BoundsRule();
+    ctor public BoundsRule(android.support.v17.leanback.graphics.BoundsRule);
+    method public void calculateBounds(android.graphics.Rect, android.graphics.Rect);
+    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule bottom;
+    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule left;
+    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule right;
+    field public android.support.v17.leanback.graphics.BoundsRule.ValueRule top;
+  }
+
+  public static final class BoundsRule.ValueRule {
+    method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule absoluteValue(int);
+    method public int getAbsoluteValue();
+    method public float getFraction();
+    method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule inheritFromParent(float);
+    method public static android.support.v17.leanback.graphics.BoundsRule.ValueRule inheritFromParentWithOffset(float, int);
+    method public void setAbsoluteValue(int);
+    method public void setFraction(float);
+  }
+
+  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);
+  }
+
+  public class CompositeDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public CompositeDrawable();
+    method public void addChildDrawable(android.graphics.drawable.Drawable);
+    method public void draw(android.graphics.Canvas);
+    method public android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable getChildAt(int);
+    method public int getChildCount();
+    method public android.graphics.drawable.Drawable getDrawable(int);
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable);
+    method public void removeChild(int);
+    method public void removeDrawable(android.graphics.drawable.Drawable);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
+    method public void setAlpha(int);
+    method public void setChildDrawableAt(int, android.graphics.drawable.Drawable);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+  }
+
+  public static final class CompositeDrawable.ChildDrawable {
+    ctor public CompositeDrawable.ChildDrawable(android.graphics.drawable.Drawable, android.support.v17.leanback.graphics.CompositeDrawable);
+    method public android.support.v17.leanback.graphics.BoundsRule getBoundsRule();
+    method public android.graphics.drawable.Drawable getDrawable();
+    method public void recomputeBounds();
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> BOTTOM_ABSOLUTE;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> BOTTOM_FRACTION;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> LEFT_ABSOLUTE;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> LEFT_FRACTION;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> RIGHT_ABSOLUTE;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> RIGHT_FRACTION;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Integer> TOP_ABSOLUTE;
+    field public static final android.util.Property<android.support.v17.leanback.graphics.CompositeDrawable.ChildDrawable, java.lang.Float> TOP_FRACTION;
+  }
+
+  public class FitWidthBitmapDrawable extends android.graphics.drawable.Drawable {
+    ctor public FitWidthBitmapDrawable();
+    method public void draw(android.graphics.Canvas);
+    method public android.graphics.Bitmap getBitmap();
+    method public int getOpacity();
+    method public android.graphics.Rect getSource();
+    method public int getVerticalOffset();
+    method public void setAlpha(int);
+    method public void setBitmap(android.graphics.Bitmap);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setSource(android.graphics.Rect);
+    method public void setVerticalOffset(int);
+    field public static final android.util.Property<android.support.v17.leanback.graphics.FitWidthBitmapDrawable, java.lang.Integer> PROPERTY_VERTICAL_OFFSET;
+  }
+
+}
+
+package android.support.v17.leanback.media {
+
+  public class MediaControllerAdapter extends android.support.v17.leanback.media.PlayerAdapter {
+    ctor public MediaControllerAdapter(android.support.v4.media.session.MediaControllerCompat);
+    method public android.graphics.drawable.Drawable getMediaArt(android.content.Context);
+    method public android.support.v4.media.session.MediaControllerCompat getMediaController();
+    method public java.lang.CharSequence getMediaSubtitle();
+    method public java.lang.CharSequence getMediaTitle();
+    method public void pause();
+    method public void play();
+  }
+
+  public abstract deprecated class MediaControllerGlue extends android.support.v17.leanback.media.PlaybackControlGlue {
+    ctor public MediaControllerGlue(android.content.Context, 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();
+  }
+
+  public class MediaPlayerAdapter extends android.support.v17.leanback.media.PlayerAdapter {
+    ctor public MediaPlayerAdapter(android.content.Context);
+    method protected boolean onError(int, int);
+    method protected boolean onInfo(int, int);
+    method protected void onSeekComplete();
+    method public void pause();
+    method public void play();
+    method public void release();
+    method public void reset();
+    method public boolean setDataSource(android.net.Uri);
+  }
+
+  public class PlaybackBannerControlGlue<T extends android.support.v17.leanback.media.PlayerAdapter> extends android.support.v17.leanback.media.PlaybackBaseControlGlue {
+    ctor public PlaybackBannerControlGlue(android.content.Context, int[], T);
+    ctor public PlaybackBannerControlGlue(android.content.Context, int[], int[], T);
+    method public int[] getFastForwardSpeeds();
+    method public int[] getRewindSpeeds();
+    method public void onActionClicked(android.support.v17.leanback.widget.Action);
+    method protected android.support.v17.leanback.widget.PlaybackRowPresenter onCreateRowPresenter();
+    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+    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 PlaybackBaseControlGlue<T extends android.support.v17.leanback.media.PlayerAdapter> extends android.support.v17.leanback.media.PlaybackGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
+    ctor public PlaybackBaseControlGlue(android.content.Context, T);
+    method public android.graphics.drawable.Drawable getArt();
+    method public final long getBufferedPosition();
+    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
+    method public long getCurrentPosition();
+    method public final long getDuration();
+    method public android.support.v17.leanback.widget.PlaybackRowPresenter getPlaybackRowPresenter();
+    method public final T getPlayerAdapter();
+    method public java.lang.CharSequence getSubtitle();
+    method public long getSupportedActions();
+    method public java.lang.CharSequence getTitle();
+    method public boolean isControlsOverlayAutoHideEnabled();
+    method public final boolean isPlaying();
+    method public final boolean isPrepared();
+    method protected static void notifyItemChanged(android.support.v17.leanback.widget.ArrayObjectAdapter, java.lang.Object);
+    method public abstract void onActionClicked(android.support.v17.leanback.widget.Action);
+    method protected void onCreatePrimaryActions(android.support.v17.leanback.widget.ArrayObjectAdapter);
+    method protected abstract android.support.v17.leanback.widget.PlaybackRowPresenter onCreateRowPresenter();
+    method protected void onCreateSecondaryActions(android.support.v17.leanback.widget.ArrayObjectAdapter);
+    method public abstract boolean onKey(android.view.View, int, android.view.KeyEvent);
+    method protected void onMetadataChanged();
+    method protected void onPlayCompleted();
+    method protected void onPlayStateChanged();
+    method protected void onPreparedStateChanged();
+    method protected void onUpdateBufferedProgress();
+    method protected void onUpdateDuration();
+    method protected void onUpdateProgress();
+    method public final void seekTo(long);
+    method public void setArt(android.graphics.drawable.Drawable);
+    method public void setControlsOverlayAutoHideEnabled(boolean);
+    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    method public void setSubtitle(java.lang.CharSequence);
+    method public void setTitle(java.lang.CharSequence);
+    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_REPEAT = 512; // 0x200
+    field public static final int ACTION_REWIND = 32; // 0x20
+    field public static final int ACTION_SHUFFLE = 1024; // 0x400
+    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
+    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
+  }
+
+  public abstract class PlaybackControlGlue extends android.support.v17.leanback.media.PlaybackGlue 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[]);
+    method public void enableProgressUpdating(boolean);
+    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
+    method public deprecated android.support.v17.leanback.widget.PlaybackControlsRowPresenter getControlsRowPresenter();
+    method public abstract int getCurrentPosition();
+    method public abstract int getCurrentSpeedId();
+    method public int[] getFastForwardSpeeds();
+    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.PlaybackRowPresenter getPlaybackRowPresenter();
+    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 protected void onCreateControlsRowAndPresenter();
+    method protected void onCreatePrimaryActions(android.support.v17.leanback.widget.SparseArrayObjectAdapter);
+    method protected void onCreateSecondaryActions(android.support.v17.leanback.widget.ArrayObjectAdapter);
+    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+    method protected void onMetadataChanged();
+    method protected void onStateChanged();
+    method public void play(int);
+    method public final void play();
+    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method public deprecated void setControlsRowPresenter(android.support.v17.leanback.widget.PlaybackControlsRowPresenter);
+    method public void setFadingEnabled(boolean);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    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 PlaybackGlue {
+    ctor public PlaybackGlue(android.content.Context);
+    method public void addPlayerCallback(android.support.v17.leanback.media.PlaybackGlue.PlayerCallback);
+    method public android.content.Context getContext();
+    method public android.support.v17.leanback.media.PlaybackGlueHost getHost();
+    method protected java.util.List<android.support.v17.leanback.media.PlaybackGlue.PlayerCallback> getPlayerCallbacks();
+    method public boolean isPlaying();
+    method public boolean isPrepared();
+    method public void next();
+    method protected void onAttachedToHost(android.support.v17.leanback.media.PlaybackGlueHost);
+    method protected void onDetachedFromHost();
+    method protected void onHostPause();
+    method protected void onHostResume();
+    method protected void onHostStart();
+    method protected void onHostStop();
+    method public void pause();
+    method public void play();
+    method public void playWhenPrepared();
+    method public void previous();
+    method public void removePlayerCallback(android.support.v17.leanback.media.PlaybackGlue.PlayerCallback);
+    method public final void setHost(android.support.v17.leanback.media.PlaybackGlueHost);
+  }
+
+  public static abstract class PlaybackGlue.PlayerCallback {
+    ctor public PlaybackGlue.PlayerCallback();
+    method public void onPlayCompleted(android.support.v17.leanback.media.PlaybackGlue);
+    method public void onPlayStateChanged(android.support.v17.leanback.media.PlaybackGlue);
+    method public void onPreparedStateChanged(android.support.v17.leanback.media.PlaybackGlue);
+  }
+
+  public abstract class PlaybackGlueHost {
+    ctor public PlaybackGlueHost();
+    method public deprecated void fadeOut();
+    method public android.support.v17.leanback.media.PlaybackGlueHost.PlayerCallback getPlayerCallback();
+    method public void hideControlsOverlay(boolean);
+    method public boolean isControlsOverlayAutoHideEnabled();
+    method public boolean isControlsOverlayVisible();
+    method public void notifyPlaybackRowChanged();
+    method public void setControlsOverlayAutoHideEnabled(boolean);
+    method public deprecated void setFadingEnabled(boolean);
+    method public void setHostCallback(android.support.v17.leanback.media.PlaybackGlueHost.HostCallback);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public void setOnKeyInterceptListener(android.view.View.OnKeyListener);
+    method public void setPlaybackRow(android.support.v17.leanback.widget.Row);
+    method public void setPlaybackRowPresenter(android.support.v17.leanback.widget.PlaybackRowPresenter);
+    method public void showControlsOverlay(boolean);
+  }
+
+  public static abstract class PlaybackGlueHost.HostCallback {
+    ctor public PlaybackGlueHost.HostCallback();
+    method public void onHostDestroy();
+    method public void onHostPause();
+    method public void onHostResume();
+    method public void onHostStart();
+    method public void onHostStop();
+  }
+
+  public static class PlaybackGlueHost.PlayerCallback {
+    ctor public PlaybackGlueHost.PlayerCallback();
+    method public void onBufferingStateChanged(boolean);
+    method public void onError(int, java.lang.CharSequence);
+    method public void onVideoSizeChanged(int, int);
+  }
+
+  public class PlaybackTransportControlGlue<T extends android.support.v17.leanback.media.PlayerAdapter> extends android.support.v17.leanback.media.PlaybackBaseControlGlue {
+    ctor public PlaybackTransportControlGlue(android.content.Context, T);
+    method public final android.support.v17.leanback.widget.PlaybackSeekDataProvider getSeekProvider();
+    method public final boolean isSeekEnabled();
+    method public void onActionClicked(android.support.v17.leanback.widget.Action);
+    method protected android.support.v17.leanback.widget.PlaybackRowPresenter onCreateRowPresenter();
+    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+    method public final void setSeekEnabled(boolean);
+    method public final void setSeekProvider(android.support.v17.leanback.widget.PlaybackSeekDataProvider);
+  }
+
+  public abstract class PlayerAdapter {
+    ctor public PlayerAdapter();
+    method public void fastForward();
+    method public long getBufferedPosition();
+    method public final android.support.v17.leanback.media.PlayerAdapter.Callback getCallback();
+    method public long getCurrentPosition();
+    method public long getDuration();
+    method public long getSupportedActions();
+    method public boolean isPlaying();
+    method public boolean isPrepared();
+    method public void next();
+    method public void onAttachedToHost(android.support.v17.leanback.media.PlaybackGlueHost);
+    method public void onDetachedFromHost();
+    method public abstract void pause();
+    method public abstract void play();
+    method public void previous();
+    method public void rewind();
+    method public void seekTo(long);
+    method public final void setCallback(android.support.v17.leanback.media.PlayerAdapter.Callback);
+    method public void setProgressUpdatingEnabled(boolean);
+    method public void setRepeatAction(int);
+    method public void setShuffleAction(int);
+  }
+
+  public static class PlayerAdapter.Callback {
+    ctor public PlayerAdapter.Callback();
+    method public void onBufferedPositionChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onBufferingStateChanged(android.support.v17.leanback.media.PlayerAdapter, boolean);
+    method public void onCurrentPositionChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onDurationChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onError(android.support.v17.leanback.media.PlayerAdapter, int, java.lang.String);
+    method public void onMetadataChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onPlayCompleted(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onPlayStateChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onPreparedStateChanged(android.support.v17.leanback.media.PlayerAdapter);
+    method public void onVideoSizeChanged(android.support.v17.leanback.media.PlayerAdapter, int, int);
+  }
+
+  public abstract interface SurfaceHolderGlueHost {
+    method public abstract void setSurfaceHolderCallback(android.view.SurfaceHolder.Callback);
+  }
+
+}
+
+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 OUTLINE_CLIPPING_DISABLED = "OUTLINE_CLIPPING_DISABLED";
+    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 abstract class AbstractMediaItemPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public AbstractMediaItemPresenter();
+    ctor public AbstractMediaItemPresenter(int);
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public android.support.v17.leanback.widget.Presenter getActionPresenter();
+    method protected int getMediaPlayState(java.lang.Object);
+    method public int getThemeId();
+    method public boolean hasMediaRowSeparator();
+    method protected abstract void onBindMediaDetails(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder, java.lang.Object);
+    method public void onBindMediaPlayState(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
+    method protected void onBindRowActions(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
+    method protected void onUnbindMediaDetails(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
+    method public void onUnbindMediaPlayState(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
+    method public void setActionPresenter(android.support.v17.leanback.widget.Presenter);
+    method public void setBackgroundColor(int);
+    method public void setHasMediaRowSeparator(boolean);
+    method public void setThemeId(int);
+    field public static final int PLAY_STATE_INITIAL = 0; // 0x0
+    field public static final int PLAY_STATE_PAUSED = 1; // 0x1
+    field public static final int PLAY_STATE_PLAYING = 2; // 0x2
+  }
+
+  public static class AbstractMediaItemPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public AbstractMediaItemPresenter.ViewHolder(android.view.View);
+    method public android.view.ViewGroup getMediaItemActionsContainer();
+    method public android.view.View getMediaItemDetailsView();
+    method public android.widget.TextView getMediaItemDurationView();
+    method public android.widget.TextView getMediaItemNameView();
+    method public android.widget.TextView getMediaItemNumberView();
+    method public android.widget.ViewFlipper getMediaItemNumberViewFlipper();
+    method public android.view.View getMediaItemPausedView();
+    method public android.view.View getMediaItemPlayingView();
+    method public android.support.v17.leanback.widget.MultiActionsProvider.MultiAction[] getMediaItemRowActions();
+    method public android.view.View getMediaItemRowSeparator();
+    method public android.view.View getSelectorView();
+    method public void notifyActionChanged(android.support.v17.leanback.widget.MultiActionsProvider.MultiAction);
+    method public void notifyDetailsChanged();
+    method public void notifyPlayStateChanged();
+    method public void onBindRowActions();
+    method public void setSelectedMediaItemNumberView(int);
+  }
+
+  public abstract class AbstractMediaListHeaderPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public AbstractMediaListHeaderPresenter(android.content.Context, int);
+    ctor public AbstractMediaListHeaderPresenter();
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method protected abstract void onBindMediaListHeaderViewHolder(android.support.v17.leanback.widget.AbstractMediaListHeaderPresenter.ViewHolder, java.lang.Object);
+    method public void setBackgroundColor(int);
+  }
+
+  public static class AbstractMediaListHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public AbstractMediaListHeaderPresenter.ViewHolder(android.view.View);
+    method public android.widget.TextView getHeaderView();
+  }
+
+  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);
+    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
+  }
+
+  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 move(int, int);
+    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 void setItems(java.util.List, android.support.v17.leanback.widget.DiffCallback);
+    method public int size();
+    method public <E> 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 protected android.support.v17.leanback.widget.BaseCardView.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v17.leanback.widget.BaseCardView.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v17.leanback.widget.BaseCardView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getCardType();
+    method public deprecated int getExtraVisibility();
+    method public int getInfoVisibility();
+    method public boolean isSelectedAnimationDelayed();
+    method public void setCardType(int);
+    method public deprecated 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 abstract class BaseGridView extends android.support.v7.widget.RecyclerView {
+    method public void addOnChildViewHolderSelectedListener(android.support.v17.leanback.widget.OnChildViewHolderSelectedListener);
+    method public void animateIn();
+    method public void animateOut();
+    method public int getChildDrawingOrder(int, int);
+    method public deprecated int getHorizontalMargin();
+    method public int getHorizontalSpacing();
+    method public int getInitialPrefetchItemCount();
+    method public int getItemAlignmentOffset();
+    method public float getItemAlignmentOffsetPercent();
+    method public int getItemAlignmentViewId();
+    method public android.support.v17.leanback.widget.BaseGridView.OnUnhandledKeyListener getOnUnhandledKeyListener();
+    method public final int getSaveChildrenLimitNumber();
+    method public final int getSaveChildrenPolicy();
+    method public int getSelectedPosition();
+    method public deprecated int getVerticalMargin();
+    method public int getVerticalSpacing();
+    method public void getViewSelectedOffsets(android.view.View, int[]);
+    method public int getWindowAlignment();
+    method public int getWindowAlignmentOffset();
+    method public float getWindowAlignmentOffsetPercent();
+    method public boolean hasPreviousViewInSameRow(int);
+    method public boolean isChildLayoutAnimated();
+    method public boolean isFocusDrawingOrderEnabled();
+    method public final boolean isFocusSearchDisabled();
+    method public boolean isItemAlignmentOffsetWithPadding();
+    method public boolean isScrollEnabled();
+    method public boolean isWindowAlignmentPreferKeyLineOverHighEdge();
+    method public boolean isWindowAlignmentPreferKeyLineOverLowEdge();
+    method public boolean onRequestFocusInDescendants(int, android.graphics.Rect);
+    method public void removeOnChildViewHolderSelectedListener(android.support.v17.leanback.widget.OnChildViewHolderSelectedListener);
+    method public void setAnimateChildLayout(boolean);
+    method public void setChildrenVisibility(int);
+    method public void setFocusDrawingOrderEnabled(boolean);
+    method public final void setFocusSearchDisabled(boolean);
+    method public void setGravity(int);
+    method public void setHasOverlappingRendering(boolean);
+    method public deprecated void setHorizontalMargin(int);
+    method public void setHorizontalSpacing(int);
+    method public void setInitialPrefetchItemCount(int);
+    method public void setItemAlignmentOffset(int);
+    method public void setItemAlignmentOffsetPercent(float);
+    method public void setItemAlignmentOffsetWithPadding(boolean);
+    method public void setItemAlignmentViewId(int);
+    method public deprecated void setItemMargin(int);
+    method public void setItemSpacing(int);
+    method public void setLayoutEnabled(boolean);
+    method public void setOnChildLaidOutListener(android.support.v17.leanback.widget.OnChildLaidOutListener);
+    method public void setOnChildSelectedListener(android.support.v17.leanback.widget.OnChildSelectedListener);
+    method public void setOnChildViewHolderSelectedListener(android.support.v17.leanback.widget.OnChildViewHolderSelectedListener);
+    method public void setOnKeyInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnKeyInterceptListener);
+    method public void setOnMotionInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnMotionInterceptListener);
+    method public void setOnTouchInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnTouchInterceptListener);
+    method public void setOnUnhandledKeyListener(android.support.v17.leanback.widget.BaseGridView.OnUnhandledKeyListener);
+    method public void setPruneChild(boolean);
+    method public final void setSaveChildrenLimitNumber(int);
+    method public final void setSaveChildrenPolicy(int);
+    method public void setScrollEnabled(boolean);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, int);
+    method public void setSelectedPosition(int, android.support.v17.leanback.widget.ViewHolderTask);
+    method public void setSelectedPositionSmooth(int);
+    method public void setSelectedPositionSmooth(int, android.support.v17.leanback.widget.ViewHolderTask);
+    method public deprecated void setVerticalMargin(int);
+    method public void setVerticalSpacing(int);
+    method public void setWindowAlignment(int);
+    method public void setWindowAlignmentOffset(int);
+    method public void setWindowAlignmentOffsetPercent(float);
+    method public void setWindowAlignmentPreferKeyLineOverHighEdge(boolean);
+    method public void setWindowAlignmentPreferKeyLineOverLowEdge(boolean);
+    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+    field public static final int SAVE_ALL_CHILD = 3; // 0x3
+    field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
+    field public static final int SAVE_NO_CHILD = 0; // 0x0
+    field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
+    field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
+    field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
+    field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
+    field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
+    field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+  }
+
+  public static abstract interface BaseGridView.OnKeyInterceptListener {
+    method public abstract boolean onInterceptKeyEvent(android.view.KeyEvent);
+  }
+
+  public static abstract interface BaseGridView.OnMotionInterceptListener {
+    method public abstract boolean onInterceptMotionEvent(android.view.MotionEvent);
+  }
+
+  public static abstract interface BaseGridView.OnTouchInterceptListener {
+    method public abstract boolean onInterceptTouchEvent(android.view.MotionEvent);
+  }
+
+  public static abstract interface BaseGridView.OnUnhandledKeyListener {
+    method public abstract boolean onUnhandledKey(android.view.KeyEvent);
+  }
+
+  public abstract interface BaseOnItemViewClickedListener<T> {
+    method public abstract void onItemClicked(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, T);
+  }
+
+  public abstract interface BaseOnItemViewSelectedListener<T> {
+    method public abstract void onItemSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, T);
+  }
+
+  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 setOnDispatchKeyListener(android.view.View.OnKeyListener);
+    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 android.support.v17.leanback.widget.ClassPresenterSelector addClassPresenter(java.lang.Class<?>, android.support.v17.leanback.widget.Presenter);
+    method public android.support.v17.leanback.widget.ClassPresenterSelector addClassPresenterSelector(java.lang.Class<?>, android.support.v17.leanback.widget.PresenterSelector);
+    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.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);
+  }
+
+  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;
+  }
+
+  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 class DetailsParallax extends android.support.v17.leanback.widget.RecyclerViewParallax {
+    ctor public DetailsParallax();
+    method public android.support.v17.leanback.widget.Parallax.IntProperty getOverviewRowBottom();
+    method public android.support.v17.leanback.widget.Parallax.IntProperty getOverviewRowTop();
+  }
+
+  public abstract class DiffCallback<Value> {
+    ctor public DiffCallback();
+    method public abstract boolean areContentsTheSame(Value, Value);
+    method public abstract boolean areItemsTheSame(Value, Value);
+    method public java.lang.Object getChangePayload(Value, Value);
+  }
+
+  public class DividerPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public DividerPresenter();
+    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);
+  }
+
+  public class DividerRow extends android.support.v17.leanback.widget.Row {
+    ctor public DividerRow();
+    method public final boolean isRenderedAsRowView();
+  }
+
+  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 deprecated void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView);
+    method public static deprecated void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView, boolean);
+    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter);
+    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, boolean);
+  }
+
+  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 onDestroyView();
+    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 {
+    ctor protected GuidedAction();
+    method public int getCheckSetId();
+    method public java.lang.CharSequence getDescription();
+    method public int getDescriptionEditInputType();
+    method public int getDescriptionInputType();
+    method public java.lang.CharSequence getEditDescription();
+    method public int getEditInputType();
+    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 hasEditableActivatorView();
+    method public boolean hasMultilineDescription();
+    method public boolean hasNext();
+    method public boolean hasSubActions();
+    method public boolean hasTextEditable();
+    method public boolean infoOnly();
+    method public final boolean isAutoSaveRestoreEnabled();
+    method public boolean isChecked();
+    method public boolean isDescriptionEditable();
+    method public boolean isEditTitleUsed();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public void onRestoreInstanceState(android.os.Bundle, java.lang.String);
+    method public void onSaveInstanceState(android.os.Bundle, java.lang.String);
+    method public void setChecked(boolean);
+    method public void setDescription(java.lang.CharSequence);
+    method public void setEditDescription(java.lang.CharSequence);
+    method public void setEditTitle(java.lang.CharSequence);
+    method public void setEnabled(boolean);
+    method public void setFocusable(boolean);
+    method public void setIntent(android.content.Intent);
+    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
+    field public static final long ACTION_ID_CURRENT = -3L; // 0xfffffffffffffffdL
+    field public static final long ACTION_ID_FINISH = -6L; // 0xfffffffffffffffaL
+    field public static final long ACTION_ID_NEXT = -2L; // 0xfffffffffffffffeL
+    field public static final long ACTION_ID_NO = -9L; // 0xfffffffffffffff7L
+    field public static final long ACTION_ID_OK = -4L; // 0xfffffffffffffffcL
+    field public static final long ACTION_ID_YES = -8L; // 0xfffffffffffffff8L
+    field public static final int CHECKBOX_CHECK_SET_ID = -1; // 0xffffffff
+    field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
+    field public static final int NO_CHECK_SET = 0; // 0x0
+  }
+
+  public static class GuidedAction.Builder extends android.support.v17.leanback.widget.GuidedAction.BuilderBase {
+    ctor public deprecated GuidedAction.Builder();
+    ctor public GuidedAction.Builder(android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedAction build();
+  }
+
+  public static abstract class GuidedAction.BuilderBase<B extends android.support.v17.leanback.widget.GuidedAction.BuilderBase> {
+    ctor public GuidedAction.BuilderBase(android.content.Context);
+    method protected final void applyValues(android.support.v17.leanback.widget.GuidedAction);
+    method public B autoSaveRestoreEnabled(boolean);
+    method public B checkSetId(int);
+    method public B checked(boolean);
+    method public B clickAction(long);
+    method public B description(java.lang.CharSequence);
+    method public B description(int);
+    method public B descriptionEditInputType(int);
+    method public B descriptionEditable(boolean);
+    method public B descriptionInputType(int);
+    method public B editDescription(java.lang.CharSequence);
+    method public B editDescription(int);
+    method public B editInputType(int);
+    method public B editTitle(java.lang.CharSequence);
+    method public B editTitle(int);
+    method public B editable(boolean);
+    method public B enabled(boolean);
+    method public B focusable(boolean);
+    method public android.content.Context getContext();
+    method public B hasEditableActivatorView(boolean);
+    method public B hasNext(boolean);
+    method public B icon(android.graphics.drawable.Drawable);
+    method public B icon(int);
+    method public deprecated B iconResourceId(int, android.content.Context);
+    method public B id(long);
+    method public B infoOnly(boolean);
+    method public B inputType(int);
+    method public B intent(android.content.Intent);
+    method public B multilineDescription(boolean);
+    method public B subActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public B title(java.lang.CharSequence);
+    method public B title(int);
+  }
+
+  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 void collapseAction(boolean);
+    method public void expandAction(android.support.v17.leanback.widget.GuidedAction, boolean);
+    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 final boolean isBackKeyToCollapseActivatorView();
+    method public final boolean isBackKeyToCollapseSubActions();
+    method public boolean isButtonActions();
+    method public boolean isExpandTransitionSupported();
+    method public boolean isExpanded();
+    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);
+    method public void onAnimateItemPressedCancelled(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+    method public void onBindActivatorView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void onBindCheckMarkView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void onBindChevronView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    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 android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onDestroyView();
+    method protected deprecated void onEditingModeChange(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
+    method protected void onEditingModeChange(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean, boolean);
+    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 onProvideItemLayoutId(int);
+    method public int onProvideLayoutId();
+    method public boolean onUpdateActivatorView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void onUpdateExpandedViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+    method public void openInEditMode(android.support.v17.leanback.widget.GuidedAction);
+    method public void setAsButtonActions();
+    method public final void setBackKeyToCollapseActivatorView(boolean);
+    method public final void setBackKeyToCollapseSubActions(boolean);
+    method public deprecated void setEditingMode(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
+    method public deprecated 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 deprecated void startExpandedTransition(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+    field public static final int VIEW_TYPE_DATE_PICKER = 1; // 0x1
+    field public static final int VIEW_TYPE_DEFAULT = 0; // 0x0
+  }
+
+  public static class GuidedActionsStylist.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
+    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();
+    method public android.widget.TextView getDescriptionView();
+    method public android.widget.EditText getEditableDescriptionView();
+    method public android.widget.EditText getEditableTitleView();
+    method public android.view.View getEditingView();
+    method public java.lang.Object getFacet(java.lang.Class<?>);
+    method public android.widget.ImageView getIconView();
+    method public android.widget.TextView getTitleView();
+    method public boolean isInEditing();
+    method public boolean isInEditingActivatorView();
+    method public boolean isInEditingDescription();
+    method public boolean isInEditingText();
+    method public boolean isInEditingTitle();
+    method public boolean isSubAction();
+  }
+
+  public class GuidedDatePickerAction extends android.support.v17.leanback.widget.GuidedAction {
+    ctor public GuidedDatePickerAction();
+    method public long getDate();
+    method public java.lang.String getDatePickerFormat();
+    method public long getMaxDate();
+    method public long getMinDate();
+    method public void setDate(long);
+  }
+
+  public static final class GuidedDatePickerAction.Builder extends android.support.v17.leanback.widget.GuidedDatePickerAction.BuilderBase {
+    ctor public GuidedDatePickerAction.Builder(android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedDatePickerAction build();
+  }
+
+  public static abstract class GuidedDatePickerAction.BuilderBase<B extends android.support.v17.leanback.widget.GuidedDatePickerAction.BuilderBase> extends android.support.v17.leanback.widget.GuidedAction.BuilderBase {
+    ctor public GuidedDatePickerAction.BuilderBase(android.content.Context);
+    method protected final void applyDatePickerValues(android.support.v17.leanback.widget.GuidedDatePickerAction);
+    method public B date(long);
+    method public B datePickerFormat(java.lang.String);
+    method public B maxDate(long);
+    method public B minDate(long);
+  }
+
+  public class HeaderItem {
+    ctor public HeaderItem(long, java.lang.String);
+    ctor public HeaderItem(java.lang.String);
+    method public java.lang.CharSequence getContentDescription();
+    method public java.lang.CharSequence getDescription();
+    method public final long getId();
+    method public final java.lang.String getName();
+    method public void setContentDescription(java.lang.CharSequence);
+    method public void setDescription(java.lang.CharSequence);
+  }
+
+  public class HorizontalGridView extends android.support.v17.leanback.widget.BaseGridView {
+    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 deprecated 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 boolean isAlignedToTextViewBaseLine();
+    method public final boolean isItemAlignmentOffsetWithPadding();
+    method public final void setAlignedToTextViewBaseline(boolean);
+    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 public final void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, int, java.util.List);
+    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 setPresenter(android.support.v17.leanback.widget.PresenterSelector);
+    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 onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder, java.util.List);
+    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();
+    method public java.lang.CharSequence getContentDescription();
+    method public void setContentDescription(java.lang.CharSequence);
+  }
+
+  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 protected void applySelectLevelToChild(android.support.v17.leanback.widget.ListRowPresenter.ViewHolder, android.view.View);
+    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 isUsingOutlineClipping(android.content.Context);
+    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 setNumRows(int);
+    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.SelectItemViewHolderTask extends android.support.v17.leanback.widget.Presenter.ViewHolderTask {
+    ctor public ListRowPresenter.SelectItemViewHolderTask(int);
+    method public int getItemPosition();
+    method public android.support.v17.leanback.widget.Presenter.ViewHolderTask getItemTask();
+    method public boolean isSmoothScroll();
+    method public void setItemPosition(int);
+    method public void setItemTask(android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void setSmoothScroll(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 android.support.v17.leanback.widget.Presenter.ViewHolder getItemViewHolder(int);
+    method public final android.support.v17.leanback.widget.ListRowPresenter getListRowPresenter();
+    method public int getSelectedPosition();
+  }
+
+  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 interface MultiActionsProvider {
+    method public abstract android.support.v17.leanback.widget.MultiActionsProvider.MultiAction[] getActions();
+  }
+
+  public static class MultiActionsProvider.MultiAction {
+    ctor public MultiActionsProvider.MultiAction(long);
+    method public android.graphics.drawable.Drawable getCurrentDrawable();
+    method public android.graphics.drawable.Drawable[] getDrawables();
+    method public long getId();
+    method public int getIndex();
+    method public void incrementIndex();
+    method public void setDrawables(android.graphics.drawable.Drawable[]);
+    method public void setIndex(int);
+  }
+
+  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 public boolean isImmediateNotifySupported();
+    method protected final void notifyChanged();
+    method protected final void notifyItemMoved(int, int);
+    method public final void notifyItemRangeChanged(int, int);
+    method public final void notifyItemRangeChanged(int, int, java.lang.Object);
+    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 onItemMoved(int, int);
+    method public void onItemRangeChanged(int, int);
+    method public void onItemRangeChanged(int, int, java.lang.Object);
+    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);
+    method public void onChildViewHolderSelectedAndPositioned(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, int);
+  }
+
+  public abstract interface OnItemViewClickedListener implements android.support.v17.leanback.widget.BaseOnItemViewClickedListener {
+  }
+
+  public abstract interface OnItemViewSelectedListener implements android.support.v17.leanback.widget.BaseOnItemViewSelectedListener {
+  }
+
+  public class PageRow extends android.support.v17.leanback.widget.Row {
+    ctor public PageRow(android.support.v17.leanback.widget.HeaderItem);
+    method public final boolean isRenderedAsRowView();
+  }
+
+  public abstract class Parallax<PropertyT extends android.util.Property> {
+    ctor public Parallax();
+    method public android.support.v17.leanback.widget.ParallaxEffect addEffect(android.support.v17.leanback.widget.Parallax.PropertyMarkerValue...);
+    method public final PropertyT addProperty(java.lang.String);
+    method public abstract PropertyT createProperty(java.lang.String, int);
+    method public java.util.List<android.support.v17.leanback.widget.ParallaxEffect> getEffects();
+    method public abstract float getMaxValue();
+    method public final java.util.List<PropertyT> getProperties();
+    method public void removeAllEffects();
+    method public void removeEffect(android.support.v17.leanback.widget.ParallaxEffect);
+    method public void updateValues();
+  }
+
+  public static class Parallax.FloatProperty extends android.util.Property {
+    ctor public Parallax.FloatProperty(java.lang.String, int);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue at(float, float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atAbsolute(float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atFraction(float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMax();
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMin();
+    method public final java.lang.Float get(android.support.v17.leanback.widget.Parallax);
+    method public final int getIndex();
+    method public final float getValue(android.support.v17.leanback.widget.Parallax);
+    method public final void set(android.support.v17.leanback.widget.Parallax, java.lang.Float);
+    method public final void setValue(android.support.v17.leanback.widget.Parallax, float);
+    field public static final float UNKNOWN_AFTER = 3.4028235E38f;
+    field public static final float UNKNOWN_BEFORE = -3.4028235E38f;
+  }
+
+  public static class Parallax.IntProperty extends android.util.Property {
+    ctor public Parallax.IntProperty(java.lang.String, int);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue at(int, float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atAbsolute(int);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atFraction(float);
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMax();
+    method public final android.support.v17.leanback.widget.Parallax.PropertyMarkerValue atMin();
+    method public final java.lang.Integer get(android.support.v17.leanback.widget.Parallax);
+    method public final int getIndex();
+    method public final int getValue(android.support.v17.leanback.widget.Parallax);
+    method public final void set(android.support.v17.leanback.widget.Parallax, java.lang.Integer);
+    method public final void setValue(android.support.v17.leanback.widget.Parallax, int);
+    field public static final int UNKNOWN_AFTER = 2147483647; // 0x7fffffff
+    field public static final int UNKNOWN_BEFORE = -2147483648; // 0x80000000
+  }
+
+  public static class Parallax.PropertyMarkerValue<PropertyT> {
+    ctor public Parallax.PropertyMarkerValue(PropertyT);
+    method public PropertyT getProperty();
+  }
+
+  public abstract class ParallaxEffect {
+    method public final void addTarget(android.support.v17.leanback.widget.ParallaxTarget);
+    method public final java.util.List<android.support.v17.leanback.widget.Parallax.PropertyMarkerValue> getPropertyRanges();
+    method public final java.util.List<android.support.v17.leanback.widget.ParallaxTarget> getTargets();
+    method public final void performMapping(android.support.v17.leanback.widget.Parallax);
+    method public final void removeTarget(android.support.v17.leanback.widget.ParallaxTarget);
+    method public final void setPropertyRanges(android.support.v17.leanback.widget.Parallax.PropertyMarkerValue...);
+    method public final android.support.v17.leanback.widget.ParallaxEffect target(android.support.v17.leanback.widget.ParallaxTarget);
+    method public final android.support.v17.leanback.widget.ParallaxEffect target(java.lang.Object, android.animation.PropertyValuesHolder);
+    method public final <T, V extends java.lang.Number> android.support.v17.leanback.widget.ParallaxEffect target(T, android.util.Property<T, V>);
+  }
+
+  public abstract class ParallaxTarget {
+    ctor public ParallaxTarget();
+    method public void directUpdate(java.lang.Number);
+    method public boolean isDirectMapping();
+    method public void update(float);
+  }
+
+  public static final class ParallaxTarget.DirectPropertyTarget<T, V extends java.lang.Number> extends android.support.v17.leanback.widget.ParallaxTarget {
+    ctor public ParallaxTarget.DirectPropertyTarget(java.lang.Object, android.util.Property<T, V>);
+  }
+
+  public static final class ParallaxTarget.PropertyValuesHolderTarget extends android.support.v17.leanback.widget.ParallaxTarget {
+    ctor public ParallaxTarget.PropertyValuesHolderTarget(java.lang.Object, android.animation.PropertyValuesHolder);
+  }
+
+  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 long getBufferedPosition();
+    method public deprecated int getBufferedProgress();
+    method public deprecated long getBufferedProgressLong();
+    method public long getCurrentPosition();
+    method public deprecated int getCurrentTime();
+    method public deprecated long getCurrentTimeLong();
+    method public long getDuration();
+    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 deprecated int getTotalTime();
+    method public deprecated long getTotalTimeLong();
+    method public void setBufferedPosition(long);
+    method public deprecated void setBufferedProgress(int);
+    method public deprecated void setBufferedProgressLong(long);
+    method public void setCurrentPosition(long);
+    method public deprecated void setCurrentTime(int);
+    method public deprecated void setCurrentTimeLong(long);
+    method public void setDuration(long);
+    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
+    method public final void setImageDrawable(android.graphics.drawable.Drawable);
+    method public void setOnPlaybackProgressChangedListener(android.support.v17.leanback.widget.PlaybackControlsRow.OnPlaybackProgressCallback);
+    method public final void setPrimaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public final void setSecondaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public deprecated void setTotalTime(int);
+    method public deprecated void setTotalTimeLong(long);
+  }
+
+  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 final int INDEX_OFF = 0; // 0x0
+    field public static final int INDEX_ON = 1; // 0x1
+    field public static deprecated int OFF;
+    field public static deprecated 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 final int INDEX_OFF = 0; // 0x0
+    field public static final int INDEX_ON = 1; // 0x1
+    field public static deprecated int OFF;
+    field public static deprecated 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.OnPlaybackProgressCallback {
+    ctor public PlaybackControlsRow.OnPlaybackProgressCallback();
+    method public void onBufferedPositionChanged(android.support.v17.leanback.widget.PlaybackControlsRow, long);
+    method public void onCurrentPositionChanged(android.support.v17.leanback.widget.PlaybackControlsRow, long);
+    method public void onDurationChanged(android.support.v17.leanback.widget.PlaybackControlsRow, long);
+  }
+
+  public static class PlaybackControlsRow.PictureInPictureAction extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.PictureInPictureAction(android.content.Context);
+  }
+
+  public static class PlaybackControlsRow.PlayPauseAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context);
+    field public static final int INDEX_PAUSE = 1; // 0x1
+    field public static final int INDEX_PLAY = 0; // 0x0
+    field public static deprecated int PAUSE;
+    field public static deprecated 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 deprecated int ALL;
+    field public static final int INDEX_ALL = 1; // 0x1
+    field public static final int INDEX_NONE = 0; // 0x0
+    field public static final int INDEX_ONE = 2; // 0x2
+    field public static deprecated int NONE;
+    field public static deprecated 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 final int INDEX_OFF = 0; // 0x0
+    field public static final int INDEX_ON = 1; // 0x1
+    field public static deprecated int OFF;
+    field public static deprecated 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 final int INDEX_OUTLINE = 1; // 0x1
+    field public static final int INDEX_SOLID = 0; // 0x0
+    field public static deprecated int OUTLINE;
+    field public static deprecated 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.PlaybackRowPresenter {
+    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.PlaybackRowPresenter.ViewHolder {
+    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDescriptionViewHolder;
+  }
+
+  public abstract class PlaybackRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public PlaybackRowPresenter();
+    method public void onReappear(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+  }
+
+  public static class PlaybackRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public PlaybackRowPresenter.ViewHolder(android.view.View);
+  }
+
+  public class PlaybackSeekDataProvider {
+    ctor public PlaybackSeekDataProvider();
+    method public long[] getSeekPositions();
+    method public void getThumbnail(int, android.support.v17.leanback.widget.PlaybackSeekDataProvider.ResultCallback);
+    method public void reset();
+  }
+
+  public static class PlaybackSeekDataProvider.ResultCallback {
+    ctor public PlaybackSeekDataProvider.ResultCallback();
+    method public void onThumbnailLoaded(android.graphics.Bitmap, int);
+  }
+
+  public abstract interface PlaybackSeekUi {
+    method public abstract void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+  }
+
+  public static class PlaybackSeekUi.Client {
+    ctor public PlaybackSeekUi.Client();
+    method public android.support.v17.leanback.widget.PlaybackSeekDataProvider getPlaybackSeekDataProvider();
+    method public boolean isSeekEnabled();
+    method public void onSeekFinished(boolean);
+    method public void onSeekPositionChanged(long);
+    method public void onSeekStarted();
+  }
+
+  public class PlaybackTransportRowPresenter extends android.support.v17.leanback.widget.PlaybackRowPresenter {
+    ctor public PlaybackTransportRowPresenter();
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public float getDefaultSeekIncrement();
+    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
+    method public int getProgressColor();
+    method protected void onProgressBarClicked(android.support.v17.leanback.widget.PlaybackTransportRowPresenter.ViewHolder);
+    method public void setDefaultSeekIncrement(float);
+    method public void setDescriptionPresenter(android.support.v17.leanback.widget.Presenter);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public void setProgressColor(int);
+  }
+
+  public class PlaybackTransportRowPresenter.ViewHolder extends android.support.v17.leanback.widget.PlaybackRowPresenter.ViewHolder implements android.support.v17.leanback.widget.PlaybackSeekUi {
+    ctor public PlaybackTransportRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
+    method public final android.widget.TextView getCurrentPositionView();
+    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getDescriptionViewHolder();
+    method public final android.widget.TextView getDurationView();
+    method protected void onSetCurrentPositionLabel(long);
+    method protected void onSetDurationLabel(long);
+    method public void setPlaybackSeekUiClient(android.support.v17.leanback.widget.PlaybackSeekUi.Client);
+  }
+
+  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 void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, java.util.List<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 static abstract class Presenter.ViewHolderTask {
+    ctor public Presenter.ViewHolderTask();
+    method public void run(android.support.v17.leanback.widget.Presenter.ViewHolder);
+  }
+
+  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 RecyclerViewParallax extends android.support.v17.leanback.widget.Parallax {
+    ctor public RecyclerViewParallax();
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty createProperty(java.lang.String, int);
+    method public float getMaxValue();
+    method public android.support.v7.widget.RecyclerView getRecyclerView();
+    method public void setRecyclerView(android.support.v7.widget.RecyclerView);
+  }
+
+  public static final class RecyclerViewParallax.ChildPositionProperty extends android.support.v17.leanback.widget.Parallax.IntProperty {
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty adapterPosition(int);
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty fraction(float);
+    method public int getAdapterPosition();
+    method public float getFraction();
+    method public int getOffset();
+    method public int getViewId();
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty offset(int);
+    method public android.support.v17.leanback.widget.RecyclerViewParallax.ChildPositionProperty viewId(int);
+  }
+
+  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 boolean isRenderedAsRowView();
+    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.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public final android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.view.View.OnKeyListener getOnKeyListener();
+    method public final android.support.v17.leanback.widget.Row getRow();
+    method public final java.lang.Object getRowObject();
+    method public final float getSelectLevel();
+    method public java.lang.Object getSelectedItem();
+    method public android.support.v17.leanback.widget.Presenter.ViewHolder getSelectedItemViewHolder();
+    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.BaseOnItemViewClickedListener);
+    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    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 boolean isRecognizing();
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setPermissionListener(android.support.v17.leanback.widget.SearchBar.SearchBarPermissionListener);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSearchBarListener(android.support.v17.leanback.widget.SearchBar.SearchBarListener);
+    method public void setSearchQuery(java.lang.String);
+    method public deprecated 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 static abstract interface SearchBar.SearchBarPermissionListener {
+    method public abstract void requestAudioPermission();
+  }
+
+  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 SectionRow extends android.support.v17.leanback.widget.Row {
+    ctor public SectionRow(android.support.v17.leanback.widget.HeaderItem);
+    ctor public SectionRow(long, java.lang.String);
+    ctor public SectionRow(java.lang.String);
+    method public final boolean isRenderedAsRowView();
+  }
+
+  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 setListeningOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setNotListeningOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setSoundLevel(int);
+    method public void showListening();
+    method public void showNotListening();
+  }
+
+  public abstract deprecated 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.view.View);
+    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
+    method public android.view.ViewGroup getSceneRoot();
+    method public android.view.View getTitleView();
+    method public void showTitle(boolean);
+  }
+
+  public class TitleView extends android.widget.FrameLayout implements android.support.v17.leanback.widget.TitleViewAdapter.Provider {
+    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 android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+    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.CharSequence);
+    method public void updateComponentsVisibility(int);
+  }
+
+  public abstract class TitleViewAdapter {
+    ctor public TitleViewAdapter();
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public abstract android.view.View getSearchAffordanceView();
+    method public java.lang.CharSequence getTitle();
+    method public void setAnimationEnabled(boolean);
+    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.CharSequence);
+    method public void updateComponentsVisibility(int);
+    field public static final int BRANDING_VIEW_VISIBLE = 2; // 0x2
+    field public static final int FULL_VIEW_VISIBLE = 6; // 0x6
+    field public static final int SEARCH_VIEW_VISIBLE = 4; // 0x4
+  }
+
+  public static abstract interface TitleViewAdapter.Provider {
+    method public abstract android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+  }
+
+  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.v17.leanback.widget.BaseGridView {
+    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);
+  }
+
+  public abstract interface ViewHolderTask {
+    method public abstract void run(android.support.v7.widget.RecyclerView.ViewHolder);
+  }
+
+}
+
+package android.support.v17.leanback.widget.picker {
+
+  public class Picker extends android.widget.FrameLayout {
+    ctor public Picker(android.content.Context, android.util.AttributeSet, int);
+    method public void addOnValueChangedListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
+    method public float getActivatedVisibleItemCount();
+    method public android.support.v17.leanback.widget.picker.PickerColumn getColumnAt(int);
+    method public int getColumnsCount();
+    method protected int getPickerItemHeightPixels();
+    method public final int getPickerItemLayoutId();
+    method public final int getPickerItemTextViewId();
+    method public int getSelectedColumn();
+    method public final deprecated java.lang.CharSequence getSeparator();
+    method public final java.util.List<java.lang.CharSequence> getSeparators();
+    method public float getVisibleItemCount();
+    method public void onColumnValueChanged(int, int);
+    method public void removeOnValueChangedListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
+    method public void setActivatedVisibleItemCount(float);
+    method public void setColumnAt(int, android.support.v17.leanback.widget.picker.PickerColumn);
+    method public void setColumnValue(int, int, boolean);
+    method public void setColumns(java.util.List<android.support.v17.leanback.widget.picker.PickerColumn>);
+    method public final void setPickerItemTextViewId(int);
+    method public void setSelectedColumn(int);
+    method public final void setSeparator(java.lang.CharSequence);
+    method public final void setSeparators(java.util.List<java.lang.CharSequence>);
+    method public void setVisibleItemCount(float);
+  }
+
+  public static abstract interface Picker.PickerValueListener {
+    method public abstract void onValueChanged(android.support.v17.leanback.widget.picker.Picker, int);
+  }
+
+  public class PickerColumn {
+    ctor public PickerColumn();
+    method public int getCount();
+    method public int getCurrentValue();
+    method public java.lang.CharSequence getLabelFor(int);
+    method public java.lang.String getLabelFormat();
+    method public int getMaxValue();
+    method public int getMinValue();
+    method public java.lang.CharSequence[] getStaticLabels();
+    method public void setCurrentValue(int);
+    method public void setLabelFormat(java.lang.String);
+    method public void setMaxValue(int);
+    method public void setMinValue(int);
+    method public void setStaticLabels(java.lang.CharSequence[]);
+  }
+
+  public class TimePicker extends android.support.v17.leanback.widget.picker.Picker {
+    ctor public TimePicker(android.content.Context, android.util.AttributeSet);
+    ctor public TimePicker(android.content.Context, android.util.AttributeSet, int);
+    method public int getHour();
+    method public int getMinute();
+    method public boolean is24Hour();
+    method public boolean isPm();
+    method public void setHour(int);
+    method public void setIs24Hour(boolean);
+    method public void setMinute(int);
+  }
+
+}
+
diff --git a/v17/leanback/api/current.txt b/v17/leanback/api/current.txt
index d67ba42..4ee4d94 100644
--- a/v17/leanback/api/current.txt
+++ b/v17/leanback/api/current.txt
@@ -823,7 +823,7 @@
     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 deprecated void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
     method public void setTitle(java.lang.String);
     method public void startRecognition();
   }
@@ -853,7 +853,7 @@
     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 deprecated void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
     method public void setTitle(java.lang.String);
     method public void startRecognition();
   }
@@ -2800,7 +2800,7 @@
     method public void setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors);
     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 deprecated 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();
@@ -2956,7 +2956,7 @@
     method public void showNotListening();
   }
 
-  public abstract interface SpeechRecognitionCallback {
+  public abstract deprecated interface SpeechRecognitionCallback {
     method public abstract void recognizeSpeech();
   }
 
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BaseFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BaseFragment.java
index 278c1ac..bdb213f 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BaseFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BaseFragment.java
@@ -18,6 +18,8 @@
 
 import android.annotation.SuppressLint;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v17.leanback.transition.TransitionHelper;
 import android.support.v17.leanback.transition.TransitionListener;
 import android.support.v17.leanback.util.StateMachine;
@@ -180,7 +182,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         mStateMachine.fireEvent(EVT_ON_CREATEVIEW);
     }
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 ac67d2b..2d79f3e 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BaseRowFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BaseRowFragment.java
@@ -17,6 +17,8 @@
 package android.support.v17.leanback.app;
 
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v17.leanback.widget.ItemBridgeAdapter;
 import android.support.v17.leanback.widget.ListRow;
 import android.support.v17.leanback.widget.ObjectAdapter;
@@ -78,7 +80,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         if (savedInstanceState != null) {
             mSelectedPosition = savedInstanceState.getInt(CURRENT_SELECTED_POSITION, -1);
         }
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 7431da7..dba78da 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BaseRowSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BaseRowSupportFragment.java
@@ -14,6 +14,8 @@
 package android.support.v17.leanback.app;
 
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v17.leanback.widget.ItemBridgeAdapter;
 import android.support.v17.leanback.widget.ListRow;
 import android.support.v17.leanback.widget.ObjectAdapter;
@@ -75,7 +77,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         if (savedInstanceState != null) {
             mSelectedPosition = savedInstanceState.getInt(CURRENT_SELECTED_POSITION, -1);
         }
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BaseSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BaseSupportFragment.java
index 177052d..d89cf39 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BaseSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BaseSupportFragment.java
@@ -15,6 +15,8 @@
 
 import android.annotation.SuppressLint;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v17.leanback.transition.TransitionHelper;
 import android.support.v17.leanback.transition.TransitionListener;
 import android.support.v17.leanback.util.StateMachine;
@@ -177,7 +179,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         mStateMachine.fireEvent(EVT_ON_CREATEVIEW);
     }
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BrandedFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BrandedFragment.java
index b80bd7c..1f6ad29 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BrandedFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BrandedFragment.java
@@ -18,6 +18,8 @@
 
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.widget.SearchOrbView;
 import android.support.v17.leanback.widget.TitleHelper;
@@ -146,7 +148,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         if (savedInstanceState != null) {
             mShowingTitle = savedInstanceState.getBoolean(TITLE_SHOW);
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BrandedSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BrandedSupportFragment.java
index aff8c89..306e1f1 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BrandedSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BrandedSupportFragment.java
@@ -15,6 +15,8 @@
 
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.widget.SearchOrbView;
 import android.support.v17.leanback.widget.TitleHelper;
@@ -143,7 +145,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         if (savedInstanceState != null) {
             mShowingTitle = savedInstanceState.getBoolean(TITLE_SHOW);
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 12cdcd7..dd037d2 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/HeadersFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/HeadersFragment.java
@@ -23,6 +23,8 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.GradientDrawable;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.widget.ClassPresenterSelector;
 import android.support.v17.leanback.widget.DividerPresenter;
@@ -163,7 +165,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         final VerticalGridView listView = getVerticalGridView();
         if (listView == null) {
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 7a45630..56c85af 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/HeadersSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/HeadersSupportFragment.java
@@ -20,6 +20,8 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.GradientDrawable;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.widget.ClassPresenterSelector;
 import android.support.v17.leanback.widget.DividerPresenter;
@@ -160,7 +162,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         final VerticalGridView listView = getVerticalGridView();
         if (listView == null) {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/OnboardingFragment.java b/v17/leanback/src/android/support/v17/leanback/app/OnboardingFragment.java
index 74affd6..b69d5a7 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/OnboardingFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/OnboardingFragment.java
@@ -29,6 +29,7 @@
 import android.graphics.Color;
 import android.os.Bundle;
 import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.widget.PagingIndicator;
@@ -353,7 +354,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         if (savedInstanceState == null) {
             mCurrentPageIndex = 0;
diff --git a/v17/leanback/src/android/support/v17/leanback/app/OnboardingSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/OnboardingSupportFragment.java
index 9892625..51cb2de 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/OnboardingSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/OnboardingSupportFragment.java
@@ -26,6 +26,7 @@
 import android.graphics.Color;
 import android.os.Bundle;
 import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.widget.PagingIndicator;
@@ -350,7 +351,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         if (savedInstanceState == null) {
             mCurrentPageIndex = 0;
diff --git a/v17/leanback/src/android/support/v17/leanback/app/PlaybackFragment.java b/v17/leanback/src/android/support/v17/leanback/app/PlaybackFragment.java
index 1279521..33e787c 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/PlaybackFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/PlaybackFragment.java
@@ -27,6 +27,8 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.animation.LogAccelerateInterpolator;
 import android.support.v17.leanback.animation.LogDecelerateInterpolator;
@@ -450,7 +452,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         // controls view are initially visible, make it invisible
         // if app has called hideControlsOverlay() before view created.
diff --git a/v17/leanback/src/android/support/v17/leanback/app/PlaybackSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/PlaybackSupportFragment.java
index 197e275..a8741ab 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/PlaybackSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/PlaybackSupportFragment.java
@@ -24,6 +24,8 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.animation.LogAccelerateInterpolator;
 import android.support.v17.leanback.animation.LogDecelerateInterpolator;
@@ -447,7 +449,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         // controls view are initially visible, make it invisible
         // if app has called hideControlsOverlay() before view created.
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 46ad417..a008ad6 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/RowsFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/RowsFragment.java
@@ -19,6 +19,8 @@
 import android.animation.TimeAnimator;
 import android.animation.TimeAnimator.TimeListener;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.widget.BaseOnItemViewClickedListener;
 import android.support.v17.leanback.widget.BaseOnItemViewSelectedListener;
@@ -288,7 +290,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         if (DEBUG) Log.v(TAG, "onViewCreated");
         super.onViewCreated(view, savedInstanceState);
         // Align the top edge of child with id row_content.
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 dd357ac..05e3813 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/RowsSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/RowsSupportFragment.java
@@ -16,6 +16,8 @@
 import android.animation.TimeAnimator;
 import android.animation.TimeAnimator.TimeListener;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.widget.BaseOnItemViewClickedListener;
 import android.support.v17.leanback.widget.BaseOnItemViewSelectedListener;
@@ -285,7 +287,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         if (DEBUG) Log.v(TAG, "onViewCreated");
         super.onViewCreated(view, savedInstanceState);
         // Align the top edge of child with id row_content.
diff --git a/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java b/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java
index 8e99bd3..2154ff2 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java
@@ -55,12 +55,11 @@
  * into a {@link RowsFragment}, in the same way that they are in a {@link
  * BrowseFragment}.
  *
- * <p>If you do not supply a callback via
- * {@link #setSpeechRecognitionCallback(SpeechRecognitionCallback)}, an internal speech
- * recognizer will be used for which your application will need to declare
+ * <p>A SpeechRecognizer object will be created for which your application will need to declare
  * android.permission.RECORD_AUDIO in AndroidManifest file. If app's target version is >= 23 and
  * the device version is >= 23, a permission dialog will show first time using speech recognition.
  * 0 will be used as requestCode in requestPermissions() call.
+ * {@link #setSpeechRecognitionCallback(SpeechRecognitionCallback)} is deprecated.
  * </p>
  * <p>
  * Speech recognition is automatically started when fragment is created, but
@@ -579,8 +578,11 @@
 
     /**
      * Sets this callback to have the fragment pass speech recognition requests
-     * to the activity rather than using an internal recognizer.
+     * to the activity rather than using a SpeechRecognizer object.
+     * @deprecated Launching voice recognition activity is no longer supported. App should declare
+     *             android.permission.RECORD_AUDIO in AndroidManifest file.
      */
+    @Deprecated
     public void setSpeechRecognitionCallback(SpeechRecognitionCallback callback) {
         mSpeechRecognitionCallback = callback;
         if (mSearchBar != null) {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/SearchSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/SearchSupportFragment.java
index e26f5ba..ed2a679 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/SearchSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/SearchSupportFragment.java
@@ -52,12 +52,11 @@
  * into a {@link RowsSupportFragment}, in the same way that they are in a {@link
  * BrowseSupportFragment}.
  *
- * <p>If you do not supply a callback via
- * {@link #setSpeechRecognitionCallback(SpeechRecognitionCallback)}, an internal speech
- * recognizer will be used for which your application will need to declare
+ * <p>A SpeechRecognizer object will be created for which your application will need to declare
  * android.permission.RECORD_AUDIO in AndroidManifest file. If app's target version is >= 23 and
  * the device version is >= 23, a permission dialog will show first time using speech recognition.
  * 0 will be used as requestCode in requestPermissions() call.
+ * {@link #setSpeechRecognitionCallback(SpeechRecognitionCallback)} is deprecated.
  * </p>
  * <p>
  * Speech recognition is automatically started when fragment is created, but
@@ -576,8 +575,11 @@
 
     /**
      * Sets this callback to have the fragment pass speech recognition requests
-     * to the activity rather than using an internal recognizer.
+     * to the activity rather than using a SpeechRecognizer object.
+     * @deprecated Launching voice recognition activity is no longer supported. App should declare
+     *             android.permission.RECORD_AUDIO in AndroidManifest file.
      */
+    @Deprecated
     public void setSpeechRecognitionCallback(SpeechRecognitionCallback callback) {
         mSpeechRecognitionCallback = callback;
         if (mSearchBar != null) {
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ActionPresenterSelector.java b/v17/leanback/src/android/support/v17/leanback/widget/ActionPresenterSelector.java
index 1ced4d4..a018c2e 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/ActionPresenterSelector.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ActionPresenterSelector.java
@@ -55,43 +55,13 @@
         }
     }
 
-    static class OneLineActionPresenter extends Presenter {
-        @Override
-        public ViewHolder onCreateViewHolder(ViewGroup parent) {
-            View v = LayoutInflater.from(parent.getContext())
-                .inflate(R.layout.lb_action_1_line, parent, false);
-            return new ActionViewHolder(v, parent.getLayoutDirection());
-        }
-
+    abstract static class ActionPresenter extends Presenter {
         @Override
         public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
             Action action = (Action) item;
             ActionViewHolder vh = (ActionViewHolder) viewHolder;
             vh.mAction = action;
-            vh.mButton.setText(action.getLabel1());
-        }
-
-        @Override
-        public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
-            ((ActionViewHolder) viewHolder).mAction = null;
-        }
-    }
-
-    static class TwoLineActionPresenter extends Presenter {
-        @Override
-        public ViewHolder onCreateViewHolder(ViewGroup parent) {
-            View v = LayoutInflater.from(parent.getContext())
-                .inflate(R.layout.lb_action_2_lines, parent, false);
-            return new ActionViewHolder(v, parent.getLayoutDirection());
-        }
-
-        @Override
-        public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
-            Action action = (Action) item;
-            ActionViewHolder vh = (ActionViewHolder) viewHolder;
             Drawable icon = action.getIcon();
-            vh.mAction = action;
-
             if (icon != null) {
                 final int startPadding = vh.view.getResources()
                         .getDimensionPixelSize(R.dimen.lb_action_with_icon_padding_start);
@@ -108,6 +78,47 @@
             } else {
                 vh.mButton.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
             }
+        }
+
+        @Override
+        public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
+            ActionViewHolder vh = (ActionViewHolder) viewHolder;
+            vh.mButton.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
+            vh.view.setPadding(0, 0, 0, 0);
+            vh.mAction = null;
+        }
+    }
+
+    static class OneLineActionPresenter extends ActionPresenter {
+        @Override
+        public ViewHolder onCreateViewHolder(ViewGroup parent) {
+            View v = LayoutInflater.from(parent.getContext())
+                .inflate(R.layout.lb_action_1_line, parent, false);
+            return new ActionViewHolder(v, parent.getLayoutDirection());
+        }
+
+        @Override
+        public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
+            super.onBindViewHolder(viewHolder, item);
+            ActionViewHolder vh = ((ActionViewHolder) viewHolder);
+            Action action = (Action) item;
+            vh.mButton.setText(action.getLabel1());
+        }
+    }
+
+    static class TwoLineActionPresenter extends ActionPresenter {
+        @Override
+        public ViewHolder onCreateViewHolder(ViewGroup parent) {
+            View v = LayoutInflater.from(parent.getContext())
+                .inflate(R.layout.lb_action_2_lines, parent, false);
+            return new ActionViewHolder(v, parent.getLayoutDirection());
+        }
+
+        @Override
+        public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
+            super.onBindViewHolder(viewHolder, item);
+            Action action = (Action) item;
+            ActionViewHolder vh = (ActionViewHolder) viewHolder;
 
             CharSequence line1 = action.getLabel1();
             CharSequence line2 = action.getLabel2();
@@ -119,13 +130,5 @@
                 vh.mButton.setText(line1 + "\n" + line2);
             }
         }
-
-        @Override
-        public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
-            ActionViewHolder vh = (ActionViewHolder) viewHolder;
-            vh.mButton.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
-            vh.view.setPadding(0, 0, 0, 0);
-            vh.mAction = null;
-        }
     }
 }
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 8143197..af37f77 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
@@ -2240,10 +2240,24 @@
             focusToViewInLayout(hadFocus, scrollToFocus, -deltaPrimary, -deltaSecondary);
             appendVisibleItems();
             prependVisibleItems();
-            removeInvisibleViewsAtFront();
-            removeInvisibleViewsAtEnd();
+            // b/67370222: do not removeInvisibleViewsAtFront/End() in the loop, otherwise
+            // loop may bounce between scroll forward and scroll backward forever. Example:
+            // Assuming there are 19 items, child#18 and child#19 are both in RV, we are
+            // trying to focus to child#18 and there are 200px remaining scroll distance.
+            //   1  focusToViewInLayout() tries scroll forward 50 px to align focused child#18 on
+            //      right edge, but there to compensate remaining scroll 200px, also scroll
+            //      backward 200px, 150px pushes last child#19 out side of right edge.
+            //   2  removeInvisibleViewsAtEnd() remove last child#19, updateScrollLimits()
+            //      invalidates scroll max
+            //   3  In next iteration, when scroll max/min is unknown, focusToViewInLayout() will
+            //      align focused child#18 at center of screen.
+            //   4  Because #18 is aligned at center, appendVisibleItems() will fill child#19 to
+            //      the right.
+            //   5  (back to 1 and loop forever)
         } while (mGrid.getFirstVisibleIndex() != oldFirstVisible
                 || mGrid.getLastVisibleIndex() != oldLastVisible);
+        removeInvisibleViewsAtFront();
+        removeInvisibleViewsAtEnd();
 
         if (state.willRunPredictiveAnimations()) {
             fillScrapViewsInPostLayout();
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java b/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java
index 18f608e..1094343 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java
@@ -116,14 +116,6 @@
 
     }
 
-    private AudioManager.OnAudioFocusChangeListener mAudioFocusChangeListener =
-            new AudioManager.OnAudioFocusChangeListener() {
-                @Override
-                public void onAudioFocusChange(int focusChange) {
-                    stopRecognition();
-                }
-            };
-
     SearchBarListener mSearchBarListener;
     SearchEditText mSearchTextEditor;
     SpeechOrbView mSpeechOrbView;
@@ -495,7 +487,12 @@
 
     /**
      * Sets the speech recognition callback.
+     *
+     * @deprecated Launching voice recognition activity is no longer supported. App should declare
+     *             android.permission.RECORD_AUDIO in AndroidManifest file. See details in
+     *             {@link android.support.v17.leanback.app.SearchSupportFragment}.
      */
+    @Deprecated
     public void setSpeechRecognitionCallback(SpeechRecognitionCallback request) {
         mSpeechRecognitionCallback = request;
         if (mSpeechRecognitionCallback != null && mSpeechRecognizer != null) {
@@ -582,7 +579,6 @@
         if (mListening) {
             mSpeechRecognizer.cancel();
             mListening = false;
-            mAudioManager.abandonAudioFocus(mAudioFocusChangeListener);
         }
 
         mSpeechRecognizer.setRecognitionListener(null);
@@ -624,17 +620,6 @@
         }
 
         mRecognizing = true;
-        // Request audio focus
-        int result = mAudioManager.requestAudioFocus(mAudioFocusChangeListener,
-                // Use the music stream.
-                AudioManager.STREAM_MUSIC,
-                // Request exclusive transient focus.
-                AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
-
-
-        if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
-            Log.w(TAG, "Could not get audio focus");
-        }
 
         mSearchTextEditor.setText("");
 
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/SpeechRecognitionCallback.java b/v17/leanback/src/android/support/v17/leanback/widget/SpeechRecognitionCallback.java
index 02b0990..173444d 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/SpeechRecognitionCallback.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/SpeechRecognitionCallback.java
@@ -15,7 +15,12 @@
 
 /**
  * Interface for receiving notification that speech recognition should be initiated.
+ *
+ * @deprecated Launching voice recognition activity is no longer supported. App should declare
+ *             android.permission.RECORD_AUDIO in AndroidManifest file. See details in
+ *             {@link android.support.v17.leanback.app.SearchSupportFragment}.
  */
+@Deprecated
 public interface SpeechRecognitionCallback {
     /**
      * Method invoked when speech recognition should be initiated.
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/media/MediaControllerAdapterTest.java b/v17/leanback/tests/java/android/support/v17/leanback/media/MediaControllerAdapterTest.java
index 080dee0..cdcbec6 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/media/MediaControllerAdapterTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/media/MediaControllerAdapterTest.java
@@ -789,7 +789,6 @@
     private class MediaSessionCallback extends MediaSessionCompat.Callback {
         private long mSeekPosition;
         private int mRepeatMode;
-        private boolean mShuffleModeEnabled;
         private int mShuffleMode;
 
         private boolean mOnPlayCalled;
@@ -805,7 +804,6 @@
 
         public void reset() {
             mSeekPosition = -1;
-            mShuffleModeEnabled = false;
             mRepeatMode = PlaybackStateCompat.REPEAT_MODE_NONE;
             mShuffleMode = PlaybackStateCompat.SHUFFLE_MODE_NONE;
 
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java
index b6fe3c4..5de0aa7 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java
@@ -1387,6 +1387,68 @@
     }
 
     @Test
+    public void testScrollAndStuck() throws Throwable {
+        // see b/67370222 fastRelayout() may be stuck.
+        final int numItems = 19;
+        final int[] itemsLength = new int[numItems];
+        for (int i = 0; i < numItems; i++) {
+            itemsLength[i] = 288;
+        }
+        Intent intent = new Intent();
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_linear);
+        intent.putExtra(GridActivity.EXTRA_ITEMS, itemsLength);
+        initActivity(intent);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 1;
+
+        // set left right padding to 112, space between items to be 16.
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                ViewGroup.LayoutParams lp = mGridView.getLayoutParams();
+                lp.width = 1920;
+                mGridView.setLayoutParams(lp);
+                mGridView.setPadding(112, mGridView.getPaddingTop(), 112,
+                        mGridView.getPaddingBottom());
+                mGridView.setItemSpacing(16);
+            }
+        });
+        waitOneUiCycle();
+
+        int scrollPos = 0;
+        while (true) {
+            final View view = mGridView.getChildAt(mGridView.getChildCount() - 1);
+            final int pos = mGridView.getChildViewHolder(view).getAdapterPosition();
+            if (scrollPos != pos) {
+                scrollPos = pos;
+                mActivityTestRule.runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        mGridView.smoothScrollToPosition(pos);
+                    }
+                });
+            }
+            // wait until we see 2nd from last:
+            if (pos >= 17) {
+                if (pos == 17) {
+                    // great we can test fastRelayout() bug.
+                    Thread.sleep(50);
+                    mActivityTestRule.runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            view.requestLayout();
+                        }
+                    });
+                }
+                break;
+            }
+            Thread.sleep(16);
+        }
+        waitForScrollIdle();
+    }
+
+    @Test
     public void testSwapAfterScroll() throws Throwable {
         Intent intent = new Intent();
         intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
diff --git a/v17/preference-leanback/AndroidManifest.xml b/v17/preference-leanback/AndroidManifest.xml
index c34c254..028f582 100644
--- a/v17/preference-leanback/AndroidManifest.xml
+++ b/v17/preference-leanback/AndroidManifest.xml
@@ -18,8 +18,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="android.support.v17.preference">
     <uses-sdk android:minSdkVersion="17" />
-    <application>
-        <meta-data android:name="android.support.v17.preference.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/v17/preference-leanback/OWNERS b/v17/preference-leanback/OWNERS
new file mode 100644
index 0000000..727cc8e
--- /dev/null
+++ b/v17/preference-leanback/OWNERS
@@ -0,0 +1 @@
+nicoya@google.com
\ No newline at end of file
diff --git a/v17/preference-leanback/api/26.1.0.txt b/v17/preference-leanback/api/26.1.0.txt
new file mode 100644
index 0000000..7bae10d
--- /dev/null
+++ b/v17/preference-leanback/api/26.1.0.txt
@@ -0,0 +1,62 @@
+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();
+    method public void setTitle(java.lang.CharSequence);
+  }
+
+  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/preference-leanback/api/27.0.0.txt b/v17/preference-leanback/api/27.0.0.txt
new file mode 100644
index 0000000..7bae10d
--- /dev/null
+++ b/v17/preference-leanback/api/27.0.0.txt
@@ -0,0 +1,62 @@
+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();
+    method public void setTitle(java.lang.CharSequence);
+  }
+
+  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/preference-leanback/src/android/support/v17/preference/LeanbackPreferenceFragment.java b/v17/preference-leanback/src/android/support/v17/preference/LeanbackPreferenceFragment.java
index dbff1c8..48d14b8 100644
--- a/v17/preference-leanback/src/android/support/v17/preference/LeanbackPreferenceFragment.java
+++ b/v17/preference-leanback/src/android/support/v17/preference/LeanbackPreferenceFragment.java
@@ -30,12 +30,12 @@
  * <p>The following sample code shows a simple leanback preference fragment that is
  * populated from a resource.  The resource it loads is:</p>
  *
- * {@sample frameworks/support/samples/SupportPreferenceDemos/res/xml/preferences.xml preferences}
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml preferences}
  *
  * <p>The fragment needs only to implement {@link #onCreatePreferences(Bundle, String)} to populate
  * the list of preference objects:</p>
  *
- * {@sample frameworks/support/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/java/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java
  *      support_fragment_leanback}
  */
 public abstract class LeanbackPreferenceFragment extends BaseLeanbackPreferenceFragment {
diff --git a/v17/preference-leanback/src/android/support/v17/preference/LeanbackSettingsFragment.java b/v17/preference-leanback/src/android/support/v17/preference/LeanbackSettingsFragment.java
index 08f19c4..d56a2a6 100644
--- a/v17/preference-leanback/src/android/support/v17/preference/LeanbackSettingsFragment.java
+++ b/v17/preference-leanback/src/android/support/v17/preference/LeanbackSettingsFragment.java
@@ -42,14 +42,14 @@
  * <p>The following sample code shows a simple leanback preference fragment that is
  * populated from a resource.  The resource it loads is:</p>
  *
- * {@sample frameworks/support/samples/SupportPreferenceDemos/res/xml/preferences.xml preferences}
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml preferences}
  *
  * <p>The sample implements
  * {@link PreferenceFragment.OnPreferenceStartFragmentCallback#onPreferenceStartFragment(PreferenceFragment, Preference)},
  * {@link PreferenceFragment.OnPreferenceStartScreenCallback#onPreferenceStartScreen(PreferenceFragment, PreferenceScreen)},
  * and {@link #onPreferenceStartInitialScreen()}:</p>
  *
- * {@sample frameworks/support/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/java/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java
  *      support_fragment_leanback}
  */
 public abstract class LeanbackSettingsFragment extends Fragment
diff --git a/v4/AndroidManifest.xml b/v4/AndroidManifest.xml
index c179eb2..bc1ee8e 100644
--- a/v4/AndroidManifest.xml
+++ b/v4/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.v4">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.v4.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/v7/appcompat/Android.mk b/v7/appcompat/Android.mk
index 93baa95..500a2a2 100644
--- a/v7/appcompat/Android.mk
+++ b/v7/appcompat/Android.mk
@@ -26,7 +26,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-v7-appcompat
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under,src)
+LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_STATIC_JAVA_LIBRARIES := \
     android-support-vectordrawable \
diff --git a/v7/appcompat/AndroidManifest.xml b/v7/appcompat/AndroidManifest.xml
index 786d361..76b8a23 100644
--- a/v7/appcompat/AndroidManifest.xml
+++ b/v7/appcompat/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.v7.appcompat">
     <uses-sdk android:minSdkVersion="14" />
-    <application>
-        <meta-data android:name="android.support.v7.appcompat.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/v7/appcompat/OWNERS b/v7/appcompat/OWNERS
new file mode 100644
index 0000000..9ac21f4
--- /dev/null
+++ b/v7/appcompat/OWNERS
@@ -0,0 +1,2 @@
+clarabayarri@google.com
+kirillg@google.com
\ No newline at end of file
diff --git a/v7/appcompat/api/26.1.0.txt b/v7/appcompat/api/26.1.0.txt
new file mode 100644
index 0000000..0b26bb7
--- /dev/null
+++ b/v7/appcompat/api/26.1.0.txt
@@ -0,0 +1,890 @@
+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 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.support.v7.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
+    method public boolean isDrawerIndicatorEnabled();
+    method public boolean isDrawerSlideAnimationEnabled();
+    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 setDrawerArrowDrawable(android.support.v7.graphics.drawable.DrawerArrowDrawable);
+    method public void setDrawerIndicatorEnabled(boolean);
+    method public void setDrawerSlideAnimationEnabled(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 deprecated 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 supportInvalidateOptionsMenu();
+    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 abstract boolean 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);
+    method public abstract <T extends android.view.View> T findViewById(int);
+    method public static int getDefaultNightMode();
+    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 static boolean isCompatVectorFromResourcesEnabled();
+    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 onSaveInstanceState(android.os.Bundle);
+    method public abstract void onStart();
+    method public abstract void onStop();
+    method public abstract boolean requestWindowFeature(int);
+    method public static void setCompatVectorFromResourcesEnabled(boolean);
+    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 static void setDefaultNightMode(int);
+    method public abstract void setHandleNativeActionModesEnabled(boolean);
+    method public abstract void setLocalNightMode(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 = 0; // 0x0
+    field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+    field public static final int MODE_NIGHT_NO = 1; // 0x1
+    field public static final int MODE_NIGHT_YES = 2; // 0x2
+  }
+
+  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 deprecated class NotificationCompat extends android.support.v4.app.NotificationCompat {
+    ctor public deprecated NotificationCompat();
+    method public static deprecated android.support.v4.media.session.MediaSessionCompat.Token getMediaSession(android.app.Notification);
+  }
+
+  public static deprecated class NotificationCompat.Builder extends android.support.v4.app.NotificationCompat.Builder {
+    ctor public deprecated NotificationCompat.Builder(android.content.Context);
+  }
+
+  public static deprecated class NotificationCompat.DecoratedCustomViewStyle extends android.support.v4.app.NotificationCompat.DecoratedCustomViewStyle {
+    ctor public deprecated NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static deprecated class NotificationCompat.DecoratedMediaCustomViewStyle extends android.support.v4.media.app.NotificationCompat.DecoratedMediaCustomViewStyle {
+    ctor public deprecated NotificationCompat.DecoratedMediaCustomViewStyle();
+  }
+
+  public static deprecated class NotificationCompat.MediaStyle extends android.support.v4.media.app.NotificationCompat.MediaStyle {
+    ctor public deprecated NotificationCompat.MediaStyle();
+    ctor public deprecated NotificationCompat.MediaStyle(android.support.v4.app.NotificationCompat.Builder);
+    method public deprecated android.support.v7.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
+    method public deprecated android.support.v7.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
+    method public deprecated android.support.v7.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
+    method public deprecated android.support.v7.app.NotificationCompat.MediaStyle setShowCancelButton(boolean);
+  }
+
+}
+
+package android.support.v7.content.res {
+
+  public final class AppCompatResources {
+    method public static android.content.res.ColorStateList getColorStateList(android.content.Context, int);
+    method public static android.graphics.drawable.Drawable getDrawable(android.content.Context, int);
+  }
+
+}
+
+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 protected android.support.v7.widget.ActionMenuView.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.ActionMenuView.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v7.widget.ActionMenuView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    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);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setTextAppearance(android.content.Context, 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 setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setSupportAllCaps(boolean);
+    method public void setTextAppearance(android.content.Context, int);
+  }
+
+  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);
+    method public void setTextAppearance(android.content.Context, 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);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setTextAppearance(android.content.Context, 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);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+  }
+
+  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);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+  }
+
+  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);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setTextAppearance(android.content.Context, 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);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+  }
+
+  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);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setTextAppearance(android.content.Context, 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 protected android.support.v7.widget.LinearLayoutCompat.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.LinearLayoutCompat.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v7.widget.LinearLayoutCompat.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getBaselineAlignedChildIndex();
+    method public android.graphics.drawable.Drawable getDividerDrawable();
+    method public int getDividerPadding();
+    method public int getGravity();
+    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.content.res.ColorStateList getThumbTintList();
+    method public android.graphics.PorterDuff.Mode getThumbTintMode();
+    method public android.graphics.drawable.Drawable getTrackDrawable();
+    method public android.content.res.ColorStateList getTrackTintList();
+    method public android.graphics.PorterDuff.Mode getTrackTintMode();
+    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 setThumbTintList(android.content.res.ColorStateList);
+    method public void setThumbTintMode(android.graphics.PorterDuff.Mode);
+    method public void setTrackDrawable(android.graphics.drawable.Drawable);
+    method public void setTrackResource(int);
+    method public void setTrackTintList(android.content.res.ColorStateList);
+    method public void setTrackTintMode(android.graphics.PorterDuff.Mode);
+  }
+
+  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 protected android.support.v7.widget.Toolbar.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.Toolbar.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v7.widget.Toolbar.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getContentInsetEnd();
+    method public int getContentInsetEndWithActions();
+    method public int getContentInsetLeft();
+    method public int getContentInsetRight();
+    method public int getContentInsetStart();
+    method public int getContentInsetStartWithNavigation();
+    method public int getCurrentContentInsetEnd();
+    method public int getCurrentContentInsetLeft();
+    method public int getCurrentContentInsetRight();
+    method public int getCurrentContentInsetStart();
+    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 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);
+    method public boolean isOverflowMenuShowing();
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void setContentInsetEndWithActions(int);
+    method public void setContentInsetStartWithNavigation(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 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();
+  }
+
+  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.support.v4.view.AbsSavedState {
+    ctor public Toolbar.SavedState(android.os.Parcel);
+    ctor public Toolbar.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public Toolbar.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.v7.widget.Toolbar.SavedState> CREATOR;
+  }
+
+  public class TooltipCompat {
+    method public static void setTooltipText(android.view.View, java.lang.CharSequence);
+  }
+
+}
+
diff --git a/v7/appcompat/api/27.0.0.txt b/v7/appcompat/api/27.0.0.txt
new file mode 100644
index 0000000..93d0186
--- /dev/null
+++ b/v7/appcompat/api/27.0.0.txt
@@ -0,0 +1,864 @@
+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 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.support.v7.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
+    method public boolean isDrawerIndicatorEnabled();
+    method public boolean isDrawerSlideAnimationEnabled();
+    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 setDrawerArrowDrawable(android.support.v7.graphics.drawable.DrawerArrowDrawable);
+    method public void setDrawerIndicatorEnabled(boolean);
+    method public void setDrawerSlideAnimationEnabled(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 deprecated 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 supportInvalidateOptionsMenu();
+    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 abstract boolean 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);
+    method public abstract <T extends android.view.View> T findViewById(int);
+    method public static int getDefaultNightMode();
+    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 static boolean isCompatVectorFromResourcesEnabled();
+    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 onSaveInstanceState(android.os.Bundle);
+    method public abstract void onStart();
+    method public abstract void onStop();
+    method public abstract boolean requestWindowFeature(int);
+    method public static void setCompatVectorFromResourcesEnabled(boolean);
+    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 static void setDefaultNightMode(int);
+    method public abstract void setHandleNativeActionModesEnabled(boolean);
+    method public abstract void setLocalNightMode(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 = 0; // 0x0
+    field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+    field public static final int MODE_NIGHT_NO = 1; // 0x1
+    field public static final int MODE_NIGHT_YES = 2; // 0x2
+  }
+
+  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();
+  }
+
+}
+
+package android.support.v7.content.res {
+
+  public final class AppCompatResources {
+    method public static android.content.res.ColorStateList getColorStateList(android.content.Context, int);
+    method public static android.graphics.drawable.Drawable getDrawable(android.content.Context, int);
+  }
+
+}
+
+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 protected android.support.v7.widget.ActionMenuView.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.ActionMenuView.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v7.widget.ActionMenuView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    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);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setTextAppearance(android.content.Context, 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 setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setSupportAllCaps(boolean);
+    method public void setTextAppearance(android.content.Context, int);
+  }
+
+  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);
+    method public void setTextAppearance(android.content.Context, 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);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setTextAppearance(android.content.Context, 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);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+  }
+
+  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);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+  }
+
+  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);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setTextAppearance(android.content.Context, 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);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+  }
+
+  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);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setTextAppearance(android.content.Context, 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 protected android.support.v7.widget.LinearLayoutCompat.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.LinearLayoutCompat.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v7.widget.LinearLayoutCompat.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getBaselineAlignedChildIndex();
+    method public android.graphics.drawable.Drawable getDividerDrawable();
+    method public int getDividerPadding();
+    method public int getGravity();
+    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.content.res.ColorStateList getThumbTintList();
+    method public android.graphics.PorterDuff.Mode getThumbTintMode();
+    method public android.graphics.drawable.Drawable getTrackDrawable();
+    method public android.content.res.ColorStateList getTrackTintList();
+    method public android.graphics.PorterDuff.Mode getTrackTintMode();
+    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 setThumbTintList(android.content.res.ColorStateList);
+    method public void setThumbTintMode(android.graphics.PorterDuff.Mode);
+    method public void setTrackDrawable(android.graphics.drawable.Drawable);
+    method public void setTrackResource(int);
+    method public void setTrackTintList(android.content.res.ColorStateList);
+    method public void setTrackTintMode(android.graphics.PorterDuff.Mode);
+  }
+
+  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 protected android.support.v7.widget.Toolbar.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.Toolbar.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v7.widget.Toolbar.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getContentInsetEnd();
+    method public int getContentInsetEndWithActions();
+    method public int getContentInsetLeft();
+    method public int getContentInsetRight();
+    method public int getContentInsetStart();
+    method public int getContentInsetStartWithNavigation();
+    method public int getCurrentContentInsetEnd();
+    method public int getCurrentContentInsetLeft();
+    method public int getCurrentContentInsetRight();
+    method public int getCurrentContentInsetStart();
+    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 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);
+    method public boolean isOverflowMenuShowing();
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void setContentInsetEndWithActions(int);
+    method public void setContentInsetStartWithNavigation(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 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();
+  }
+
+  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.support.v4.view.AbsSavedState {
+    ctor public Toolbar.SavedState(android.os.Parcel);
+    ctor public Toolbar.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public Toolbar.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.v7.widget.Toolbar.SavedState> CREATOR;
+  }
+
+  public class TooltipCompat {
+    method public static void setTooltipText(android.view.View, java.lang.CharSequence);
+  }
+
+}
+
diff --git a/v7/appcompat/build.gradle b/v7/appcompat/build.gradle
index a0e5290..2d57ac4 100644
--- a/v7/appcompat/build.gradle
+++ b/v7/appcompat/build.gradle
@@ -22,10 +22,7 @@
     }
 
     sourceSets {
-        main.java.srcDir 'src'
         main.res.srcDirs 'res', 'res-public'
-        main.assets.srcDir 'assets'
-        main.resources.srcDir 'src'
     }
 
     aaptOptions {
diff --git a/v7/appcompat/res/color-v21/abc_btn_colored_borderless_text_material.xml b/v7/appcompat/res/color-v21/abc_btn_colored_borderless_text_material.xml
new file mode 100644
index 0000000..f5585e3
--- /dev/null
+++ b/v7/appcompat/res/color-v21/abc_btn_colored_borderless_text_material.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<!-- Used for the text of a borderless colored button. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_enabled="false"
+          android:color="?android:attr/textColorSecondary"/>
+    <item android:color="?attr/colorAccent"/>
+</selector>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-vi/strings.xml b/v7/appcompat/res/values-vi/strings.xml
index 4560b4b..9587bed 100644
--- a/v7/appcompat/res/values-vi/strings.xml
+++ b/v7/appcompat/res/values-vi/strings.xml
@@ -19,7 +19,7 @@
     <string name="abc_action_mode_done" msgid="4076576682505996667">"Xong"</string>
     <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Điều hướng về trang chủ"</string>
     <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Điều hướng lên trên"</string>
-    <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Tùy chọn khác"</string>
+    <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Thêm tùy chọn"</string>
     <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Thu gọn"</string>
     <string name="abc_searchview_description_search" msgid="8264924765203268293">"Tìm kiếm"</string>
     <string name="abc_search_hint" msgid="7723749260725869598">"Tìm kiếm…"</string>
diff --git a/v7/appcompat/src/android/support/v7/app/ActionBar.java b/v7/appcompat/src/main/java/android/support/v7/app/ActionBar.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/ActionBar.java
rename to v7/appcompat/src/main/java/android/support/v7/app/ActionBar.java
diff --git a/v7/appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java b/v7/appcompat/src/main/java/android/support/v7/app/ActionBarDrawerToggle.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java
rename to v7/appcompat/src/main/java/android/support/v7/app/ActionBarDrawerToggle.java
diff --git a/v7/appcompat/src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java b/v7/appcompat/src/main/java/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java
rename to v7/appcompat/src/main/java/android/support/v7/app/ActionBarDrawerToggleHoneycomb.java
diff --git a/v7/appcompat/src/android/support/v7/app/AlertController.java b/v7/appcompat/src/main/java/android/support/v7/app/AlertController.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/AlertController.java
rename to v7/appcompat/src/main/java/android/support/v7/app/AlertController.java
diff --git a/v7/appcompat/src/android/support/v7/app/AlertDialog.java b/v7/appcompat/src/main/java/android/support/v7/app/AlertDialog.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/AlertDialog.java
rename to v7/appcompat/src/main/java/android/support/v7/app/AlertDialog.java
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java b/v7/appcompat/src/main/java/android/support/v7/app/AppCompatActivity.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/AppCompatActivity.java
rename to v7/appcompat/src/main/java/android/support/v7/app/AppCompatActivity.java
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatCallback.java b/v7/appcompat/src/main/java/android/support/v7/app/AppCompatCallback.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/AppCompatCallback.java
rename to v7/appcompat/src/main/java/android/support/v7/app/AppCompatCallback.java
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java b/v7/appcompat/src/main/java/android/support/v7/app/AppCompatDelegate.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java
rename to v7/appcompat/src/main/java/android/support/v7/app/AppCompatDelegate.java
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java b/v7/appcompat/src/main/java/android/support/v7/app/AppCompatDelegateImplBase.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplBase.java
rename to v7/appcompat/src/main/java/android/support/v7/app/AppCompatDelegateImplBase.java
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplN.java b/v7/appcompat/src/main/java/android/support/v7/app/AppCompatDelegateImplN.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplN.java
rename to v7/appcompat/src/main/java/android/support/v7/app/AppCompatDelegateImplN.java
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV11.java b/v7/appcompat/src/main/java/android/support/v7/app/AppCompatDelegateImplV11.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV11.java
rename to v7/appcompat/src/main/java/android/support/v7/app/AppCompatDelegateImplV11.java
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV14.java b/v7/appcompat/src/main/java/android/support/v7/app/AppCompatDelegateImplV14.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV14.java
rename to v7/appcompat/src/main/java/android/support/v7/app/AppCompatDelegateImplV14.java
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV23.java b/v7/appcompat/src/main/java/android/support/v7/app/AppCompatDelegateImplV23.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV23.java
rename to v7/appcompat/src/main/java/android/support/v7/app/AppCompatDelegateImplV23.java
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV9.java b/v7/appcompat/src/main/java/android/support/v7/app/AppCompatDelegateImplV9.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV9.java
rename to v7/appcompat/src/main/java/android/support/v7/app/AppCompatDelegateImplV9.java
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDialog.java b/v7/appcompat/src/main/java/android/support/v7/app/AppCompatDialog.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/AppCompatDialog.java
rename to v7/appcompat/src/main/java/android/support/v7/app/AppCompatDialog.java
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDialogFragment.java b/v7/appcompat/src/main/java/android/support/v7/app/AppCompatDialogFragment.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/AppCompatDialogFragment.java
rename to v7/appcompat/src/main/java/android/support/v7/app/AppCompatDialogFragment.java
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatViewInflater.java b/v7/appcompat/src/main/java/android/support/v7/app/AppCompatViewInflater.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/AppCompatViewInflater.java
rename to v7/appcompat/src/main/java/android/support/v7/app/AppCompatViewInflater.java
diff --git a/v7/appcompat/src/android/support/v7/app/NavItemSelectedListener.java b/v7/appcompat/src/main/java/android/support/v7/app/NavItemSelectedListener.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/NavItemSelectedListener.java
rename to v7/appcompat/src/main/java/android/support/v7/app/NavItemSelectedListener.java
diff --git a/v7/appcompat/src/android/support/v7/app/ResourcesFlusher.java b/v7/appcompat/src/main/java/android/support/v7/app/ResourcesFlusher.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/ResourcesFlusher.java
rename to v7/appcompat/src/main/java/android/support/v7/app/ResourcesFlusher.java
diff --git a/v7/appcompat/src/android/support/v7/app/ToolbarActionBar.java b/v7/appcompat/src/main/java/android/support/v7/app/ToolbarActionBar.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/ToolbarActionBar.java
rename to v7/appcompat/src/main/java/android/support/v7/app/ToolbarActionBar.java
diff --git a/v7/appcompat/src/android/support/v7/app/TwilightCalculator.java b/v7/appcompat/src/main/java/android/support/v7/app/TwilightCalculator.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/TwilightCalculator.java
rename to v7/appcompat/src/main/java/android/support/v7/app/TwilightCalculator.java
diff --git a/v7/appcompat/src/android/support/v7/app/TwilightManager.java b/v7/appcompat/src/main/java/android/support/v7/app/TwilightManager.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/TwilightManager.java
rename to v7/appcompat/src/main/java/android/support/v7/app/TwilightManager.java
diff --git a/v7/appcompat/src/android/support/v7/app/WindowDecorActionBar.java b/v7/appcompat/src/main/java/android/support/v7/app/WindowDecorActionBar.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/WindowDecorActionBar.java
rename to v7/appcompat/src/main/java/android/support/v7/app/WindowDecorActionBar.java
diff --git a/v7/appcompat/src/android/support/v7/content/res/AppCompatColorStateListInflater.java b/v7/appcompat/src/main/java/android/support/v7/content/res/AppCompatColorStateListInflater.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/content/res/AppCompatColorStateListInflater.java
rename to v7/appcompat/src/main/java/android/support/v7/content/res/AppCompatColorStateListInflater.java
diff --git a/v7/appcompat/src/android/support/v7/content/res/AppCompatResources.java b/v7/appcompat/src/main/java/android/support/v7/content/res/AppCompatResources.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/content/res/AppCompatResources.java
rename to v7/appcompat/src/main/java/android/support/v7/content/res/AppCompatResources.java
diff --git a/v7/appcompat/src/android/support/v7/content/res/GrowingArrayUtils.java b/v7/appcompat/src/main/java/android/support/v7/content/res/GrowingArrayUtils.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/content/res/GrowingArrayUtils.java
rename to v7/appcompat/src/main/java/android/support/v7/content/res/GrowingArrayUtils.java
diff --git a/v7/appcompat/src/android/support/v7/graphics/drawable/DrawableWrapper.java b/v7/appcompat/src/main/java/android/support/v7/graphics/drawable/DrawableWrapper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/graphics/drawable/DrawableWrapper.java
rename to v7/appcompat/src/main/java/android/support/v7/graphics/drawable/DrawableWrapper.java
diff --git a/v7/appcompat/src/android/support/v7/graphics/drawable/DrawerArrowDrawable.java b/v7/appcompat/src/main/java/android/support/v7/graphics/drawable/DrawerArrowDrawable.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/graphics/drawable/DrawerArrowDrawable.java
rename to v7/appcompat/src/main/java/android/support/v7/graphics/drawable/DrawerArrowDrawable.java
diff --git a/v7/appcompat/src/android/support/v7/text/AllCapsTransformationMethod.java b/v7/appcompat/src/main/java/android/support/v7/text/AllCapsTransformationMethod.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/text/AllCapsTransformationMethod.java
rename to v7/appcompat/src/main/java/android/support/v7/text/AllCapsTransformationMethod.java
diff --git a/v7/appcompat/src/android/support/v7/view/ActionBarPolicy.java b/v7/appcompat/src/main/java/android/support/v7/view/ActionBarPolicy.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/ActionBarPolicy.java
rename to v7/appcompat/src/main/java/android/support/v7/view/ActionBarPolicy.java
diff --git a/v7/appcompat/src/android/support/v7/view/ActionMode.java b/v7/appcompat/src/main/java/android/support/v7/view/ActionMode.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/ActionMode.java
rename to v7/appcompat/src/main/java/android/support/v7/view/ActionMode.java
diff --git a/v7/appcompat/src/android/support/v7/view/CollapsibleActionView.java b/v7/appcompat/src/main/java/android/support/v7/view/CollapsibleActionView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/CollapsibleActionView.java
rename to v7/appcompat/src/main/java/android/support/v7/view/CollapsibleActionView.java
diff --git a/v7/appcompat/src/android/support/v7/view/ContextThemeWrapper.java b/v7/appcompat/src/main/java/android/support/v7/view/ContextThemeWrapper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/ContextThemeWrapper.java
rename to v7/appcompat/src/main/java/android/support/v7/view/ContextThemeWrapper.java
diff --git a/v7/appcompat/src/android/support/v7/view/StandaloneActionMode.java b/v7/appcompat/src/main/java/android/support/v7/view/StandaloneActionMode.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/StandaloneActionMode.java
rename to v7/appcompat/src/main/java/android/support/v7/view/StandaloneActionMode.java
diff --git a/v7/appcompat/src/android/support/v7/view/SupportActionModeWrapper.java b/v7/appcompat/src/main/java/android/support/v7/view/SupportActionModeWrapper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/SupportActionModeWrapper.java
rename to v7/appcompat/src/main/java/android/support/v7/view/SupportActionModeWrapper.java
diff --git a/v7/appcompat/src/android/support/v7/view/SupportMenuInflater.java b/v7/appcompat/src/main/java/android/support/v7/view/SupportMenuInflater.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/SupportMenuInflater.java
rename to v7/appcompat/src/main/java/android/support/v7/view/SupportMenuInflater.java
diff --git a/v7/appcompat/src/android/support/v7/view/ViewPropertyAnimatorCompatSet.java b/v7/appcompat/src/main/java/android/support/v7/view/ViewPropertyAnimatorCompatSet.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/ViewPropertyAnimatorCompatSet.java
rename to v7/appcompat/src/main/java/android/support/v7/view/ViewPropertyAnimatorCompatSet.java
diff --git a/v7/appcompat/src/android/support/v7/view/WindowCallbackWrapper.java b/v7/appcompat/src/main/java/android/support/v7/view/WindowCallbackWrapper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/WindowCallbackWrapper.java
rename to v7/appcompat/src/main/java/android/support/v7/view/WindowCallbackWrapper.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItem.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/ActionMenuItem.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/ActionMenuItem.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/ActionMenuItem.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItemView.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/ActionMenuItemView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/ActionMenuItemView.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/ActionMenuItemView.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/BaseMenuPresenter.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/BaseMenuPresenter.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/BaseMenuPresenter.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/BaseMenuPresenter.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/BaseMenuWrapper.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/BaseMenuWrapper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/BaseMenuWrapper.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/BaseMenuWrapper.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/BaseWrapper.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/BaseWrapper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/BaseWrapper.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/BaseWrapper.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/CascadingMenuPopup.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/CascadingMenuPopup.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/CascadingMenuPopup.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/CascadingMenuPopup.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/ExpandedMenuView.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/ExpandedMenuView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/ExpandedMenuView.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/ExpandedMenuView.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/ListMenuItemView.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/ListMenuItemView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/ListMenuItemView.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/ListMenuItemView.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/ListMenuPresenter.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/ListMenuPresenter.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/ListMenuPresenter.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/ListMenuPresenter.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuAdapter.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuAdapter.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/MenuAdapter.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/MenuAdapter.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuBuilder.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuBuilder.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/MenuBuilder.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/MenuBuilder.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuDialogHelper.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuDialogHelper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/MenuDialogHelper.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/MenuDialogHelper.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuHelper.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuHelper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/MenuHelper.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/MenuHelper.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuItemImpl.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuItemImpl.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/MenuItemImpl.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/MenuItemImpl.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuItemWrapperICS.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuItemWrapperICS.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/MenuItemWrapperICS.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/MenuItemWrapperICS.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuItemWrapperJB.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuItemWrapperJB.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/MenuItemWrapperJB.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/MenuItemWrapperJB.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuPopup.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuPopup.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/MenuPopup.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/MenuPopup.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuPopupHelper.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuPopupHelper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/MenuPopupHelper.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/MenuPopupHelper.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuPresenter.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuPresenter.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/MenuPresenter.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/MenuPresenter.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuView.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/MenuView.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/MenuView.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuWrapperFactory.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuWrapperFactory.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/MenuWrapperFactory.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/MenuWrapperFactory.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuWrapperICS.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/MenuWrapperICS.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/MenuWrapperICS.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/MenuWrapperICS.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/ShowableListMenu.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/ShowableListMenu.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/ShowableListMenu.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/ShowableListMenu.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/StandardMenuPopup.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/StandardMenuPopup.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/StandardMenuPopup.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/StandardMenuPopup.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/SubMenuBuilder.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/SubMenuBuilder.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/SubMenuBuilder.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/SubMenuBuilder.java
diff --git a/v7/appcompat/src/android/support/v7/view/menu/SubMenuWrapperICS.java b/v7/appcompat/src/main/java/android/support/v7/view/menu/SubMenuWrapperICS.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/view/menu/SubMenuWrapperICS.java
rename to v7/appcompat/src/main/java/android/support/v7/view/menu/SubMenuWrapperICS.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AbsActionBarView.java b/v7/appcompat/src/main/java/android/support/v7/widget/AbsActionBarView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AbsActionBarView.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AbsActionBarView.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ActionBarBackgroundDrawable.java b/v7/appcompat/src/main/java/android/support/v7/widget/ActionBarBackgroundDrawable.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ActionBarBackgroundDrawable.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ActionBarBackgroundDrawable.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ActionBarBackgroundDrawableV21.java b/v7/appcompat/src/main/java/android/support/v7/widget/ActionBarBackgroundDrawableV21.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ActionBarBackgroundDrawableV21.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ActionBarBackgroundDrawableV21.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ActionBarContainer.java b/v7/appcompat/src/main/java/android/support/v7/widget/ActionBarContainer.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ActionBarContainer.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ActionBarContainer.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ActionBarContextView.java b/v7/appcompat/src/main/java/android/support/v7/widget/ActionBarContextView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ActionBarContextView.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ActionBarContextView.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ActionBarOverlayLayout.java b/v7/appcompat/src/main/java/android/support/v7/widget/ActionBarOverlayLayout.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ActionBarOverlayLayout.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ActionBarOverlayLayout.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ActionMenuPresenter.java b/v7/appcompat/src/main/java/android/support/v7/widget/ActionMenuPresenter.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ActionMenuPresenter.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ActionMenuPresenter.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ActionMenuView.java b/v7/appcompat/src/main/java/android/support/v7/widget/ActionMenuView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ActionMenuView.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ActionMenuView.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ActivityChooserModel.java b/v7/appcompat/src/main/java/android/support/v7/widget/ActivityChooserModel.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ActivityChooserModel.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ActivityChooserModel.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ActivityChooserView.java b/v7/appcompat/src/main/java/android/support/v7/widget/ActivityChooserView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ActivityChooserView.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ActivityChooserView.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AlertDialogLayout.java b/v7/appcompat/src/main/java/android/support/v7/widget/AlertDialogLayout.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AlertDialogLayout.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AlertDialogLayout.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatAutoCompleteTextView.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatAutoCompleteTextView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatAutoCompleteTextView.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatAutoCompleteTextView.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatBackgroundHelper.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatBackgroundHelper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatBackgroundHelper.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatBackgroundHelper.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatButton.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatButton.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatButton.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatButton.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatCheckBox.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatCheckBox.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatCheckBox.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatCheckBox.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatCheckedTextView.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatCheckedTextView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatCheckedTextView.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatCheckedTextView.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatCompoundButtonHelper.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatCompoundButtonHelper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatCompoundButtonHelper.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatCompoundButtonHelper.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatDrawableManager.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatDrawableManager.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatEditText.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatEditText.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatEditText.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatEditText.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatImageButton.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatImageButton.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatImageButton.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatImageButton.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatImageHelper.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatImageHelper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatImageHelper.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatImageHelper.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatImageView.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatImageView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatImageView.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatImageView.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatMultiAutoCompleteTextView.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatMultiAutoCompleteTextView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatMultiAutoCompleteTextView.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatMultiAutoCompleteTextView.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatPopupWindow.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatPopupWindow.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatPopupWindow.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatPopupWindow.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatProgressBarHelper.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatProgressBarHelper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatProgressBarHelper.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatProgressBarHelper.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatRadioButton.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatRadioButton.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatRadioButton.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatRadioButton.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatRatingBar.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatRatingBar.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatRatingBar.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatRatingBar.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatSeekBar.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatSeekBar.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatSeekBar.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatSeekBar.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatSeekBarHelper.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatSeekBarHelper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatSeekBarHelper.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatSeekBarHelper.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatSpinner.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatSpinner.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatSpinner.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatSpinner.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatTextHelper.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatTextHelper.java
similarity index 90%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatTextHelper.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatTextHelper.java
index 75fa38f..fa6196f 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatTextHelper.java
+++ b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatTextHelper.java
@@ -29,6 +29,7 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.RequiresApi;
 import android.support.annotation.RestrictTo;
+import android.support.v4.content.res.ResourcesCompat;
 import android.support.v4.widget.TextViewCompat;
 import android.support.v7.appcompat.R;
 import android.text.method.PasswordTransformationMethod;
@@ -36,6 +37,8 @@
 import android.util.TypedValue;
 import android.widget.TextView;
 
+import java.lang.ref.WeakReference;
+
 @RequiresApi(9)
 class AppCompatTextHelper {
 
@@ -63,6 +66,7 @@
 
     private int mStyle = Typeface.NORMAL;
     private Typeface mFontTypeface;
+    private boolean mAsyncFontPending;
 
     AppCompatTextHelper(TextView view) {
         mView = view;
@@ -213,8 +217,23 @@
                     ? R.styleable.TextAppearance_android_fontFamily
                     : R.styleable.TextAppearance_fontFamily;
             if (!context.isRestricted()) {
+                final WeakReference<TextView> textViewWeak = new WeakReference<>(mView);
+                ResourcesCompat.FontCallback replyCallback = new ResourcesCompat.FontCallback() {
+                    @Override
+                    public void onFontRetrieved(@NonNull Typeface typeface) {
+                        onAsyncTypefaceReceived(textViewWeak, typeface);
+                    }
+
+                    @Override
+                    public void onFontRetrievalFailed(int reason) {
+                        // Do nothing.
+                    }
+                };
                 try {
-                    mFontTypeface = a.getFont(fontFamilyId, mStyle, mView);
+                    // Note the callback will be triggered on the UI thread.
+                    mFontTypeface = a.getFont(fontFamilyId, mStyle, replyCallback);
+                    // If this call gave us an immediate result, ignore any pending callbacks.
+                    mAsyncFontPending = mFontTypeface == null;
                 } catch (UnsupportedOperationException | Resources.NotFoundException e) {
                     // Expected if it is not a font resource.
                 }
@@ -222,12 +241,16 @@
             if (mFontTypeface == null) {
                 // Try with String. This is done by TextView JB+, but fails in ICS
                 String fontFamilyName = a.getString(fontFamilyId);
-                mFontTypeface = Typeface.create(fontFamilyName, mStyle);
+                if (fontFamilyName != null) {
+                    mFontTypeface = Typeface.create(fontFamilyName, mStyle);
+                }
             }
             return;
         }
 
         if (a.hasValue(R.styleable.TextAppearance_android_typeface)) {
+            // Ignore previous pending fonts
+            mAsyncFontPending = false;
             int typefaceIndex = a.getInt(R.styleable.TextAppearance_android_typeface, SANS);
             switch (typefaceIndex) {
                 case SANS:
@@ -245,6 +268,16 @@
         }
     }
 
+    private void onAsyncTypefaceReceived(WeakReference<TextView> textViewWeak, Typeface typeface) {
+        if (mAsyncFontPending) {
+            mFontTypeface = typeface;
+            final TextView textView = textViewWeak.get();
+            if (textView != null) {
+                textView.setTypeface(typeface, mStyle);
+            }
+        }
+    }
+
     void onSetTextAppearance(Context context, int resId) {
         final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context,
                 resId, R.styleable.TextAppearance);
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatTextHelperV17.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatTextHelperV17.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatTextHelperV17.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatTextHelperV17.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatTextView.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatTextView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatTextView.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatTextView.java
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatTextViewAutoSizeHelper.java b/v7/appcompat/src/main/java/android/support/v7/widget/AppCompatTextViewAutoSizeHelper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/AppCompatTextViewAutoSizeHelper.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/AppCompatTextViewAutoSizeHelper.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ButtonBarLayout.java b/v7/appcompat/src/main/java/android/support/v7/widget/ButtonBarLayout.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ButtonBarLayout.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ButtonBarLayout.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ContentFrameLayout.java b/v7/appcompat/src/main/java/android/support/v7/widget/ContentFrameLayout.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ContentFrameLayout.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ContentFrameLayout.java
diff --git a/v7/appcompat/src/android/support/v7/widget/DecorContentParent.java b/v7/appcompat/src/main/java/android/support/v7/widget/DecorContentParent.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/DecorContentParent.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/DecorContentParent.java
diff --git a/v7/appcompat/src/android/support/v7/widget/DecorToolbar.java b/v7/appcompat/src/main/java/android/support/v7/widget/DecorToolbar.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/DecorToolbar.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/DecorToolbar.java
diff --git a/v7/appcompat/src/android/support/v7/widget/DialogTitle.java b/v7/appcompat/src/main/java/android/support/v7/widget/DialogTitle.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/DialogTitle.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/DialogTitle.java
diff --git a/v7/appcompat/src/android/support/v7/widget/DrawableUtils.java b/v7/appcompat/src/main/java/android/support/v7/widget/DrawableUtils.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/DrawableUtils.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/DrawableUtils.java
diff --git a/v7/appcompat/src/android/support/v7/widget/DropDownListView.java b/v7/appcompat/src/main/java/android/support/v7/widget/DropDownListView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/DropDownListView.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/DropDownListView.java
diff --git a/v7/appcompat/src/android/support/v7/widget/FitWindowsFrameLayout.java b/v7/appcompat/src/main/java/android/support/v7/widget/FitWindowsFrameLayout.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/FitWindowsFrameLayout.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/FitWindowsFrameLayout.java
diff --git a/v7/appcompat/src/android/support/v7/widget/FitWindowsLinearLayout.java b/v7/appcompat/src/main/java/android/support/v7/widget/FitWindowsLinearLayout.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/FitWindowsLinearLayout.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/FitWindowsLinearLayout.java
diff --git a/v7/appcompat/src/android/support/v7/widget/FitWindowsViewGroup.java b/v7/appcompat/src/main/java/android/support/v7/widget/FitWindowsViewGroup.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/FitWindowsViewGroup.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/FitWindowsViewGroup.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ForwardingListener.java b/v7/appcompat/src/main/java/android/support/v7/widget/ForwardingListener.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ForwardingListener.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ForwardingListener.java
diff --git a/v7/appcompat/src/android/support/v7/widget/LinearLayoutCompat.java b/v7/appcompat/src/main/java/android/support/v7/widget/LinearLayoutCompat.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/LinearLayoutCompat.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/LinearLayoutCompat.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ListPopupWindow.java b/v7/appcompat/src/main/java/android/support/v7/widget/ListPopupWindow.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ListPopupWindow.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ListPopupWindow.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ListViewCompat.java b/v7/appcompat/src/main/java/android/support/v7/widget/ListViewCompat.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ListViewCompat.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ListViewCompat.java
diff --git a/v7/appcompat/src/android/support/v7/widget/MenuItemHoverListener.java b/v7/appcompat/src/main/java/android/support/v7/widget/MenuItemHoverListener.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/MenuItemHoverListener.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/MenuItemHoverListener.java
diff --git a/v7/appcompat/src/android/support/v7/widget/MenuPopupWindow.java b/v7/appcompat/src/main/java/android/support/v7/widget/MenuPopupWindow.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/MenuPopupWindow.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/MenuPopupWindow.java
diff --git a/v7/appcompat/src/android/support/v7/widget/PopupMenu.java b/v7/appcompat/src/main/java/android/support/v7/widget/PopupMenu.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/PopupMenu.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/PopupMenu.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ResourcesWrapper.java b/v7/appcompat/src/main/java/android/support/v7/widget/ResourcesWrapper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ResourcesWrapper.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ResourcesWrapper.java
diff --git a/v7/appcompat/src/android/support/v7/widget/RtlSpacingHelper.java b/v7/appcompat/src/main/java/android/support/v7/widget/RtlSpacingHelper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/RtlSpacingHelper.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/RtlSpacingHelper.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ScrollingTabContainerView.java b/v7/appcompat/src/main/java/android/support/v7/widget/ScrollingTabContainerView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ScrollingTabContainerView.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ScrollingTabContainerView.java
diff --git a/v7/appcompat/src/android/support/v7/widget/SearchView.java b/v7/appcompat/src/main/java/android/support/v7/widget/SearchView.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/SearchView.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/SearchView.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ShareActionProvider.java b/v7/appcompat/src/main/java/android/support/v7/widget/ShareActionProvider.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ShareActionProvider.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ShareActionProvider.java
diff --git a/v7/appcompat/src/android/support/v7/widget/SuggestionsAdapter.java b/v7/appcompat/src/main/java/android/support/v7/widget/SuggestionsAdapter.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/SuggestionsAdapter.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/SuggestionsAdapter.java
diff --git a/v7/appcompat/src/android/support/v7/widget/SwitchCompat.java b/v7/appcompat/src/main/java/android/support/v7/widget/SwitchCompat.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/SwitchCompat.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/SwitchCompat.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ThemeUtils.java b/v7/appcompat/src/main/java/android/support/v7/widget/ThemeUtils.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ThemeUtils.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ThemeUtils.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ThemedSpinnerAdapter.java b/v7/appcompat/src/main/java/android/support/v7/widget/ThemedSpinnerAdapter.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ThemedSpinnerAdapter.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ThemedSpinnerAdapter.java
diff --git a/v7/appcompat/src/android/support/v7/widget/TintContextWrapper.java b/v7/appcompat/src/main/java/android/support/v7/widget/TintContextWrapper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/TintContextWrapper.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/TintContextWrapper.java
diff --git a/v7/appcompat/src/android/support/v7/widget/TintInfo.java b/v7/appcompat/src/main/java/android/support/v7/widget/TintInfo.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/TintInfo.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/TintInfo.java
diff --git a/v7/appcompat/src/android/support/v7/widget/TintResources.java b/v7/appcompat/src/main/java/android/support/v7/widget/TintResources.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/TintResources.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/TintResources.java
diff --git a/v7/appcompat/src/android/support/v7/widget/TintTypedArray.java b/v7/appcompat/src/main/java/android/support/v7/widget/TintTypedArray.java
similarity index 95%
rename from v7/appcompat/src/android/support/v7/widget/TintTypedArray.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/TintTypedArray.java
index 2213dd3..384c461 100644
--- a/v7/appcompat/src/android/support/v7/widget/TintTypedArray.java
+++ b/v7/appcompat/src/main/java/android/support/v7/widget/TintTypedArray.java
@@ -25,7 +25,6 @@
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
-import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
 import android.support.annotation.RestrictTo;
@@ -34,7 +33,6 @@
 import android.support.v7.content.res.AppCompatResources;
 import android.util.AttributeSet;
 import android.util.TypedValue;
-import android.widget.TextView;
 
 /**
  * A class that wraps a {@link android.content.res.TypedArray} and provides the same public API
@@ -98,9 +96,9 @@
      *
      * @param index Index of attribute to retrieve.
      * @param style A style value used for selecting best match font from the list of family. Note
-     * that this value will be ignored if the platform supports font family(API 24 or later).
-     * @param targetView A text view to be applied this font. If async loading is specified in XML,
-     * this view will be refreshed with result typeface.
+     * that this value will be ignored if the platform supports font family (API 24 or later).
+     * @param fontCallback A callback to receive async fetching of this font. If async loading is
+     *                     specified in XML, this callback will be triggered.
      *
      * @return Typeface for the attribute, or {@code null} if not defined.
      * @throws RuntimeException if the TypedArray has already been recycled.
@@ -108,7 +106,8 @@
      *         not a font resource.
      */
     @Nullable
-    public Typeface getFont(@StyleableRes int index, int style, @NonNull TextView targetView) {
+    public Typeface getFont(@StyleableRes int index, int style,
+            @Nullable ResourcesCompat.FontCallback fontCallback) {
         final int resourceId = mWrapped.getResourceId(index, 0);
         if (resourceId == 0) {
             return null;
@@ -116,7 +115,7 @@
         if (mTypedValue == null) {
             mTypedValue = new TypedValue();
         }
-        return ResourcesCompat.getFont(mContext, resourceId, mTypedValue, style, targetView);
+        return ResourcesCompat.getFont(mContext, resourceId, mTypedValue, style, fontCallback);
     }
 
     public int length() {
diff --git a/v7/appcompat/src/android/support/v7/widget/Toolbar.java b/v7/appcompat/src/main/java/android/support/v7/widget/Toolbar.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/Toolbar.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/Toolbar.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ToolbarWidgetWrapper.java b/v7/appcompat/src/main/java/android/support/v7/widget/ToolbarWidgetWrapper.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ToolbarWidgetWrapper.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ToolbarWidgetWrapper.java
diff --git a/v7/appcompat/src/android/support/v7/widget/TooltipCompat.java b/v7/appcompat/src/main/java/android/support/v7/widget/TooltipCompat.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/TooltipCompat.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/TooltipCompat.java
diff --git a/v7/appcompat/src/android/support/v7/widget/TooltipCompatHandler.java b/v7/appcompat/src/main/java/android/support/v7/widget/TooltipCompatHandler.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/TooltipCompatHandler.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/TooltipCompatHandler.java
diff --git a/v7/appcompat/src/android/support/v7/widget/TooltipPopup.java b/v7/appcompat/src/main/java/android/support/v7/widget/TooltipPopup.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/TooltipPopup.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/TooltipPopup.java
diff --git a/v7/appcompat/src/android/support/v7/widget/VectorEnabledTintResources.java b/v7/appcompat/src/main/java/android/support/v7/widget/VectorEnabledTintResources.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/VectorEnabledTintResources.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/VectorEnabledTintResources.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ViewStubCompat.java b/v7/appcompat/src/main/java/android/support/v7/widget/ViewStubCompat.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ViewStubCompat.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ViewStubCompat.java
diff --git a/v7/appcompat/src/android/support/v7/widget/ViewUtils.java b/v7/appcompat/src/main/java/android/support/v7/widget/ViewUtils.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/widget/ViewUtils.java
rename to v7/appcompat/src/main/java/android/support/v7/widget/ViewUtils.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/PopupMenuTest.java b/v7/appcompat/tests/src/android/support/v7/widget/PopupMenuTest.java
index f55ca17..361662a 100644
--- a/v7/appcompat/tests/src/android/support/v7/widget/PopupMenuTest.java
+++ b/v7/appcompat/tests/src/android/support/v7/widget/PopupMenuTest.java
@@ -48,6 +48,7 @@
 import android.support.test.espresso.Root;
 import android.support.test.espresso.UiController;
 import android.support.test.espresso.ViewAction;
+import android.support.test.filters.FlakyTest;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.MediumTest;
 import android.support.test.rule.ActivityTestRule;
@@ -305,6 +306,7 @@
         };
     }
 
+    @FlakyTest(bugId = 33669575)
     @Test
     @LargeTest
     public void testAnchoring() {
diff --git a/v7/cardview/Android.mk b/v7/cardview/Android.mk
index 56fa996..19d377c 100644
--- a/v7/cardview/Android.mk
+++ b/v7/cardview/Android.mk
@@ -25,7 +25,7 @@
 LOCAL_MODULE := android-support-v7-cardview
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_SRC_FILES := \
-    $(call all-java-files-under,src)
+    $(call all-java-files-under,src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-annotations
diff --git a/v7/cardview/AndroidManifest.xml b/v7/cardview/AndroidManifest.xml
index af07bbc..3831492 100644
--- a/v7/cardview/AndroidManifest.xml
+++ b/v7/cardview/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.v7.cardview">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.v7.cardview.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/v7/cardview/api/26.1.0.txt b/v7/cardview/api/26.1.0.txt
new file mode 100644
index 0000000..6732501
--- /dev/null
+++ b/v7/cardview/api/26.1.0.txt
@@ -0,0 +1,28 @@
+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 android.content.res.ColorStateList getCardBackgroundColor();
+    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 setCardBackgroundColor(android.content.res.ColorStateList);
+    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/api/27.0.0.txt b/v7/cardview/api/27.0.0.txt
new file mode 100644
index 0000000..6732501
--- /dev/null
+++ b/v7/cardview/api/27.0.0.txt
@@ -0,0 +1,28 @@
+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 android.content.res.ColorStateList getCardBackgroundColor();
+    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 setCardBackgroundColor(android.content.res.ColorStateList);
+    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/build.gradle b/v7/cardview/build.gradle
index 5d9494e..76c3bf3 100644
--- a/v7/cardview/build.gradle
+++ b/v7/cardview/build.gradle
@@ -10,9 +10,6 @@
     }
 
     sourceSets {
-        main.java.srcDirs = [
-                'src'
-        ]
         main.res.srcDir 'res'
     }
 }
diff --git a/v7/cardview/src/android/support/v7/widget/CardView.java b/v7/cardview/src/main/java/android/support/v7/widget/CardView.java
similarity index 98%
rename from v7/cardview/src/android/support/v7/widget/CardView.java
rename to v7/cardview/src/main/java/android/support/v7/widget/CardView.java
index 3df45d9..58a04f0 100644
--- a/v7/cardview/src/android/support/v7/widget/CardView.java
+++ b/v7/cardview/src/main/java/android/support/v7/widget/CardView.java
@@ -24,6 +24,7 @@
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v7.cardview.R;
 import android.util.AttributeSet;
@@ -106,17 +107,17 @@
 
     final Rect mShadowBounds = new Rect();
 
-    public CardView(Context context) {
+    public CardView(@NonNull Context context) {
         super(context);
         initialize(context, null, 0);
     }
 
-    public CardView(Context context, AttributeSet attrs) {
+    public CardView(@NonNull Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
         initialize(context, attrs, 0);
     }
 
-    public CardView(Context context, AttributeSet attrs, int defStyleAttr) {
+    public CardView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
         initialize(context, attrs, defStyleAttr);
     }
@@ -300,6 +301,7 @@
      *
      * @return The background color state list of the CardView.
      */
+    @NonNull
     public ColorStateList getCardBackgroundColor() {
         return IMPL.getBackgroundColor(mCardViewDelegate);
     }
diff --git a/v7/cardview/src/android/support/v7/widget/CardViewApi17Impl.java b/v7/cardview/src/main/java/android/support/v7/widget/CardViewApi17Impl.java
similarity index 100%
rename from v7/cardview/src/android/support/v7/widget/CardViewApi17Impl.java
rename to v7/cardview/src/main/java/android/support/v7/widget/CardViewApi17Impl.java
diff --git a/v7/cardview/src/android/support/v7/widget/CardViewApi21Impl.java b/v7/cardview/src/main/java/android/support/v7/widget/CardViewApi21Impl.java
similarity index 100%
rename from v7/cardview/src/android/support/v7/widget/CardViewApi21Impl.java
rename to v7/cardview/src/main/java/android/support/v7/widget/CardViewApi21Impl.java
diff --git a/v7/cardview/src/android/support/v7/widget/CardViewBaseImpl.java b/v7/cardview/src/main/java/android/support/v7/widget/CardViewBaseImpl.java
similarity index 100%
rename from v7/cardview/src/android/support/v7/widget/CardViewBaseImpl.java
rename to v7/cardview/src/main/java/android/support/v7/widget/CardViewBaseImpl.java
diff --git a/v7/cardview/src/android/support/v7/widget/CardViewDelegate.java b/v7/cardview/src/main/java/android/support/v7/widget/CardViewDelegate.java
similarity index 100%
rename from v7/cardview/src/android/support/v7/widget/CardViewDelegate.java
rename to v7/cardview/src/main/java/android/support/v7/widget/CardViewDelegate.java
diff --git a/v7/cardview/src/android/support/v7/widget/CardViewImpl.java b/v7/cardview/src/main/java/android/support/v7/widget/CardViewImpl.java
similarity index 100%
rename from v7/cardview/src/android/support/v7/widget/CardViewImpl.java
rename to v7/cardview/src/main/java/android/support/v7/widget/CardViewImpl.java
diff --git a/v7/cardview/src/android/support/v7/widget/RoundRectDrawable.java b/v7/cardview/src/main/java/android/support/v7/widget/RoundRectDrawable.java
similarity index 100%
rename from v7/cardview/src/android/support/v7/widget/RoundRectDrawable.java
rename to v7/cardview/src/main/java/android/support/v7/widget/RoundRectDrawable.java
diff --git a/v7/cardview/src/android/support/v7/widget/RoundRectDrawableWithShadow.java b/v7/cardview/src/main/java/android/support/v7/widget/RoundRectDrawableWithShadow.java
similarity index 100%
rename from v7/cardview/src/android/support/v7/widget/RoundRectDrawableWithShadow.java
rename to v7/cardview/src/main/java/android/support/v7/widget/RoundRectDrawableWithShadow.java
diff --git a/v7/gridlayout/Android.mk b/v7/gridlayout/Android.mk
index 6eac23b4..5091081 100644
--- a/v7/gridlayout/Android.mk
+++ b/v7/gridlayout/Android.mk
@@ -27,7 +27,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-v7-gridlayout
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-compat \
diff --git a/v7/gridlayout/AndroidManifest.xml b/v7/gridlayout/AndroidManifest.xml
index c18f5a1..288bb34 100644
--- a/v7/gridlayout/AndroidManifest.xml
+++ b/v7/gridlayout/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.v7.gridlayout">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.v7.gridlayout.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/v7/gridlayout/api/26.1.0.txt b/v7/gridlayout/api/26.1.0.txt
new file mode 100644
index 0000000..1fc6e1d
--- /dev/null
+++ b/v7/gridlayout/api/26.1.0.txt
@@ -0,0 +1,71 @@
+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 protected android.support.v7.widget.GridLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.GridLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v7.widget.GridLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    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);
+  }
+
+}
+
diff --git a/v7/gridlayout/api/27.0.0.txt b/v7/gridlayout/api/27.0.0.txt
new file mode 100644
index 0000000..1fc6e1d
--- /dev/null
+++ b/v7/gridlayout/api/27.0.0.txt
@@ -0,0 +1,71 @@
+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 protected android.support.v7.widget.GridLayout.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.GridLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected android.support.v7.widget.GridLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    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);
+  }
+
+}
+
diff --git a/v7/gridlayout/build.gradle b/v7/gridlayout/build.gradle
index e0df821..d4d467d 100644
--- a/v7/gridlayout/build.gradle
+++ b/v7/gridlayout/build.gradle
@@ -14,7 +14,6 @@
     }
 
     sourceSets {
-        main.java.srcDir 'src'
         main.res.srcDir 'res'
     }
 }
diff --git a/v7/gridlayout/src/android/support/v7/widget/GridLayout.java b/v7/gridlayout/src/main/java/android/support/v7/widget/GridLayout.java
similarity index 100%
rename from v7/gridlayout/src/android/support/v7/widget/GridLayout.java
rename to v7/gridlayout/src/main/java/android/support/v7/widget/GridLayout.java
diff --git a/v7/mediarouter/AndroidManifest.xml b/v7/mediarouter/AndroidManifest.xml
index c2c4ee3..c20a5c0 100644
--- a/v7/mediarouter/AndroidManifest.xml
+++ b/v7/mediarouter/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.v7.mediarouter">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.v7.mediarouter.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/v7/mediarouter/api/26.1.0.txt b/v7/mediarouter/api/26.1.0.txt
new file mode 100644
index 0000000..7670978
--- /dev/null
+++ b/v7/mediarouter/api/26.1.0.txt
@@ -0,0 +1,476 @@
+package android.support.v7.app {
+
+  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.support.v7.app.AppCompatDialog {
+    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_SEND_MESSAGE = "android.media.intent.action.SEND_MESSAGE";
+    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_MESSAGE = "android.media.intent.extra.MESSAGE";
+    field public static final java.lang.String EXTRA_MESSAGE_RECEIVER = "android.media.intent.extra.MESSAGE_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 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 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 getBluetoothRoute();
+    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 onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo, int);
+    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.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 isBluetooth();
+    method public boolean isConnecting();
+    method public boolean isDefault();
+    method public boolean isDeviceSpeaker();
+    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 isMessagingSupported();
+    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 sendMessage(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void setOnMessageReceivedListener(android.support.v7.media.RemotePlaybackClient.OnMessageReceivedListener);
+    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 interface RemotePlaybackClient.OnMessageReceivedListener {
+    method public abstract void onMessageReceived(java.lang.String, android.os.Bundle);
+  }
+
+  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/27.0.0.txt b/v7/mediarouter/api/27.0.0.txt
new file mode 100644
index 0000000..7670978
--- /dev/null
+++ b/v7/mediarouter/api/27.0.0.txt
@@ -0,0 +1,476 @@
+package android.support.v7.app {
+
+  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.support.v7.app.AppCompatDialog {
+    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_SEND_MESSAGE = "android.media.intent.action.SEND_MESSAGE";
+    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_MESSAGE = "android.media.intent.extra.MESSAGE";
+    field public static final java.lang.String EXTRA_MESSAGE_RECEIVER = "android.media.intent.extra.MESSAGE_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 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 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 getBluetoothRoute();
+    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 onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo, int);
+    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.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 isBluetooth();
+    method public boolean isConnecting();
+    method public boolean isDefault();
+    method public boolean isDeviceSpeaker();
+    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 isMessagingSupported();
+    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 sendMessage(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void setOnMessageReceivedListener(android.support.v7.media.RemotePlaybackClient.OnMessageReceivedListener);
+    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 interface RemotePlaybackClient.OnMessageReceivedListener {
+    method public abstract void onMessageReceived(java.lang.String, android.os.Bundle);
+  }
+
+  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/res/values-in/strings.xml b/v7/mediarouter/res/values-in/strings.xml
index e76b3e8..5e537af 100644
--- a/v7/mediarouter/res/values-in/strings.xml
+++ b/v7/mediarouter/res/values-in/strings.xml
@@ -18,10 +18,10 @@
     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="3698378085901466129">"Tombol Cast"</string>
-    <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Tombol Cast. Terputus"</string>
-    <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tombol Cast. Menghubungkan"</string>
-    <string name="mr_cast_button_connected" msgid="5088427771788648085">"Tombol Cast. Terhubung"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Tombol transmisi"</string>
+    <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Tombol transmisi. Terputus"</string>
+    <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tombol transmisi. Menghubungkan"</string>
+    <string name="mr_cast_button_connected" msgid="5088427771788648085">"Tombol transmisi. Terhubung"</string>
     <string name="mr_chooser_title" msgid="414301941546135990">"Transmisikan ke"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Mencari perangkat"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Putuskan sambungan"</string>
diff --git a/v7/mediarouter/res/values-ml/strings.xml b/v7/mediarouter/res/values-ml/strings.xml
index 62258fb..c7b50be 100644
--- a/v7/mediarouter/res/values-ml/strings.xml
+++ b/v7/mediarouter/res/values-ml/strings.xml
@@ -26,7 +26,7 @@
     <string name="mr_chooser_searching" msgid="6349900579507521956">"ഉപകരണങ്ങൾ കണ്ടെത്തുന്നു"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"വിച്ഛേദിക്കുക"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"കാസ്റ്റുചെയ്യൽ നിർത്തുക"</string>
-    <string name="mr_controller_close_description" msgid="7333862312480583260">"അവസാനിപ്പിക്കുക"</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_stop" msgid="735874641921425123">"നിര്‍ത്തുക"</string>
diff --git a/v7/mediarouter/res/values-ta/strings.xml b/v7/mediarouter/res/values-ta/strings.xml
index 9888472..99c6172 100644
--- a/v7/mediarouter/res/values-ta/strings.xml
+++ b/v7/mediarouter/res/values-ta/strings.xml
@@ -22,7 +22,7 @@
     <string name="mr_cast_button_disconnected" msgid="816305490427819240">"அனுப்புதல் பொத்தான். துண்டிக்கப்பட்டது"</string>
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"அனுப்புதல் பொத்தான். இணைக்கிறது"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"அனுப்புதல் பொத்தான். இணைக்கப்பட்டது"</string>
-    <string name="mr_chooser_title" msgid="414301941546135990">"இதற்கு அனுப்பு"</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_casting" msgid="8857886794086583226">"அனுப்புவதை நிறுத்து"</string>
diff --git a/v7/mediarouter/res/values-tr/strings.xml b/v7/mediarouter/res/values-tr/strings.xml
index 8189092..a0eb2e4 100644
--- a/v7/mediarouter/res/values-tr/strings.xml
+++ b/v7/mediarouter/res/values-tr/strings.xml
@@ -18,7 +18,7 @@
     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ınla düğmesi"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Yayın düğmesi"</string>
     <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Yayınla düğmesi. Bağlantı kesildi"</string>
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Yayınla düğmesi. Bağlanıyor"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"Yayınla düğmesi. Bağlandı"</string>
diff --git a/v7/palette/AndroidManifest.xml b/v7/palette/AndroidManifest.xml
index 491cc8e..61bddd2 100644
--- a/v7/palette/AndroidManifest.xml
+++ b/v7/palette/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.v7.palette">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.v7.palette.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/v7/palette/api/26.1.0.txt b/v7/palette/api/26.1.0.txt
new file mode 100644
index 0000000..2ff5fd3
--- /dev/null
+++ b/v7/palette/api/26.1.0.txt
@@ -0,0 +1,99 @@
+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 getColorForTarget(android.support.v7.graphics.Target, int);
+    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 getDominantColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getDominantSwatch();
+    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 android.support.v7.graphics.Palette.Swatch getSwatchForTarget(android.support.v7.graphics.Target);
+    method public java.util.List<android.support.v7.graphics.Palette.Swatch> getSwatches();
+    method public java.util.List<android.support.v7.graphics.Target> getTargets();
+    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 addTarget(android.support.v7.graphics.Target);
+    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.Builder clearTargets();
+    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 resizeBitmapArea(int);
+    method public deprecated 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();
+  }
+
+  public final class Target {
+    method public float getLightnessWeight();
+    method public float getMaximumLightness();
+    method public float getMaximumSaturation();
+    method public float getMinimumLightness();
+    method public float getMinimumSaturation();
+    method public float getPopulationWeight();
+    method public float getSaturationWeight();
+    method public float getTargetLightness();
+    method public float getTargetSaturation();
+    method public boolean isExclusive();
+    field public static final android.support.v7.graphics.Target DARK_MUTED;
+    field public static final android.support.v7.graphics.Target DARK_VIBRANT;
+    field public static final android.support.v7.graphics.Target LIGHT_MUTED;
+    field public static final android.support.v7.graphics.Target LIGHT_VIBRANT;
+    field public static final android.support.v7.graphics.Target MUTED;
+    field public static final android.support.v7.graphics.Target VIBRANT;
+  }
+
+  public static final class Target.Builder {
+    ctor public Target.Builder();
+    ctor public Target.Builder(android.support.v7.graphics.Target);
+    method public android.support.v7.graphics.Target build();
+    method public android.support.v7.graphics.Target.Builder setExclusive(boolean);
+    method public android.support.v7.graphics.Target.Builder setLightnessWeight(float);
+    method public android.support.v7.graphics.Target.Builder setMaximumLightness(float);
+    method public android.support.v7.graphics.Target.Builder setMaximumSaturation(float);
+    method public android.support.v7.graphics.Target.Builder setMinimumLightness(float);
+    method public android.support.v7.graphics.Target.Builder setMinimumSaturation(float);
+    method public android.support.v7.graphics.Target.Builder setPopulationWeight(float);
+    method public android.support.v7.graphics.Target.Builder setSaturationWeight(float);
+    method public android.support.v7.graphics.Target.Builder setTargetLightness(float);
+    method public android.support.v7.graphics.Target.Builder setTargetSaturation(float);
+  }
+
+}
+
diff --git a/v7/palette/api/27.0.0.txt b/v7/palette/api/27.0.0.txt
new file mode 100644
index 0000000..2ff5fd3
--- /dev/null
+++ b/v7/palette/api/27.0.0.txt
@@ -0,0 +1,99 @@
+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 getColorForTarget(android.support.v7.graphics.Target, int);
+    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 getDominantColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getDominantSwatch();
+    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 android.support.v7.graphics.Palette.Swatch getSwatchForTarget(android.support.v7.graphics.Target);
+    method public java.util.List<android.support.v7.graphics.Palette.Swatch> getSwatches();
+    method public java.util.List<android.support.v7.graphics.Target> getTargets();
+    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 addTarget(android.support.v7.graphics.Target);
+    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.Builder clearTargets();
+    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 resizeBitmapArea(int);
+    method public deprecated 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();
+  }
+
+  public final class Target {
+    method public float getLightnessWeight();
+    method public float getMaximumLightness();
+    method public float getMaximumSaturation();
+    method public float getMinimumLightness();
+    method public float getMinimumSaturation();
+    method public float getPopulationWeight();
+    method public float getSaturationWeight();
+    method public float getTargetLightness();
+    method public float getTargetSaturation();
+    method public boolean isExclusive();
+    field public static final android.support.v7.graphics.Target DARK_MUTED;
+    field public static final android.support.v7.graphics.Target DARK_VIBRANT;
+    field public static final android.support.v7.graphics.Target LIGHT_MUTED;
+    field public static final android.support.v7.graphics.Target LIGHT_VIBRANT;
+    field public static final android.support.v7.graphics.Target MUTED;
+    field public static final android.support.v7.graphics.Target VIBRANT;
+  }
+
+  public static final class Target.Builder {
+    ctor public Target.Builder();
+    ctor public Target.Builder(android.support.v7.graphics.Target);
+    method public android.support.v7.graphics.Target build();
+    method public android.support.v7.graphics.Target.Builder setExclusive(boolean);
+    method public android.support.v7.graphics.Target.Builder setLightnessWeight(float);
+    method public android.support.v7.graphics.Target.Builder setMaximumLightness(float);
+    method public android.support.v7.graphics.Target.Builder setMaximumSaturation(float);
+    method public android.support.v7.graphics.Target.Builder setMinimumLightness(float);
+    method public android.support.v7.graphics.Target.Builder setMinimumSaturation(float);
+    method public android.support.v7.graphics.Target.Builder setPopulationWeight(float);
+    method public android.support.v7.graphics.Target.Builder setSaturationWeight(float);
+    method public android.support.v7.graphics.Target.Builder setTargetLightness(float);
+    method public android.support.v7.graphics.Target.Builder setTargetSaturation(float);
+  }
+
+}
+
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 b7fb054..e716fb5 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
@@ -80,7 +80,7 @@
         /**
          * Called when the {@link Palette} has been generated.
          */
-        void onGenerated(Palette palette);
+        void onGenerated(@NonNull Palette palette);
     }
 
     static final int DEFAULT_RESIZE_BITMAP_AREA = 112 * 112;
@@ -95,7 +95,8 @@
     /**
      * Start generating a {@link Palette} with the returned {@link Builder} instance.
      */
-    public static Builder from(Bitmap bitmap) {
+    @NonNull
+    public static Builder from(@NonNull Bitmap bitmap) {
         return new Builder(bitmap);
     }
 
@@ -104,7 +105,8 @@
      * This is useful for testing, or if you want to resurrect a {@link Palette} instance from a
      * list of swatches. Will return null if the {@code swatches} is null.
      */
-    public static Palette from(List<Swatch> swatches) {
+    @NonNull
+    public static Palette from(@NonNull List<Swatch> swatches) {
         return new Builder(swatches).generate();
     }
 
@@ -484,6 +486,7 @@
          *     hsv[1] is Saturation [0...1]
          *     hsv[2] is Lightness [0...1]
          */
+        @NonNull
         public float[] getHsl() {
             if (mHsl == null) {
                 mHsl = new float[3];
@@ -610,7 +613,7 @@
         /**
          * Construct a new {@link Builder} using a source {@link Bitmap}
          */
-        public Builder(Bitmap bitmap) {
+        public Builder(@NonNull Bitmap bitmap) {
             if (bitmap == null || bitmap.isRecycled()) {
                 throw new IllegalArgumentException("Bitmap is not valid");
             }
@@ -631,7 +634,7 @@
          * Construct a new {@link Builder} using a list of {@link Swatch} instances.
          * Typically only used for testing.
          */
-        public Builder(List<Swatch> swatches) {
+        public Builder(@NonNull List<Swatch> swatches) {
             if (swatches == null || swatches.isEmpty()) {
                 throw new IllegalArgumentException("List of Swatches is not valid");
             }
@@ -850,7 +853,8 @@
          * generated.
          */
         @NonNull
-        public AsyncTask<Bitmap, Void, Palette> generate(final PaletteAsyncListener listener) {
+        public AsyncTask<Bitmap, Void, Palette> generate(
+                @NonNull final PaletteAsyncListener listener) {
             if (listener == null) {
                 throw new IllegalArgumentException("listener can not be null");
             }
@@ -943,7 +947,7 @@
          *
          * @see Builder#addFilter(Filter)
          */
-        boolean isAllowed(int rgb, float[] hsl);
+        boolean isAllowed(@ColorInt int rgb, @NonNull float[] hsl);
     }
 
     /**
diff --git a/v7/palette/src/main/java/android/support/v7/graphics/Target.java b/v7/palette/src/main/java/android/support/v7/graphics/Target.java
index 640970b..0eff90b 100644
--- a/v7/palette/src/main/java/android/support/v7/graphics/Target.java
+++ b/v7/palette/src/main/java/android/support/v7/graphics/Target.java
@@ -17,6 +17,7 @@
 package android.support.v7.graphics;
 
 import android.support.annotation.FloatRange;
+import android.support.annotation.NonNull;
 
 /**
  * A class which allows custom selection of colors in a {@link Palette}'s generation. Instances
@@ -122,7 +123,7 @@
         setDefaultWeights();
     }
 
-    Target(Target from) {
+    Target(@NonNull Target from) {
         System.arraycopy(from.mSaturationTargets, 0, mSaturationTargets, 0,
                 mSaturationTargets.length);
         System.arraycopy(from.mLightnessTargets, 0, mLightnessTargets, 0,
@@ -295,13 +296,14 @@
         /**
          * Create a new builder based on an existing {@link Target}.
          */
-        public Builder(Target target) {
+        public Builder(@NonNull Target target) {
             mTarget = new Target(target);
         }
 
         /**
          * Set the minimum saturation value for this target.
          */
+        @NonNull
         public Builder setMinimumSaturation(@FloatRange(from = 0, to = 1) float value) {
             mTarget.mSaturationTargets[INDEX_MIN] = value;
             return this;
@@ -310,6 +312,7 @@
         /**
          * Set the target/ideal saturation value for this target.
          */
+        @NonNull
         public Builder setTargetSaturation(@FloatRange(from = 0, to = 1) float value) {
             mTarget.mSaturationTargets[INDEX_TARGET] = value;
             return this;
@@ -318,6 +321,7 @@
         /**
          * Set the maximum saturation value for this target.
          */
+        @NonNull
         public Builder setMaximumSaturation(@FloatRange(from = 0, to = 1) float value) {
             mTarget.mSaturationTargets[INDEX_MAX] = value;
             return this;
@@ -326,6 +330,7 @@
         /**
          * Set the minimum lightness value for this target.
          */
+        @NonNull
         public Builder setMinimumLightness(@FloatRange(from = 0, to = 1) float value) {
             mTarget.mLightnessTargets[INDEX_MIN] = value;
             return this;
@@ -334,6 +339,7 @@
         /**
          * Set the target/ideal lightness value for this target.
          */
+        @NonNull
         public Builder setTargetLightness(@FloatRange(from = 0, to = 1) float value) {
             mTarget.mLightnessTargets[INDEX_TARGET] = value;
             return this;
@@ -342,6 +348,7 @@
         /**
          * Set the maximum lightness value for this target.
          */
+        @NonNull
         public Builder setMaximumLightness(@FloatRange(from = 0, to = 1) float value) {
             mTarget.mLightnessTargets[INDEX_MAX] = value;
             return this;
@@ -358,6 +365,7 @@
          *
          * @see #setTargetSaturation(float)
          */
+        @NonNull
         public Builder setSaturationWeight(@FloatRange(from = 0) float weight) {
             mTarget.mWeights[INDEX_WEIGHT_SAT] = weight;
             return this;
@@ -374,6 +382,7 @@
          *
          * @see #setTargetLightness(float)
          */
+        @NonNull
         public Builder setLightnessWeight(@FloatRange(from = 0) float weight) {
             mTarget.mWeights[INDEX_WEIGHT_LUMA] = weight;
             return this;
@@ -389,6 +398,7 @@
          * <p>A weight of 0 means that it has no weight, and thus has no
          * bearing on the selection.</p>
          */
+        @NonNull
         public Builder setPopulationWeight(@FloatRange(from = 0) float weight) {
             mTarget.mWeights[INDEX_WEIGHT_POP] = weight;
             return this;
@@ -401,6 +411,7 @@
          * @param exclusive true if any the color is exclusive to this target, or false is the
          *                  color can be selected for other targets.
          */
+        @NonNull
         public Builder setExclusive(boolean exclusive) {
             mTarget.mIsExclusive = exclusive;
             return this;
@@ -409,6 +420,7 @@
         /**
          * Builds and returns the resulting {@link Target}.
          */
+        @NonNull
         public Target build() {
             return mTarget;
         }
diff --git a/v7/preference/Android.mk b/v7/preference/Android.mk
index e751e1c..1e3e0b6 100644
--- a/v7/preference/Android.mk
+++ b/v7/preference/Android.mk
@@ -29,8 +29,7 @@
 LOCAL_MODULE := android-support-v7-preference
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_SRC_FILES := \
-    $(call all-java-files-under,constants) \
-    $(call all-java-files-under,src)
+    $(call all-java-files-under,src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-v7-appcompat \
diff --git a/v7/preference/AndroidManifest.xml b/v7/preference/AndroidManifest.xml
index c8df9a0..3195a03 100644
--- a/v7/preference/AndroidManifest.xml
+++ b/v7/preference/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="android.support.v7.preference">
     <uses-sdk android:minSdkVersion="14" />
-    <application>
-        <meta-data android:name="android.support.v7.preference.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/v7/preference/OWNERS b/v7/preference/OWNERS
new file mode 100644
index 0000000..ddaac03
--- /dev/null
+++ b/v7/preference/OWNERS
@@ -0,0 +1 @@
+pavlis@google.com
\ No newline at end of file
diff --git a/v7/preference/api/26.1.0.txt b/v7/preference/api/26.1.0.txt
new file mode 100644
index 0000000..04c7329
--- /dev/null
+++ b/v7/preference/api/26.1.0.txt
@@ -0,0 +1,412 @@
+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 DropDownPreference extends android.support.v7.preference.ListPreference {
+    ctor public DropDownPreference(android.content.Context);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet, int, int);
+    method protected android.widget.ArrayAdapter createAdapter();
+  }
+
+  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 MultiSelectListPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
+    ctor public MultiSelectListPreferenceDialogFragmentCompat();
+    method public static android.support.v7.preference.MultiSelectListPreferenceDialogFragmentCompat newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class Preference implements java.lang.Comparable {
+    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 public android.support.v7.preference.PreferenceGroup getParent();
+    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 java.util.Set<java.lang.String> getPersistedStringSet(java.util.Set<java.lang.String>);
+    method public android.support.v7.preference.PreferenceDataStore getPreferenceDataStore();
+    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 isIconSpaceReserved();
+    method public boolean isPersistent();
+    method public boolean isSelectable();
+    method public boolean isSingleLineTitle();
+    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 public void onDetached();
+    method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int);
+    method public void onInitializeAccessibilityNodeInfo(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    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 boolean persistStringSet(java.util.Set<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 setIconSpaceReserved(boolean);
+    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 setPreferenceDataStore(android.support.v7.preference.PreferenceDataStore);
+    method public void setSelectable(boolean);
+    method public void setShouldDisableView(boolean);
+    method public void setSingleLineTitle(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 void setViewId(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 PreferenceDataStore {
+    ctor public PreferenceDataStore();
+    method public boolean getBoolean(java.lang.String, boolean);
+    method public float getFloat(java.lang.String, float);
+    method public int getInt(java.lang.String, int);
+    method public long getLong(java.lang.String, long);
+    method public java.lang.String getString(java.lang.String, java.lang.String);
+    method public java.util.Set<java.lang.String> getStringSet(java.lang.String, java.util.Set<java.lang.String>);
+    method public void putBoolean(java.lang.String, boolean);
+    method public void putFloat(java.lang.String, float);
+    method public void putInt(java.lang.String, int);
+    method public void putLong(java.lang.String, long);
+    method public void putString(java.lang.String, java.lang.String);
+    method public void putStringSet(java.lang.String, java.util.Set<java.lang.String>);
+  }
+
+  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 scrollToPreference(java.lang.String);
+    method public void scrollToPreference(android.support.v7.preference.Preference);
+    method public void setDivider(android.graphics.drawable.Drawable);
+    method public void setDividerHeight(int);
+    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 static abstract interface PreferenceGroup.PreferencePositionCallback {
+    method public abstract int getPreferenceAdapterPosition(java.lang.String);
+    method public abstract int getPreferenceAdapterPosition(android.support.v7.preference.Preference);
+  }
+
+  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.PreferenceManager.PreferenceComparisonCallback getPreferenceComparisonCallback();
+    method public android.support.v7.preference.PreferenceDataStore getPreferenceDataStore();
+    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 boolean isStorageDefault();
+    method public boolean isStorageDeviceProtected();
+    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 void setPreferenceComparisonCallback(android.support.v7.preference.PreferenceManager.PreferenceComparisonCallback);
+    method public void setPreferenceDataStore(android.support.v7.preference.PreferenceDataStore);
+    method public boolean setPreferences(android.support.v7.preference.PreferenceScreen);
+    method public void setSharedPreferencesMode(int);
+    method public void setSharedPreferencesName(java.lang.String);
+    method public void setStorageDefault();
+    method public void setStorageDeviceProtected();
+    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 static abstract class PreferenceManager.PreferenceComparisonCallback {
+    ctor public PreferenceManager.PreferenceComparisonCallback();
+    method public abstract boolean arePreferenceContentsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
+    method public abstract boolean arePreferenceItemsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
+  }
+
+  public static class PreferenceManager.SimplePreferenceComparisonCallback extends android.support.v7.preference.PreferenceManager.PreferenceComparisonCallback {
+    ctor public PreferenceManager.SimplePreferenceComparisonCallback();
+    method public boolean arePreferenceContentsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
+    method public boolean arePreferenceItemsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
+  }
+
+  public final class PreferenceScreen extends android.support.v7.preference.PreferenceGroup {
+    method public void setShouldUseGeneratedIds(boolean);
+    method public boolean shouldUseGeneratedIds();
+  }
+
+  public class PreferenceViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder {
+    method public android.view.View findViewById(int);
+    method public boolean isDividerAllowedAbove();
+    method public boolean isDividerAllowedBelow();
+    method public void setDividerAllowedAbove(boolean);
+    method public void setDividerAllowedBelow(boolean);
+  }
+
+  public class SeekBarPreference extends android.support.v7.preference.Preference {
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet);
+    ctor public SeekBarPreference(android.content.Context);
+    method public int getMax();
+    method public int getMin();
+    method public final int getSeekBarIncrement();
+    method public int getValue();
+    method public boolean isAdjustable();
+    method public void setAdjustable(boolean);
+    method public final void setMax(int);
+    method public void setMin(int);
+    method public final void setSeekBarIncrement(int);
+    method public void setValue(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/api/27.0.0.txt b/v7/preference/api/27.0.0.txt
new file mode 100644
index 0000000..04c7329
--- /dev/null
+++ b/v7/preference/api/27.0.0.txt
@@ -0,0 +1,412 @@
+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 DropDownPreference extends android.support.v7.preference.ListPreference {
+    ctor public DropDownPreference(android.content.Context);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet, int, int);
+    method protected android.widget.ArrayAdapter createAdapter();
+  }
+
+  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 MultiSelectListPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
+    ctor public MultiSelectListPreferenceDialogFragmentCompat();
+    method public static android.support.v7.preference.MultiSelectListPreferenceDialogFragmentCompat newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class Preference implements java.lang.Comparable {
+    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 public android.support.v7.preference.PreferenceGroup getParent();
+    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 java.util.Set<java.lang.String> getPersistedStringSet(java.util.Set<java.lang.String>);
+    method public android.support.v7.preference.PreferenceDataStore getPreferenceDataStore();
+    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 isIconSpaceReserved();
+    method public boolean isPersistent();
+    method public boolean isSelectable();
+    method public boolean isSingleLineTitle();
+    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 public void onDetached();
+    method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int);
+    method public void onInitializeAccessibilityNodeInfo(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    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 boolean persistStringSet(java.util.Set<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 setIconSpaceReserved(boolean);
+    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 setPreferenceDataStore(android.support.v7.preference.PreferenceDataStore);
+    method public void setSelectable(boolean);
+    method public void setShouldDisableView(boolean);
+    method public void setSingleLineTitle(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 void setViewId(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 PreferenceDataStore {
+    ctor public PreferenceDataStore();
+    method public boolean getBoolean(java.lang.String, boolean);
+    method public float getFloat(java.lang.String, float);
+    method public int getInt(java.lang.String, int);
+    method public long getLong(java.lang.String, long);
+    method public java.lang.String getString(java.lang.String, java.lang.String);
+    method public java.util.Set<java.lang.String> getStringSet(java.lang.String, java.util.Set<java.lang.String>);
+    method public void putBoolean(java.lang.String, boolean);
+    method public void putFloat(java.lang.String, float);
+    method public void putInt(java.lang.String, int);
+    method public void putLong(java.lang.String, long);
+    method public void putString(java.lang.String, java.lang.String);
+    method public void putStringSet(java.lang.String, java.util.Set<java.lang.String>);
+  }
+
+  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 scrollToPreference(java.lang.String);
+    method public void scrollToPreference(android.support.v7.preference.Preference);
+    method public void setDivider(android.graphics.drawable.Drawable);
+    method public void setDividerHeight(int);
+    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 static abstract interface PreferenceGroup.PreferencePositionCallback {
+    method public abstract int getPreferenceAdapterPosition(java.lang.String);
+    method public abstract int getPreferenceAdapterPosition(android.support.v7.preference.Preference);
+  }
+
+  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.PreferenceManager.PreferenceComparisonCallback getPreferenceComparisonCallback();
+    method public android.support.v7.preference.PreferenceDataStore getPreferenceDataStore();
+    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 boolean isStorageDefault();
+    method public boolean isStorageDeviceProtected();
+    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 void setPreferenceComparisonCallback(android.support.v7.preference.PreferenceManager.PreferenceComparisonCallback);
+    method public void setPreferenceDataStore(android.support.v7.preference.PreferenceDataStore);
+    method public boolean setPreferences(android.support.v7.preference.PreferenceScreen);
+    method public void setSharedPreferencesMode(int);
+    method public void setSharedPreferencesName(java.lang.String);
+    method public void setStorageDefault();
+    method public void setStorageDeviceProtected();
+    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 static abstract class PreferenceManager.PreferenceComparisonCallback {
+    ctor public PreferenceManager.PreferenceComparisonCallback();
+    method public abstract boolean arePreferenceContentsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
+    method public abstract boolean arePreferenceItemsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
+  }
+
+  public static class PreferenceManager.SimplePreferenceComparisonCallback extends android.support.v7.preference.PreferenceManager.PreferenceComparisonCallback {
+    ctor public PreferenceManager.SimplePreferenceComparisonCallback();
+    method public boolean arePreferenceContentsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
+    method public boolean arePreferenceItemsTheSame(android.support.v7.preference.Preference, android.support.v7.preference.Preference);
+  }
+
+  public final class PreferenceScreen extends android.support.v7.preference.PreferenceGroup {
+    method public void setShouldUseGeneratedIds(boolean);
+    method public boolean shouldUseGeneratedIds();
+  }
+
+  public class PreferenceViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder {
+    method public android.view.View findViewById(int);
+    method public boolean isDividerAllowedAbove();
+    method public boolean isDividerAllowedBelow();
+    method public void setDividerAllowedAbove(boolean);
+    method public void setDividerAllowedBelow(boolean);
+  }
+
+  public class SeekBarPreference extends android.support.v7.preference.Preference {
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet);
+    ctor public SeekBarPreference(android.content.Context);
+    method public int getMax();
+    method public int getMin();
+    method public final int getSeekBarIncrement();
+    method public int getValue();
+    method public boolean isAdjustable();
+    method public void setAdjustable(boolean);
+    method public final void setMax(int);
+    method public void setMin(int);
+    method public final void setSeekBarIncrement(int);
+    method public void setValue(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 16498b3..2b1e871 100644
--- a/v7/preference/build.gradle
+++ b/v7/preference/build.gradle
@@ -33,14 +33,10 @@
     }
 
     sourceSets {
-        main.java.srcDir 'src'
-        main.java.srcDir 'constants'
         main.res.srcDirs = [
                 'res',
                 'res-public'
         ]
-        main.assets.srcDir 'assets'
-        main.resources.srcDir 'src'
     }
 
     lintOptions {
diff --git a/v7/preference/src/android/support/v7/internal/package-info.java b/v7/preference/src/main/java/android/support/v7/internal/package-info.java
similarity index 100%
rename from v7/preference/src/android/support/v7/internal/package-info.java
rename to v7/preference/src/main/java/android/support/v7/internal/package-info.java
diff --git a/v7/preference/src/android/support/v7/internal/widget/PreferenceImageView.java b/v7/preference/src/main/java/android/support/v7/internal/widget/PreferenceImageView.java
similarity index 100%
rename from v7/preference/src/android/support/v7/internal/widget/PreferenceImageView.java
rename to v7/preference/src/main/java/android/support/v7/internal/widget/PreferenceImageView.java
diff --git a/v7/preference/constants/android/support/v7/preference/AndroidResources.java b/v7/preference/src/main/java/android/support/v7/preference/AndroidResources.java
similarity index 100%
rename from v7/preference/constants/android/support/v7/preference/AndroidResources.java
rename to v7/preference/src/main/java/android/support/v7/preference/AndroidResources.java
diff --git a/v7/preference/src/android/support/v7/preference/CheckBoxPreference.java b/v7/preference/src/main/java/android/support/v7/preference/CheckBoxPreference.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/CheckBoxPreference.java
rename to v7/preference/src/main/java/android/support/v7/preference/CheckBoxPreference.java
diff --git a/v7/preference/src/android/support/v7/preference/DialogPreference.java b/v7/preference/src/main/java/android/support/v7/preference/DialogPreference.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/DialogPreference.java
rename to v7/preference/src/main/java/android/support/v7/preference/DialogPreference.java
diff --git a/v7/preference/src/android/support/v7/preference/DropDownPreference.java b/v7/preference/src/main/java/android/support/v7/preference/DropDownPreference.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/DropDownPreference.java
rename to v7/preference/src/main/java/android/support/v7/preference/DropDownPreference.java
diff --git a/v7/preference/src/android/support/v7/preference/EditTextPreference.java b/v7/preference/src/main/java/android/support/v7/preference/EditTextPreference.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/EditTextPreference.java
rename to v7/preference/src/main/java/android/support/v7/preference/EditTextPreference.java
diff --git a/v7/preference/src/android/support/v7/preference/EditTextPreferenceDialogFragmentCompat.java b/v7/preference/src/main/java/android/support/v7/preference/EditTextPreferenceDialogFragmentCompat.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/EditTextPreferenceDialogFragmentCompat.java
rename to v7/preference/src/main/java/android/support/v7/preference/EditTextPreferenceDialogFragmentCompat.java
diff --git a/v7/preference/src/android/support/v7/preference/ListPreference.java b/v7/preference/src/main/java/android/support/v7/preference/ListPreference.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/ListPreference.java
rename to v7/preference/src/main/java/android/support/v7/preference/ListPreference.java
diff --git a/v7/preference/src/android/support/v7/preference/ListPreferenceDialogFragmentCompat.java b/v7/preference/src/main/java/android/support/v7/preference/ListPreferenceDialogFragmentCompat.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/ListPreferenceDialogFragmentCompat.java
rename to v7/preference/src/main/java/android/support/v7/preference/ListPreferenceDialogFragmentCompat.java
diff --git a/v7/preference/src/android/support/v7/preference/MultiSelectListPreferenceDialogFragmentCompat.java b/v7/preference/src/main/java/android/support/v7/preference/MultiSelectListPreferenceDialogFragmentCompat.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/MultiSelectListPreferenceDialogFragmentCompat.java
rename to v7/preference/src/main/java/android/support/v7/preference/MultiSelectListPreferenceDialogFragmentCompat.java
diff --git a/v7/preference/src/android/support/v7/preference/Preference.java b/v7/preference/src/main/java/android/support/v7/preference/Preference.java
similarity index 99%
rename from v7/preference/src/android/support/v7/preference/Preference.java
rename to v7/preference/src/main/java/android/support/v7/preference/Preference.java
index cfc4311..fa8461d 100644
--- a/v7/preference/src/android/support/v7/preference/Preference.java
+++ b/v7/preference/src/main/java/android/support/v7/preference/Preference.java
@@ -31,7 +31,6 @@
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 import android.support.v4.content.ContextCompat;
-import android.support.v4.content.SharedPreferencesCompat;
 import android.support.v4.content.res.TypedArrayUtils;
 import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
 import android.text.TextUtils;
@@ -1543,7 +1542,7 @@
 
     private void tryCommit(@NonNull SharedPreferences.Editor editor) {
         if (mPreferenceManager.shouldCommit()) {
-            SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
+            editor.apply();
         }
     }
 
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceCategory.java b/v7/preference/src/main/java/android/support/v7/preference/PreferenceCategory.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/PreferenceCategory.java
rename to v7/preference/src/main/java/android/support/v7/preference/PreferenceCategory.java
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceDataStore.java b/v7/preference/src/main/java/android/support/v7/preference/PreferenceDataStore.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/PreferenceDataStore.java
rename to v7/preference/src/main/java/android/support/v7/preference/PreferenceDataStore.java
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceDialogFragmentCompat.java b/v7/preference/src/main/java/android/support/v7/preference/PreferenceDialogFragmentCompat.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/PreferenceDialogFragmentCompat.java
rename to v7/preference/src/main/java/android/support/v7/preference/PreferenceDialogFragmentCompat.java
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java b/v7/preference/src/main/java/android/support/v7/preference/PreferenceFragmentCompat.java
similarity index 98%
rename from v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java
rename to v7/preference/src/main/java/android/support/v7/preference/PreferenceFragmentCompat.java
index 4fb9ff8..6094217 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java
+++ b/v7/preference/src/main/java/android/support/v7/preference/PreferenceFragmentCompat.java
@@ -92,13 +92,13 @@
  * <p>The following sample code shows a simple preference fragment that is
  * populated from a resource.  The resource it loads is:</p>
  *
- * {@sample frameworks/support/samples/SupportPreferenceDemos/res/xml/preferences.xml preferences}
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/res/xml/preferences.xml preferences}
  *
  * <p>The fragment implementation itself simply populates the preferences
  * when created.  Note that the preferences framework takes care of loading
  * the current values out of the app preferences and writing them when changed:</p>
  *
- * {@sample frameworks/support/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesCompat.java
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/main/java/com/example/android/supportpreference/FragmentSupportPreferencesCompat.java
  *      support_fragment_compat}
  *
  * @see Preference
@@ -321,7 +321,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
         if (mHavePrefs) {
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceGroup.java b/v7/preference/src/main/java/android/support/v7/preference/PreferenceGroup.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/PreferenceGroup.java
rename to v7/preference/src/main/java/android/support/v7/preference/PreferenceGroup.java
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceGroupAdapter.java b/v7/preference/src/main/java/android/support/v7/preference/PreferenceGroupAdapter.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/PreferenceGroupAdapter.java
rename to v7/preference/src/main/java/android/support/v7/preference/PreferenceGroupAdapter.java
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceInflater.java b/v7/preference/src/main/java/android/support/v7/preference/PreferenceInflater.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/PreferenceInflater.java
rename to v7/preference/src/main/java/android/support/v7/preference/PreferenceInflater.java
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceManager.java b/v7/preference/src/main/java/android/support/v7/preference/PreferenceManager.java
similarity index 98%
rename from v7/preference/src/android/support/v7/preference/PreferenceManager.java
rename to v7/preference/src/main/java/android/support/v7/preference/PreferenceManager.java
index 83af86c..19b6908 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceManager.java
+++ b/v7/preference/src/main/java/android/support/v7/preference/PreferenceManager.java
@@ -25,7 +25,6 @@
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 import android.support.v4.content.ContextCompat;
-import android.support.v4.content.SharedPreferencesCompat;
 import android.text.TextUtils;
 
 /**
@@ -464,10 +463,9 @@
             pm.setSharedPreferencesMode(sharedPreferencesMode);
             pm.inflateFromResource(context, resId, null);
 
-            SharedPreferences.Editor editor =
-                    defaultValueSp.edit().putBoolean(KEY_HAS_SET_DEFAULT_VALUES, true);
-
-            SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
+            defaultValueSp.edit()
+                    .putBoolean(KEY_HAS_SET_DEFAULT_VALUES, true)
+                    .apply();
         }
     }
 
@@ -511,7 +509,7 @@
 
     private void setNoCommit(boolean noCommit) {
         if (!noCommit && mEditor != null) {
-            SharedPreferencesCompat.EditorCompat.getInstance().apply(mEditor);
+            mEditor.apply();
         }
         mNoCommit = noCommit;
     }
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceRecyclerViewAccessibilityDelegate.java b/v7/preference/src/main/java/android/support/v7/preference/PreferenceRecyclerViewAccessibilityDelegate.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/PreferenceRecyclerViewAccessibilityDelegate.java
rename to v7/preference/src/main/java/android/support/v7/preference/PreferenceRecyclerViewAccessibilityDelegate.java
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceScreen.java b/v7/preference/src/main/java/android/support/v7/preference/PreferenceScreen.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/PreferenceScreen.java
rename to v7/preference/src/main/java/android/support/v7/preference/PreferenceScreen.java
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceViewHolder.java b/v7/preference/src/main/java/android/support/v7/preference/PreferenceViewHolder.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/PreferenceViewHolder.java
rename to v7/preference/src/main/java/android/support/v7/preference/PreferenceViewHolder.java
diff --git a/v7/preference/src/android/support/v7/preference/SeekBarPreference.java b/v7/preference/src/main/java/android/support/v7/preference/SeekBarPreference.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/SeekBarPreference.java
rename to v7/preference/src/main/java/android/support/v7/preference/SeekBarPreference.java
diff --git a/v7/preference/src/android/support/v7/preference/SwitchPreferenceCompat.java b/v7/preference/src/main/java/android/support/v7/preference/SwitchPreferenceCompat.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/SwitchPreferenceCompat.java
rename to v7/preference/src/main/java/android/support/v7/preference/SwitchPreferenceCompat.java
diff --git a/v7/preference/src/android/support/v7/preference/TwoStatePreference.java b/v7/preference/src/main/java/android/support/v7/preference/TwoStatePreference.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/TwoStatePreference.java
rename to v7/preference/src/main/java/android/support/v7/preference/TwoStatePreference.java
diff --git a/v7/preference/src/android/support/v7/preference/UnPressableLinearLayout.java b/v7/preference/src/main/java/android/support/v7/preference/UnPressableLinearLayout.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/UnPressableLinearLayout.java
rename to v7/preference/src/main/java/android/support/v7/preference/UnPressableLinearLayout.java
diff --git a/v7/preference/src/android/support/v7/preference/internal/AbstractMultiSelectListPreference.java b/v7/preference/src/main/java/android/support/v7/preference/internal/AbstractMultiSelectListPreference.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/internal/AbstractMultiSelectListPreference.java
rename to v7/preference/src/main/java/android/support/v7/preference/internal/AbstractMultiSelectListPreference.java
diff --git a/v7/preference/src/android/support/v7/preference/internal/package-info.java b/v7/preference/src/main/java/android/support/v7/preference/internal/package-info.java
similarity index 100%
rename from v7/preference/src/android/support/v7/preference/internal/package-info.java
rename to v7/preference/src/main/java/android/support/v7/preference/internal/package-info.java
diff --git a/v7/recyclerview/Android.mk b/v7/recyclerview/Android.mk
index e434ab2..dcebe88 100644
--- a/v7/recyclerview/Android.mk
+++ b/v7/recyclerview/Android.mk
@@ -27,7 +27,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-v7-recyclerview
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under,src)
+LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-compat \
diff --git a/v7/recyclerview/AndroidManifest.xml b/v7/recyclerview/AndroidManifest.xml
index 04d095c..f83681e 100644
--- a/v7/recyclerview/AndroidManifest.xml
+++ b/v7/recyclerview/AndroidManifest.xml
@@ -16,8 +16,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.v7.recyclerview">
     <uses-sdk android:minSdkVersion="14"/>
-    <application>
-        <meta-data android:name="android.support.v7.recyclerview.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/v7/recyclerview/OWNERS b/v7/recyclerview/OWNERS
new file mode 100644
index 0000000..6fc3ba6
--- /dev/null
+++ b/v7/recyclerview/OWNERS
@@ -0,0 +1,2 @@
+shepshapard@google.com
+yboyar@google.com
\ No newline at end of file
diff --git a/v7/recyclerview/api/26.1.0.txt b/v7/recyclerview/api/26.1.0.txt
new file mode 100644
index 0000000..4e7e14d
--- /dev/null
+++ b/v7/recyclerview/api/26.1.0.txt
@@ -0,0 +1,960 @@
+package android.support.v7.util {
+
+  public class AsyncListUtil<T> {
+    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<T> {
+    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 BatchingListUpdateCallback implements android.support.v7.util.ListUpdateCallback {
+    ctor public BatchingListUpdateCallback(android.support.v7.util.ListUpdateCallback);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int, java.lang.Object);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public class DiffUtil {
+    method public static android.support.v7.util.DiffUtil.DiffResult calculateDiff(android.support.v7.util.DiffUtil.Callback);
+    method public static android.support.v7.util.DiffUtil.DiffResult calculateDiff(android.support.v7.util.DiffUtil.Callback, boolean);
+  }
+
+  public static abstract class DiffUtil.Callback {
+    ctor public DiffUtil.Callback();
+    method public abstract boolean areContentsTheSame(int, int);
+    method public abstract boolean areItemsTheSame(int, int);
+    method public java.lang.Object getChangePayload(int, int);
+    method public abstract int getNewListSize();
+    method public abstract int getOldListSize();
+  }
+
+  public static class DiffUtil.DiffResult {
+    method public void dispatchUpdatesTo(android.support.v7.widget.RecyclerView.Adapter);
+    method public void dispatchUpdatesTo(android.support.v7.util.ListUpdateCallback);
+  }
+
+  public abstract interface ListUpdateCallback {
+    method public abstract void onChanged(int, int, java.lang.Object);
+    method public abstract void onInserted(int, int);
+    method public abstract void onMoved(int, int);
+    method public abstract void onRemoved(int, int);
+  }
+
+  public class SortedList<T> {
+    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<T2> 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<T2> implements java.util.Comparator android.support.v7.util.ListUpdateCallback {
+    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 void onChanged(int, int, java.lang.Object);
+  }
+
+}
+
+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 DividerItemDecoration extends android.support.v7.widget.RecyclerView.ItemDecoration {
+    ctor public DividerItemDecoration(android.content.Context, int);
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setOrientation(int);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  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 android.support.v7.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    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 getInitialPrefetchItemCount();
+    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 scrollToPositionWithOffset(int, int);
+    method public void setInitialPrefetchItemCount(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 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 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 class LinearSnapHelper extends android.support.v7.widget.SnapHelper {
+    ctor public LinearSnapHelper();
+    method public int[] calculateDistanceToFinalSnap(android.support.v7.widget.RecyclerView.LayoutManager, android.view.View);
+    method public android.view.View findSnapView(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public int findTargetSnapPosition(android.support.v7.widget.RecyclerView.LayoutManager, int, int);
+  }
+
+  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 getMode();
+    method public abstract int getModeInOther();
+    method public abstract int getStartAfterPadding();
+    method public abstract int getTotalSpace();
+    method public int getTotalSpaceChange();
+    method public abstract int getTransformedEndWithDecoration(android.view.View);
+    method public abstract int getTransformedStartWithDecoration(android.view.View);
+    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 PagerSnapHelper extends android.support.v7.widget.SnapHelper {
+    ctor public PagerSnapHelper();
+    method public int[] calculateDistanceToFinalSnap(android.support.v7.widget.RecyclerView.LayoutManager, android.view.View);
+    method protected android.support.v7.widget.LinearSmoothScroller createSnapScroller(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public android.view.View findSnapView(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public int findTargetSnapPosition(android.support.v7.widget.RecyclerView.LayoutManager, int, int);
+  }
+
+  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 dispatchNestedPreScroll(int, int, int[], int[], int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
+    method public boolean drawChild(android.graphics.Canvas, android.view.View, long);
+    method public android.view.View findChildViewUnder(float, float);
+    method public android.view.View findContainingItemView(android.view.View);
+    method public android.support.v7.widget.RecyclerView.ViewHolder findContainingViewHolder(android.view.View);
+    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 void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
+    method public android.support.v7.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
+    method public int getMaxFlingVelocity();
+    method public int getMinFlingVelocity();
+    method public android.support.v7.widget.RecyclerView.OnFlingListener getOnFlingListener();
+    method public boolean getPreserveFocusAfterLayout();
+    method public android.support.v7.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
+    method public int getScrollState();
+    method public boolean hasFixedSize();
+    method public boolean hasNestedScrollingParent(int);
+    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 void setOnFlingListener(android.support.v7.widget.RecyclerView.OnFlingListener);
+    method public deprecated void setOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
+    method public void setPreserveFocusAfterLayout(boolean);
+    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 smoothScrollBy(int, int, android.view.animation.Interpolator);
+    method public void smoothScrollToPosition(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(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<VH extends android.support.v7.widget.RecyclerView.ViewHolder> {
+    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 boolean canReuseUpdatedViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, java.util.List<java.lang.Object>);
+    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 static int chooseSize(int, int, int);
+    method public void collectAdjacentPrefetchPositions(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
+    method public void collectInitialPrefetchPositions(int, android.support.v7.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
+    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 findContainingItemView(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 deprecated int getChildMeasureSpec(int, int, int, boolean);
+    method public static int getChildMeasureSpec(int, 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 void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    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 getHeightMode();
+    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 void getTransformedBoundingBox(android.view.View, boolean, android.graphics.Rect);
+    method public int getWidth();
+    method public int getWidthMode();
+    method public boolean hasFocus();
+    method public void ignoreView(android.view.View);
+    method public boolean isAttachedToWindow();
+    method public boolean isAutoMeasureEnabled();
+    method public boolean isFocused();
+    method public final boolean isItemPrefetchEnabled();
+    method public boolean isLayoutHierarchical(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public boolean isMeasurementCacheEnabled();
+    method public boolean isSmoothScrolling();
+    method public boolean isViewPartiallyVisible(android.view.View, boolean, boolean);
+    method public void layoutDecorated(android.view.View, int, int, int, int);
+    method public void layoutDecoratedWithMargins(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 onLayoutCompleted(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 boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, 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 setAutoMeasureEnabled(boolean);
+    method public final void setItemPrefetchEnabled(boolean);
+    method public void setMeasuredDimension(android.graphics.Rect, int, int);
+    method public void setMeasuredDimension(int, int);
+    method public void setMeasurementCacheEnabled(boolean);
+    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 abstract interface RecyclerView.LayoutManager.LayoutPrefetchRegistry {
+    method public abstract void addPosition(int, int);
+  }
+
+  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 class RecyclerView.OnFlingListener {
+    ctor public RecyclerView.OnFlingListener();
+    method public abstract boolean onFling(int, int);
+  }
+
+  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 int getRecycledViewCount(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 abstract interface RecyclerView.SmoothScroller.ScrollVectorProvider {
+    method public abstract android.graphics.PointF computeScrollVectorForPosition(int);
+  }
+
+  public static class RecyclerView.State {
+    ctor public RecyclerView.State();
+    method public boolean didStructureChange();
+    method public <T> T get(int);
+    method public int getItemCount();
+    method public int getRemainingScrollHorizontal();
+    method public int getRemainingScrollVertical();
+    method public int getTargetScrollPosition();
+    method public boolean hasTargetScrollPosition();
+    method public boolean isMeasuring();
+    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);
+    method public android.support.v4.view.AccessibilityDelegateCompat getItemDelegate();
+  }
+
+  public static class RecyclerViewAccessibilityDelegate.ItemDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate.ItemDelegate(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
+  }
+
+  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 abstract class SnapHelper extends android.support.v7.widget.RecyclerView.OnFlingListener {
+    ctor public SnapHelper();
+    method public void attachToRecyclerView(android.support.v7.widget.RecyclerView) throws java.lang.IllegalStateException;
+    method public abstract int[] calculateDistanceToFinalSnap(android.support.v7.widget.RecyclerView.LayoutManager, android.view.View);
+    method public int[] calculateScrollDistance(int, int);
+    method protected android.support.v7.widget.RecyclerView.SmoothScroller createScroller(android.support.v7.widget.RecyclerView.LayoutManager);
+    method protected deprecated android.support.v7.widget.LinearSmoothScroller createSnapScroller(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public abstract android.view.View findSnapView(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public abstract int findTargetSnapPosition(android.support.v7.widget.RecyclerView.LayoutManager, int, int);
+    method public boolean onFling(int, int);
+  }
+
+  public class StaggeredGridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager implements android.support.v7.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    ctor public StaggeredGridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public StaggeredGridLayoutManager(int, int);
+    method public android.graphics.PointF computeScrollVectorForPosition(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 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 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();
+    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<T2> 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/27.0.0.txt b/v7/recyclerview/api/27.0.0.txt
new file mode 100644
index 0000000..9b4500a
--- /dev/null
+++ b/v7/recyclerview/api/27.0.0.txt
@@ -0,0 +1,962 @@
+package android.support.v7.util {
+
+  public class AsyncListUtil<T> {
+    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<T> {
+    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 BatchingListUpdateCallback implements android.support.v7.util.ListUpdateCallback {
+    ctor public BatchingListUpdateCallback(android.support.v7.util.ListUpdateCallback);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int, java.lang.Object);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public class DiffUtil {
+    method public static android.support.v7.util.DiffUtil.DiffResult calculateDiff(android.support.v7.util.DiffUtil.Callback);
+    method public static android.support.v7.util.DiffUtil.DiffResult calculateDiff(android.support.v7.util.DiffUtil.Callback, boolean);
+  }
+
+  public static abstract class DiffUtil.Callback {
+    ctor public DiffUtil.Callback();
+    method public abstract boolean areContentsTheSame(int, int);
+    method public abstract boolean areItemsTheSame(int, int);
+    method public java.lang.Object getChangePayload(int, int);
+    method public abstract int getNewListSize();
+    method public abstract int getOldListSize();
+  }
+
+  public static class DiffUtil.DiffResult {
+    method public void dispatchUpdatesTo(android.support.v7.widget.RecyclerView.Adapter);
+    method public void dispatchUpdatesTo(android.support.v7.util.ListUpdateCallback);
+  }
+
+  public abstract interface ListUpdateCallback {
+    method public abstract void onChanged(int, int, java.lang.Object);
+    method public abstract void onInserted(int, int);
+    method public abstract void onMoved(int, int);
+    method public abstract void onRemoved(int, int);
+  }
+
+  public class SortedList<T> {
+    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<T2> 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<T2> implements java.util.Comparator android.support.v7.util.ListUpdateCallback {
+    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 void onChanged(int, int, java.lang.Object);
+  }
+
+}
+
+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 DividerItemDecoration extends android.support.v7.widget.RecyclerView.ItemDecoration {
+    ctor public DividerItemDecoration(android.content.Context, int);
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setOrientation(int);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  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 android.support.v7.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    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 getInitialPrefetchItemCount();
+    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 scrollToPositionWithOffset(int, int);
+    method public void setInitialPrefetchItemCount(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 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 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 class LinearSnapHelper extends android.support.v7.widget.SnapHelper {
+    ctor public LinearSnapHelper();
+    method public int[] calculateDistanceToFinalSnap(android.support.v7.widget.RecyclerView.LayoutManager, android.view.View);
+    method public android.view.View findSnapView(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public int findTargetSnapPosition(android.support.v7.widget.RecyclerView.LayoutManager, int, int);
+  }
+
+  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 getMode();
+    method public abstract int getModeInOther();
+    method public abstract int getStartAfterPadding();
+    method public abstract int getTotalSpace();
+    method public int getTotalSpaceChange();
+    method public abstract int getTransformedEndWithDecoration(android.view.View);
+    method public abstract int getTransformedStartWithDecoration(android.view.View);
+    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 PagerSnapHelper extends android.support.v7.widget.SnapHelper {
+    ctor public PagerSnapHelper();
+    method public int[] calculateDistanceToFinalSnap(android.support.v7.widget.RecyclerView.LayoutManager, android.view.View);
+    method protected android.support.v7.widget.LinearSmoothScroller createSnapScroller(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public android.view.View findSnapView(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public int findTargetSnapPosition(android.support.v7.widget.RecyclerView.LayoutManager, int, int);
+  }
+
+  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 dispatchNestedPreScroll(int, int, int[], int[], int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[], int);
+    method public boolean drawChild(android.graphics.Canvas, android.view.View, long);
+    method public android.view.View findChildViewUnder(float, float);
+    method public android.view.View findContainingItemView(android.view.View);
+    method public android.support.v7.widget.RecyclerView.ViewHolder findContainingViewHolder(android.view.View);
+    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 void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
+    method public android.support.v7.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+    method public int getItemDecorationCount();
+    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
+    method public int getMaxFlingVelocity();
+    method public int getMinFlingVelocity();
+    method public android.support.v7.widget.RecyclerView.OnFlingListener getOnFlingListener();
+    method public boolean getPreserveFocusAfterLayout();
+    method public android.support.v7.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
+    method public int getScrollState();
+    method public boolean hasFixedSize();
+    method public boolean hasNestedScrollingParent(int);
+    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 removeItemDecorationAt(int);
+    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 void setOnFlingListener(android.support.v7.widget.RecyclerView.OnFlingListener);
+    method public deprecated void setOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
+    method public void setPreserveFocusAfterLayout(boolean);
+    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 smoothScrollBy(int, int, android.view.animation.Interpolator);
+    method public void smoothScrollToPosition(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(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<VH extends android.support.v7.widget.RecyclerView.ViewHolder> {
+    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 boolean canReuseUpdatedViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, java.util.List<java.lang.Object>);
+    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 static int chooseSize(int, int, int);
+    method public void collectAdjacentPrefetchPositions(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
+    method public void collectInitialPrefetchPositions(int, android.support.v7.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
+    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 findContainingItemView(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 deprecated int getChildMeasureSpec(int, int, int, boolean);
+    method public static int getChildMeasureSpec(int, 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 void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    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 getHeightMode();
+    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 void getTransformedBoundingBox(android.view.View, boolean, android.graphics.Rect);
+    method public int getWidth();
+    method public int getWidthMode();
+    method public boolean hasFocus();
+    method public void ignoreView(android.view.View);
+    method public boolean isAttachedToWindow();
+    method public boolean isAutoMeasureEnabled();
+    method public boolean isFocused();
+    method public final boolean isItemPrefetchEnabled();
+    method public boolean isLayoutHierarchical(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public boolean isMeasurementCacheEnabled();
+    method public boolean isSmoothScrolling();
+    method public boolean isViewPartiallyVisible(android.view.View, boolean, boolean);
+    method public void layoutDecorated(android.view.View, int, int, int, int);
+    method public void layoutDecoratedWithMargins(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 onLayoutCompleted(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 boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, 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 setAutoMeasureEnabled(boolean);
+    method public final void setItemPrefetchEnabled(boolean);
+    method public void setMeasuredDimension(android.graphics.Rect, int, int);
+    method public void setMeasuredDimension(int, int);
+    method public void setMeasurementCacheEnabled(boolean);
+    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 abstract interface RecyclerView.LayoutManager.LayoutPrefetchRegistry {
+    method public abstract void addPosition(int, int);
+  }
+
+  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 class RecyclerView.OnFlingListener {
+    ctor public RecyclerView.OnFlingListener();
+    method public abstract boolean onFling(int, int);
+  }
+
+  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 int getRecycledViewCount(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 abstract interface RecyclerView.SmoothScroller.ScrollVectorProvider {
+    method public abstract android.graphics.PointF computeScrollVectorForPosition(int);
+  }
+
+  public static class RecyclerView.State {
+    ctor public RecyclerView.State();
+    method public boolean didStructureChange();
+    method public <T> T get(int);
+    method public int getItemCount();
+    method public int getRemainingScrollHorizontal();
+    method public int getRemainingScrollVertical();
+    method public int getTargetScrollPosition();
+    method public boolean hasTargetScrollPosition();
+    method public boolean isMeasuring();
+    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);
+    method public android.support.v4.view.AccessibilityDelegateCompat getItemDelegate();
+  }
+
+  public static class RecyclerViewAccessibilityDelegate.ItemDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate.ItemDelegate(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
+  }
+
+  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 abstract class SnapHelper extends android.support.v7.widget.RecyclerView.OnFlingListener {
+    ctor public SnapHelper();
+    method public void attachToRecyclerView(android.support.v7.widget.RecyclerView) throws java.lang.IllegalStateException;
+    method public abstract int[] calculateDistanceToFinalSnap(android.support.v7.widget.RecyclerView.LayoutManager, android.view.View);
+    method public int[] calculateScrollDistance(int, int);
+    method protected android.support.v7.widget.RecyclerView.SmoothScroller createScroller(android.support.v7.widget.RecyclerView.LayoutManager);
+    method protected deprecated android.support.v7.widget.LinearSmoothScroller createSnapScroller(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public abstract android.view.View findSnapView(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public abstract int findTargetSnapPosition(android.support.v7.widget.RecyclerView.LayoutManager, int, int);
+    method public boolean onFling(int, int);
+  }
+
+  public class StaggeredGridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager implements android.support.v7.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    ctor public StaggeredGridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public StaggeredGridLayoutManager(int, int);
+    method public android.graphics.PointF computeScrollVectorForPosition(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 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 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();
+    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<T2> 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/build.gradle b/v7/recyclerview/build.gradle
index e035b82..ad1150f 100644
--- a/v7/recyclerview/build.gradle
+++ b/v7/recyclerview/build.gradle
@@ -23,10 +23,7 @@
     }
 
     sourceSets {
-        main.java.srcDir 'src'
         main.res.srcDirs 'res', 'res-public'
-
-        test.java.srcDir 'jvm-tests/src'
     }
 
     testOptions {
diff --git a/v7/recyclerview/src/android/support/v7/util/AsyncListUtil.java b/v7/recyclerview/src/main/java/android/support/v7/util/AsyncListUtil.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/util/AsyncListUtil.java
rename to v7/recyclerview/src/main/java/android/support/v7/util/AsyncListUtil.java
diff --git a/v7/recyclerview/src/android/support/v7/util/BatchingListUpdateCallback.java b/v7/recyclerview/src/main/java/android/support/v7/util/BatchingListUpdateCallback.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/util/BatchingListUpdateCallback.java
rename to v7/recyclerview/src/main/java/android/support/v7/util/BatchingListUpdateCallback.java
diff --git a/v7/recyclerview/src/android/support/v7/util/DiffUtil.java b/v7/recyclerview/src/main/java/android/support/v7/util/DiffUtil.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/util/DiffUtil.java
rename to v7/recyclerview/src/main/java/android/support/v7/util/DiffUtil.java
diff --git a/v7/recyclerview/src/android/support/v7/util/ListUpdateCallback.java b/v7/recyclerview/src/main/java/android/support/v7/util/ListUpdateCallback.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/util/ListUpdateCallback.java
rename to v7/recyclerview/src/main/java/android/support/v7/util/ListUpdateCallback.java
diff --git a/v7/recyclerview/src/android/support/v7/util/MessageThreadUtil.java b/v7/recyclerview/src/main/java/android/support/v7/util/MessageThreadUtil.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/util/MessageThreadUtil.java
rename to v7/recyclerview/src/main/java/android/support/v7/util/MessageThreadUtil.java
diff --git a/v7/recyclerview/src/android/support/v7/util/SortedList.java b/v7/recyclerview/src/main/java/android/support/v7/util/SortedList.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/util/SortedList.java
rename to v7/recyclerview/src/main/java/android/support/v7/util/SortedList.java
diff --git a/v7/recyclerview/src/android/support/v7/util/ThreadUtil.java b/v7/recyclerview/src/main/java/android/support/v7/util/ThreadUtil.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/util/ThreadUtil.java
rename to v7/recyclerview/src/main/java/android/support/v7/util/ThreadUtil.java
diff --git a/v7/recyclerview/src/android/support/v7/util/TileList.java b/v7/recyclerview/src/main/java/android/support/v7/util/TileList.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/util/TileList.java
rename to v7/recyclerview/src/main/java/android/support/v7/util/TileList.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/AdapterHelper.java b/v7/recyclerview/src/main/java/android/support/v7/widget/AdapterHelper.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/AdapterHelper.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/AdapterHelper.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/ChildHelper.java b/v7/recyclerview/src/main/java/android/support/v7/widget/ChildHelper.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/ChildHelper.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/ChildHelper.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/DefaultItemAnimator.java b/v7/recyclerview/src/main/java/android/support/v7/widget/DefaultItemAnimator.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/DefaultItemAnimator.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/DefaultItemAnimator.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/DividerItemDecoration.java b/v7/recyclerview/src/main/java/android/support/v7/widget/DividerItemDecoration.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/DividerItemDecoration.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/DividerItemDecoration.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/FastScroller.java b/v7/recyclerview/src/main/java/android/support/v7/widget/FastScroller.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/FastScroller.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/FastScroller.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/GapWorker.java b/v7/recyclerview/src/main/java/android/support/v7/widget/GapWorker.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/GapWorker.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/GapWorker.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/GridLayoutManager.java b/v7/recyclerview/src/main/java/android/support/v7/widget/GridLayoutManager.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/GridLayoutManager.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/GridLayoutManager.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/LayoutState.java b/v7/recyclerview/src/main/java/android/support/v7/widget/LayoutState.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/LayoutState.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/LayoutState.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java b/v7/recyclerview/src/main/java/android/support/v7/widget/LinearLayoutManager.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/LinearLayoutManager.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/LinearSmoothScroller.java b/v7/recyclerview/src/main/java/android/support/v7/widget/LinearSmoothScroller.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/LinearSmoothScroller.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/LinearSmoothScroller.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/LinearSnapHelper.java b/v7/recyclerview/src/main/java/android/support/v7/widget/LinearSnapHelper.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/LinearSnapHelper.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/LinearSnapHelper.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/OpReorderer.java b/v7/recyclerview/src/main/java/android/support/v7/widget/OpReorderer.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/OpReorderer.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/OpReorderer.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/OrientationHelper.java b/v7/recyclerview/src/main/java/android/support/v7/widget/OrientationHelper.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/OrientationHelper.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/OrientationHelper.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/PagerSnapHelper.java b/v7/recyclerview/src/main/java/android/support/v7/widget/PagerSnapHelper.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/PagerSnapHelper.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/PagerSnapHelper.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/PositionMap.java b/v7/recyclerview/src/main/java/android/support/v7/widget/PositionMap.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/PositionMap.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/PositionMap.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java b/v7/recyclerview/src/main/java/android/support/v7/widget/RecyclerView.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/RecyclerView.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/RecyclerViewAccessibilityDelegate.java b/v7/recyclerview/src/main/java/android/support/v7/widget/RecyclerViewAccessibilityDelegate.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/RecyclerViewAccessibilityDelegate.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/RecyclerViewAccessibilityDelegate.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/ScrollbarHelper.java b/v7/recyclerview/src/main/java/android/support/v7/widget/ScrollbarHelper.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/ScrollbarHelper.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/ScrollbarHelper.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/SimpleItemAnimator.java b/v7/recyclerview/src/main/java/android/support/v7/widget/SimpleItemAnimator.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/SimpleItemAnimator.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/SimpleItemAnimator.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/SnapHelper.java b/v7/recyclerview/src/main/java/android/support/v7/widget/SnapHelper.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/SnapHelper.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/SnapHelper.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/StaggeredGridLayoutManager.java b/v7/recyclerview/src/main/java/android/support/v7/widget/StaggeredGridLayoutManager.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/StaggeredGridLayoutManager.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/StaggeredGridLayoutManager.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/ViewBoundsCheck.java b/v7/recyclerview/src/main/java/android/support/v7/widget/ViewBoundsCheck.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/ViewBoundsCheck.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/ViewBoundsCheck.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/ViewInfoStore.java b/v7/recyclerview/src/main/java/android/support/v7/widget/ViewInfoStore.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/ViewInfoStore.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/ViewInfoStore.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java b/v7/recyclerview/src/main/java/android/support/v7/widget/helper/ItemTouchHelper.java
similarity index 97%
rename from v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/helper/ItemTouchHelper.java
index b0a2cb3..aee48df 100644
--- a/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java
+++ b/v7/recyclerview/src/main/java/android/support/v7/widget/helper/ItemTouchHelper.java
@@ -292,6 +292,11 @@
      */
     GestureDetectorCompat mGestureDetector;
 
+    /**
+     * Callback for when long press occurs.
+     */
+    private ItemTouchHelperGestureListener mItemTouchHelperGestureListener;
+
     private final OnItemTouchListener mOnItemTouchListener = new OnItemTouchListener() {
         @Override
         public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent event) {
@@ -468,7 +473,7 @@
         mRecyclerView.addItemDecoration(this);
         mRecyclerView.addOnItemTouchListener(mOnItemTouchListener);
         mRecyclerView.addOnChildAttachStateChangeListener(this);
-        initGestureDetector();
+        startGestureDetection();
     }
 
     private void destroyCallbacks() {
@@ -485,14 +490,23 @@
         mOverdrawChild = null;
         mOverdrawChildPosition = -1;
         releaseVelocityTracker();
+        stopGestureDetection();
     }
 
-    private void initGestureDetector() {
-        if (mGestureDetector != null) {
-            return;
-        }
+    private void startGestureDetection() {
+        mItemTouchHelperGestureListener = new ItemTouchHelperGestureListener();
         mGestureDetector = new GestureDetectorCompat(mRecyclerView.getContext(),
-                new ItemTouchHelperGestureListener());
+                mItemTouchHelperGestureListener);
+    }
+
+    private void stopGestureDetection() {
+        if (mItemTouchHelperGestureListener != null) {
+            mItemTouchHelperGestureListener.doNotReactToLongPress();
+            mItemTouchHelperGestureListener = null;
+        }
+        if (mGestureDetector != null) {
+            mGestureDetector = null;
+        }
     }
 
     private void getSelectedDxDy(float[] outPosition) {
@@ -2242,9 +2256,33 @@
 
     private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener {
 
+        /**
+         * Whether to execute code in response to the the invoking of
+         * {@link ItemTouchHelperGestureListener#onLongPress(MotionEvent)}.
+         *
+         * It is necessary to control this here because
+         * {@link GestureDetector.SimpleOnGestureListener} can only be set on a
+         * {@link GestureDetector} in a GestureDetector's constructor, a GestureDetector will call
+         * onLongPress if an {@link MotionEvent#ACTION_DOWN} event is not followed by another event
+         * that would cancel it (like {@link MotionEvent#ACTION_UP} or
+         * {@link MotionEvent#ACTION_CANCEL}), the long press responding to the long press event
+         * needs to be cancellable to prevent unexpected behavior.
+         *
+         * @see #doNotReactToLongPress()
+         */
+        private boolean mShouldReactToLongPress = true;
+
         ItemTouchHelperGestureListener() {
         }
 
+        /**
+         * Call to prevent executing code in response to
+         * {@link ItemTouchHelperGestureListener#onLongPress(MotionEvent)} being called.
+         */
+        void doNotReactToLongPress() {
+            mShouldReactToLongPress = false;
+        }
+
         @Override
         public boolean onDown(MotionEvent e) {
             return true;
@@ -2252,6 +2290,9 @@
 
         @Override
         public void onLongPress(MotionEvent e) {
+            if (!mShouldReactToLongPress) {
+                return;
+            }
             View child = findChildView(e);
             if (child != null) {
                 ViewHolder vh = mRecyclerView.getChildViewHolder(child);
diff --git a/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchUIUtil.java b/v7/recyclerview/src/main/java/android/support/v7/widget/helper/ItemTouchUIUtil.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchUIUtil.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/helper/ItemTouchUIUtil.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchUIUtilImpl.java b/v7/recyclerview/src/main/java/android/support/v7/widget/helper/ItemTouchUIUtilImpl.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchUIUtilImpl.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/helper/ItemTouchUIUtilImpl.java
diff --git a/v7/recyclerview/src/android/support/v7/widget/util/SortedListAdapterCallback.java b/v7/recyclerview/src/main/java/android/support/v7/widget/util/SortedListAdapterCallback.java
similarity index 100%
rename from v7/recyclerview/src/android/support/v7/widget/util/SortedListAdapterCallback.java
rename to v7/recyclerview/src/main/java/android/support/v7/widget/util/SortedListAdapterCallback.java
diff --git a/v7/recyclerview/jvm-tests/NO_DOCS b/v7/recyclerview/src/test/NO_DOCS
similarity index 100%
rename from v7/recyclerview/jvm-tests/NO_DOCS
rename to v7/recyclerview/src/test/NO_DOCS
diff --git a/v7/recyclerview/jvm-tests/src/android/support/v7/util/BatchingListUpdateCallbackTest.java b/v7/recyclerview/src/test/java/android/support/v7/util/BatchingListUpdateCallbackTest.java
similarity index 100%
rename from v7/recyclerview/jvm-tests/src/android/support/v7/util/BatchingListUpdateCallbackTest.java
rename to v7/recyclerview/src/test/java/android/support/v7/util/BatchingListUpdateCallbackTest.java
diff --git a/v7/recyclerview/jvm-tests/src/android/support/v7/util/DiffUtilTest.java b/v7/recyclerview/src/test/java/android/support/v7/util/DiffUtilTest.java
similarity index 100%
rename from v7/recyclerview/jvm-tests/src/android/support/v7/util/DiffUtilTest.java
rename to v7/recyclerview/src/test/java/android/support/v7/util/DiffUtilTest.java
diff --git a/v7/recyclerview/jvm-tests/src/android/support/v7/util/SortedListBatchedCallbackTest.java b/v7/recyclerview/src/test/java/android/support/v7/util/SortedListBatchedCallbackTest.java
similarity index 100%
rename from v7/recyclerview/jvm-tests/src/android/support/v7/util/SortedListBatchedCallbackTest.java
rename to v7/recyclerview/src/test/java/android/support/v7/util/SortedListBatchedCallbackTest.java
diff --git a/v7/recyclerview/jvm-tests/src/android/support/v7/util/SortedListTest.java b/v7/recyclerview/src/test/java/android/support/v7/util/SortedListTest.java
similarity index 100%
rename from v7/recyclerview/jvm-tests/src/android/support/v7/util/SortedListTest.java
rename to v7/recyclerview/src/test/java/android/support/v7/util/SortedListTest.java
diff --git a/v7/recyclerview/jvm-tests/src/android/support/v7/widget/AdapterHelperTest.java b/v7/recyclerview/src/test/java/android/support/v7/widget/AdapterHelperTest.java
similarity index 100%
rename from v7/recyclerview/jvm-tests/src/android/support/v7/widget/AdapterHelperTest.java
rename to v7/recyclerview/src/test/java/android/support/v7/widget/AdapterHelperTest.java
diff --git a/v7/recyclerview/jvm-tests/src/android/support/v7/widget/OpReorderTest.java b/v7/recyclerview/src/test/java/android/support/v7/widget/OpReorderTest.java
similarity index 100%
rename from v7/recyclerview/jvm-tests/src/android/support/v7/widget/OpReorderTest.java
rename to v7/recyclerview/src/test/java/android/support/v7/widget/OpReorderTest.java
diff --git a/v7/recyclerview/jvm-tests/src/android/support/v7/widget/ViewInfoStoreTest.java b/v7/recyclerview/src/test/java/android/support/v7/widget/ViewInfoStoreTest.java
similarity index 100%
rename from v7/recyclerview/jvm-tests/src/android/support/v7/widget/ViewInfoStoreTest.java
rename to v7/recyclerview/src/test/java/android/support/v7/widget/ViewInfoStoreTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/util/TouchUtils.java b/v7/recyclerview/tests/src/android/support/v7/util/TouchUtils.java
index 02099ba..1a64e3c 100644
--- a/v7/recyclerview/tests/src/android/support/v7/util/TouchUtils.java
+++ b/v7/recyclerview/tests/src/android/support/v7/util/TouchUtils.java
@@ -142,13 +142,6 @@
         inst.sendPointerSync(event);
         inst.waitForIdleSync();
 
-        eventTime = SystemClock.uptimeMillis();
-        final int touchSlop = ViewConfiguration.get(v.getContext()).getScaledTouchSlop();
-        event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE,
-                x + touchSlop / 2, y + touchSlop / 2, 0);
-        inst.sendPointerSync(event);
-        inst.waitForIdleSync();
-
         try {
             Thread.sleep((long) (ViewConfiguration.getLongPressTimeout() * 1.5f));
         } catch (InterruptedException e) {
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/helper/ItemTouchHelperTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/helper/ItemTouchHelperTest.java
index 18af47b..090ea69 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/helper/ItemTouchHelperTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/helper/ItemTouchHelperTest.java
@@ -32,11 +32,13 @@
 import android.support.test.filters.Suppress;
 import android.support.test.runner.AndroidJUnit4;
 import android.support.testutils.PollingCheck;
+import android.support.v4.util.Pair;
 import android.support.v7.util.TouchUtils;
 import android.support.v7.widget.BaseRecyclerViewInstrumentationTest;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.WrappedRecyclerView;
 import android.view.Gravity;
+import android.view.View;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -48,26 +50,27 @@
 @RunWith(AndroidJUnit4.class)
 public class ItemTouchHelperTest extends BaseRecyclerViewInstrumentationTest {
 
-    TestAdapter mAdapter;
-
-    TestLayoutManager mLayoutManager;
+    private static class RecyclerViewState {
+        public TestAdapter mAdapter;
+        public TestLayoutManager mLayoutManager;
+        public WrappedRecyclerView mWrappedRecyclerView;
+    }
 
     private LoggingCalback mCalback;
 
     private LoggingItemTouchHelper mItemTouchHelper;
 
-    private WrappedRecyclerView mWrappedRecyclerView;
-
     private Boolean mSetupRTL;
 
     public ItemTouchHelperTest() {
         super(false);
     }
 
-    private RecyclerView setup(int dragDirs, int swipeDirs) throws Throwable {
-        mWrappedRecyclerView = inflateWrappedRV();
-        mAdapter = new TestAdapter(10);
-        mLayoutManager = new TestLayoutManager() {
+    private RecyclerViewState setupRecyclerView() throws Throwable {
+        RecyclerViewState rvs = new RecyclerViewState();
+        rvs.mWrappedRecyclerView = inflateWrappedRV();
+        rvs.mAdapter = new TestAdapter(10);
+        rvs.mLayoutManager = new TestLayoutManager() {
             @Override
             public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
                 detachAndScrapAttachedViews(recycler);
@@ -85,19 +88,24 @@
                 return false;
             }
         };
-        mWrappedRecyclerView.setFakeRTL(mSetupRTL);
-        mWrappedRecyclerView.setAdapter(mAdapter);
-        mWrappedRecyclerView.setLayoutManager(mLayoutManager);
+        rvs.mWrappedRecyclerView.setFakeRTL(mSetupRTL);
+        rvs.mWrappedRecyclerView.setAdapter(rvs.mAdapter);
+        rvs.mWrappedRecyclerView.setLayoutManager(rvs.mLayoutManager);
+        return rvs;
+    }
+
+    private RecyclerViewState setupItemTouchHelper(final RecyclerViewState rvs, int dragDirs,
+            int swipeDirs) throws Throwable {
         mCalback = new LoggingCalback(dragDirs, swipeDirs);
         mItemTouchHelper = new LoggingItemTouchHelper(mCalback);
         mActivityRule.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                mItemTouchHelper.attachToRecyclerView(mWrappedRecyclerView);
+                mItemTouchHelper.attachToRecyclerView(rvs.mWrappedRecyclerView);
             }
         });
 
-        return mWrappedRecyclerView;
+        return rvs;
     }
 
     @Test
@@ -136,11 +144,60 @@
         basicSwipeTest(END, START | END, -getActivity().getWindow().getDecorView().getWidth());
     }
 
+    @Test
+    public void attachToNullRecycleViewDuringLongPress() throws Throwable {
+        final RecyclerViewState rvs = setupItemTouchHelper(setupRecyclerView(), END, 0);
+        rvs.mLayoutManager.expectLayouts(1);
+        setRecyclerView(rvs.mWrappedRecyclerView);
+        rvs.mLayoutManager.waitForLayout(1);
+
+        final RecyclerView.ViewHolder target = mRecyclerView
+                .findViewHolderForAdapterPosition(1);
+        target.itemView.setOnLongClickListener(new View.OnLongClickListener() {
+            @Override
+            public boolean onLongClick(View v) {
+                mItemTouchHelper.attachToRecyclerView(null);
+                return false;
+            }
+        });
+        TouchUtils.longClickView(getInstrumentation(), target.itemView);
+    }
+
+    @Test
+    public void attachToAnotherRecycleViewDuringLongPress() throws Throwable {
+        final RecyclerViewState rvs2 = setupRecyclerView();
+        rvs2.mLayoutManager.expectLayouts(1);
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                getActivity().getContainer().addView(rvs2.mWrappedRecyclerView);
+            }
+        });
+        rvs2.mLayoutManager.waitForLayout(1);
+
+        final RecyclerViewState rvs = setupItemTouchHelper(setupRecyclerView(), END, 0);
+        rvs.mLayoutManager.expectLayouts(1);
+        setRecyclerView(rvs.mWrappedRecyclerView);
+        rvs.mLayoutManager.waitForLayout(1);
+
+        final RecyclerView.ViewHolder target = mRecyclerView
+                .findViewHolderForAdapterPosition(1);
+        target.itemView.setOnLongClickListener(new View.OnLongClickListener() {
+            @Override
+            public boolean onLongClick(View v) {
+                mItemTouchHelper.attachToRecyclerView(rvs2.mWrappedRecyclerView);
+                return false;
+            }
+        });
+        TouchUtils.longClickView(getInstrumentation(), target.itemView);
+        assertEquals(0, mCalback.mHasDragFlag.size());
+    }
+
     public void basicSwipeTest(int dir, int swipeDirs, int targetX) throws Throwable {
-        final RecyclerView recyclerView = setup(0, swipeDirs);
-        mLayoutManager.expectLayouts(1);
-        setRecyclerView(recyclerView);
-        mLayoutManager.waitForLayout(1);
+        final RecyclerViewState rvs = setupItemTouchHelper(setupRecyclerView(), 0, swipeDirs);
+        rvs.mLayoutManager.expectLayouts(1);
+        setRecyclerView(rvs.mWrappedRecyclerView);
+        rvs.mLayoutManager.waitForLayout(1);
 
         final RecyclerView.ViewHolder target = mRecyclerView
                 .findViewHolderForAdapterPosition(1);
@@ -158,9 +215,9 @@
         assertEquals(1, mItemTouchHelper.mRecoverAnimations.size());
         assertEquals(1, mItemTouchHelper.mPendingCleanup.size());
         // get rid of the view
-        mLayoutManager.expectLayouts(1);
-        mAdapter.deleteAndNotify(1, 1);
-        mLayoutManager.waitForLayout(1);
+        rvs.mLayoutManager.expectLayouts(1);
+        rvs.mAdapter.deleteAndNotify(1, 1);
+        rvs.mLayoutManager.waitForLayout(1);
         waitForAnimations();
         assertEquals(0, mItemTouchHelper.mRecoverAnimations.size());
         assertEquals(0, mItemTouchHelper.mPendingCleanup.size());
@@ -181,6 +238,8 @@
 
         private List<RecyclerView.ViewHolder> mCleared = new ArrayList<RecyclerView.ViewHolder>();
 
+        public List<Pair<RecyclerView, RecyclerView.ViewHolder>> mHasDragFlag = new ArrayList<>();
+
         LoggingCalback(int dragDirs, int swipeDirs) {
             super(dragDirs, swipeDirs);
         }
@@ -212,6 +271,12 @@
             mCleared.add(viewHolder);
         }
 
+        @Override
+        boolean hasDragFlag(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+            mHasDragFlag.add(new Pair<>(recyclerView, viewHolder));
+            return super.hasDragFlag(recyclerView, viewHolder);
+        }
+
         public SwipeRecord getSwipe(RecyclerView.ViewHolder vh) {
             for (SwipeRecord swipe : mSwipeRecords) {
                 if (swipe.viewHolder == vh) {
diff --git a/wear/Android.mk b/wear/Android.mk
index eec890b..fe9b8d3 100644
--- a/wear/Android.mk
+++ b/wear/Android.mk
@@ -14,6 +14,12 @@
 
 LOCAL_PATH := $(call my-dir)
 
+# Here is a prebuilt library containing all the wearable stubs necessary for ambient mode
+include $(CLEAR_VARS)
+LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
+        prebuilt-com.google.android.wearable-stubs:wear_stubs/com.google.android.wearable-stubs.jar
+include $(BUILD_MULTI_PREBUILT)
+
 # Here is the final static library that apps can link against.
 # Applications that use this library must specify
 #
@@ -22,12 +28,13 @@
 #       android-support-core-ui \
 #       android-support-v7-recyclerview
 #
-# in their makefiles to include the resources and their dependencies in their package.
+# in their makefiles to include the resources and their dependencies in their package
+
 include $(CLEAR_VARS)
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-wear
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := $(call all-java-files-under,src)
+LOCAL_SRC_FILES := $(call all-java-files-under,src/main/java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
         android-support-core-ui \
@@ -35,7 +42,10 @@
         android-support-percent \
         android-support-v7-recyclerview \
         android-support-v4
+LOCAL_STATIC_JAVA_LIBRARIES := \
+        prebuilt-com.google.android.wearable-stubs
 LOCAL_JAR_EXCLUDE_FILES := none
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
 include $(BUILD_STATIC_JAVA_LIBRARY)
+
diff --git a/wear/AndroidManifest.xml b/wear/AndroidManifest.xml
index 0541f36..3849df5 100644
--- a/wear/AndroidManifest.xml
+++ b/wear/AndroidManifest.xml
@@ -15,8 +15,4 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.wear">
-    <application>
-        <meta-data android:name="android.support.wear.VERSION"
-                   android:value="${support-version}" />
-    </application>
 </manifest>
diff --git a/wear/OWNERS b/wear/OWNERS
new file mode 100644
index 0000000..9cd6e52
--- /dev/null
+++ b/wear/OWNERS
@@ -0,0 +1,2 @@
+amad@google.com
+griff@google.com
\ No newline at end of file
diff --git a/wear/api/26.1.0.txt b/wear/api/26.1.0.txt
new file mode 100644
index 0000000..1fb713a
--- /dev/null
+++ b/wear/api/26.1.0.txt
@@ -0,0 +1,218 @@
+package android.support.wear.widget {
+
+  public class BoxInsetLayout extends android.view.ViewGroup {
+    ctor public BoxInsetLayout(android.content.Context);
+    ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet);
+    ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet, int);
+    method public android.support.wear.widget.BoxInsetLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected void onLayout(boolean, int, int, int, int);
+  }
+
+  public static class BoxInsetLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
+    ctor public BoxInsetLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public BoxInsetLayout.LayoutParams(int, int);
+    ctor public BoxInsetLayout.LayoutParams(int, int, int);
+    ctor public BoxInsetLayout.LayoutParams(int, int, int, int);
+    ctor public BoxInsetLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public BoxInsetLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public BoxInsetLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
+    ctor public BoxInsetLayout.LayoutParams(android.support.wear.widget.BoxInsetLayout.LayoutParams);
+    field public static final int BOX_ALL = 15; // 0xf
+    field public static final int BOX_BOTTOM = 8; // 0x8
+    field public static final int BOX_LEFT = 1; // 0x1
+    field public static final int BOX_NONE = 0; // 0x0
+    field public static final int BOX_RIGHT = 4; // 0x4
+    field public static final int BOX_TOP = 2; // 0x2
+    field public int boxedEdges;
+  }
+
+  public class CircularProgressLayout extends android.widget.FrameLayout {
+    ctor public CircularProgressLayout(android.content.Context);
+    ctor public CircularProgressLayout(android.content.Context, android.util.AttributeSet);
+    ctor public CircularProgressLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public CircularProgressLayout(android.content.Context, android.util.AttributeSet, int, int);
+    method public int getBackgroundColor();
+    method public int[] getColorSchemeColors();
+    method public android.support.wear.widget.CircularProgressLayout.OnTimerFinishedListener getOnTimerFinishedListener();
+    method public android.support.v4.widget.CircularProgressDrawable getProgressDrawable();
+    method public float getStartingRotation();
+    method public float getStrokeWidth();
+    method public long getTotalTime();
+    method public boolean isIndeterminate();
+    method public boolean isTimerRunning();
+    method public void setColorSchemeColors(int...);
+    method public void setIndeterminate(boolean);
+    method public void setOnTimerFinishedListener(android.support.wear.widget.CircularProgressLayout.OnTimerFinishedListener);
+    method public void setStartingRotation(float);
+    method public void setStrokeWidth(float);
+    method public void setTotalTime(long);
+    method public void startTimer();
+    method public void stopTimer();
+  }
+
+  public static abstract interface CircularProgressLayout.OnTimerFinishedListener {
+    method public abstract void onTimerFinished(android.support.wear.widget.CircularProgressLayout);
+  }
+
+  public class CurvingLayoutCallback extends android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback {
+    ctor public CurvingLayoutCallback(android.content.Context);
+    method public void adjustAnchorOffsetXY(android.view.View, float[]);
+    method public void onLayoutFinished(android.view.View, android.support.v7.widget.RecyclerView);
+  }
+
+  public class RoundedDrawable extends android.graphics.drawable.Drawable {
+    ctor public RoundedDrawable();
+    method public void draw(android.graphics.Canvas);
+    method public int getBackgroundColor();
+    method public android.graphics.drawable.Drawable getDrawable();
+    method public int getOpacity();
+    method public int getRadius();
+    method public boolean isClipEnabled();
+    method public void setAlpha(int);
+    method public void setBackgroundColor(int);
+    method public void setClipEnabled(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setRadius(int);
+  }
+
+  public class SwipeDismissFrameLayout extends android.widget.FrameLayout {
+    ctor public SwipeDismissFrameLayout(android.content.Context);
+    ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet);
+    ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet, int, int);
+    method public void addCallback(android.support.wear.widget.SwipeDismissFrameLayout.Callback);
+    method public void removeCallback(android.support.wear.widget.SwipeDismissFrameLayout.Callback);
+  }
+
+  public static abstract class SwipeDismissFrameLayout.Callback {
+    ctor public SwipeDismissFrameLayout.Callback();
+    method public void onDismissed(android.support.wear.widget.SwipeDismissFrameLayout);
+    method public void onSwipeCanceled(android.support.wear.widget.SwipeDismissFrameLayout);
+    method public void onSwipeStarted(android.support.wear.widget.SwipeDismissFrameLayout);
+  }
+
+  public class WearableLinearLayoutManager extends android.support.v7.widget.LinearLayoutManager {
+    ctor public WearableLinearLayoutManager(android.content.Context, android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback);
+    ctor public WearableLinearLayoutManager(android.content.Context);
+    method public android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback getLayoutCallback();
+    method public void setLayoutCallback(android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback);
+  }
+
+  public static abstract class WearableLinearLayoutManager.LayoutCallback {
+    ctor public WearableLinearLayoutManager.LayoutCallback();
+    method public abstract void onLayoutFinished(android.view.View, android.support.v7.widget.RecyclerView);
+  }
+
+  public class WearableRecyclerView extends android.support.v7.widget.RecyclerView {
+    ctor public WearableRecyclerView(android.content.Context);
+    ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet);
+    ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet, int, int);
+    method public float getBezelFraction();
+    method public float getScrollDegreesPerScreen();
+    method public boolean isCircularScrollingGestureEnabled();
+    method public boolean isEdgeItemsCenteringEnabled();
+    method public void setBezelFraction(float);
+    method public void setCircularScrollingGestureEnabled(boolean);
+    method public void setEdgeItemsCenteringEnabled(boolean);
+    method public void setScrollDegreesPerScreen(float);
+  }
+
+}
+
+package android.support.wear.widget.drawer {
+
+  public class WearableActionDrawerView extends android.support.wear.widget.drawer.WearableDrawerView {
+    ctor public WearableActionDrawerView(android.content.Context);
+    ctor public WearableActionDrawerView(android.content.Context, android.util.AttributeSet);
+    ctor public WearableActionDrawerView(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableActionDrawerView(android.content.Context, android.util.AttributeSet, int, int);
+    method public android.view.Menu getMenu();
+    method public void setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener);
+    method public void setTitle(java.lang.CharSequence);
+  }
+
+  public class WearableDrawerController {
+    method public void closeDrawer();
+    method public void openDrawer();
+    method public void peekDrawer();
+  }
+
+  public class WearableDrawerLayout extends android.widget.FrameLayout implements android.view.View.OnLayoutChangeListener {
+    ctor public WearableDrawerLayout(android.content.Context);
+    ctor public WearableDrawerLayout(android.content.Context, android.util.AttributeSet);
+    ctor public WearableDrawerLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableDrawerLayout(android.content.Context, android.util.AttributeSet, int, int);
+    method public void onFlingComplete(android.view.View);
+    method public void onLayoutChange(android.view.View, int, int, int, int, int, int, int, int);
+    method public void setDrawerStateCallback(android.support.wear.widget.drawer.WearableDrawerLayout.DrawerStateCallback);
+  }
+
+  public static class WearableDrawerLayout.DrawerStateCallback {
+    ctor public WearableDrawerLayout.DrawerStateCallback();
+    method public void onDrawerClosed(android.support.wear.widget.drawer.WearableDrawerLayout, android.support.wear.widget.drawer.WearableDrawerView);
+    method public void onDrawerOpened(android.support.wear.widget.drawer.WearableDrawerLayout, android.support.wear.widget.drawer.WearableDrawerView);
+    method public void onDrawerStateChanged(android.support.wear.widget.drawer.WearableDrawerLayout, int);
+  }
+
+  public class WearableDrawerView extends android.widget.FrameLayout {
+    ctor public WearableDrawerView(android.content.Context);
+    ctor public WearableDrawerView(android.content.Context, android.util.AttributeSet);
+    ctor public WearableDrawerView(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableDrawerView(android.content.Context, android.util.AttributeSet, int, int);
+    method public android.support.wear.widget.drawer.WearableDrawerController getController();
+    method public android.view.View getDrawerContent();
+    method public int getDrawerState();
+    method public boolean isAutoPeekEnabled();
+    method public boolean isClosed();
+    method public boolean isLocked();
+    method public boolean isLockedWhenClosed();
+    method public boolean isOpenOnlyAtTopEnabled();
+    method public boolean isOpened();
+    method public boolean isPeekOnScrollDownEnabled();
+    method public boolean isPeeking();
+    method public void onDrawerClosed();
+    method public void onDrawerOpened();
+    method public void onDrawerStateChanged(int);
+    method public void onPeekContainerClicked(android.view.View);
+    method public void setDrawerContent(android.view.View);
+    method public void setIsAutoPeekEnabled(boolean);
+    method public void setIsLocked(boolean);
+    method public void setLockedWhenClosed(boolean);
+    method public void setOpenOnlyAtTopEnabled(boolean);
+    method public void setPeekContent(android.view.View);
+    method public void setPeekOnScrollDownEnabled(boolean);
+    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 class WearableNavigationDrawerView extends android.support.wear.widget.drawer.WearableDrawerView {
+    ctor public WearableNavigationDrawerView(android.content.Context);
+    ctor public WearableNavigationDrawerView(android.content.Context, android.util.AttributeSet);
+    ctor public WearableNavigationDrawerView(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableNavigationDrawerView(android.content.Context, android.util.AttributeSet, int, int);
+    method public void addOnItemSelectedListener(android.support.wear.widget.drawer.WearableNavigationDrawerView.OnItemSelectedListener);
+    method public int getNavigationStyle();
+    method public void removeOnItemSelectedListener(android.support.wear.widget.drawer.WearableNavigationDrawerView.OnItemSelectedListener);
+    method public void setAdapter(android.support.wear.widget.drawer.WearableNavigationDrawerView.WearableNavigationDrawerAdapter);
+    method public void setCurrentItem(int, boolean);
+    field public static final int MULTI_PAGE = 1; // 0x1
+    field public static final int SINGLE_PAGE = 0; // 0x0
+  }
+
+  public static abstract interface WearableNavigationDrawerView.OnItemSelectedListener {
+    method public abstract void onItemSelected(int);
+  }
+
+  public static abstract class WearableNavigationDrawerView.WearableNavigationDrawerAdapter {
+    ctor public WearableNavigationDrawerView.WearableNavigationDrawerAdapter();
+    method public abstract int getCount();
+    method public abstract android.graphics.drawable.Drawable getItemDrawable(int);
+    method public abstract java.lang.CharSequence getItemText(int);
+    method public void notifyDataSetChanged();
+  }
+
+}
+
diff --git a/wear/api/27.0.0.txt b/wear/api/27.0.0.txt
new file mode 100644
index 0000000..e9b7d86
--- /dev/null
+++ b/wear/api/27.0.0.txt
@@ -0,0 +1,261 @@
+package android.support.wear.ambient {
+
+  public final class AmbientMode extends android.app.Fragment {
+    ctor public AmbientMode();
+    method public static <T extends android.app.Activity & android.support.wear.ambient.AmbientMode.AmbientCallbackProvider> android.support.wear.ambient.AmbientMode.AmbientController attachAmbientSupport(T);
+    field public static final java.lang.String EXTRA_BURN_IN_PROTECTION = "com.google.android.wearable.compat.extra.BURN_IN_PROTECTION";
+    field public static final java.lang.String EXTRA_LOWBIT_AMBIENT = "com.google.android.wearable.compat.extra.LOWBIT_AMBIENT";
+    field public static final java.lang.String FRAGMENT_TAG = "android.support.wearable.ambient.AmbientMode";
+  }
+
+  public static abstract class AmbientMode.AmbientCallback {
+    ctor public AmbientMode.AmbientCallback();
+    method public void onEnterAmbient(android.os.Bundle);
+    method public void onExitAmbient();
+    method public void onUpdateAmbient();
+  }
+
+  public static abstract interface AmbientMode.AmbientCallbackProvider {
+    method public abstract android.support.wear.ambient.AmbientMode.AmbientCallback getAmbientCallback();
+  }
+
+  public final class AmbientMode.AmbientController {
+    method public boolean isAmbient();
+  }
+
+}
+
+package android.support.wear.utils {
+
+  public class MetadataConstants {
+    method public static int getPreviewDrawableResourceId(android.content.Context, boolean);
+    method public static boolean isNotificationBridgingEnabled(android.content.Context);
+    method public static boolean isStandalone(android.content.Context);
+    field public static final java.lang.String NOTIFICATION_BRIDGE_MODE_BRIDGING = "BRIDGING";
+    field public static final java.lang.String NOTIFICATION_BRIDGE_MODE_METADATA_NAME = "com.google.android.wearable.notificationBridgeMode";
+    field public static final java.lang.String NOTIFICATION_BRIDGE_MODE_NO_BRIDGING = "NO_BRIDGING";
+    field public static final java.lang.String STANDALONE_METADATA_NAME = "com.google.android.wearable.standalone";
+    field public static final java.lang.String WATCH_FACE_PREVIEW_CIRCULAR_METADATA_NAME = "com.google.android.wearable.watchface.preview_circular";
+    field public static final java.lang.String WATCH_FACE_PREVIEW_METADATA_NAME = "com.google.android.wearable.watchface.preview";
+  }
+
+}
+
+package android.support.wear.widget {
+
+  public class BoxInsetLayout extends android.view.ViewGroup {
+    ctor public BoxInsetLayout(android.content.Context);
+    ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet);
+    ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet, int);
+    method public android.support.wear.widget.BoxInsetLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+    method protected void onLayout(boolean, int, int, int, int);
+  }
+
+  public static class BoxInsetLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
+    ctor public BoxInsetLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public BoxInsetLayout.LayoutParams(int, int);
+    ctor public BoxInsetLayout.LayoutParams(int, int, int);
+    ctor public BoxInsetLayout.LayoutParams(int, int, int, int);
+    ctor public BoxInsetLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public BoxInsetLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public BoxInsetLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
+    ctor public BoxInsetLayout.LayoutParams(android.support.wear.widget.BoxInsetLayout.LayoutParams);
+    field public static final int BOX_ALL = 15; // 0xf
+    field public static final int BOX_BOTTOM = 8; // 0x8
+    field public static final int BOX_LEFT = 1; // 0x1
+    field public static final int BOX_NONE = 0; // 0x0
+    field public static final int BOX_RIGHT = 4; // 0x4
+    field public static final int BOX_TOP = 2; // 0x2
+    field public int boxedEdges;
+  }
+
+  public class CircularProgressLayout extends android.widget.FrameLayout {
+    ctor public CircularProgressLayout(android.content.Context);
+    ctor public CircularProgressLayout(android.content.Context, android.util.AttributeSet);
+    ctor public CircularProgressLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public CircularProgressLayout(android.content.Context, android.util.AttributeSet, int, int);
+    method public int getBackgroundColor();
+    method public int[] getColorSchemeColors();
+    method public android.support.wear.widget.CircularProgressLayout.OnTimerFinishedListener getOnTimerFinishedListener();
+    method public android.support.v4.widget.CircularProgressDrawable getProgressDrawable();
+    method public float getStartingRotation();
+    method public float getStrokeWidth();
+    method public long getTotalTime();
+    method public boolean isIndeterminate();
+    method public boolean isTimerRunning();
+    method public void setColorSchemeColors(int...);
+    method public void setIndeterminate(boolean);
+    method public void setOnTimerFinishedListener(android.support.wear.widget.CircularProgressLayout.OnTimerFinishedListener);
+    method public void setStartingRotation(float);
+    method public void setStrokeWidth(float);
+    method public void setTotalTime(long);
+    method public void startTimer();
+    method public void stopTimer();
+  }
+
+  public static abstract interface CircularProgressLayout.OnTimerFinishedListener {
+    method public abstract void onTimerFinished(android.support.wear.widget.CircularProgressLayout);
+  }
+
+  public class CurvingLayoutCallback extends android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback {
+    ctor public CurvingLayoutCallback(android.content.Context);
+    method public void adjustAnchorOffsetXY(android.view.View, float[]);
+    method public void onLayoutFinished(android.view.View, android.support.v7.widget.RecyclerView);
+  }
+
+  public class RoundedDrawable extends android.graphics.drawable.Drawable {
+    ctor public RoundedDrawable();
+    method public void draw(android.graphics.Canvas);
+    method public int getBackgroundColor();
+    method public android.graphics.drawable.Drawable getDrawable();
+    method public int getOpacity();
+    method public int getRadius();
+    method public boolean isClipEnabled();
+    method public void setAlpha(int);
+    method public void setBackgroundColor(int);
+    method public void setClipEnabled(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setRadius(int);
+  }
+
+  public class SwipeDismissFrameLayout extends android.widget.FrameLayout {
+    ctor public SwipeDismissFrameLayout(android.content.Context);
+    ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet);
+    ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public SwipeDismissFrameLayout(android.content.Context, android.util.AttributeSet, int, int);
+    method public void addCallback(android.support.wear.widget.SwipeDismissFrameLayout.Callback);
+    method public void removeCallback(android.support.wear.widget.SwipeDismissFrameLayout.Callback);
+  }
+
+  public static abstract class SwipeDismissFrameLayout.Callback {
+    ctor public SwipeDismissFrameLayout.Callback();
+    method public void onDismissed(android.support.wear.widget.SwipeDismissFrameLayout);
+    method public void onSwipeCanceled(android.support.wear.widget.SwipeDismissFrameLayout);
+    method public void onSwipeStarted(android.support.wear.widget.SwipeDismissFrameLayout);
+  }
+
+  public class WearableLinearLayoutManager extends android.support.v7.widget.LinearLayoutManager {
+    ctor public WearableLinearLayoutManager(android.content.Context, android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback);
+    ctor public WearableLinearLayoutManager(android.content.Context);
+    method public android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback getLayoutCallback();
+    method public void setLayoutCallback(android.support.wear.widget.WearableLinearLayoutManager.LayoutCallback);
+  }
+
+  public static abstract class WearableLinearLayoutManager.LayoutCallback {
+    ctor public WearableLinearLayoutManager.LayoutCallback();
+    method public abstract void onLayoutFinished(android.view.View, android.support.v7.widget.RecyclerView);
+  }
+
+  public class WearableRecyclerView extends android.support.v7.widget.RecyclerView {
+    ctor public WearableRecyclerView(android.content.Context);
+    ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet);
+    ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableRecyclerView(android.content.Context, android.util.AttributeSet, int, int);
+    method public float getBezelFraction();
+    method public float getScrollDegreesPerScreen();
+    method public boolean isCircularScrollingGestureEnabled();
+    method public boolean isEdgeItemsCenteringEnabled();
+    method public void setBezelFraction(float);
+    method public void setCircularScrollingGestureEnabled(boolean);
+    method public void setEdgeItemsCenteringEnabled(boolean);
+    method public void setScrollDegreesPerScreen(float);
+  }
+
+}
+
+package android.support.wear.widget.drawer {
+
+  public class WearableActionDrawerView extends android.support.wear.widget.drawer.WearableDrawerView {
+    ctor public WearableActionDrawerView(android.content.Context);
+    ctor public WearableActionDrawerView(android.content.Context, android.util.AttributeSet);
+    ctor public WearableActionDrawerView(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableActionDrawerView(android.content.Context, android.util.AttributeSet, int, int);
+    method public android.view.Menu getMenu();
+    method public void setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener);
+    method public void setTitle(java.lang.CharSequence);
+  }
+
+  public class WearableDrawerController {
+    method public void closeDrawer();
+    method public void openDrawer();
+    method public void peekDrawer();
+  }
+
+  public class WearableDrawerLayout extends android.widget.FrameLayout implements android.view.View.OnLayoutChangeListener {
+    ctor public WearableDrawerLayout(android.content.Context);
+    ctor public WearableDrawerLayout(android.content.Context, android.util.AttributeSet);
+    ctor public WearableDrawerLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableDrawerLayout(android.content.Context, android.util.AttributeSet, int, int);
+    method public void onFlingComplete(android.view.View);
+    method public void onLayoutChange(android.view.View, int, int, int, int, int, int, int, int);
+    method public void setDrawerStateCallback(android.support.wear.widget.drawer.WearableDrawerLayout.DrawerStateCallback);
+  }
+
+  public static class WearableDrawerLayout.DrawerStateCallback {
+    ctor public WearableDrawerLayout.DrawerStateCallback();
+    method public void onDrawerClosed(android.support.wear.widget.drawer.WearableDrawerLayout, android.support.wear.widget.drawer.WearableDrawerView);
+    method public void onDrawerOpened(android.support.wear.widget.drawer.WearableDrawerLayout, android.support.wear.widget.drawer.WearableDrawerView);
+    method public void onDrawerStateChanged(android.support.wear.widget.drawer.WearableDrawerLayout, int);
+  }
+
+  public class WearableDrawerView extends android.widget.FrameLayout {
+    ctor public WearableDrawerView(android.content.Context);
+    ctor public WearableDrawerView(android.content.Context, android.util.AttributeSet);
+    ctor public WearableDrawerView(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableDrawerView(android.content.Context, android.util.AttributeSet, int, int);
+    method public android.support.wear.widget.drawer.WearableDrawerController getController();
+    method public android.view.View getDrawerContent();
+    method public int getDrawerState();
+    method public boolean isAutoPeekEnabled();
+    method public boolean isClosed();
+    method public boolean isLocked();
+    method public boolean isLockedWhenClosed();
+    method public boolean isOpenOnlyAtTopEnabled();
+    method public boolean isOpened();
+    method public boolean isPeekOnScrollDownEnabled();
+    method public boolean isPeeking();
+    method public void onDrawerClosed();
+    method public void onDrawerOpened();
+    method public void onDrawerStateChanged(int);
+    method public void onPeekContainerClicked(android.view.View);
+    method public void setDrawerContent(android.view.View);
+    method public void setIsAutoPeekEnabled(boolean);
+    method public void setIsLocked(boolean);
+    method public void setLockedWhenClosed(boolean);
+    method public void setOpenOnlyAtTopEnabled(boolean);
+    method public void setPeekContent(android.view.View);
+    method public void setPeekOnScrollDownEnabled(boolean);
+    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 class WearableNavigationDrawerView extends android.support.wear.widget.drawer.WearableDrawerView {
+    ctor public WearableNavigationDrawerView(android.content.Context);
+    ctor public WearableNavigationDrawerView(android.content.Context, android.util.AttributeSet);
+    ctor public WearableNavigationDrawerView(android.content.Context, android.util.AttributeSet, int);
+    ctor public WearableNavigationDrawerView(android.content.Context, android.util.AttributeSet, int, int);
+    method public void addOnItemSelectedListener(android.support.wear.widget.drawer.WearableNavigationDrawerView.OnItemSelectedListener);
+    method public int getNavigationStyle();
+    method public void removeOnItemSelectedListener(android.support.wear.widget.drawer.WearableNavigationDrawerView.OnItemSelectedListener);
+    method public void setAdapter(android.support.wear.widget.drawer.WearableNavigationDrawerView.WearableNavigationDrawerAdapter);
+    method public void setCurrentItem(int, boolean);
+    field public static final int MULTI_PAGE = 1; // 0x1
+    field public static final int SINGLE_PAGE = 0; // 0x0
+  }
+
+  public static abstract interface WearableNavigationDrawerView.OnItemSelectedListener {
+    method public abstract void onItemSelected(int);
+  }
+
+  public static abstract class WearableNavigationDrawerView.WearableNavigationDrawerAdapter {
+    ctor public WearableNavigationDrawerView.WearableNavigationDrawerAdapter();
+    method public abstract int getCount();
+    method public abstract android.graphics.drawable.Drawable getItemDrawable(int);
+    method public abstract java.lang.CharSequence getItemText(int);
+    method public void notifyDataSetChanged();
+  }
+
+}
+
diff --git a/wear/api/current.txt b/wear/api/current.txt
index afffeed..e397eb3 100644
--- a/wear/api/current.txt
+++ b/wear/api/current.txt
@@ -1,3 +1,31 @@
+package android.support.wear.ambient {
+
+  public final class AmbientMode extends android.app.Fragment {
+    ctor public AmbientMode();
+    method public static <T extends android.app.Activity & android.support.wear.ambient.AmbientMode.AmbientCallbackProvider> android.support.wear.ambient.AmbientMode.AmbientController attachAmbientSupport(T);
+    field public static final java.lang.String EXTRA_BURN_IN_PROTECTION = "com.google.android.wearable.compat.extra.BURN_IN_PROTECTION";
+    field public static final java.lang.String EXTRA_LOWBIT_AMBIENT = "com.google.android.wearable.compat.extra.LOWBIT_AMBIENT";
+    field public static final java.lang.String FRAGMENT_TAG = "android.support.wearable.ambient.AmbientMode";
+  }
+
+  public static abstract class AmbientMode.AmbientCallback {
+    ctor public AmbientMode.AmbientCallback();
+    method public void onEnterAmbient(android.os.Bundle);
+    method public void onExitAmbient();
+    method public void onUpdateAmbient();
+  }
+
+  public static abstract interface AmbientMode.AmbientCallbackProvider {
+    method public abstract android.support.wear.ambient.AmbientMode.AmbientCallback getAmbientCallback();
+  }
+
+  public final class AmbientMode.AmbientController {
+    method public boolean isAmbient();
+    method public void setAutoResumeEnabled(boolean);
+  }
+
+}
+
 package android.support.wear.utils {
 
   public class MetadataConstants {
diff --git a/wear/build.gradle b/wear/build.gradle
index f471bc0..814f5cf 100644
--- a/wear/build.gradle
+++ b/wear/build.gradle
@@ -3,6 +3,7 @@
 dependencies {
     api project(':support-annotations')
     api project(':support-core-ui')
+    api project(':support-fragment')
     api project(':percent')
     api project(':recyclerview-v7')
 
@@ -10,6 +11,8 @@
     androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
     androidTestImplementation libs.mockito_core,     { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
     androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+
+    provided fileTree(dir: 'wear_stubs', include: ['com.google.android.wearable-stubs.jar'])
 }
 
 android {
@@ -18,8 +21,10 @@
     }
 
     sourceSets {
-        main.java.srcDir 'src'
         main.res.srcDirs 'res', 'res-public'
+        main.resources {
+            includes = ["wear_stubs/LICENSE"]
+        }
     }
 
     buildTypes.all {
@@ -32,4 +37,9 @@
     publish true
     inceptionYear '2016'
     description 'Android Wear Support UI'
+
+    license {
+        name 'The Apache Software License, Version 2.0'
+        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+    }
 }
diff --git a/wear/src/main/java/android/support/wear/ambient/AmbientDelegate.java b/wear/src/main/java/android/support/wear/ambient/AmbientDelegate.java
new file mode 100644
index 0000000..4901290
--- /dev/null
+++ b/wear/src/main/java/android/support/wear/ambient/AmbientDelegate.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.support.wear.ambient;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.util.Log;
+
+import com.google.android.wearable.compat.WearableActivityController;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Method;
+
+/**
+ * Provides compatibility for ambient mode.
+ */
+final class AmbientDelegate {
+
+    private static final String TAG = "AmbientDelegate";
+
+    private WearableActivityController mWearableController;
+
+    private static boolean sInitAutoResumeEnabledMethod;
+    private static boolean sHasAutoResumeEnabledMethod;
+    private final WearableControllerProvider mWearableControllerProvider;
+    private final AmbientCallback mCallback;
+    private final WeakReference<Activity> mActivity;
+
+    /**
+     * AmbientCallback must be implemented by all users of the delegate.
+     */
+    interface AmbientCallback {
+        /**
+         * Called when an activity is entering ambient mode. This event is sent while an activity is
+         * running (after onResume, before onPause). All drawing should complete by the conclusion
+         * of this method. Note that {@code invalidate()} calls will be executed before resuming
+         * lower-power mode.
+         * <p>
+         * <p><em>Derived classes must call through to the super class's implementation of this
+         * method. If they do not, an exception will be thrown.</em>
+         *
+         * @param ambientDetails bundle containing information about the display being used.
+         *                      It includes information about low-bit color and burn-in protection.
+         */
+        void onEnterAmbient(Bundle ambientDetails);
+
+        /**
+         * Called when the system is updating the display for ambient mode. Activities may use this
+         * opportunity to update or invalidate views.
+         */
+        void onUpdateAmbient();
+
+        /**
+         * Called when an activity should exit ambient mode. This event is sent while an activity is
+         * running (after onResume, before onPause).
+         * <p>
+         * <p><em>Derived classes must call through to the super class's implementation of this
+         * method. If they do not, an exception will be thrown.</em>
+         */
+        void onExitAmbient();
+    }
+
+    AmbientDelegate(@Nullable Activity activity,
+                           @NonNull WearableControllerProvider wearableControllerProvider,
+                           @NonNull AmbientCallback callback) {
+        mActivity = new WeakReference<>(activity);
+        mCallback = callback;
+        mWearableControllerProvider = wearableControllerProvider;
+    }
+
+    /**
+     * Receives and handles the onCreate call from the associated {@link AmbientMode}
+     */
+    void onCreate() {
+        Activity activity = mActivity.get();
+        if (activity != null) {
+            mWearableController =
+                    mWearableControllerProvider.getWearableController(activity, mCallback);
+        }
+        if (mWearableController != null) {
+            mWearableController.onCreate();
+        }
+    }
+
+    /**
+     * Receives and handles the onResume call from the associated {@link AmbientMode}
+     */
+    void onResume() {
+        if (mWearableController != null) {
+            mWearableController.onResume();
+        }
+    }
+
+    /**
+     * Receives and handles the onPause call from the associated {@link AmbientMode}
+     */
+    void onPause() {
+        if (mWearableController != null) {
+            mWearableController.onPause();
+        }
+    }
+
+    /**
+     * Receives and handles the onStop call from the associated {@link AmbientMode}
+     */
+    void onStop() {
+        if (mWearableController != null) {
+            mWearableController.onStop();
+        }
+    }
+
+    /**
+     * Receives and handles the onDestroy call from the associated {@link AmbientMode}
+     */
+    void onDestroy() {
+        if (mWearableController != null) {
+            mWearableController.onDestroy();
+        }
+    }
+
+    /**
+     * Sets that this activity should remain displayed when the system enters ambient mode. The
+     * default is false. In this case, the activity is stopped when the system enters ambient mode.
+     */
+    void setAmbientEnabled() {
+        if (mWearableController != null) {
+            mWearableController.setAmbientEnabled();
+        }
+    }
+
+    /**
+     * Sets whether this activity's task should be moved to the front when the system exits ambient
+     * mode. If true, the activity's task may be moved to the front if it was the last activity to
+     * be running when ambient started, depending on how much time the system spent in ambient mode.
+     */
+    void setAutoResumeEnabled(boolean enabled) {
+        if (mWearableController != null) {
+            if (hasSetAutoResumeEnabledMethod()) {
+                mWearableController.setAutoResumeEnabled(enabled);
+            }
+        }
+    }
+
+    /**
+     * @return {@code true} if the activity is currently in ambient.
+     */
+    boolean isAmbient() {
+        if (mWearableController != null) {
+            return mWearableController.isAmbient();
+        }
+        return false;
+    }
+
+    /**
+     * Dump the current state of the wearableController responsible for implementing the Ambient
+     * mode.
+     */
+    void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+        if (mWearableController != null) {
+            mWearableController.dump(prefix, fd, writer, args);
+        }
+    }
+
+    private boolean hasSetAutoResumeEnabledMethod() {
+        if (!sInitAutoResumeEnabledMethod) {
+            sInitAutoResumeEnabledMethod = true;
+            try {
+                Method method =
+                        WearableActivityController.class
+                                .getDeclaredMethod("setAutoResumeEnabled", boolean.class);
+                // Proguard is sneaky -- it will actually rewrite strings it finds in addition to
+                // function names. Therefore add a "." prefix to the method name check to ensure the
+                // function was not renamed by proguard.
+                if (!(".setAutoResumeEnabled".equals("." + method.getName()))) {
+                    throw new NoSuchMethodException();
+                }
+                sHasAutoResumeEnabledMethod = true;
+            } catch (NoSuchMethodException e) {
+                Log.w(
+                        "WearableActivity",
+                        "Could not find a required method for auto-resume "
+                                + "support, likely due to proguard optimization. Please add "
+                                + "com.google.android.wearable:wearable jar to the list of library "
+                                + "jars for your project");
+                sHasAutoResumeEnabledMethod = false;
+            }
+        }
+        return sHasAutoResumeEnabledMethod;
+    }
+}
diff --git a/wear/src/main/java/android/support/wear/ambient/AmbientMode.java b/wear/src/main/java/android/support/wear/ambient/AmbientMode.java
new file mode 100644
index 0000000..db53dfc
--- /dev/null
+++ b/wear/src/main/java/android/support/wear/ambient/AmbientMode.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.support.wear.ambient;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.CallSuper;
+import android.support.annotation.VisibleForTesting;
+
+import com.google.android.wearable.compat.WearableActivityController;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+/**
+ * Use this as a headless Fragment to add ambient support to an Activity on Wearable devices.
+ * <p>
+ * The application that uses this should add the {@link android.Manifest.permission#WAKE_LOCK}
+ * permission to its manifest.
+ * <p>
+ * The primary entry  point for this code is the {@link #attachAmbientSupport(Activity)} method.
+ * It should be called with an {@link Activity} as an argument and that {@link Activity} will then
+ * be able to receive ambient lifecycle events through an {@link AmbientCallback}. The
+ * {@link Activity} will also receive a {@link AmbientController} object from the attachment which
+ * can be used to query the current status of the ambient mode, or toggle simple settings.
+ * An example of how to attach {@link AmbientMode} to your {@link Activity} and use
+ * the {@link AmbientController} can be found below:
+ * <p>
+ * <pre class="prettyprint">{@code
+ *     AmbientMode.AmbientController controller = AmbientMode.attachAmbientSupport(this);
+ *     controller.setAutoResumeEnabled(true);
+ * }</pre>
+ */
+public final class AmbientMode extends Fragment {
+
+    /**
+     * Property in bundle passed to {@code AmbientCallback#onEnterAmbient(Bundle)} to indicate
+     * whether burn-in protection is required. When this property is set to true, views must be
+     * shifted around periodically in ambient mode. To ensure that content isn't shifted off
+     * the screen, avoid placing content within 10 pixels of the edge of the screen. Activities
+     * should also avoid solid white areas to prevent pixel burn-in. Both of these requirements
+     * only apply in ambient mode, and only when this property is set to true.
+     */
+    public static final String EXTRA_BURN_IN_PROTECTION =
+            WearableActivityController.EXTRA_BURN_IN_PROTECTION;
+
+    /**
+     * Property in bundle passed to {@code AmbientCallback#onEnterAmbient(Bundle)} to indicate
+     * whether the device has low-bit ambient mode. When this property is set to true, the screen
+     * supports fewer bits for each color in ambient mode. In this case, activities should disable
+     * anti-aliasing in ambient mode.
+     */
+    public static final String EXTRA_LOWBIT_AMBIENT =
+            WearableActivityController.EXTRA_LOWBIT_AMBIENT;
+
+    /**
+     * Fragment tag used by default when adding {@link AmbientMode} to add ambient support to an
+     * {@link Activity}.
+     */
+    public static final String FRAGMENT_TAG = "android.support.wearable.ambient.AmbientMode";
+
+    /**
+     * Interface for any {@link Activity} that wishes to implement Ambient Mode. Use the
+     * {@link #getAmbientCallback()} method to return and {@link AmbientCallback} which can be used
+     * to bind the {@link AmbientMode} to the instantiation of this interface.
+     * <p>
+     * <pre class="prettyprint">{@code
+     * return new AmbientMode.AmbientCallback() {
+     *     public void onEnterAmbient(Bundle ambientDetails) {...}
+     *     public void onExitAmbient(Bundle ambientDetails) {...}
+     *  }
+     * }</pre>
+     */
+    public interface AmbientCallbackProvider {
+        /**
+         * @return the {@link AmbientCallback} to be used by this class to communicate with the
+         * entity interested in ambient events.
+         */
+        AmbientCallback getAmbientCallback();
+    }
+
+    /**
+     * Callback to receive ambient mode state changes. It must be used by all users of AmbientMode.
+     */
+    public abstract static class AmbientCallback {
+        /**
+         * Called when an activity is entering ambient mode. This event is sent while an activity is
+         * running (after onResume, before onPause). All drawing should complete by the conclusion
+         * of this method. Note that {@code invalidate()} calls will be executed before resuming
+         * lower-power mode.
+         * <p>
+         * <p><em>Derived classes must call through to the super class's implementation of this
+         * method. If they do not, an exception will be thrown.</em>
+         *
+         * @param ambientDetails bundle containing information about the display being used.
+         *                      It includes information about low-bit color and burn-in protection.
+         */
+        public void onEnterAmbient(Bundle ambientDetails) {}
+
+        /**
+         * Called when the system is updating the display for ambient mode. Activities may use this
+         * opportunity to update or invalidate views.
+         */
+        public void onUpdateAmbient() {};
+
+        /**
+         * Called when an activity should exit ambient mode. This event is sent while an activity is
+         * running (after onResume, before onPause).
+         * <p>
+         * <p><em>Derived classes must call through to the super class's implementation of this
+         * method. If they do not, an exception will be thrown.</em>
+         */
+        public void onExitAmbient() {};
+    }
+
+    private final AmbientDelegate.AmbientCallback mCallback =
+            new AmbientDelegate.AmbientCallback() {
+                @Override
+                public void onEnterAmbient(Bundle ambientDetails) {
+                    mSuppliedCallback.onEnterAmbient(ambientDetails);
+                }
+
+                @Override
+                public void onExitAmbient() {
+                    mSuppliedCallback.onExitAmbient();
+                }
+
+                @Override
+                public void onUpdateAmbient() {
+                    mSuppliedCallback.onUpdateAmbient();
+                }
+            };
+    private AmbientDelegate mDelegate;
+    private AmbientCallback mSuppliedCallback;
+    private AmbientController mController;
+
+    /**
+     * Constructor
+     */
+    public AmbientMode() {
+        mController = new AmbientController();
+    }
+
+    @Override
+    @CallSuper
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mDelegate = new AmbientDelegate(getActivity(), new WearableControllerProvider(), mCallback);
+
+        if (context instanceof AmbientCallbackProvider) {
+            mSuppliedCallback = ((AmbientCallbackProvider) context).getAmbientCallback();
+        } else {
+            throw new IllegalArgumentException(
+                    "fragment should attach to an activity that implements AmbientCallback");
+        }
+    }
+
+    @Override
+    @CallSuper
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mDelegate.onCreate();
+        mDelegate.setAmbientEnabled();
+    }
+
+    @Override
+    @CallSuper
+    public void onResume() {
+        super.onResume();
+        mDelegate.onResume();
+    }
+
+    @Override
+    @CallSuper
+    public void onPause() {
+        mDelegate.onPause();
+        super.onPause();
+    }
+
+    @Override
+    @CallSuper
+    public void onStop() {
+        mDelegate.onStop();
+        super.onStop();
+    }
+
+    @Override
+    @CallSuper
+    public void onDestroy() {
+        mDelegate.onDestroy();
+        super.onDestroy();
+    }
+
+    @Override
+    @CallSuper
+    public void onDetach() {
+        mDelegate = null;
+        super.onDetach();
+    }
+
+    /**
+     * Attach ambient support to the given activity.
+     *
+     * @param activity the activity to attach ambient support to. This activity has to also
+     *                implement {@link AmbientCallbackProvider}
+     * @return the associated {@link AmbientController} which can be used to query the state of
+     * ambient mode and toggle simple settings related to it.
+     */
+    public static <T extends Activity & AmbientCallbackProvider> AmbientController
+            attachAmbientSupport(T activity) {
+        FragmentManager fragmentManager = activity.getFragmentManager();
+        AmbientMode ambientFragment = (AmbientMode) fragmentManager.findFragmentByTag(FRAGMENT_TAG);
+        if (ambientFragment == null) {
+            AmbientMode fragment = new AmbientMode();
+            fragmentManager
+                    .beginTransaction()
+                    .add(fragment, FRAGMENT_TAG)
+                    .commit();
+            ambientFragment = fragment;
+        }
+        return ambientFragment.mController;
+    }
+
+    @Override
+    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+        if (mDelegate != null) {
+            mDelegate.dump(prefix, fd, writer, args);
+        }
+    }
+
+    @VisibleForTesting
+    void setAmbientDelegate(AmbientDelegate delegate) {
+        mDelegate = delegate;
+    }
+
+    /**
+     * A class for interacting with the ambient mode on a wearable device. This class can be used to
+     * query the current state of ambient mode and to enable or disable certain settings.
+     * An instance of this class is returned to the user when they attach their {@link Activity}
+     * to {@link AmbientMode}.
+     */
+    public final class AmbientController {
+        private static final String TAG = "AmbientController";
+
+        // Do not initialize outside of this class.
+        AmbientController() {}
+
+        /**
+         * @return {@code true} if the activity is currently in ambient.
+         */
+        public boolean isAmbient() {
+            return mDelegate == null ? false : mDelegate.isAmbient();
+        }
+    }
+}
diff --git a/wear/src/main/java/android/support/wear/ambient/SharedLibraryVersion.java b/wear/src/main/java/android/support/wear/ambient/SharedLibraryVersion.java
new file mode 100644
index 0000000..cd90a3b
--- /dev/null
+++ b/wear/src/main/java/android/support/wear/ambient/SharedLibraryVersion.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.support.wear.ambient;
+
+import android.os.Build;
+import android.support.annotation.RestrictTo;
+import android.support.annotation.VisibleForTesting;
+
+import com.google.android.wearable.WearableSharedLib;
+
+/**
+ * Internal class which can be used to determine the version of the wearable shared library that is
+ * available on the current device.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+final class SharedLibraryVersion {
+
+    private SharedLibraryVersion() {
+    }
+
+    /**
+     * Returns the version of the wearable shared library available on the current device.
+     * <p>
+     * <p>Version 1 was introduced on 2016-09-26, so any previous shared library will return 0. In
+     * those cases, it may be necessary to check {@code Build.VERSION.SDK_INT}.
+     *
+     * @throws IllegalStateException if the Wearable Shared Library is not present, which means that
+     * the {@code <uses-library>} tag is missing.
+     */
+    public static int version() {
+        verifySharedLibraryPresent();
+        return VersionHolder.VERSION;
+    }
+
+    /**
+     * Throws {@link IllegalStateException} if the Wearable Shared Library is not present and API
+     * level is at least LMP MR1.
+     * <p>
+     * <p>This validates that the developer hasn't forgotten to include a {@code <uses-library>} tag
+     * in their manifest. The method should be used in combination with API level checks for
+     * features added before {@link #version() version} 1.
+     */
+    public static void verifySharedLibraryPresent() {
+        if (!PresenceHolder.PRESENT) {
+            throw new IllegalStateException("Could not find wearable shared library classes. "
+                    + "Please add <uses-library android:name=\"com.google.android.wearable\" "
+                    + "android:required=\"false\" /> to the application manifest");
+        }
+    }
+
+    // Lazy initialization holder class (see Effective Java item 71)
+    @VisibleForTesting
+    static final class VersionHolder {
+        static final int VERSION = getSharedLibVersion(Build.VERSION.SDK_INT);
+
+        @VisibleForTesting
+        static int getSharedLibVersion(int sdkInt) {
+            if (sdkInt < Build.VERSION_CODES.N_MR1) {
+                // WearableSharedLib was introduced in N MR1 (Wear FDP 4)
+                return 0;
+            }
+            return WearableSharedLib.version();
+        }
+    }
+
+    // Lazy initialization holder class (see Effective Java item 71)
+    @VisibleForTesting
+    static final class PresenceHolder {
+        static final boolean PRESENT = isSharedLibPresent(Build.VERSION.SDK_INT);
+
+        @VisibleForTesting
+        static boolean isSharedLibPresent(int sdkInt) {
+            try {
+                // A class which has been available on the shared library from the first version.
+                Class.forName("com.google.android.wearable.compat.WearableActivityController");
+            } catch (ClassNotFoundException e) {
+                return false;
+            }
+            return true;
+        }
+    }
+}
diff --git a/wear/src/main/java/android/support/wear/ambient/WearableControllerProvider.java b/wear/src/main/java/android/support/wear/ambient/WearableControllerProvider.java
new file mode 100644
index 0000000..1682dc0
--- /dev/null
+++ b/wear/src/main/java/android/support/wear/ambient/WearableControllerProvider.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.support.wear.ambient;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.annotation.RestrictTo;
+
+import com.google.android.wearable.compat.WearableActivityController;
+
+import java.lang.reflect.Method;
+
+/**
+ * Provides a {@link WearableActivityController} for ambient mode control.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class WearableControllerProvider {
+
+    private static final String TAG = "WearableControllerProvider";
+
+    private static volatile boolean sAmbientCallbacksVerifiedPresent;
+
+    /**
+     * Retrieves a {@link WearableActivityController} to use for ambient mode.
+     *
+     * @param activity The {@link Activity} to be associated with the Controller.
+     * @param callback The {@link AmbientDelegate.AmbientCallback} for the Controller.
+     * @return the platform-appropriate version of the {@link WearableActivityController}.
+     */
+    public WearableActivityController getWearableController(Activity activity,
+            final AmbientDelegate.AmbientCallback callback) {
+        SharedLibraryVersion.verifySharedLibraryPresent();
+
+        // The AmbientCallback is an abstract class instead of an interface.
+        WearableActivityController.AmbientCallback callbackBridge =
+                new WearableActivityController.AmbientCallback() {
+                    @Override
+                    public void onEnterAmbient(Bundle ambientDetails) {
+                        callback.onEnterAmbient(ambientDetails);
+                    }
+
+                    @Override
+                    public void onUpdateAmbient() {
+                        callback.onUpdateAmbient();
+                    }
+
+                    @Override
+                    public void onExitAmbient() {
+                        callback.onExitAmbient();
+                    }
+                };
+
+        verifyAmbientCallbacksPresent();
+
+        return new WearableActivityController(TAG, activity, callbackBridge);
+    }
+
+    private static void verifyAmbientCallbacksPresent() {
+        if (sAmbientCallbacksVerifiedPresent) {
+            return;
+        }
+        try {
+            Method method =
+                    WearableActivityController.AmbientCallback.class.getDeclaredMethod(
+                            "onEnterAmbient", Bundle.class);
+            // Proguard is sneaky -- it will actually rewrite strings it finds in addition to
+            // function names. Therefore add a "." prefix to the method name check to ensure the
+            // function was not renamed by proguard.
+            if (!(".onEnterAmbient".equals("." + method.getName()))) {
+                throw new NoSuchMethodException();
+            }
+        } catch (NoSuchMethodException e) {
+            throw new IllegalStateException(
+                    "Could not find a required method for "
+                            + "ambient support, likely due to proguard optimization. Please add "
+                            + "com.google.android.wearable:wearable jar to the list of library jars"
+                            + " for your project");
+        }
+        sAmbientCallbacksVerifiedPresent = true;
+    }
+}
diff --git a/wear/src/android/support/wear/internal/widget/ResourcesUtil.java b/wear/src/main/java/android/support/wear/internal/widget/ResourcesUtil.java
similarity index 100%
rename from wear/src/android/support/wear/internal/widget/ResourcesUtil.java
rename to wear/src/main/java/android/support/wear/internal/widget/ResourcesUtil.java
diff --git a/wear/src/android/support/wear/internal/widget/drawer/MultiPagePresenter.java b/wear/src/main/java/android/support/wear/internal/widget/drawer/MultiPagePresenter.java
similarity index 100%
rename from wear/src/android/support/wear/internal/widget/drawer/MultiPagePresenter.java
rename to wear/src/main/java/android/support/wear/internal/widget/drawer/MultiPagePresenter.java
diff --git a/wear/src/android/support/wear/internal/widget/drawer/MultiPageUi.java b/wear/src/main/java/android/support/wear/internal/widget/drawer/MultiPageUi.java
similarity index 100%
rename from wear/src/android/support/wear/internal/widget/drawer/MultiPageUi.java
rename to wear/src/main/java/android/support/wear/internal/widget/drawer/MultiPageUi.java
diff --git a/wear/src/android/support/wear/internal/widget/drawer/SinglePagePresenter.java b/wear/src/main/java/android/support/wear/internal/widget/drawer/SinglePagePresenter.java
similarity index 100%
rename from wear/src/android/support/wear/internal/widget/drawer/SinglePagePresenter.java
rename to wear/src/main/java/android/support/wear/internal/widget/drawer/SinglePagePresenter.java
diff --git a/wear/src/android/support/wear/internal/widget/drawer/SinglePageUi.java b/wear/src/main/java/android/support/wear/internal/widget/drawer/SinglePageUi.java
similarity index 100%
rename from wear/src/android/support/wear/internal/widget/drawer/SinglePageUi.java
rename to wear/src/main/java/android/support/wear/internal/widget/drawer/SinglePageUi.java
diff --git a/wear/src/android/support/wear/internal/widget/drawer/WearableNavigationDrawerPresenter.java b/wear/src/main/java/android/support/wear/internal/widget/drawer/WearableNavigationDrawerPresenter.java
similarity index 100%
rename from wear/src/android/support/wear/internal/widget/drawer/WearableNavigationDrawerPresenter.java
rename to wear/src/main/java/android/support/wear/internal/widget/drawer/WearableNavigationDrawerPresenter.java
diff --git a/wear/src/android/support/wear/internal/widget/drawer/package-info.java b/wear/src/main/java/android/support/wear/internal/widget/drawer/package-info.java
similarity index 100%
rename from wear/src/android/support/wear/internal/widget/drawer/package-info.java
rename to wear/src/main/java/android/support/wear/internal/widget/drawer/package-info.java
diff --git a/wear/src/android/support/wear/utils/MetadataConstants.java b/wear/src/main/java/android/support/wear/utils/MetadataConstants.java
similarity index 100%
rename from wear/src/android/support/wear/utils/MetadataConstants.java
rename to wear/src/main/java/android/support/wear/utils/MetadataConstants.java
diff --git a/wear/src/android/support/wear/widget/BezierSCurveInterpolator.java b/wear/src/main/java/android/support/wear/widget/BezierSCurveInterpolator.java
similarity index 100%
rename from wear/src/android/support/wear/widget/BezierSCurveInterpolator.java
rename to wear/src/main/java/android/support/wear/widget/BezierSCurveInterpolator.java
diff --git a/wear/src/android/support/wear/widget/BoxInsetLayout.java b/wear/src/main/java/android/support/wear/widget/BoxInsetLayout.java
similarity index 100%
rename from wear/src/android/support/wear/widget/BoxInsetLayout.java
rename to wear/src/main/java/android/support/wear/widget/BoxInsetLayout.java
diff --git a/wear/src/android/support/wear/widget/CircledImageView.java b/wear/src/main/java/android/support/wear/widget/CircledImageView.java
similarity index 100%
rename from wear/src/android/support/wear/widget/CircledImageView.java
rename to wear/src/main/java/android/support/wear/widget/CircledImageView.java
diff --git a/wear/src/android/support/wear/widget/CircularProgressLayout.java b/wear/src/main/java/android/support/wear/widget/CircularProgressLayout.java
similarity index 100%
rename from wear/src/android/support/wear/widget/CircularProgressLayout.java
rename to wear/src/main/java/android/support/wear/widget/CircularProgressLayout.java
diff --git a/wear/src/android/support/wear/widget/CircularProgressLayoutController.java b/wear/src/main/java/android/support/wear/widget/CircularProgressLayoutController.java
similarity index 100%
rename from wear/src/android/support/wear/widget/CircularProgressLayoutController.java
rename to wear/src/main/java/android/support/wear/widget/CircularProgressLayoutController.java
diff --git a/wear/src/android/support/wear/widget/CurvingLayoutCallback.java b/wear/src/main/java/android/support/wear/widget/CurvingLayoutCallback.java
similarity index 100%
rename from wear/src/android/support/wear/widget/CurvingLayoutCallback.java
rename to wear/src/main/java/android/support/wear/widget/CurvingLayoutCallback.java
diff --git a/wear/src/android/support/wear/widget/ProgressDrawable.java b/wear/src/main/java/android/support/wear/widget/ProgressDrawable.java
similarity index 100%
rename from wear/src/android/support/wear/widget/ProgressDrawable.java
rename to wear/src/main/java/android/support/wear/widget/ProgressDrawable.java
diff --git a/wear/src/android/support/wear/widget/RoundedDrawable.java b/wear/src/main/java/android/support/wear/widget/RoundedDrawable.java
similarity index 100%
rename from wear/src/android/support/wear/widget/RoundedDrawable.java
rename to wear/src/main/java/android/support/wear/widget/RoundedDrawable.java
diff --git a/wear/src/android/support/wear/widget/ScrollManager.java b/wear/src/main/java/android/support/wear/widget/ScrollManager.java
similarity index 100%
rename from wear/src/android/support/wear/widget/ScrollManager.java
rename to wear/src/main/java/android/support/wear/widget/ScrollManager.java
diff --git a/wear/src/android/support/wear/widget/SimpleAnimatorListener.java b/wear/src/main/java/android/support/wear/widget/SimpleAnimatorListener.java
similarity index 100%
rename from wear/src/android/support/wear/widget/SimpleAnimatorListener.java
rename to wear/src/main/java/android/support/wear/widget/SimpleAnimatorListener.java
diff --git a/wear/src/android/support/wear/widget/SwipeDismissFrameLayout.java b/wear/src/main/java/android/support/wear/widget/SwipeDismissFrameLayout.java
similarity index 100%
rename from wear/src/android/support/wear/widget/SwipeDismissFrameLayout.java
rename to wear/src/main/java/android/support/wear/widget/SwipeDismissFrameLayout.java
diff --git a/wear/src/android/support/wear/widget/SwipeDismissLayout.java b/wear/src/main/java/android/support/wear/widget/SwipeDismissLayout.java
similarity index 100%
rename from wear/src/android/support/wear/widget/SwipeDismissLayout.java
rename to wear/src/main/java/android/support/wear/widget/SwipeDismissLayout.java
diff --git a/wear/src/android/support/wear/widget/WearableLinearLayoutManager.java b/wear/src/main/java/android/support/wear/widget/WearableLinearLayoutManager.java
similarity index 100%
rename from wear/src/android/support/wear/widget/WearableLinearLayoutManager.java
rename to wear/src/main/java/android/support/wear/widget/WearableLinearLayoutManager.java
diff --git a/wear/src/android/support/wear/widget/WearableRecyclerView.java b/wear/src/main/java/android/support/wear/widget/WearableRecyclerView.java
similarity index 100%
rename from wear/src/android/support/wear/widget/WearableRecyclerView.java
rename to wear/src/main/java/android/support/wear/widget/WearableRecyclerView.java
diff --git a/wear/src/android/support/wear/widget/drawer/AbsListViewFlingWatcher.java b/wear/src/main/java/android/support/wear/widget/drawer/AbsListViewFlingWatcher.java
similarity index 100%
rename from wear/src/android/support/wear/widget/drawer/AbsListViewFlingWatcher.java
rename to wear/src/main/java/android/support/wear/widget/drawer/AbsListViewFlingWatcher.java
diff --git a/wear/src/android/support/wear/widget/drawer/FlingWatcherFactory.java b/wear/src/main/java/android/support/wear/widget/drawer/FlingWatcherFactory.java
similarity index 100%
rename from wear/src/android/support/wear/widget/drawer/FlingWatcherFactory.java
rename to wear/src/main/java/android/support/wear/widget/drawer/FlingWatcherFactory.java
diff --git a/wear/src/android/support/wear/widget/drawer/NestedScrollViewFlingWatcher.java b/wear/src/main/java/android/support/wear/widget/drawer/NestedScrollViewFlingWatcher.java
similarity index 100%
rename from wear/src/android/support/wear/widget/drawer/NestedScrollViewFlingWatcher.java
rename to wear/src/main/java/android/support/wear/widget/drawer/NestedScrollViewFlingWatcher.java
diff --git a/wear/src/android/support/wear/widget/drawer/PageIndicatorView.java b/wear/src/main/java/android/support/wear/widget/drawer/PageIndicatorView.java
similarity index 100%
rename from wear/src/android/support/wear/widget/drawer/PageIndicatorView.java
rename to wear/src/main/java/android/support/wear/widget/drawer/PageIndicatorView.java
diff --git a/wear/src/android/support/wear/widget/drawer/RecyclerViewFlingWatcher.java b/wear/src/main/java/android/support/wear/widget/drawer/RecyclerViewFlingWatcher.java
similarity index 100%
rename from wear/src/android/support/wear/widget/drawer/RecyclerViewFlingWatcher.java
rename to wear/src/main/java/android/support/wear/widget/drawer/RecyclerViewFlingWatcher.java
diff --git a/wear/src/android/support/wear/widget/drawer/ScrollViewFlingWatcher.java b/wear/src/main/java/android/support/wear/widget/drawer/ScrollViewFlingWatcher.java
similarity index 100%
rename from wear/src/android/support/wear/widget/drawer/ScrollViewFlingWatcher.java
rename to wear/src/main/java/android/support/wear/widget/drawer/ScrollViewFlingWatcher.java
diff --git a/wear/src/android/support/wear/widget/drawer/WearableActionDrawerMenu.java b/wear/src/main/java/android/support/wear/widget/drawer/WearableActionDrawerMenu.java
similarity index 100%
rename from wear/src/android/support/wear/widget/drawer/WearableActionDrawerMenu.java
rename to wear/src/main/java/android/support/wear/widget/drawer/WearableActionDrawerMenu.java
diff --git a/wear/src/android/support/wear/widget/drawer/WearableActionDrawerView.java b/wear/src/main/java/android/support/wear/widget/drawer/WearableActionDrawerView.java
similarity index 100%
rename from wear/src/android/support/wear/widget/drawer/WearableActionDrawerView.java
rename to wear/src/main/java/android/support/wear/widget/drawer/WearableActionDrawerView.java
diff --git a/wear/src/android/support/wear/widget/drawer/WearableDrawerController.java b/wear/src/main/java/android/support/wear/widget/drawer/WearableDrawerController.java
similarity index 100%
rename from wear/src/android/support/wear/widget/drawer/WearableDrawerController.java
rename to wear/src/main/java/android/support/wear/widget/drawer/WearableDrawerController.java
diff --git a/wear/src/android/support/wear/widget/drawer/WearableDrawerLayout.java b/wear/src/main/java/android/support/wear/widget/drawer/WearableDrawerLayout.java
similarity index 100%
rename from wear/src/android/support/wear/widget/drawer/WearableDrawerLayout.java
rename to wear/src/main/java/android/support/wear/widget/drawer/WearableDrawerLayout.java
diff --git a/wear/src/android/support/wear/widget/drawer/WearableDrawerView.java b/wear/src/main/java/android/support/wear/widget/drawer/WearableDrawerView.java
similarity index 100%
rename from wear/src/android/support/wear/widget/drawer/WearableDrawerView.java
rename to wear/src/main/java/android/support/wear/widget/drawer/WearableDrawerView.java
diff --git a/wear/src/android/support/wear/widget/drawer/WearableNavigationDrawerView.java b/wear/src/main/java/android/support/wear/widget/drawer/WearableNavigationDrawerView.java
similarity index 100%
rename from wear/src/android/support/wear/widget/drawer/WearableNavigationDrawerView.java
rename to wear/src/main/java/android/support/wear/widget/drawer/WearableNavigationDrawerView.java
diff --git a/wear/tests/AndroidManifest.xml b/wear/tests/AndroidManifest.xml
index 834e067..ce78477 100644
--- a/wear/tests/AndroidManifest.xml
+++ b/wear/tests/AndroidManifest.xml
@@ -48,6 +48,13 @@
                 <category android:name="android.intent.category.LAUNCHER"/>
             </intent-filter>
         </activity>
+
+        <activity android:name="android.support.wear.ambient.AmbientModeTestActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity>
         <!-- Test app is iOS compatible. -->
         <meta-data
             android:name="com.google.android.wearable.standalone"
diff --git a/wear/tests/src/android/support/wear/ambient/AmbientDelegateTest.java b/wear/tests/src/android/support/wear/ambient/AmbientDelegateTest.java
new file mode 100644
index 0000000..32f9bb6
--- /dev/null
+++ b/wear/tests/src/android/support/wear/ambient/AmbientDelegateTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.support.wear.ambient;
+
+import static junit.framework.Assert.assertFalse;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.app.FragmentActivity;
+
+import com.google.android.wearable.compat.WearableActivityController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+/**
+ * Tests for {@link AmbientDelegate}.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AmbientDelegateTest {
+
+    @Mock
+    AmbientDelegate.AmbientCallback mMockAmbientCallback;
+    @Mock
+    WearableControllerProvider mMockWearableControllerProvider;
+    @Mock
+    WearableActivityController mMockWearableController;
+    @Mock
+    FragmentActivity mMockActivity;
+
+    private AmbientDelegate mAmbientDelegateUnderTest;
+
+    @Before
+    public void setUp() {
+        mMockAmbientCallback = mock(AmbientDelegate.AmbientCallback.class);
+        mMockWearableControllerProvider = mock(WearableControllerProvider.class);
+        mMockWearableController = mock(WearableActivityController.class);
+        mMockActivity = mock(FragmentActivity.class);
+        when(mMockWearableControllerProvider
+                .getWearableController(mMockActivity, mMockAmbientCallback))
+                .thenReturn(mMockWearableController);
+    }
+
+    @Test
+    public void testNullActivity() {
+        mAmbientDelegateUnderTest = new AmbientDelegate(null,
+                mMockWearableControllerProvider, mMockAmbientCallback);
+        verifyZeroInteractions(mMockWearableControllerProvider);
+
+        assertFalse(mAmbientDelegateUnderTest.isAmbient());
+
+    }
+
+    @Test
+    public void testActivityPresent() {
+        mAmbientDelegateUnderTest = new AmbientDelegate(mMockActivity,
+                mMockWearableControllerProvider, mMockAmbientCallback);
+
+        mAmbientDelegateUnderTest.onCreate();
+        verify(mMockWearableController).onCreate();
+
+        mAmbientDelegateUnderTest.onResume();
+        verify(mMockWearableController).onResume();
+
+        mAmbientDelegateUnderTest.onPause();
+        verify(mMockWearableController).onPause();
+
+        mAmbientDelegateUnderTest.onStop();
+        verify(mMockWearableController).onStop();
+
+        mAmbientDelegateUnderTest.onDestroy();
+        verify(mMockWearableController).onDestroy();
+    }
+}
diff --git a/wear/tests/src/android/support/wear/ambient/AmbientModeTest.java b/wear/tests/src/android/support/wear/ambient/AmbientModeTest.java
new file mode 100644
index 0000000..301c513
--- /dev/null
+++ b/wear/tests/src/android/support/wear/ambient/AmbientModeTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.wear.ambient;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.wear.widget.util.WakeLockRule;
+
+import com.google.android.wearable.compat.WearableActivityController;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class AmbientModeTest {
+    @Rule
+    public final WakeLockRule mWakeLock = new WakeLockRule();
+
+    @Rule
+    public final ActivityTestRule<AmbientModeTestActivity> mActivityRule = new ActivityTestRule<>(
+            AmbientModeTestActivity.class);
+
+    @Test
+    public void testEnterAmbientCallback() throws Throwable {
+        AmbientModeTestActivity activity = mActivityRule.getActivity();
+
+        WearableActivityController.getLastInstance().enterAmbient();
+        assertTrue(activity.mEnterAmbientCalled);
+        assertFalse(activity.mUpdateAmbientCalled);
+        assertFalse(activity.mExitAmbientCalled);
+    }
+
+    @Test
+    public void testUpdateAmbientCallback() throws Throwable {
+        AmbientModeTestActivity activity = mActivityRule.getActivity();
+
+        WearableActivityController.getLastInstance().updateAmbient();
+        assertFalse(activity.mEnterAmbientCalled);
+        assertTrue(activity.mUpdateAmbientCalled);
+        assertFalse(activity.mExitAmbientCalled);
+    }
+
+    @Test
+    public void testExitAmbientCallback() throws Throwable {
+        AmbientModeTestActivity activity = mActivityRule.getActivity();
+
+        WearableActivityController.getLastInstance().exitAmbient();
+        assertFalse(activity.mEnterAmbientCalled);
+        assertFalse(activity.mUpdateAmbientCalled);
+        assertTrue(activity.mExitAmbientCalled);
+    }
+
+    @Test
+    public void testIsAmbientEnabled() {
+        assertTrue(WearableActivityController.getLastInstance().isAmbientEnabled());
+    }
+
+    @Test
+    public void testCallsControllerIsAmbient() {
+        AmbientModeTestActivity activity = mActivityRule.getActivity();
+
+        WearableActivityController.getLastInstance().setAmbient(true);
+        assertTrue(activity.getAmbientController().isAmbient());
+
+        WearableActivityController.getLastInstance().setAmbient(false);
+        assertFalse(activity.getAmbientController().isAmbient());
+    }
+}
diff --git a/wear/tests/src/android/support/wear/ambient/AmbientModeTestActivity.java b/wear/tests/src/android/support/wear/ambient/AmbientModeTestActivity.java
new file mode 100644
index 0000000..26155d8
--- /dev/null
+++ b/wear/tests/src/android/support/wear/ambient/AmbientModeTestActivity.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.support.wear.ambient;
+
+import android.os.Bundle;
+import android.support.v4.app.FragmentActivity;
+
+public class AmbientModeTestActivity extends FragmentActivity
+        implements AmbientMode.AmbientCallbackProvider {
+    AmbientMode.AmbientController mAmbientController;
+
+    boolean mEnterAmbientCalled;
+    boolean mUpdateAmbientCalled;
+    boolean mExitAmbientCalled;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mAmbientController = AmbientMode.attachAmbientSupport(this);
+    }
+
+    @Override
+    public AmbientMode.AmbientCallback getAmbientCallback() {
+        return new MyAmbientCallback();
+    }
+
+    private class MyAmbientCallback extends AmbientMode.AmbientCallback {
+
+        @Override
+        public void onEnterAmbient(Bundle ambientDetails) {
+            mEnterAmbientCalled = true;
+        }
+
+        @Override
+        public void onUpdateAmbient() {
+            mUpdateAmbientCalled = true;
+        }
+
+        @Override
+        public void onExitAmbient() {
+            mExitAmbientCalled = true;
+        }
+    }
+
+    public AmbientMode.AmbientController getAmbientController() {
+        return mAmbientController;
+    }
+
+}
diff --git a/wear/tests/src/com/google/android/wearable/compat/WearableActivityController.java b/wear/tests/src/com/google/android/wearable/compat/WearableActivityController.java
new file mode 100644
index 0000000..7823f23
--- /dev/null
+++ b/wear/tests/src/com/google/android/wearable/compat/WearableActivityController.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.wearable.compat;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * Mock version of {@link WearableActivityController}. During instrumentation testing, the tests
+ * would end up using this instead of the version implemented on device.
+ */
+public class WearableActivityController {
+
+    private static WearableActivityController sLastInstance;
+
+    public static WearableActivityController getLastInstance() {
+        return sLastInstance;
+    }
+
+    private AmbientCallback mCallback;
+    private boolean mAmbientEnabled = false;
+    private boolean mAutoResumeEnabled = false;
+    private boolean mAmbient = false;
+
+    public WearableActivityController(String tag, Activity activity, AmbientCallback callback) {
+        sLastInstance = this;
+        mCallback = callback;
+    }
+
+    // Methods required by the stub but not currently used in tests.
+    public void onCreate() {}
+    public void onResume() {}
+    public void onPause() {}
+    public void onStop() {}
+    public void onDestroy() {}
+
+    public void enterAmbient() {
+        mCallback.onEnterAmbient(null);
+    }
+
+    public void exitAmbient() {
+        mCallback.onExitAmbient();
+    }
+
+    public void updateAmbient() {
+        mCallback.onUpdateAmbient();
+    }
+
+    public void setAmbientEnabled() {
+        mAmbientEnabled = true;
+    }
+
+    public boolean isAmbientEnabled() {
+        return mAmbientEnabled;
+    }
+
+    public void setAutoResumeEnabled(boolean enabled) {
+        mAutoResumeEnabled = enabled;
+    }
+
+    public boolean isAutoResumeEnabled() {
+        return mAutoResumeEnabled;
+    }
+
+    public final boolean isAmbient() {
+        return mAmbient;
+    }
+
+    public void setAmbient(boolean ambient) {
+        mAmbient = ambient;
+    }
+
+    /** Stub version of {@link WearableActivityController.AmbientCallback}. */
+    public static class AmbientCallback {
+        public void onEnterAmbient(Bundle ambientDetails) {}
+
+        public void onExitAmbient() {}
+
+        public void onUpdateAmbient() {}
+    }
+}
diff --git a/wear/wear_stubs/LICENSE b/wear/wear_stubs/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/wear/wear_stubs/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/wear/wear_stubs/README.android b/wear/wear_stubs/README.android
new file mode 100644
index 0000000..5fdff39
--- /dev/null
+++ b/wear/wear_stubs/README.android
@@ -0,0 +1,10 @@
+# Wearable support system stubs from http://ab/4131273
+This library contains system stubs generated for the
+com.google.android.wearable.jar shared library. Classes in the 1st/3rd party
+accessible wearable support library are able to access these apis.
+
+See `vendor/google_clockwork/libs/wearable` in Android Git.
+
+Imports to this directory must always be done from the Android Build server.
+To test with local changes made in Android Git see the instructions at
+http://go/clockwork-dev/device-builds.
diff --git a/wear/wear_stubs/api/1.txt b/wear/wear_stubs/api/1.txt
new file mode 100644
index 0000000..af53c8e
--- /dev/null
+++ b/wear/wear_stubs/api/1.txt
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.wearable {
+
+  public final class WearableSharedLib {
+    method public static int version();
+  }
+
+}
+
+package com.google.android.wearable.compat {
+
+  public class WearableActivityController {
+    ctor public WearableActivityController(java.lang.String, android.app.Activity, com.google.android.wearable.compat.WearableActivityController.AmbientCallback);
+    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public final boolean isAmbient();
+    method public void onCreate();
+    method public void onDestroy();
+    method public void onPause();
+    method public void onResume();
+    method public void onStop();
+    method public final void setAmbientEnabled();
+    method public final void setAutoResumeEnabled(boolean);
+    field public static final java.lang.String EXTRA_BURN_IN_PROTECTION = "com.google.android.wearable.compat.extra.BURN_IN_PROTECTION";
+    field public static final java.lang.String EXTRA_LOWBIT_AMBIENT = "com.google.android.wearable.compat.extra.LOWBIT_AMBIENT";
+  }
+
+  public static abstract class WearableActivityController.AmbientCallback {
+    ctor public WearableActivityController.AmbientCallback();
+    method public void onEnterAmbient(android.os.Bundle);
+    method public void onExitAmbient();
+    method public void onUpdateAmbient();
+  }
+
+}
+
+package com.google.android.wearable.input {
+
+  public class RotaryEncoderHelper {
+    method public static float getRotaryAxisValue(android.view.MotionEvent);
+    method public static float getScaledScrollFactor(android.content.Context);
+    method public static boolean isFromRotaryEncoder(android.view.MotionEvent);
+  }
+
+  public final class WearableInputDevice {
+    method public static final int[] getAvailableButtonKeyCodes(android.content.Context);
+    method public static final android.os.Bundle getButtonInfo(android.content.Context, int);
+    field public static final java.lang.String X_KEY = "x_key";
+    field public static final java.lang.String Y_KEY = "y_key";
+  }
+
+}
+
diff --git a/wear/wear_stubs/api/2.txt b/wear/wear_stubs/api/2.txt
new file mode 100644
index 0000000..2850f24
--- /dev/null
+++ b/wear/wear_stubs/api/2.txt
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.wearable {
+
+  public final class WearableSharedLib {
+    method public static int version();
+  }
+
+}
+
+package com.google.android.wearable.compat {
+
+  public class WearableActivityController {
+    ctor public WearableActivityController(java.lang.String, android.app.Activity, com.google.android.wearable.compat.WearableActivityController.AmbientCallback);
+    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public final boolean isAmbient();
+    method public void onCreate();
+    method public void onDestroy();
+    method public void onPause();
+    method public void onResume();
+    method public void onStop();
+    method public final void setAmbientEnabled();
+    method public final void setAutoResumeEnabled(boolean);
+    field public static final java.lang.String EXTRA_BURN_IN_PROTECTION = "com.google.android.wearable.compat.extra.BURN_IN_PROTECTION";
+    field public static final java.lang.String EXTRA_LOWBIT_AMBIENT = "com.google.android.wearable.compat.extra.LOWBIT_AMBIENT";
+  }
+
+  public static abstract class WearableActivityController.AmbientCallback {
+    ctor public WearableActivityController.AmbientCallback();
+    method public void onEnterAmbient(android.os.Bundle);
+    method public void onExitAmbient();
+    method public void onUpdateAmbient();
+  }
+
+}
+
+package com.google.android.wearable.display {
+
+  public final class WearableDisplayHelper {
+    method public static final android.graphics.RectF getObstruction();
+  }
+
+}
+
+package com.google.android.wearable.input {
+
+  public class RotaryEncoderHelper {
+    method public static float getRotaryAxisValue(android.view.MotionEvent);
+    method public static float getScaledScrollFactor(android.content.Context);
+    method public static boolean isFromRotaryEncoder(android.view.MotionEvent);
+  }
+
+  public final class WearableInputDevice {
+    method public static final int[] getAvailableButtonKeyCodes(android.content.Context);
+    method public static final android.os.Bundle getButtonInfo(android.content.Context, int);
+    field public static final java.lang.String X_KEY = "x_key";
+    field public static final java.lang.String Y_KEY = "y_key";
+  }
+
+}
+
diff --git a/wear/wear_stubs/api/current.txt b/wear/wear_stubs/api/current.txt
new file mode 100644
index 0000000..2850f24
--- /dev/null
+++ b/wear/wear_stubs/api/current.txt
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.wearable {
+
+  public final class WearableSharedLib {
+    method public static int version();
+  }
+
+}
+
+package com.google.android.wearable.compat {
+
+  public class WearableActivityController {
+    ctor public WearableActivityController(java.lang.String, android.app.Activity, com.google.android.wearable.compat.WearableActivityController.AmbientCallback);
+    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public final boolean isAmbient();
+    method public void onCreate();
+    method public void onDestroy();
+    method public void onPause();
+    method public void onResume();
+    method public void onStop();
+    method public final void setAmbientEnabled();
+    method public final void setAutoResumeEnabled(boolean);
+    field public static final java.lang.String EXTRA_BURN_IN_PROTECTION = "com.google.android.wearable.compat.extra.BURN_IN_PROTECTION";
+    field public static final java.lang.String EXTRA_LOWBIT_AMBIENT = "com.google.android.wearable.compat.extra.LOWBIT_AMBIENT";
+  }
+
+  public static abstract class WearableActivityController.AmbientCallback {
+    ctor public WearableActivityController.AmbientCallback();
+    method public void onEnterAmbient(android.os.Bundle);
+    method public void onExitAmbient();
+    method public void onUpdateAmbient();
+  }
+
+}
+
+package com.google.android.wearable.display {
+
+  public final class WearableDisplayHelper {
+    method public static final android.graphics.RectF getObstruction();
+  }
+
+}
+
+package com.google.android.wearable.input {
+
+  public class RotaryEncoderHelper {
+    method public static float getRotaryAxisValue(android.view.MotionEvent);
+    method public static float getScaledScrollFactor(android.content.Context);
+    method public static boolean isFromRotaryEncoder(android.view.MotionEvent);
+  }
+
+  public final class WearableInputDevice {
+    method public static final int[] getAvailableButtonKeyCodes(android.content.Context);
+    method public static final android.os.Bundle getButtonInfo(android.content.Context, int);
+    field public static final java.lang.String X_KEY = "x_key";
+    field public static final java.lang.String Y_KEY = "y_key";
+  }
+
+}
+
diff --git a/wear/wear_stubs/com.google.android.wearable-stubs.jar b/wear/wear_stubs/com.google.android.wearable-stubs.jar
new file mode 100644
index 0000000..7465f7c
--- /dev/null
+++ b/wear/wear_stubs/com.google.android.wearable-stubs.jar
Binary files differ