Merge "Grid/CellContent changes to know # of lines in a row"
diff --git a/asynclayoutinflater/api/current.txt b/asynclayoutinflater/api/current.txt
new file mode 100644
index 0000000..83a85be
--- /dev/null
+++ b/asynclayoutinflater/api/current.txt
@@ -0,0 +1,13 @@
+package android.support.v4.view {
+
+  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);
+  }
+
+}
+
diff --git a/asynclayoutinflater/build.gradle b/asynclayoutinflater/build.gradle
new file mode 100644
index 0000000..597b01d
--- /dev/null
+++ b/asynclayoutinflater/build.gradle
@@ -0,0 +1,20 @@
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    api(project(":support-annotations"))
+    api(project(":support-compat"))
+}
+
+supportLibrary {
+    name = "Android Support Library Async Layout Inflater"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
+    inceptionYear = "2018"
+    description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
+}
diff --git a/asynclayoutinflater/src/main/AndroidManifest.xml b/asynclayoutinflater/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..a98f288
--- /dev/null
+++ b/asynclayoutinflater/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest package="android.support.asynclayoutinflater"/>
diff --git a/core-ui/src/main/java/android/support/v4/view/AsyncLayoutInflater.java b/asynclayoutinflater/src/main/java/android/support/v4/view/AsyncLayoutInflater.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/AsyncLayoutInflater.java
rename to asynclayoutinflater/src/main/java/android/support/v4/view/AsyncLayoutInflater.java
diff --git a/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt b/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt
index 383c3d0..ac74c0d 100644
--- a/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt
@@ -46,9 +46,9 @@
     val LIFECYCLES_VIEWMODEL = LIFECYCLES_EXT
 
     /**
-     * Version code for RecyclerView & Room paging
+     * Version code for Paging
      */
-    val PAGING = Version("1.0.0-alpha5")
+    val PAGING = Version("1.0.0-alpha6")
 
     private val LIFECYCLES = Version("1.1.0")
 
diff --git a/buildSrc/src/main/kotlin/android/support/SupportAndroidLibraryPlugin.kt b/buildSrc/src/main/kotlin/android/support/SupportAndroidLibraryPlugin.kt
index 6db309e..69419d4 100644
--- a/buildSrc/src/main/kotlin/android/support/SupportAndroidLibraryPlugin.kt
+++ b/buildSrc/src/main/kotlin/android/support/SupportAndroidLibraryPlugin.kt
@@ -47,15 +47,6 @@
 
             library.defaultConfig.minSdkVersion(supportLibraryExtension.minSdkVersion)
 
-            if (supportLibraryExtension.legacySourceLocation) {
-                // We use a non-standard test directory structure.
-                val androidTest = library.sourceSets.getByName("androidTest")
-                androidTest.setRoot("tests")
-                androidTest.java.srcDir("tests/src")
-                androidTest.res.srcDir("tests/res")
-                androidTest.manifest.srcFile("tests/AndroidManifest.xml")
-            }
-
             // 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.
             val javaVersion: JavaVersion
@@ -175,10 +166,6 @@
         lintOptions.fatal("MissingTranslation")
     }
 
-    if (System.getenv("GRADLE_PLUGIN_VERSION") != null) {
-        lintOptions.check("NewApi")
-    }
-
     // Set baseline file for all legacy lint warnings.
     if (baseline.exists()) {
         lintOptions.baseline(baseline)
diff --git a/buildSrc/src/main/kotlin/android/support/SupportLibraryExtension.kt b/buildSrc/src/main/kotlin/android/support/SupportLibraryExtension.kt
index c6b5fa5..fb2f3b5 100644
--- a/buildSrc/src/main/kotlin/android/support/SupportLibraryExtension.kt
+++ b/buildSrc/src/main/kotlin/android/support/SupportLibraryExtension.kt
@@ -33,7 +33,6 @@
     var url = SUPPORT_URL
     private var licenses: MutableCollection<License> = ArrayList()
     var java8Library = false
-    var legacySourceLocation = false
     var publish = false
     /**
      * This flag works only if publish flag is "true".
diff --git a/buildSrc/src/main/kotlin/android/support/dependencies/Dependencies.kt b/buildSrc/src/main/kotlin/android/support/dependencies/Dependencies.kt
index 7345733..0844832 100644
--- a/buildSrc/src/main/kotlin/android/support/dependencies/Dependencies.kt
+++ b/buildSrc/src/main/kotlin/android/support/dependencies/Dependencies.kt
@@ -50,6 +50,12 @@
 
 // Support library dependencies needed for projects that compile against prebuilt versions
 // instead of source directly.
+// NOTE: _27 versions exist for modules that have opted-in to 27, and tests that depend on those
+// modules. Other projects may stick to older versions to avoid forcing users to update.
+private const val SUPPORT_VERSION_27 = "27.1.0"
+const val SUPPORT_RECYCLERVIEW_27 = "com.android.support:recyclerview-v7:$SUPPORT_VERSION_27"
+const val SUPPORT_APPCOMPAT_27 = "com.android.support:appcompat-v7:$SUPPORT_VERSION_27"
+
 private const val SUPPORT_VERSION = "26.1.0"
 const val SUPPORT_ANNOTATIONS = "com.android.support:support-annotations:$SUPPORT_VERSION"
 const val SUPPORT_APPCOMPAT = "com.android.support:appcompat-v7:$SUPPORT_VERSION"
diff --git a/car/src/androidTest/NO_DOCS b/car/src/androidTest/NO_DOCS
deleted file mode 100644
index bd77b1a..0000000
--- a/car/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
\ No newline at end of file
diff --git a/collections/build.gradle b/collections/build.gradle
new file mode 100644
index 0000000..3145c4a
--- /dev/null
+++ b/collections/build.gradle
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportJavaLibraryPlugin")
+}
+
+dependencies {
+    compile(project(":support-annotations"))
+    testCompile(JUNIT)
+}
+
+supportLibrary {
+    name = "Android Support Library collections"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
+    inceptionYear = "2018"
+    description = "Standalone efficient collections."
+}
diff --git a/compat/src/main/java/android/support/v4/util/ArrayMap.java b/collections/src/main/java/android/support/v4/util/ArrayMap.java
similarity index 98%
rename from compat/src/main/java/android/support/v4/util/ArrayMap.java
rename to collections/src/main/java/android/support/v4/util/ArrayMap.java
index 0a8a0ab..1948093 100644
--- a/compat/src/main/java/android/support/v4/util/ArrayMap.java
+++ b/collections/src/main/java/android/support/v4/util/ArrayMap.java
@@ -24,7 +24,7 @@
  * ArrayMap is a generic key->value mapping data structure that is
  * designed to be more memory efficient than a traditional {@link java.util.HashMap},
  * this implementation is a version of the platform's
- * {@link android.util.ArrayMap} that can be used on older versions of the platform.
+ * {@code android.util.ArrayMap} that can be used on older versions of the platform.
  * It keeps its mappings in an array data structure -- an integer array of hash
  * codes for each item, and an Object array of the key/value pairs.  This allows it to
  * avoid having to create an extra object for every entry put in to the map, and it
diff --git a/compat/src/main/java/android/support/v4/util/ArraySet.java b/collections/src/main/java/android/support/v4/util/ArraySet.java
similarity index 94%
rename from compat/src/main/java/android/support/v4/util/ArraySet.java
rename to collections/src/main/java/android/support/v4/util/ArraySet.java
index 8444d2c..84073f0 100644
--- a/compat/src/main/java/android/support/v4/util/ArraySet.java
+++ b/collections/src/main/java/android/support/v4/util/ArraySet.java
@@ -21,7 +21,6 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
-import android.util.Log;
 
 import java.lang.reflect.Array;
 import java.util.Collection;
@@ -169,7 +168,7 @@
                     array[0] = array[1] = null;
                     sTwiceBaseCacheSize--;
                     if (DEBUG) {
-                        Log.d(TAG, "Retrieving 2x cache " + mHashes + " now have "
+                        System.out.println(TAG + " Retrieving 2x cache " + mHashes + " now have "
                                 + sTwiceBaseCacheSize + " entries");
                     }
                     return;
@@ -185,8 +184,8 @@
                     array[0] = array[1] = null;
                     sBaseCacheSize--;
                     if (DEBUG) {
-                        Log.d(TAG, "Retrieving 1x cache " + mHashes + " now have " + sBaseCacheSize
-                                + " entries");
+                        System.out.println(TAG + " Retrieving 1x cache " + mHashes + " now have "
+                                + sBaseCacheSize + " entries");
                     }
                     return;
                 }
@@ -210,8 +209,8 @@
                     sTwiceBaseCache = array;
                     sTwiceBaseCacheSize++;
                     if (DEBUG) {
-                        Log.d(TAG, "Storing 2x cache " + array + " now have " + sTwiceBaseCacheSize
-                                + " entries");
+                        System.out.println(TAG + " Storing 2x cache " + array + " now have "
+                                + sTwiceBaseCacheSize + " entries");
                     }
                 }
             }
@@ -226,7 +225,7 @@
                     sBaseCache = array;
                     sBaseCacheSize++;
                     if (DEBUG) {
-                        Log.d(TAG, "Storing 1x cache " + array + " now have "
+                        System.out.println(TAG + " Storing 1x cache " + array + " now have "
                                 + sBaseCacheSize + " entries");
                     }
                 }
@@ -373,14 +372,14 @@
             final int n = mSize >= (BASE_SIZE * 2) ? (mSize + (mSize >> 1))
                     : (mSize >= BASE_SIZE ? (BASE_SIZE * 2) : BASE_SIZE);
 
-            if (DEBUG) Log.d(TAG, "add: grow from " + mHashes.length + " to " + n);
+            if (DEBUG) System.out.println(TAG + " add: grow from " + mHashes.length + " to " + n);
 
             final int[] ohashes = mHashes;
             final Object[] oarray = mArray;
             allocArrays(n);
 
             if (mHashes.length > 0) {
-                if (DEBUG) Log.d(TAG, "add: copy 0-" + mSize + " to 0");
+                if (DEBUG) System.out.println(TAG + " add: copy 0-" + mSize + " to 0");
                 System.arraycopy(ohashes, 0, mHashes, 0, ohashes.length);
                 System.arraycopy(oarray, 0, mArray, 0, oarray.length);
             }
@@ -390,7 +389,8 @@
 
         if (index < mSize) {
             if (DEBUG) {
-                Log.d(TAG, "add: move " + index + "-" + (mSize - index) + " to " + (index + 1));
+                System.out.println(TAG + " add: move " + index + "-" + (mSize - index) + " to "
+                        + (index + 1));
             }
             System.arraycopy(mHashes, index, mHashes, index + 1, mSize - index);
             System.arraycopy(mArray, index, mArray, index + 1, mSize - index);
@@ -418,10 +418,10 @@
             // Cannot optimize since it would break the sorted order - fallback to add()
             if (DEBUG) {
                 RuntimeException e = new RuntimeException("here");
-                e.fillInStackTrace();
-                Log.w(TAG, "New hash " + hash
+                System.err.println(TAG + " New hash " + hash
                         + " is before end of array hash " + mHashes[index - 1]
-                        + " at index " + index, e);
+                        + " at index " + index);
+                e.printStackTrace();
             }
             add(value);
             return;
@@ -476,7 +476,7 @@
         final Object old = mArray[index];
         if (mSize <= 1) {
             // Now empty.
-            if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to 0");
+            if (DEBUG) System.out.println(TAG + " remove: shrink from " + mHashes.length + " to 0");
             freeArrays(mHashes, mArray, mSize);
             mHashes = INT;
             mArray = OBJECT;
@@ -488,7 +488,7 @@
                 // that and BASE_SIZE.
                 final int n = mSize > (BASE_SIZE * 2) ? (mSize + (mSize >> 1)) : (BASE_SIZE * 2);
 
-                if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to " + n);
+                if (DEBUG) System.out.println(TAG + " remove: shrink from " + mHashes.length + " to " + n);
 
                 final int[] ohashes = mHashes;
                 final Object[] oarray = mArray;
@@ -496,13 +496,13 @@
 
                 mSize--;
                 if (index > 0) {
-                    if (DEBUG) Log.d(TAG, "remove: copy from 0-" + index + " to 0");
+                    if (DEBUG) System.out.println(TAG + " remove: copy from 0-" + index + " to 0");
                     System.arraycopy(ohashes, 0, mHashes, 0, index);
                     System.arraycopy(oarray, 0, mArray, 0, index);
                 }
                 if (index < mSize) {
                     if (DEBUG) {
-                        Log.d(TAG, "remove: copy from " + (index + 1) + "-" + mSize
+                        System.out.println(TAG + " remove: copy from " + (index + 1) + "-" + mSize
                                 + " to " + index);
                     }
                     System.arraycopy(ohashes, index + 1, mHashes, index, mSize - index);
@@ -512,7 +512,7 @@
                 mSize--;
                 if (index < mSize) {
                     if (DEBUG) {
-                        Log.d(TAG, "remove: move " + (index + 1) + "-" + mSize + " to " + index);
+                        System.out.println(TAG + " remove: move " + (index + 1) + "-" + mSize + " to " + index);
                     }
                     System.arraycopy(mHashes, index + 1, mHashes, index, mSize - index);
                     System.arraycopy(mArray, index + 1, mArray, index, mSize - index);
diff --git a/compat/src/main/java/android/support/v4/util/CircularArray.java b/collections/src/main/java/android/support/v4/util/CircularArray.java
similarity index 100%
rename from compat/src/main/java/android/support/v4/util/CircularArray.java
rename to collections/src/main/java/android/support/v4/util/CircularArray.java
diff --git a/compat/src/main/java/android/support/v4/util/CircularIntArray.java b/collections/src/main/java/android/support/v4/util/CircularIntArray.java
similarity index 100%
rename from compat/src/main/java/android/support/v4/util/CircularIntArray.java
rename to collections/src/main/java/android/support/v4/util/CircularIntArray.java
diff --git a/compat/src/main/java/android/support/v4/util/ContainerHelpers.java b/collections/src/main/java/android/support/v4/util/ContainerHelpers.java
similarity index 100%
rename from compat/src/main/java/android/support/v4/util/ContainerHelpers.java
rename to collections/src/main/java/android/support/v4/util/ContainerHelpers.java
diff --git a/compat/src/main/java/android/support/v4/util/LongSparseArray.java b/collections/src/main/java/android/support/v4/util/LongSparseArray.java
similarity index 99%
rename from compat/src/main/java/android/support/v4/util/LongSparseArray.java
rename to collections/src/main/java/android/support/v4/util/LongSparseArray.java
index febb5d5..9285619 100644
--- a/compat/src/main/java/android/support/v4/util/LongSparseArray.java
+++ b/collections/src/main/java/android/support/v4/util/LongSparseArray.java
@@ -18,7 +18,7 @@
 
 /**
  * SparseArray mapping longs to Objects, a version of the platform's
- * {@link android.util.LongSparseArray} that can be used on older versions of the
+ * {@code android.util.LongSparseArray} that can be used on older versions of the
  * platform.  Unlike a normal array of Objects,
  * there can be gaps in the indices.  It is intended to be more memory efficient
  * than using a HashMap to map Longs to Objects, both because it avoids
diff --git a/compat/src/main/java/android/support/v4/util/LruCache.java b/collections/src/main/java/android/support/v4/util/LruCache.java
similarity index 99%
rename from compat/src/main/java/android/support/v4/util/LruCache.java
rename to collections/src/main/java/android/support/v4/util/LruCache.java
index 944b354..d41f4fb 100644
--- a/compat/src/main/java/android/support/v4/util/LruCache.java
+++ b/collections/src/main/java/android/support/v4/util/LruCache.java
@@ -21,7 +21,7 @@
 import java.util.Map;
 
 /**
- * Static library version of {@link android.util.LruCache}. Used to write apps
+ * Static library version of {@code android.util.LruCache}. Used to write apps
  * that run on API levels prior to 12. When running on API level 12 or above,
  * this implementation is still used; it does not try to switch to the
  * framework's implementation. See the framework SDK documentation for a class
diff --git a/compat/src/main/java/android/support/v4/util/MapCollections.java b/collections/src/main/java/android/support/v4/util/MapCollections.java
similarity index 100%
rename from compat/src/main/java/android/support/v4/util/MapCollections.java
rename to collections/src/main/java/android/support/v4/util/MapCollections.java
diff --git a/compat/src/main/java/android/support/v4/util/SimpleArrayMap.java b/collections/src/main/java/android/support/v4/util/SimpleArrayMap.java
similarity index 94%
rename from compat/src/main/java/android/support/v4/util/SimpleArrayMap.java
rename to collections/src/main/java/android/support/v4/util/SimpleArrayMap.java
index 06e68f0..247451f 100644
--- a/compat/src/main/java/android/support/v4/util/SimpleArrayMap.java
+++ b/collections/src/main/java/android/support/v4/util/SimpleArrayMap.java
@@ -16,8 +16,6 @@
 
 package android.support.v4.util;
 
-import android.util.Log;
-
 import java.util.ConcurrentModificationException;
 import java.util.Map;
 
@@ -170,7 +168,7 @@
                     mHashes = (int[])array[1];
                     array[0] = array[1] = null;
                     mTwiceBaseCacheSize--;
-                    if (DEBUG) Log.d(TAG, "Retrieving 2x cache " + mHashes
+                    if (DEBUG) System.out.println(TAG + " Retrieving 2x cache " + mHashes
                             + " now have " + mTwiceBaseCacheSize + " entries");
                     return;
                 }
@@ -184,7 +182,7 @@
                     mHashes = (int[])array[1];
                     array[0] = array[1] = null;
                     mBaseCacheSize--;
-                    if (DEBUG) Log.d(TAG, "Retrieving 1x cache " + mHashes
+                    if (DEBUG) System.out.println(TAG + " Retrieving 1x cache " + mHashes
                             + " now have " + mBaseCacheSize + " entries");
                     return;
                 }
@@ -207,7 +205,7 @@
                     }
                     mTwiceBaseCache = array;
                     mTwiceBaseCacheSize++;
-                    if (DEBUG) Log.d(TAG, "Storing 2x cache " + array
+                    if (DEBUG) System.out.println(TAG + " Storing 2x cache " + array
                             + " now have " + mTwiceBaseCacheSize + " entries");
                 }
             }
@@ -221,7 +219,7 @@
                     }
                     mBaseCache = array;
                     mBaseCacheSize++;
-                    if (DEBUG) Log.d(TAG, "Storing 1x cache " + array
+                    if (DEBUG) System.out.println(TAG + " Storing 1x cache " + array
                             + " now have " + mBaseCacheSize + " entries");
                 }
             }
@@ -430,7 +428,7 @@
             final int n = osize >= (BASE_SIZE*2) ? (osize+(osize>>1))
                     : (osize >= BASE_SIZE ? (BASE_SIZE*2) : BASE_SIZE);
 
-            if (DEBUG) Log.d(TAG, "put: grow from " + mHashes.length + " to " + n);
+            if (DEBUG) System.out.println(TAG + " put: grow from " + mHashes.length + " to " + n);
 
             final int[] ohashes = mHashes;
             final Object[] oarray = mArray;
@@ -441,7 +439,7 @@
             }
 
             if (mHashes.length > 0) {
-                if (DEBUG) Log.d(TAG, "put: copy 0-" + osize + " to 0");
+                if (DEBUG) System.out.println(TAG + " put: copy 0-" + osize + " to 0");
                 System.arraycopy(ohashes, 0, mHashes, 0, ohashes.length);
                 System.arraycopy(oarray, 0, mArray, 0, oarray.length);
             }
@@ -450,7 +448,7 @@
         }
 
         if (index < osize) {
-            if (DEBUG) Log.d(TAG, "put: move " + index + "-" + (osize-index)
+            if (DEBUG) System.out.println(TAG + " put: move " + index + "-" + (osize-index)
                     + " to " + (index+1));
             System.arraycopy(mHashes, index, mHashes, index + 1, osize - index);
             System.arraycopy(mArray, index << 1, mArray, (index + 1) << 1, (mSize - index) << 1);
@@ -515,7 +513,7 @@
         final int nsize;
         if (osize <= 1) {
             // Now empty.
-            if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to 0");
+            if (DEBUG) System.out.println(TAG + " remove: shrink from " + mHashes.length + " to 0");
             freeArrays(mHashes, mArray, osize);
             mHashes = ContainerHelpers.EMPTY_INTS;
             mArray = ContainerHelpers.EMPTY_OBJECTS;
@@ -528,7 +526,7 @@
                 // that and BASE_SIZE.
                 final int n = osize > (BASE_SIZE*2) ? (osize + (osize>>1)) : (BASE_SIZE*2);
 
-                if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to " + n);
+                if (DEBUG) System.out.println(TAG + " remove: shrink from " + mHashes.length + " to " + n);
 
                 final int[] ohashes = mHashes;
                 final Object[] oarray = mArray;
@@ -539,12 +537,12 @@
                 }
 
                 if (index > 0) {
-                    if (DEBUG) Log.d(TAG, "remove: copy from 0-" + index + " to 0");
+                    if (DEBUG) System.out.println(TAG + " remove: copy from 0-" + index + " to 0");
                     System.arraycopy(ohashes, 0, mHashes, 0, index);
                     System.arraycopy(oarray, 0, mArray, 0, index << 1);
                 }
                 if (index < nsize) {
-                    if (DEBUG) Log.d(TAG, "remove: copy from " + (index+1) + "-" + nsize
+                    if (DEBUG) System.out.println(TAG + " remove: copy from " + (index+1) + "-" + nsize
                             + " to " + index);
                     System.arraycopy(ohashes, index + 1, mHashes, index, nsize - index);
                     System.arraycopy(oarray, (index + 1) << 1, mArray, index << 1,
@@ -552,7 +550,7 @@
                 }
             } else {
                 if (index < nsize) {
-                    if (DEBUG) Log.d(TAG, "remove: move " + (index+1) + "-" + nsize
+                    if (DEBUG) System.out.println(TAG + " remove: move " + (index+1) + "-" + nsize
                             + " to " + index);
                     System.arraycopy(mHashes, index + 1, mHashes, index, nsize - index);
                     System.arraycopy(mArray, (index + 1) << 1, mArray, index << 1,
diff --git a/compat/src/main/java/android/support/v4/util/SparseArrayCompat.java b/collections/src/main/java/android/support/v4/util/SparseArrayCompat.java
similarity index 86%
rename from compat/src/main/java/android/support/v4/util/SparseArrayCompat.java
rename to collections/src/main/java/android/support/v4/util/SparseArrayCompat.java
index 5238cf0..eece9b5 100644
--- a/compat/src/main/java/android/support/v4/util/SparseArrayCompat.java
+++ b/collections/src/main/java/android/support/v4/util/SparseArrayCompat.java
@@ -17,8 +17,32 @@
 package android.support.v4.util;
 
 /**
- * A copy of the current platform (currently {@link android.os.Build.VERSION_CODES#KITKAT}
- * version of {@link android.util.SparseArray}; provides a removeAt() method and other things.
+ * SparseArrays map integers to Objects.  Unlike a normal array of Objects,
+ * there can be gaps in the indices.  It is intended to be more memory efficient
+ * than using a HashMap to map Integers to Objects, both because it avoids
+ * auto-boxing keys and its data structure doesn't rely on an extra entry object
+ * for each mapping.
+ *
+ * <p>Note that this container keeps its mappings in an array data structure,
+ * using a binary search to find keys.  The implementation is not intended to be appropriate for
+ * data structures
+ * that may contain large numbers of items.  It is generally slower than a traditional
+ * HashMap, since lookups require a binary search and adds and removes require inserting
+ * and deleting entries in the array.  For containers holding up to hundreds of items,
+ * the performance difference is not significant, less than 50%.</p>
+ *
+ * <p>To help with performance, the container includes an optimization when removing
+ * keys: instead of compacting its array immediately, it leaves the removed entry marked
+ * as deleted.  The entry can then be re-used for the same key, or compacted later in
+ * a single garbage collection step of all removed entries.  This garbage collection will
+ * need to be performed at any time the array needs to be grown or the the map size or
+ * entry values are retrieved.</p>
+ *
+ * <p>It is possible to iterate over the items in this container using
+ * {@link #keyAt(int)} and {@link #valueAt(int)}. Iterating over the keys using
+ * <code>keyAt(int)</code> with ascending values of the index will return the
+ * keys in ascending order, or the values corresponding to the keys in ascending
+ * order in the case of <code>valueAt(int)</code>.</p>
  */
 public class SparseArrayCompat<E> implements Cloneable {
     private static final Object DELETED = new Object();
diff --git a/compat/tests/java/android/support/v4/util/ArrayMapCompatTest.java b/collections/src/test/java/android/support/v4/util/ArrayMapCompatTest.java
similarity index 95%
rename from compat/tests/java/android/support/v4/util/ArrayMapCompatTest.java
rename to collections/src/test/java/android/support/v4/util/ArrayMapCompatTest.java
index c00d264..add6ba5 100644
--- a/compat/tests/java/android/support/v4/util/ArrayMapCompatTest.java
+++ b/collections/src/test/java/android/support/v4/util/ArrayMapCompatTest.java
@@ -19,11 +19,7 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 import java.util.AbstractMap;
 import java.util.Arrays;
@@ -33,8 +29,6 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 
-@RunWith(AndroidJUnit4.class)
-@SmallTest
 public class ArrayMapCompatTest {
 
     @Test
diff --git a/compat/tests/java/android/support/v4/util/ArraySetCompatTest.java b/collections/src/test/java/android/support/v4/util/ArraySetCompatTest.java
similarity index 88%
rename from compat/tests/java/android/support/v4/util/ArraySetCompatTest.java
rename to collections/src/test/java/android/support/v4/util/ArraySetCompatTest.java
index 10a0b1b..a0e74e9 100644
--- a/compat/tests/java/android/support/v4/util/ArraySetCompatTest.java
+++ b/collections/src/test/java/android/support/v4/util/ArraySetCompatTest.java
@@ -20,17 +20,11 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
-@RunWith(AndroidJUnit4.class)
-@SmallTest
 public class ArraySetCompatTest {
     @Test
     public void testCanNotIteratePastEnd() {
diff --git a/compat/tests/java/android/support/v4/util/LongSparseArrayTest.java b/collections/src/test/java/android/support/v4/util/LongSparseArrayTest.java
similarity index 91%
rename from compat/tests/java/android/support/v4/util/LongSparseArrayTest.java
rename to collections/src/test/java/android/support/v4/util/LongSparseArrayTest.java
index 663ea48..0276e14 100644
--- a/compat/tests/java/android/support/v4/util/LongSparseArrayTest.java
+++ b/collections/src/test/java/android/support/v4/util/LongSparseArrayTest.java
@@ -19,14 +19,8 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
-@RunWith(AndroidJUnit4.class)
-@SmallTest
 public class LongSparseArrayTest {
     @Test
     public void isEmpty() throws Exception {
diff --git a/compat/tests/java/android/support/v4/util/SimpleArrayMapTest.java b/collections/src/test/java/android/support/v4/util/SimpleArrayMapTest.java
similarity index 79%
rename from compat/tests/java/android/support/v4/util/SimpleArrayMapTest.java
rename to collections/src/test/java/android/support/v4/util/SimpleArrayMapTest.java
index 350b917..3c2bea1 100644
--- a/compat/tests/java/android/support/v4/util/SimpleArrayMapTest.java
+++ b/collections/src/test/java/android/support/v4/util/SimpleArrayMapTest.java
@@ -16,12 +16,7 @@
 
 import static org.junit.Assert.fail;
 
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.util.Log;
-
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 import java.util.ConcurrentModificationException;
 import java.util.Locale;
@@ -29,10 +24,7 @@
 /**
  * Unit tests for SimpleArrayMap
  */
-@RunWith(AndroidJUnit4.class)
-@LargeTest
 public class SimpleArrayMapTest {
-    private static final String TAG = "SimpleArrayMapTest";
     SimpleArrayMap<String, String> map = new SimpleArrayMap<>();
     private boolean mDone;
 
@@ -42,7 +34,7 @@
     @Test
     public void testConcurrentModificationException() throws Exception {
         final int TEST_LEN_MS = 5000;
-        Log.d(TAG, "Starting SimpleArrayMap concurrency test");
+        System.out.println("Starting SimpleArrayMap concurrency test");
         mDone = false;
         new Thread(new Runnable() {
             @Override
@@ -54,11 +46,13 @@
                     } catch (ArrayIndexOutOfBoundsException e) {
                         // SimpleArrayMap is not thread safe, so lots of concurrent modifications
                         // can still cause data corruption
-                        Log.w(TAG, "concurrent modification uncaught, causing indexing failure", e);
+                        System.err.println("concurrent modification uncaught, causing indexing failure");
+                        e.printStackTrace();
                     } catch (ClassCastException e) {
                         // cache corruption should not occur as it is hard to trace and one thread
                         // may corrupt the pool for all threads in the same process.
-                        Log.e(TAG, "concurrent modification uncaught, causing cache corruption", e);
+                        System.err.println("concurrent modification uncaught, causing cache corruption");
+                        e.printStackTrace();
                         fail();
                     } catch (ConcurrentModificationException e) {
                     }
@@ -71,9 +65,9 @@
                 map.clear();
             } catch (InterruptedException e) {
             } catch (ArrayIndexOutOfBoundsException e) {
-                Log.w(TAG, "concurrent modification uncaught, causing indexing failure");
+                System.err.println("concurrent modification uncaught, causing indexing failure");
             } catch (ClassCastException e) {
-                Log.e(TAG, "concurrent modification uncaught, causing cache corruption");
+                System.err.println("concurrent modification uncaught, causing cache corruption");
                 fail();
             } catch (ConcurrentModificationException e) {
             }
@@ -93,7 +87,8 @@
                     map.clear();
                 }
             } catch (ConcurrentModificationException e) {
-                Log.e(TAG, "concurrent modification caught on single thread", e);
+                System.err.println("Concurrent modification caught on single thread");
+                e.printStackTrace();
                 fail();
             }
         }
diff --git a/compat/tests/java/android/support/v4/util/SparseArrayCompatTest.java b/collections/src/test/java/android/support/v4/util/SparseArrayCompatTest.java
similarity index 91%
rename from compat/tests/java/android/support/v4/util/SparseArrayCompatTest.java
rename to collections/src/test/java/android/support/v4/util/SparseArrayCompatTest.java
index 122c89b..afe58ae 100644
--- a/compat/tests/java/android/support/v4/util/SparseArrayCompatTest.java
+++ b/collections/src/test/java/android/support/v4/util/SparseArrayCompatTest.java
@@ -19,14 +19,8 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
-@RunWith(AndroidJUnit4.class)
-@SmallTest
 public class SparseArrayCompatTest {
     @Test
     public void isEmpty() throws Exception {
diff --git a/compat/api/27.1.0.ignore b/compat/api/27.1.0.ignore
index 1963552..e8c272c 100644
--- a/compat/api/27.1.0.ignore
+++ b/compat/api/27.1.0.ignore
@@ -1,2 +1,10 @@
+44c2c3c
+fbe2c76
+e51f961
+c851773
+34f4ba1
+9fad272
+43b0030
+81879f6
 343d890
 483ac6a
diff --git a/compat/api/current.txt b/compat/api/current.txt
index 0381328..a85290e 100644
--- a/compat/api/current.txt
+++ b/compat/api/current.txt
@@ -267,6 +267,7 @@
     method public boolean getShowsUserInterface();
     method public java.lang.CharSequence getTitle();
     field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
     field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
     field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
     field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
@@ -1123,45 +1124,6 @@
 
 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>);
-    ctor public ArraySet(java.util.Collection<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();
@@ -1173,83 +1135,6 @@
     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> implements java.lang.Cloneable {
-    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 boolean isEmpty();
-    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);
     method public static int hash(java.lang.Object...);
@@ -1288,49 +1173,6 @@
     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> implements java.lang.Cloneable {
-    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 boolean isEmpty();
-    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 {
@@ -1562,6 +1404,26 @@
     method public abstract void stopNestedScroll(int);
   }
 
+  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 abstract interface NestedScrollingParent {
     method public abstract int getNestedScrollAxes();
     method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
@@ -1581,6 +1443,15 @@
     method public abstract void onStopNestedScroll(android.view.View, 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 interface OnApplyWindowInsetsListener {
     method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
   }
@@ -2383,6 +2254,42 @@
     method public static void scrollListBy(android.widget.ListView, int);
   }
 
+  public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild2 android.support.v4.view.NestedScrollingParent android.support.v4.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet, int);
+    method public boolean arrowScroll(int);
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
+    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 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 final class PopupMenuCompat {
     method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
   }
diff --git a/compat/build.gradle b/compat/build.gradle
index 8f44285..f52c5ff 100644
--- a/compat/build.gradle
+++ b/compat/build.gradle
@@ -8,6 +8,7 @@
 
 dependencies {
     api(project(":support-annotations"))
+    api(project(":collections"))
     api(ARCH_LIFECYCLE_RUNTIME, libs.exclude_annotations_transitive)
 
     androidTestImplementation(TEST_RUNNER)
@@ -21,7 +22,6 @@
 
 android {
     sourceSets {
-        main.aidl.srcDirs = ['src/main/java']
         main.res.srcDirs 'res', 'res-public'
     }
 
@@ -37,5 +37,4 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2015"
     description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren\'t a part of the framework APIs. Compatible on devices running API 14 or later."
-    legacySourceLocation = true
 }
diff --git a/compat/tests/AndroidManifest.xml b/compat/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from compat/tests/AndroidManifest.xml
rename to compat/src/androidTest/AndroidManifest.xml
diff --git a/compat/tests/assets/fonts/large_a.ttf b/compat/src/androidTest/assets/fonts/large_a.ttf
similarity index 100%
rename from compat/tests/assets/fonts/large_a.ttf
rename to compat/src/androidTest/assets/fonts/large_a.ttf
Binary files differ
diff --git a/compat/tests/assets/fonts/large_a.ttx b/compat/src/androidTest/assets/fonts/large_a.ttx
similarity index 100%
rename from compat/tests/assets/fonts/large_a.ttx
rename to compat/src/androidTest/assets/fonts/large_a.ttx
diff --git a/compat/tests/assets/fonts/large_b.ttf b/compat/src/androidTest/assets/fonts/large_b.ttf
similarity index 100%
rename from compat/tests/assets/fonts/large_b.ttf
rename to compat/src/androidTest/assets/fonts/large_b.ttf
Binary files differ
diff --git a/compat/tests/assets/fonts/large_b.ttx b/compat/src/androidTest/assets/fonts/large_b.ttx
similarity index 100%
rename from compat/tests/assets/fonts/large_b.ttx
rename to compat/src/androidTest/assets/fonts/large_b.ttx
diff --git a/compat/tests/assets/fonts/large_c.ttf b/compat/src/androidTest/assets/fonts/large_c.ttf
similarity index 100%
rename from compat/tests/assets/fonts/large_c.ttf
rename to compat/src/androidTest/assets/fonts/large_c.ttf
Binary files differ
diff --git a/compat/tests/assets/fonts/large_c.ttx b/compat/src/androidTest/assets/fonts/large_c.ttx
similarity index 100%
rename from compat/tests/assets/fonts/large_c.ttx
rename to compat/src/androidTest/assets/fonts/large_c.ttx
diff --git a/compat/tests/assets/fonts/large_d.ttf b/compat/src/androidTest/assets/fonts/large_d.ttf
similarity index 100%
rename from compat/tests/assets/fonts/large_d.ttf
rename to compat/src/androidTest/assets/fonts/large_d.ttf
Binary files differ
diff --git a/compat/tests/assets/fonts/large_d.ttx b/compat/src/androidTest/assets/fonts/large_d.ttx
similarity index 100%
rename from compat/tests/assets/fonts/large_d.ttx
rename to compat/src/androidTest/assets/fonts/large_d.ttx
diff --git a/compat/tests/assets/fonts/samplefont.ttf b/compat/src/androidTest/assets/fonts/samplefont.ttf
similarity index 100%
rename from compat/tests/assets/fonts/samplefont.ttf
rename to compat/src/androidTest/assets/fonts/samplefont.ttf
Binary files differ
diff --git a/compat/tests/assets/fonts/samplefont.ttx b/compat/src/androidTest/assets/fonts/samplefont.ttx
similarity index 100%
rename from compat/tests/assets/fonts/samplefont.ttx
rename to compat/src/androidTest/assets/fonts/samplefont.ttx
diff --git a/compat/tests/fonts_readme.txt b/compat/src/androidTest/fonts_readme.txt
similarity index 100%
rename from compat/tests/fonts_readme.txt
rename to compat/src/androidTest/fonts_readme.txt
diff --git a/compat/tests/java/android/support/v13/view/DragStartHelperTest.java b/compat/src/androidTest/java/android/support/v13/view/DragStartHelperTest.java
similarity index 100%
rename from compat/tests/java/android/support/v13/view/DragStartHelperTest.java
rename to compat/src/androidTest/java/android/support/v13/view/DragStartHelperTest.java
diff --git a/compat/tests/java/android/support/v13/view/DragStartHelperTestActivity.java b/compat/src/androidTest/java/android/support/v13/view/DragStartHelperTestActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v13/view/DragStartHelperTestActivity.java
rename to compat/src/androidTest/java/android/support/v13/view/DragStartHelperTestActivity.java
diff --git a/compat/tests/java/android/support/v4/BaseInstrumentationTestCase.java b/compat/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java
similarity index 100%
rename from compat/tests/java/android/support/v4/BaseInstrumentationTestCase.java
rename to compat/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java
diff --git a/compat/tests/java/android/support/v4/BaseTestActivity.java b/compat/src/androidTest/java/android/support/v4/BaseTestActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v4/BaseTestActivity.java
rename to compat/src/androidTest/java/android/support/v4/BaseTestActivity.java
diff --git a/compat/tests/java/android/support/v4/ThemedYellowActivity.java b/compat/src/androidTest/java/android/support/v4/ThemedYellowActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v4/ThemedYellowActivity.java
rename to compat/src/androidTest/java/android/support/v4/ThemedYellowActivity.java
diff --git a/compat/tests/java/android/support/v4/app/ActivityCompatTest.java b/compat/src/androidTest/java/android/support/v4/app/ActivityCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/app/ActivityCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/app/ActivityCompatTest.java
diff --git a/compat/tests/java/android/support/v4/app/JobIntentServiceTest.java b/compat/src/androidTest/java/android/support/v4/app/JobIntentServiceTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/app/JobIntentServiceTest.java
rename to compat/src/androidTest/java/android/support/v4/app/JobIntentServiceTest.java
diff --git a/compat/tests/java/android/support/v4/app/NotificationCompatTest.java b/compat/src/androidTest/java/android/support/v4/app/NotificationCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/app/NotificationCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/app/NotificationCompatTest.java
diff --git a/compat/tests/java/android/support/v4/app/RemoteInputTest.java b/compat/src/androidTest/java/android/support/v4/app/RemoteInputTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/app/RemoteInputTest.java
rename to compat/src/androidTest/java/android/support/v4/app/RemoteInputTest.java
diff --git a/compat/tests/java/android/support/v4/app/SupportActivityTest.java b/compat/src/androidTest/java/android/support/v4/app/SupportActivityTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/app/SupportActivityTest.java
rename to compat/src/androidTest/java/android/support/v4/app/SupportActivityTest.java
diff --git a/compat/tests/java/android/support/v4/app/TestSupportActivity.java b/compat/src/androidTest/java/android/support/v4/app/TestSupportActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v4/app/TestSupportActivity.java
rename to compat/src/androidTest/java/android/support/v4/app/TestSupportActivity.java
diff --git a/compat/tests/java/android/support/v4/content/ContextCompatTest.java b/compat/src/androidTest/java/android/support/v4/content/ContextCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/content/ContextCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/content/ContextCompatTest.java
diff --git a/compat/tests/java/android/support/v4/content/pm/ShortcutInfoCompatTest.java b/compat/src/androidTest/java/android/support/v4/content/pm/ShortcutInfoCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/content/pm/ShortcutInfoCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/content/pm/ShortcutInfoCompatTest.java
diff --git a/compat/tests/java/android/support/v4/content/pm/ShortcutManagerCompatTest.java b/compat/src/androidTest/java/android/support/v4/content/pm/ShortcutManagerCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/content/pm/ShortcutManagerCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/content/pm/ShortcutManagerCompatTest.java
diff --git a/compat/tests/java/android/support/v4/content/res/FontResourcesParserCompatTest.java b/compat/src/androidTest/java/android/support/v4/content/res/FontResourcesParserCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/content/res/FontResourcesParserCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/content/res/FontResourcesParserCompatTest.java
diff --git a/compat/tests/java/android/support/v4/content/res/ResourcesCompatTest.java b/compat/src/androidTest/java/android/support/v4/content/res/ResourcesCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/content/res/ResourcesCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/content/res/ResourcesCompatTest.java
diff --git a/compat/tests/java/android/support/v4/graphics/DrawableCompatTest.java b/compat/src/androidTest/java/android/support/v4/graphics/DrawableCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/graphics/DrawableCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/graphics/DrawableCompatTest.java
diff --git a/compat/tests/java/android/support/v4/graphics/PaintCompatHasGlyphTest.java b/compat/src/androidTest/java/android/support/v4/graphics/PaintCompatHasGlyphTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/graphics/PaintCompatHasGlyphTest.java
rename to compat/src/androidTest/java/android/support/v4/graphics/PaintCompatHasGlyphTest.java
diff --git a/compat/tests/java/android/support/v4/graphics/TestTintAwareDrawable.java b/compat/src/androidTest/java/android/support/v4/graphics/TestTintAwareDrawable.java
similarity index 100%
rename from compat/tests/java/android/support/v4/graphics/TestTintAwareDrawable.java
rename to compat/src/androidTest/java/android/support/v4/graphics/TestTintAwareDrawable.java
diff --git a/compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java b/compat/src/androidTest/java/android/support/v4/graphics/TypefaceCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/graphics/TypefaceCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/graphics/TypefaceCompatTest.java
diff --git a/compat/tests/java/android/support/v4/graphics/TypefaceCompatUtilTest.java b/compat/src/androidTest/java/android/support/v4/graphics/TypefaceCompatUtilTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/graphics/TypefaceCompatUtilTest.java
rename to compat/src/androidTest/java/android/support/v4/graphics/TypefaceCompatUtilTest.java
diff --git a/compat/tests/java/android/support/v4/graphics/drawable/IconCompatTest.java b/compat/src/androidTest/java/android/support/v4/graphics/drawable/IconCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/graphics/drawable/IconCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/graphics/drawable/IconCompatTest.java
diff --git a/compat/tests/java/android/support/v4/os/LocaleListCompatTest.java b/compat/src/androidTest/java/android/support/v4/os/LocaleListCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/os/LocaleListCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/os/LocaleListCompatTest.java
diff --git a/compat/tests/java/android/support/v4/provider/FontRequestTest.java b/compat/src/androidTest/java/android/support/v4/provider/FontRequestTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/provider/FontRequestTest.java
rename to compat/src/androidTest/java/android/support/v4/provider/FontRequestTest.java
diff --git a/compat/tests/java/android/support/v4/provider/FontsContractCompatTest.java b/compat/src/androidTest/java/android/support/v4/provider/FontsContractCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/provider/FontsContractCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/provider/FontsContractCompatTest.java
diff --git a/compat/tests/java/android/support/v4/provider/MockFontProvider.java b/compat/src/androidTest/java/android/support/v4/provider/MockFontProvider.java
similarity index 100%
rename from compat/tests/java/android/support/v4/provider/MockFontProvider.java
rename to compat/src/androidTest/java/android/support/v4/provider/MockFontProvider.java
diff --git a/compat/tests/java/android/support/v4/provider/SelfDestructiveThreadTest.java b/compat/src/androidTest/java/android/support/v4/provider/SelfDestructiveThreadTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/provider/SelfDestructiveThreadTest.java
rename to compat/src/androidTest/java/android/support/v4/provider/SelfDestructiveThreadTest.java
diff --git a/compat/tests/java/android/support/v4/testutils/LayoutDirectionActions.java b/compat/src/androidTest/java/android/support/v4/testutils/LayoutDirectionActions.java
similarity index 100%
rename from compat/tests/java/android/support/v4/testutils/LayoutDirectionActions.java
rename to compat/src/androidTest/java/android/support/v4/testutils/LayoutDirectionActions.java
diff --git a/compat/tests/java/android/support/v4/testutils/TestUtils.java b/compat/src/androidTest/java/android/support/v4/testutils/TestUtils.java
similarity index 100%
rename from compat/tests/java/android/support/v4/testutils/TestUtils.java
rename to compat/src/androidTest/java/android/support/v4/testutils/TestUtils.java
diff --git a/compat/tests/java/android/support/v4/testutils/TextViewActions.java b/compat/src/androidTest/java/android/support/v4/testutils/TextViewActions.java
similarity index 100%
rename from compat/tests/java/android/support/v4/testutils/TextViewActions.java
rename to compat/src/androidTest/java/android/support/v4/testutils/TextViewActions.java
diff --git a/compat/tests/java/android/support/v4/text/BidiFormatterTest.java b/compat/src/androidTest/java/android/support/v4/text/BidiFormatterTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/text/BidiFormatterTest.java
rename to compat/src/androidTest/java/android/support/v4/text/BidiFormatterTest.java
diff --git a/compat/tests/java/android/support/v4/text/IcuCompatTest.java b/compat/src/androidTest/java/android/support/v4/text/IcuCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/text/IcuCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/text/IcuCompatTest.java
diff --git a/compat/tests/java/android/support/v4/text/util/FindAddressTest.java b/compat/src/androidTest/java/android/support/v4/text/util/FindAddressTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/text/util/FindAddressTest.java
rename to compat/src/androidTest/java/android/support/v4/text/util/FindAddressTest.java
diff --git a/compat/tests/java/android/support/v4/text/util/LinkifyCompatTest.java b/compat/src/androidTest/java/android/support/v4/text/util/LinkifyCompatTest.java
similarity index 99%
rename from compat/tests/java/android/support/v4/text/util/LinkifyCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/text/util/LinkifyCompatTest.java
index fe587ee..afaf879 100644
--- a/compat/tests/java/android/support/v4/text/util/LinkifyCompatTest.java
+++ b/compat/src/androidTest/java/android/support/v4/text/util/LinkifyCompatTest.java
@@ -832,7 +832,6 @@
         verifyAddLinksFails(msg, url, Linkify.MAP_ADDRESSES);
     }
 
-
     private static void verifyAddLinksSucceeds(String msg, String string, int type) {
         String str = "start " + string + " end";
         Spannable spannable = new SpannableString(str);
diff --git a/compat/tests/java/android/support/v4/util/ObjectsCompatTest.java b/compat/src/androidTest/java/android/support/v4/util/ObjectsCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/util/ObjectsCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/util/ObjectsCompatTest.java
diff --git a/compat/tests/java/android/support/v4/util/PatternsCompatTest.java b/compat/src/androidTest/java/android/support/v4/util/PatternsCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/util/PatternsCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/util/PatternsCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/GravityCompatTest.java b/compat/src/androidTest/java/android/support/v4/view/GravityCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/GravityCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/view/GravityCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/MarginLayoutParamsCompatTest.java b/compat/src/androidTest/java/android/support/v4/view/MarginLayoutParamsCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/MarginLayoutParamsCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/view/MarginLayoutParamsCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/PointerIconCompatTest.java b/compat/src/androidTest/java/android/support/v4/view/PointerIconCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/PointerIconCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/view/PointerIconCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/ViewCompatActivity.java b/compat/src/androidTest/java/android/support/v4/view/ViewCompatActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/ViewCompatActivity.java
rename to compat/src/androidTest/java/android/support/v4/view/ViewCompatActivity.java
diff --git a/compat/tests/java/android/support/v4/view/ViewCompatTest.java b/compat/src/androidTest/java/android/support/v4/view/ViewCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/ViewCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/view/ViewCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/ViewGroupCompatTest.java b/compat/src/androidTest/java/android/support/v4/view/ViewGroupCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/ViewGroupCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/view/ViewGroupCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/ViewPropertyAnimatorCompatTest.java b/compat/src/androidTest/java/android/support/v4/view/ViewPropertyAnimatorCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/ViewPropertyAnimatorCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/view/ViewPropertyAnimatorCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/VpaActivity.java b/compat/src/androidTest/java/android/support/v4/view/VpaActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/VpaActivity.java
rename to compat/src/androidTest/java/android/support/v4/view/VpaActivity.java
diff --git a/compat/tests/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatTest.java b/compat/src/androidTest/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatTest.java
diff --git a/compat/tests/java/android/support/v4/widget/ListViewCompatTest.java b/compat/src/androidTest/java/android/support/v4/widget/ListViewCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/widget/ListViewCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/widget/ListViewCompatTest.java
diff --git a/compat/tests/java/android/support/v4/widget/ListViewTestActivity.java b/compat/src/androidTest/java/android/support/v4/widget/ListViewTestActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v4/widget/ListViewTestActivity.java
rename to compat/src/androidTest/java/android/support/v4/widget/ListViewTestActivity.java
diff --git a/compat/tests/java/android/support/v4/widget/ScrollerCompatTestBase.java b/compat/src/androidTest/java/android/support/v4/widget/ScrollerCompatTestBase.java
similarity index 100%
rename from compat/tests/java/android/support/v4/widget/ScrollerCompatTestBase.java
rename to compat/src/androidTest/java/android/support/v4/widget/ScrollerCompatTestBase.java
diff --git a/compat/tests/java/android/support/v4/widget/TextViewCompatTest.java b/compat/src/androidTest/java/android/support/v4/widget/TextViewCompatTest.java
similarity index 100%
rename from compat/tests/java/android/support/v4/widget/TextViewCompatTest.java
rename to compat/src/androidTest/java/android/support/v4/widget/TextViewCompatTest.java
diff --git a/compat/tests/java/android/support/v4/widget/TextViewTestActivity.java b/compat/src/androidTest/java/android/support/v4/widget/TextViewTestActivity.java
similarity index 100%
rename from compat/tests/java/android/support/v4/widget/TextViewTestActivity.java
rename to compat/src/androidTest/java/android/support/v4/widget/TextViewTestActivity.java
diff --git a/compat/tests/res/color/complex_themed_selector.xml b/compat/src/androidTest/res/color/complex_themed_selector.xml
similarity index 100%
rename from compat/tests/res/color/complex_themed_selector.xml
rename to compat/src/androidTest/res/color/complex_themed_selector.xml
diff --git a/compat/tests/res/color/complex_unthemed_selector.xml b/compat/src/androidTest/res/color/complex_unthemed_selector.xml
similarity index 100%
rename from compat/tests/res/color/complex_unthemed_selector.xml
rename to compat/src/androidTest/res/color/complex_unthemed_selector.xml
diff --git a/compat/tests/res/color/simple_themed_selector.xml b/compat/src/androidTest/res/color/simple_themed_selector.xml
similarity index 100%
rename from compat/tests/res/color/simple_themed_selector.xml
rename to compat/src/androidTest/res/color/simple_themed_selector.xml
diff --git a/compat/tests/res/drawable-hdpi/density_aware_drawable.png b/compat/src/androidTest/res/drawable-hdpi/density_aware_drawable.png
similarity index 100%
rename from compat/tests/res/drawable-hdpi/density_aware_drawable.png
rename to compat/src/androidTest/res/drawable-hdpi/density_aware_drawable.png
Binary files differ
diff --git a/compat/tests/res/drawable-ldpi/aliased_drawable_alternate.png b/compat/src/androidTest/res/drawable-ldpi/aliased_drawable_alternate.png
similarity index 100%
rename from compat/tests/res/drawable-ldpi/aliased_drawable_alternate.png
rename to compat/src/androidTest/res/drawable-ldpi/aliased_drawable_alternate.png
Binary files differ
diff --git a/compat/tests/res/drawable-mdpi/density_aware_drawable.png b/compat/src/androidTest/res/drawable-mdpi/density_aware_drawable.png
similarity index 100%
rename from compat/tests/res/drawable-mdpi/density_aware_drawable.png
rename to compat/src/androidTest/res/drawable-mdpi/density_aware_drawable.png
Binary files differ
diff --git a/compat/tests/res/drawable-mdpi/test_drawable.png b/compat/src/androidTest/res/drawable-mdpi/test_drawable.png
similarity index 100%
rename from compat/tests/res/drawable-mdpi/test_drawable.png
rename to compat/src/androidTest/res/drawable-mdpi/test_drawable.png
Binary files differ
diff --git a/compat/tests/res/drawable-xhdpi/density_aware_drawable.png b/compat/src/androidTest/res/drawable-xhdpi/density_aware_drawable.png
similarity index 100%
rename from compat/tests/res/drawable-xhdpi/density_aware_drawable.png
rename to compat/src/androidTest/res/drawable-xhdpi/density_aware_drawable.png
Binary files differ
diff --git a/compat/tests/res/drawable-xxhdpi/density_aware_drawable.png b/compat/src/androidTest/res/drawable-xxhdpi/density_aware_drawable.png
similarity index 100%
rename from compat/tests/res/drawable-xxhdpi/density_aware_drawable.png
rename to compat/src/androidTest/res/drawable-xxhdpi/density_aware_drawable.png
Binary files differ
diff --git a/compat/tests/res/drawable/action_icon.xml b/compat/src/androidTest/res/drawable/action_icon.xml
similarity index 100%
rename from compat/tests/res/drawable/action_icon.xml
rename to compat/src/androidTest/res/drawable/action_icon.xml
diff --git a/compat/tests/res/drawable/action_icon2.xml b/compat/src/androidTest/res/drawable/action_icon2.xml
similarity index 100%
rename from compat/tests/res/drawable/action_icon2.xml
rename to compat/src/androidTest/res/drawable/action_icon2.xml
diff --git a/compat/tests/res/drawable/content_icon.xml b/compat/src/androidTest/res/drawable/content_icon.xml
similarity index 100%
rename from compat/tests/res/drawable/content_icon.xml
rename to compat/src/androidTest/res/drawable/content_icon.xml
diff --git a/compat/tests/res/drawable/content_icon2.xml b/compat/src/androidTest/res/drawable/content_icon2.xml
similarity index 100%
rename from compat/tests/res/drawable/content_icon2.xml
rename to compat/src/androidTest/res/drawable/content_icon2.xml
diff --git a/compat/tests/res/drawable/pointer_icon.xml b/compat/src/androidTest/res/drawable/pointer_icon.xml
similarity index 100%
rename from compat/tests/res/drawable/pointer_icon.xml
rename to compat/src/androidTest/res/drawable/pointer_icon.xml
diff --git a/compat/tests/res/drawable/test_drawable_blue.xml b/compat/src/androidTest/res/drawable/test_drawable_blue.xml
similarity index 100%
rename from compat/tests/res/drawable/test_drawable_blue.xml
rename to compat/src/androidTest/res/drawable/test_drawable_blue.xml
diff --git a/compat/tests/res/drawable/test_drawable_green.xml b/compat/src/androidTest/res/drawable/test_drawable_green.xml
similarity index 100%
rename from compat/tests/res/drawable/test_drawable_green.xml
rename to compat/src/androidTest/res/drawable/test_drawable_green.xml
diff --git a/compat/tests/res/drawable/test_drawable_red.xml b/compat/src/androidTest/res/drawable/test_drawable_red.xml
similarity index 100%
rename from compat/tests/res/drawable/test_drawable_red.xml
rename to compat/src/androidTest/res/drawable/test_drawable_red.xml
diff --git a/compat/tests/res/drawable/themed_bitmap.xml b/compat/src/androidTest/res/drawable/themed_bitmap.xml
similarity index 100%
rename from compat/tests/res/drawable/themed_bitmap.xml
rename to compat/src/androidTest/res/drawable/themed_bitmap.xml
diff --git a/compat/tests/res/drawable/themed_drawable.xml b/compat/src/androidTest/res/drawable/themed_drawable.xml
similarity index 100%
rename from compat/tests/res/drawable/themed_drawable.xml
rename to compat/src/androidTest/res/drawable/themed_drawable.xml
diff --git a/compat/tests/res/font/dummyproviderfont.xml b/compat/src/androidTest/res/font/dummyproviderfont.xml
similarity index 100%
rename from compat/tests/res/font/dummyproviderfont.xml
rename to compat/src/androidTest/res/font/dummyproviderfont.xml
diff --git a/compat/tests/res/font/invalid_font.ttf b/compat/src/androidTest/res/font/invalid_font.ttf
similarity index 100%
rename from compat/tests/res/font/invalid_font.ttf
rename to compat/src/androidTest/res/font/invalid_font.ttf
diff --git a/compat/tests/res/font/invalid_xmlempty.xml b/compat/src/androidTest/res/font/invalid_xmlempty.xml
similarity index 100%
rename from compat/tests/res/font/invalid_xmlempty.xml
rename to compat/src/androidTest/res/font/invalid_xmlempty.xml
diff --git a/compat/tests/res/font/invalid_xmlfamily.xml b/compat/src/androidTest/res/font/invalid_xmlfamily.xml
similarity index 100%
rename from compat/tests/res/font/invalid_xmlfamily.xml
rename to compat/src/androidTest/res/font/invalid_xmlfamily.xml
diff --git a/compat/tests/res/font/invalid_xmlfont.xml b/compat/src/androidTest/res/font/invalid_xmlfont.xml
similarity index 100%
rename from compat/tests/res/font/invalid_xmlfont.xml
rename to compat/src/androidTest/res/font/invalid_xmlfont.xml
diff --git a/compat/tests/res/font/invalid_xmlfont_contains_invalid_font_file.xml b/compat/src/androidTest/res/font/invalid_xmlfont_contains_invalid_font_file.xml
similarity index 100%
rename from compat/tests/res/font/invalid_xmlfont_contains_invalid_font_file.xml
rename to compat/src/androidTest/res/font/invalid_xmlfont_contains_invalid_font_file.xml
diff --git a/compat/tests/res/font/large_a.ttf b/compat/src/androidTest/res/font/large_a.ttf
similarity index 100%
rename from compat/tests/res/font/large_a.ttf
rename to compat/src/androidTest/res/font/large_a.ttf
Binary files differ
diff --git a/compat/tests/res/font/large_b.ttf b/compat/src/androidTest/res/font/large_b.ttf
similarity index 100%
rename from compat/tests/res/font/large_b.ttf
rename to compat/src/androidTest/res/font/large_b.ttf
Binary files differ
diff --git a/compat/tests/res/font/large_c.ttf b/compat/src/androidTest/res/font/large_c.ttf
similarity index 100%
rename from compat/tests/res/font/large_c.ttf
rename to compat/src/androidTest/res/font/large_c.ttf
Binary files differ
diff --git a/compat/tests/res/font/large_d.ttf b/compat/src/androidTest/res/font/large_d.ttf
similarity index 100%
rename from compat/tests/res/font/large_d.ttf
rename to compat/src/androidTest/res/font/large_d.ttf
Binary files differ
diff --git a/compat/tests/res/font/sample_font_collection.ttc b/compat/src/androidTest/res/font/sample_font_collection.ttc
similarity index 100%
rename from compat/tests/res/font/sample_font_collection.ttc
rename to compat/src/androidTest/res/font/sample_font_collection.ttc
Binary files differ
diff --git a/compat/tests/res/font/samplefont.ttf b/compat/src/androidTest/res/font/samplefont.ttf
similarity index 100%
rename from compat/tests/res/font/samplefont.ttf
rename to compat/src/androidTest/res/font/samplefont.ttf
Binary files differ
diff --git a/compat/tests/res/font/samplefont2.ttf b/compat/src/androidTest/res/font/samplefont2.ttf
similarity index 100%
rename from compat/tests/res/font/samplefont2.ttf
rename to compat/src/androidTest/res/font/samplefont2.ttf
Binary files differ
diff --git a/compat/tests/res/font/samplefont3.ttf b/compat/src/androidTest/res/font/samplefont3.ttf
similarity index 100%
rename from compat/tests/res/font/samplefont3.ttf
rename to compat/src/androidTest/res/font/samplefont3.ttf
Binary files differ
diff --git a/compat/tests/res/font/samplefont4.ttf b/compat/src/androidTest/res/font/samplefont4.ttf
similarity index 100%
rename from compat/tests/res/font/samplefont4.ttf
rename to compat/src/androidTest/res/font/samplefont4.ttf
Binary files differ
diff --git a/compat/tests/res/font/samplexmldownloadedfont.xml b/compat/src/androidTest/res/font/samplexmldownloadedfont.xml
similarity index 100%
rename from compat/tests/res/font/samplexmldownloadedfont.xml
rename to compat/src/androidTest/res/font/samplexmldownloadedfont.xml
diff --git a/compat/tests/res/font/samplexmldownloadedfontblocking.xml b/compat/src/androidTest/res/font/samplexmldownloadedfontblocking.xml
similarity index 100%
rename from compat/tests/res/font/samplexmldownloadedfontblocking.xml
rename to compat/src/androidTest/res/font/samplexmldownloadedfontblocking.xml
diff --git a/compat/tests/res/font/samplexmlfont.xml b/compat/src/androidTest/res/font/samplexmlfont.xml
similarity index 100%
rename from compat/tests/res/font/samplexmlfont.xml
rename to compat/src/androidTest/res/font/samplexmlfont.xml
diff --git a/compat/tests/res/font/samplexmlfont2.xml b/compat/src/androidTest/res/font/samplexmlfont2.xml
similarity index 100%
rename from compat/tests/res/font/samplexmlfont2.xml
rename to compat/src/androidTest/res/font/samplexmlfont2.xml
diff --git a/compat/tests/res/font/samplexmlfontforparsing.xml b/compat/src/androidTest/res/font/samplexmlfontforparsing.xml
similarity index 100%
rename from compat/tests/res/font/samplexmlfontforparsing.xml
rename to compat/src/androidTest/res/font/samplexmlfontforparsing.xml
diff --git a/compat/tests/res/font/samplexmlfontforparsing2.xml b/compat/src/androidTest/res/font/samplexmlfontforparsing2.xml
similarity index 100%
rename from compat/tests/res/font/samplexmlfontforparsing2.xml
rename to compat/src/androidTest/res/font/samplexmlfontforparsing2.xml
diff --git a/compat/tests/res/font/styletest_async_providerfont.xml b/compat/src/androidTest/res/font/styletest_async_providerfont.xml
similarity index 100%
rename from compat/tests/res/font/styletest_async_providerfont.xml
rename to compat/src/androidTest/res/font/styletest_async_providerfont.xml
diff --git a/compat/tests/res/font/styletest_sync_providerfont.xml b/compat/src/androidTest/res/font/styletest_sync_providerfont.xml
similarity index 100%
rename from compat/tests/res/font/styletest_sync_providerfont.xml
rename to compat/src/androidTest/res/font/styletest_sync_providerfont.xml
diff --git a/compat/tests/res/font/styletestfont.xml b/compat/src/androidTest/res/font/styletestfont.xml
similarity index 100%
rename from compat/tests/res/font/styletestfont.xml
rename to compat/src/androidTest/res/font/styletestfont.xml
diff --git a/compat/tests/res/font/ttctestfont1.xml b/compat/src/androidTest/res/font/ttctestfont1.xml
similarity index 100%
rename from compat/tests/res/font/ttctestfont1.xml
rename to compat/src/androidTest/res/font/ttctestfont1.xml
diff --git a/compat/tests/res/font/ttctestfont2.xml b/compat/src/androidTest/res/font/ttctestfont2.xml
similarity index 100%
rename from compat/tests/res/font/ttctestfont2.xml
rename to compat/src/androidTest/res/font/ttctestfont2.xml
diff --git a/compat/tests/res/font/variable_width_dash_font.ttf b/compat/src/androidTest/res/font/variable_width_dash_font.ttf
similarity index 100%
rename from compat/tests/res/font/variable_width_dash_font.ttf
rename to compat/src/androidTest/res/font/variable_width_dash_font.ttf
Binary files differ
diff --git a/compat/tests/res/font/variationsettingstestfont1.xml b/compat/src/androidTest/res/font/variationsettingstestfont1.xml
similarity index 100%
rename from compat/tests/res/font/variationsettingstestfont1.xml
rename to compat/src/androidTest/res/font/variationsettingstestfont1.xml
diff --git a/compat/tests/res/font/variationsettingstestfont2.xml b/compat/src/androidTest/res/font/variationsettingstestfont2.xml
similarity index 100%
rename from compat/tests/res/font/variationsettingstestfont2.xml
rename to compat/src/androidTest/res/font/variationsettingstestfont2.xml
diff --git a/compat/tests/res/layout/activity_compat_activity.xml b/compat/src/androidTest/res/layout/activity_compat_activity.xml
similarity index 100%
rename from compat/tests/res/layout/activity_compat_activity.xml
rename to compat/src/androidTest/res/layout/activity_compat_activity.xml
diff --git a/compat/tests/res/layout/drag_source_activity.xml b/compat/src/androidTest/res/layout/drag_source_activity.xml
similarity index 100%
rename from compat/tests/res/layout/drag_source_activity.xml
rename to compat/src/androidTest/res/layout/drag_source_activity.xml
diff --git a/compat/tests/res/layout/list_view_activity.xml b/compat/src/androidTest/res/layout/list_view_activity.xml
similarity index 100%
rename from compat/tests/res/layout/list_view_activity.xml
rename to compat/src/androidTest/res/layout/list_view_activity.xml
diff --git a/compat/tests/res/layout/list_view_row.xml b/compat/src/androidTest/res/layout/list_view_row.xml
similarity index 100%
rename from compat/tests/res/layout/list_view_row.xml
rename to compat/src/androidTest/res/layout/list_view_row.xml
diff --git a/compat/tests/res/layout/text_view_activity.xml b/compat/src/androidTest/res/layout/text_view_activity.xml
similarity index 100%
rename from compat/tests/res/layout/text_view_activity.xml
rename to compat/src/androidTest/res/layout/text_view_activity.xml
diff --git a/compat/tests/res/layout/view_compat_activity.xml b/compat/src/androidTest/res/layout/view_compat_activity.xml
similarity index 100%
rename from compat/tests/res/layout/view_compat_activity.xml
rename to compat/src/androidTest/res/layout/view_compat_activity.xml
diff --git a/compat/tests/res/layout/vpa_activity.xml b/compat/src/androidTest/res/layout/vpa_activity.xml
similarity index 100%
rename from compat/tests/res/layout/vpa_activity.xml
rename to compat/src/androidTest/res/layout/vpa_activity.xml
diff --git a/compat/tests/res/values-hdpi/dimens.xml b/compat/src/androidTest/res/values-hdpi/dimens.xml
similarity index 100%
rename from compat/tests/res/values-hdpi/dimens.xml
rename to compat/src/androidTest/res/values-hdpi/dimens.xml
diff --git a/compat/tests/res/values-mdpi/dimens.xml b/compat/src/androidTest/res/values-mdpi/dimens.xml
similarity index 100%
rename from compat/tests/res/values-mdpi/dimens.xml
rename to compat/src/androidTest/res/values-mdpi/dimens.xml
diff --git a/compat/tests/res/values-xhdpi/dimens.xml b/compat/src/androidTest/res/values-xhdpi/dimens.xml
similarity index 100%
rename from compat/tests/res/values-xhdpi/dimens.xml
rename to compat/src/androidTest/res/values-xhdpi/dimens.xml
diff --git a/compat/tests/res/values-xxhdpi/dimens.xml b/compat/src/androidTest/res/values-xxhdpi/dimens.xml
similarity index 100%
rename from compat/tests/res/values-xxhdpi/dimens.xml
rename to compat/src/androidTest/res/values-xxhdpi/dimens.xml
diff --git a/compat/tests/res/values/arrays.xml b/compat/src/androidTest/res/values/arrays.xml
similarity index 100%
rename from compat/tests/res/values/arrays.xml
rename to compat/src/androidTest/res/values/arrays.xml
diff --git a/compat/tests/res/values/attrs.xml b/compat/src/androidTest/res/values/attrs.xml
similarity index 100%
rename from compat/tests/res/values/attrs.xml
rename to compat/src/androidTest/res/values/attrs.xml
diff --git a/compat/tests/res/values/colors.xml b/compat/src/androidTest/res/values/colors.xml
similarity index 100%
rename from compat/tests/res/values/colors.xml
rename to compat/src/androidTest/res/values/colors.xml
diff --git a/compat/tests/res/values/dimens.xml b/compat/src/androidTest/res/values/dimens.xml
similarity index 100%
rename from compat/tests/res/values/dimens.xml
rename to compat/src/androidTest/res/values/dimens.xml
diff --git a/compat/tests/res/values/drawables.xml b/compat/src/androidTest/res/values/drawables.xml
similarity index 100%
rename from compat/tests/res/values/drawables.xml
rename to compat/src/androidTest/res/values/drawables.xml
diff --git a/compat/tests/res/values/strings.xml b/compat/src/androidTest/res/values/strings.xml
similarity index 100%
rename from compat/tests/res/values/strings.xml
rename to compat/src/androidTest/res/values/strings.xml
diff --git a/compat/tests/res/values/styles.xml b/compat/src/androidTest/res/values/styles.xml
similarity index 100%
rename from compat/tests/res/values/styles.xml
rename to compat/src/androidTest/res/values/styles.xml
diff --git a/compat/src/main/java/android/support/v4/app/INotificationSideChannel.aidl b/compat/src/main/aidl/android/support/v4/app/INotificationSideChannel.aidl
similarity index 100%
rename from compat/src/main/java/android/support/v4/app/INotificationSideChannel.aidl
rename to compat/src/main/aidl/android/support/v4/app/INotificationSideChannel.aidl
diff --git a/compat/src/main/java/android/support/v4/os/IResultReceiver.aidl b/compat/src/main/aidl/android/support/v4/os/IResultReceiver.aidl
similarity index 100%
rename from compat/src/main/java/android/support/v4/os/IResultReceiver.aidl
rename to compat/src/main/aidl/android/support/v4/os/IResultReceiver.aidl
diff --git a/compat/src/main/java/android/support/v4/os/ResultReceiver.aidl b/compat/src/main/aidl/android/support/v4/os/ResultReceiver.aidl
similarity index 100%
rename from compat/src/main/java/android/support/v4/os/ResultReceiver.aidl
rename to compat/src/main/aidl/android/support/v4/os/ResultReceiver.aidl
diff --git a/compat/src/main/java/android/support/v4/app/NotificationCompat.java b/compat/src/main/java/android/support/v4/app/NotificationCompat.java
index 1e2f317..f5610ed 100644
--- a/compat/src/main/java/android/support/v4/app/NotificationCompat.java
+++ b/compat/src/main/java/android/support/v4/app/NotificationCompat.java
@@ -17,6 +17,7 @@
 package android.support.v4.app;
 
 import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+
 import static java.lang.annotation.RetentionPolicy.SOURCE;
 
 import android.app.Activity;
@@ -2884,6 +2885,11 @@
          */
         public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9;
 
+        /**
+         * {@link SemanticAction}: Call a contact, group, etc.
+         */
+        public static final int SEMANTIC_ACTION_CALL = 10;
+
         static final String EXTRA_SHOWS_USER_INTERFACE =
                 "android.support.action.showsUserInterface";
 
@@ -3446,7 +3452,8 @@
                 SEMANTIC_ACTION_MUTE,
                 SEMANTIC_ACTION_UNMUTE,
                 SEMANTIC_ACTION_THUMBS_UP,
-                SEMANTIC_ACTION_THUMBS_DOWN
+                SEMANTIC_ACTION_THUMBS_DOWN,
+                SEMANTIC_ACTION_CALL
         })
         @Retention(RetentionPolicy.SOURCE)
         public @interface SemanticAction {}
diff --git a/compat/src/main/java/android/support/v4/text/util/LinkifyCompat.java b/compat/src/main/java/android/support/v4/text/util/LinkifyCompat.java
index 3998279..32d1914 100644
--- a/compat/src/main/java/android/support/v4/text/util/LinkifyCompat.java
+++ b/compat/src/main/java/android/support/v4/text/util/LinkifyCompat.java
@@ -18,7 +18,6 @@
 
 import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
-import android.os.Build;
 import android.support.annotation.IntDef;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
@@ -98,7 +97,7 @@
      *  @return True if at least one link is found and applied.
      */
     public static boolean addLinks(@NonNull Spannable text, @LinkifyMask int mask) {
-        if (Build.VERSION.SDK_INT >= 27) {
+        if (shouldAddLinksFallbackToFramework()) {
             return Linkify.addLinks(text, mask);
         }
         if (mask == 0) {
@@ -111,13 +110,11 @@
             text.removeSpan(old[i]);
         }
 
-        // Use framework to linkify phone numbers.
-        boolean frameworkReturn = false;
         if ((mask & Linkify.PHONE_NUMBERS) != 0) {
-            frameworkReturn = Linkify.addLinks(text, Linkify.PHONE_NUMBERS);
+            Linkify.addLinks(text, Linkify.PHONE_NUMBERS);
         }
 
-        ArrayList<LinkSpec> links = new ArrayList<LinkSpec>();
+        final ArrayList<LinkSpec> links = new ArrayList<>();
 
         if ((mask & Linkify.WEB_URLS) != 0) {
             gatherLinks(links, text, PatternsCompat.AUTOLINK_WEB_URL,
@@ -162,7 +159,7 @@
      *  @return True if at least one link is found and applied.
      */
     public static boolean addLinks(@NonNull TextView text, @LinkifyMask int mask) {
-        if (Build.VERSION.SDK_INT >= 26) {
+        if (shouldAddLinksFallbackToFramework()) {
             return Linkify.addLinks(text, mask);
         }
         if (mask == 0) {
@@ -205,7 +202,7 @@
      */
     public static void addLinks(@NonNull TextView text, @NonNull Pattern pattern,
             @Nullable String scheme) {
-        if (Build.VERSION.SDK_INT >= 26) {
+        if (shouldAddLinksFallbackToFramework()) {
             Linkify.addLinks(text, pattern, scheme);
             return;
         }
@@ -229,7 +226,7 @@
     public static void addLinks(@NonNull TextView text, @NonNull Pattern pattern,
             @Nullable String scheme, @Nullable MatchFilter matchFilter,
             @Nullable TransformFilter transformFilter) {
-        if (Build.VERSION.SDK_INT >= 26) {
+        if (shouldAddLinksFallbackToFramework()) {
             Linkify.addLinks(text, pattern, scheme, matchFilter, transformFilter);
             return;
         }
@@ -256,7 +253,7 @@
     public static void addLinks(@NonNull TextView text, @NonNull Pattern pattern,
             @Nullable String defaultScheme, @Nullable String[] schemes,
             @Nullable MatchFilter matchFilter, @Nullable TransformFilter transformFilter) {
-        if (Build.VERSION.SDK_INT >= 26) {
+        if (shouldAddLinksFallbackToFramework()) {
             Linkify.addLinks(text, pattern, defaultScheme, schemes, matchFilter, transformFilter);
             return;
         }
@@ -281,7 +278,7 @@
      */
     public static boolean addLinks(@NonNull Spannable text, @NonNull Pattern pattern,
             @Nullable String scheme) {
-        if (Build.VERSION.SDK_INT >= 26) {
+        if (shouldAddLinksFallbackToFramework()) {
             return Linkify.addLinks(text, pattern, scheme);
         }
         return addLinks(text, pattern, scheme, null, null, null);
@@ -305,7 +302,7 @@
     public static boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern,
             @Nullable String scheme, @Nullable MatchFilter matchFilter,
             @Nullable TransformFilter transformFilter) {
-        if (Build.VERSION.SDK_INT >= 26) {
+        if (shouldAddLinksFallbackToFramework()) {
             return Linkify.addLinks(spannable, pattern, scheme, matchFilter, transformFilter);
         }
         return addLinks(spannable, pattern, scheme, null, matchFilter,
@@ -331,7 +328,7 @@
     public static boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern,
             @Nullable  String defaultScheme, @Nullable String[] schemes,
             @Nullable MatchFilter matchFilter, @Nullable TransformFilter transformFilter) {
-        if (Build.VERSION.SDK_INT >= 26) {
+        if (shouldAddLinksFallbackToFramework()) {
             return Linkify.addLinks(spannable, pattern, defaultScheme, schemes, matchFilter,
                     transformFilter);
         }
@@ -371,6 +368,10 @@
         return hasMatches;
     }
 
+    private static boolean shouldAddLinksFallbackToFramework() {
+        return BuildCompat.isAtLeastP();
+    }
+
     private static void addLinkMovementMethod(@NonNull TextView t) {
         MovementMethod m = t.getMovementMethod();
 
diff --git a/core-ui/src/main/java/android/support/v4/view/NestedScrollingChildHelper.java b/compat/src/main/java/android/support/v4/view/NestedScrollingChildHelper.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/NestedScrollingChildHelper.java
rename to compat/src/main/java/android/support/v4/view/NestedScrollingChildHelper.java
diff --git a/core-ui/src/main/java/android/support/v4/view/NestedScrollingParentHelper.java b/compat/src/main/java/android/support/v4/view/NestedScrollingParentHelper.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/NestedScrollingParentHelper.java
rename to compat/src/main/java/android/support/v4/view/NestedScrollingParentHelper.java
diff --git a/core-ui/src/main/java/android/support/v4/widget/NestedScrollView.java b/compat/src/main/java/android/support/v4/widget/NestedScrollView.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/NestedScrollView.java
rename to compat/src/main/java/android/support/v4/widget/NestedScrollView.java
diff --git a/compat/tests/NO_DOCS b/compat/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/compat/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/content/src/androidTest/NO_DOCS b/content/src/androidTest/NO_DOCS
deleted file mode 100644
index 4dad694..0000000
--- a/content/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/coordinatorlayout/api/current.txt b/coordinatorlayout/api/current.txt
new file mode 100644
index 0000000..a5a44a2
--- /dev/null
+++ b/coordinatorlayout/api/current.txt
@@ -0,0 +1,97 @@
+package android.support.design.widget {
+
+  public class CoordinatorLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingParent2 {
+    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 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 interface CoordinatorLayout.AttachedBehavior {
+    method public abstract android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
+  }
+
+  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 deprecated 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;
+  }
+
+}
+
diff --git a/coordinatorlayout/build.gradle b/coordinatorlayout/build.gradle
new file mode 100644
index 0000000..c6ce55b
--- /dev/null
+++ b/coordinatorlayout/build.gradle
@@ -0,0 +1,42 @@
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    api(project(":support-annotations"))
+    api(project(":support-compat"))
+    api(project(":customview"))
+
+    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(ESPRESSO_CONTRIB, libs.exclude_support)
+    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation project(':support-testutils'), {
+        exclude group: 'com.android.support', module: 'support-core-ui'
+    }
+}
+
+android {
+    sourceSets {
+        main.res.srcDirs = [
+                'src/main/res',
+                'src/main/res-public'
+        ]
+    }
+    buildTypes.all {
+        consumerProguardFiles 'proguard-rules.pro'
+    }
+}
+
+supportLibrary {
+    name = "Android Support Library Coordinator Layout"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
+    inceptionYear = "2011"
+    description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
+}
diff --git a/core-ui/proguard-rules.pro b/coordinatorlayout/proguard-rules.pro
similarity index 100%
rename from core-ui/proguard-rules.pro
rename to coordinatorlayout/proguard-rules.pro
diff --git a/coordinatorlayout/src/androidTest/AndroidManifest.xml b/coordinatorlayout/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..ccf580d
--- /dev/null
+++ b/coordinatorlayout/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.support.coordinatorlayout.test">
+    <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
+
+    <application
+        android:supportsRtl="true"
+        android:theme="@style/TestActivityTheme">
+
+        <activity android:name="android.support.design.widget.CoordinatorLayoutActivity"/>
+
+        <activity android:name="android.support.design.widget.DynamicCoordinatorLayoutActivity"/>
+
+    </application>
+
+</manifest>
diff --git a/core-ui/tests/java/android/support/design/custom/CustomBar.java b/coordinatorlayout/src/androidTest/java/android/support/design/custom/CustomBar.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/custom/CustomBar.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/custom/CustomBar.java
diff --git a/core-ui/tests/java/android/support/design/custom/CustomTextView.java b/coordinatorlayout/src/androidTest/java/android/support/design/custom/CustomTextView.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/custom/CustomTextView.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/custom/CustomTextView.java
diff --git a/core-ui/tests/java/android/support/design/custom/CustomTextView2.java b/coordinatorlayout/src/androidTest/java/android/support/design/custom/CustomTextView2.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/custom/CustomTextView2.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/custom/CustomTextView2.java
diff --git a/core-ui/tests/java/android/support/design/custom/TestFloatingBehavior.java b/coordinatorlayout/src/androidTest/java/android/support/design/custom/TestFloatingBehavior.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/custom/TestFloatingBehavior.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/custom/TestFloatingBehavior.java
diff --git a/core-ui/tests/java/android/support/design/testutils/CoordinatorLayoutUtils.java b/coordinatorlayout/src/androidTest/java/android/support/design/testutils/CoordinatorLayoutUtils.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/testutils/CoordinatorLayoutUtils.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/testutils/CoordinatorLayoutUtils.java
diff --git a/core-ui/tests/java/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java
similarity index 98%
rename from core-ui/tests/java/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java
index 5c79b21..f00d83b 100755
--- a/core-ui/tests/java/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java
+++ b/coordinatorlayout/src/androidTest/java/android/support/design/widget/BaseDynamicCoordinatorLayoutTest.java
@@ -20,7 +20,7 @@
 import static org.hamcrest.Matchers.any;
 
 import android.support.annotation.LayoutRes;
-import android.support.coreui.test.R;
+import android.support.coordinatorlayout.test.R;
 import android.support.test.annotation.UiThreadTest;
 import android.support.test.espresso.UiController;
 import android.support.test.espresso.ViewAction;
diff --git a/core-ui/tests/java/android/support/design/widget/BaseInstrumentationTestCase.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/BaseInstrumentationTestCase.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/widget/BaseInstrumentationTestCase.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/BaseInstrumentationTestCase.java
diff --git a/core-ui/tests/java/android/support/design/widget/BaseTestActivity.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/BaseTestActivity.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/widget/BaseTestActivity.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/BaseTestActivity.java
diff --git a/core-ui/tests/java/android/support/design/widget/CoordinatorLayoutActivity.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutActivity.java
similarity index 95%
rename from core-ui/tests/java/android/support/design/widget/CoordinatorLayoutActivity.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutActivity.java
index b7fe740..9fcc271 100644
--- a/core-ui/tests/java/android/support/design/widget/CoordinatorLayoutActivity.java
+++ b/coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutActivity.java
@@ -16,7 +16,7 @@
 
 package android.support.design.widget;
 
-import android.support.coreui.test.R;
+import android.support.coordinatorlayout.test.R;
 import android.support.v4.BaseTestActivity;
 import android.widget.FrameLayout;
 
diff --git a/core-ui/tests/java/android/support/design/widget/CoordinatorLayoutSortTest.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutSortTest.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/widget/CoordinatorLayoutSortTest.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutSortTest.java
diff --git a/core-ui/tests/java/android/support/design/widget/CoordinatorLayoutTest.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutTest.java
similarity index 99%
rename from core-ui/tests/java/android/support/design/widget/CoordinatorLayoutTest.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutTest.java
index 9b4c586..bbf46f9 100644
--- a/core-ui/tests/java/android/support/design/widget/CoordinatorLayoutTest.java
+++ b/coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorLayoutTest.java
@@ -41,7 +41,7 @@
 import android.content.Context;
 import android.graphics.Rect;
 import android.support.annotation.NonNull;
-import android.support.coreui.test.R;
+import android.support.coordinatorlayout.test.R;
 import android.support.design.testutils.CoordinatorLayoutUtils;
 import android.support.design.testutils.CoordinatorLayoutUtils.DependentBehavior;
 import android.support.design.widget.CoordinatorLayout.Behavior;
diff --git a/core-ui/tests/java/android/support/design/widget/CoordinatorSnackbarWithButtonTest.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorSnackbarWithButtonTest.java
similarity index 98%
rename from core-ui/tests/java/android/support/design/widget/CoordinatorSnackbarWithButtonTest.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorSnackbarWithButtonTest.java
index 7089b80..f9f7694 100644
--- a/core-ui/tests/java/android/support/design/widget/CoordinatorSnackbarWithButtonTest.java
+++ b/coordinatorlayout/src/androidTest/java/android/support/design/widget/CoordinatorSnackbarWithButtonTest.java
@@ -24,7 +24,7 @@
 
 import android.os.Handler;
 import android.os.Looper;
-import android.support.coreui.test.R;
+import android.support.coordinatorlayout.test.R;
 import android.support.design.custom.CustomBar;
 import android.support.design.custom.TestFloatingBehavior;
 import android.support.test.annotation.UiThreadTest;
diff --git a/core-ui/tests/java/android/support/design/widget/DesignViewActions.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/DesignViewActions.java
similarity index 100%
rename from core-ui/tests/java/android/support/design/widget/DesignViewActions.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/DesignViewActions.java
diff --git a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java b/coordinatorlayout/src/androidTest/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
similarity index 94%
rename from core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
rename to coordinatorlayout/src/androidTest/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
index ac61704..e6f7935 100644
--- a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
+++ b/coordinatorlayout/src/androidTest/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
@@ -16,7 +16,7 @@
 
 package android.support.design.widget;
 
-import android.support.coreui.test.R;
+import android.support.coordinatorlayout.test.R;
 
 /**
  * Test activity for testing various aspects of {@link CoordinatorLayout}.
diff --git a/compat/tests/java/android/support/v4/BaseTestActivity.java b/coordinatorlayout/src/androidTest/java/android/support/v4/BaseTestActivity.java
similarity index 100%
copy from compat/tests/java/android/support/v4/BaseTestActivity.java
copy to coordinatorlayout/src/androidTest/java/android/support/v4/BaseTestActivity.java
diff --git a/core-ui/tests/java/android/support/v4/widget/DirectedAcyclicGraphTest.java b/coordinatorlayout/src/androidTest/java/android/support/v4/widget/DirectedAcyclicGraphTest.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/widget/DirectedAcyclicGraphTest.java
rename to coordinatorlayout/src/androidTest/java/android/support/v4/widget/DirectedAcyclicGraphTest.java
diff --git a/core-ui/tests/res/layout/activity_coordinator_layout.xml b/coordinatorlayout/src/androidTest/res/layout/activity_coordinator_layout.xml
similarity index 100%
rename from core-ui/tests/res/layout/activity_coordinator_layout.xml
rename to coordinatorlayout/src/androidTest/res/layout/activity_coordinator_layout.xml
diff --git a/core-ui/tests/res/layout/design_snackbar_behavior_annotation.xml b/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_annotation.xml
similarity index 100%
rename from core-ui/tests/res/layout/design_snackbar_behavior_annotation.xml
rename to coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_annotation.xml
diff --git a/core-ui/tests/res/layout/design_snackbar_behavior_interface.xml b/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_interface.xml
similarity index 100%
rename from core-ui/tests/res/layout/design_snackbar_behavior_interface.xml
rename to coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_interface.xml
diff --git a/core-ui/tests/res/layout/design_snackbar_behavior_layout_attr.xml b/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_layout_attr.xml
similarity index 100%
rename from core-ui/tests/res/layout/design_snackbar_behavior_layout_attr.xml
rename to coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_layout_attr.xml
diff --git a/core-ui/tests/res/layout/design_snackbar_behavior_runtime.xml b/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_runtime.xml
similarity index 100%
rename from core-ui/tests/res/layout/design_snackbar_behavior_runtime.xml
rename to coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_runtime.xml
diff --git a/core-ui/tests/res/layout/dynamic_coordinator_layout.xml b/coordinatorlayout/src/androidTest/res/layout/dynamic_coordinator_layout.xml
similarity index 100%
rename from core-ui/tests/res/layout/dynamic_coordinator_layout.xml
rename to coordinatorlayout/src/androidTest/res/layout/dynamic_coordinator_layout.xml
diff --git a/core-ui/tests/res/layout/emulated_snackbar.xml b/coordinatorlayout/src/androidTest/res/layout/emulated_snackbar.xml
similarity index 100%
rename from core-ui/tests/res/layout/emulated_snackbar.xml
rename to coordinatorlayout/src/androidTest/res/layout/emulated_snackbar.xml
diff --git a/core-ui/tests/res/layout/include_nestedscrollview.xml b/coordinatorlayout/src/androidTest/res/layout/include_nestedscrollview.xml
similarity index 100%
rename from core-ui/tests/res/layout/include_nestedscrollview.xml
rename to coordinatorlayout/src/androidTest/res/layout/include_nestedscrollview.xml
diff --git a/core-ui/tests/res/values/ids.xml b/coordinatorlayout/src/androidTest/res/values/ids.xml
similarity index 66%
copy from core-ui/tests/res/values/ids.xml
copy to coordinatorlayout/src/androidTest/res/values/ids.xml
index f3ac9b4..b34ad80 100644
--- a/core-ui/tests/res/values/ids.xml
+++ b/coordinatorlayout/src/androidTest/res/values/ids.xml
@@ -14,15 +14,5 @@
      limitations under the License.
 -->
 <resources>
-    <item name="page_0" type="id"/>
-    <item name="page_1" type="id"/>
-    <item name="page_2" type="id"/>
-    <item name="page_3" type="id"/>
-    <item name="page_4" type="id"/>
-    <item name="page_5" type="id"/>
-    <item name="page_6" type="id"/>
-    <item name="page_7" type="id"/>
-    <item name="page_8" type="id"/>
-    <item name="page_9" type="id"/>
     <item name="anchor" type="id"/>
 </resources>
\ No newline at end of file
diff --git a/core-ui/tests/res/values/styles.xml b/coordinatorlayout/src/androidTest/res/values/styles.xml
similarity index 100%
copy from core-ui/tests/res/values/styles.xml
copy to coordinatorlayout/src/androidTest/res/values/styles.xml
diff --git a/coordinatorlayout/src/main/AndroidManifest.xml b/coordinatorlayout/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..bbad509
--- /dev/null
+++ b/coordinatorlayout/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest package="android.support.coordinatorlayout" />
diff --git a/core-ui/src/main/java/android/support/design/widget/CoordinatorLayout.java b/coordinatorlayout/src/main/java/android/support/design/widget/CoordinatorLayout.java
similarity index 99%
rename from core-ui/src/main/java/android/support/design/widget/CoordinatorLayout.java
rename to coordinatorlayout/src/main/java/android/support/design/widget/CoordinatorLayout.java
index ef4d1ed..91d3fa4 100644
--- a/core-ui/src/main/java/android/support/design/widget/CoordinatorLayout.java
+++ b/coordinatorlayout/src/main/java/android/support/design/widget/CoordinatorLayout.java
@@ -41,10 +41,9 @@
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 import android.support.annotation.VisibleForTesting;
-import android.support.coreui.R;
+import android.support.coordinatorlayout.R;
 import android.support.v4.content.ContextCompat;
 import android.support.v4.graphics.drawable.DrawableCompat;
-import android.support.v4.math.MathUtils;
 import android.support.v4.util.ObjectsCompat;
 import android.support.v4.util.Pools;
 import android.support.v4.view.AbsSavedState;
@@ -1235,7 +1234,7 @@
                     mScrimPaint = new Paint();
                 }
                 mScrimPaint.setColor(lp.mBehavior.getScrimColor(this, child));
-                mScrimPaint.setAlpha(MathUtils.clamp(Math.round(255 * scrimAlpha), 0, 255));
+                mScrimPaint.setAlpha(clamp(Math.round(255 * scrimAlpha), 0, 255));
 
                 final int saved = canvas.save();
                 if (child.isOpaque()) {
@@ -1254,6 +1253,15 @@
         return super.drawChild(canvas, child, drawingTime);
     }
 
+    private static int clamp(int value, int min, int max) {
+        if (value < min) {
+            return min;
+        } else if (value > max) {
+            return max;
+        }
+        return value;
+    }
+
     /**
      * Dispatch any dependent view changes to the relevant {@link Behavior} instances.
      *
diff --git a/core-ui/src/main/java/android/support/v4/widget/DirectedAcyclicGraph.java b/coordinatorlayout/src/main/java/android/support/v4/widget/DirectedAcyclicGraph.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/DirectedAcyclicGraph.java
rename to coordinatorlayout/src/main/java/android/support/v4/widget/DirectedAcyclicGraph.java
diff --git a/core-ui/src/main/java/android/support/v4/widget/ViewGroupUtils.java b/coordinatorlayout/src/main/java/android/support/v4/widget/ViewGroupUtils.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/ViewGroupUtils.java
rename to coordinatorlayout/src/main/java/android/support/v4/widget/ViewGroupUtils.java
diff --git a/core-ui/res-public/values/public_attrs.xml b/coordinatorlayout/src/main/res-public/values/public_attrs.xml
similarity index 100%
rename from core-ui/res-public/values/public_attrs.xml
rename to coordinatorlayout/src/main/res-public/values/public_attrs.xml
diff --git a/core-ui/res-public/values/public_styles.xml b/coordinatorlayout/src/main/res-public/values/public_styles.xml
similarity index 100%
rename from core-ui/res-public/values/public_styles.xml
rename to coordinatorlayout/src/main/res-public/values/public_styles.xml
diff --git a/core-ui/res/values/attrs.xml b/coordinatorlayout/src/main/res/values/attrs.xml
similarity index 100%
rename from core-ui/res/values/attrs.xml
rename to coordinatorlayout/src/main/res/values/attrs.xml
diff --git a/core-ui/res/values/styles.xml b/coordinatorlayout/src/main/res/values/styles.xml
similarity index 100%
rename from core-ui/res/values/styles.xml
rename to coordinatorlayout/src/main/res/values/styles.xml
diff --git a/core-ui/api/27.1.0.ignore b/core-ui/api/27.1.0.ignore
new file mode 100644
index 0000000..e38b98d
--- /dev/null
+++ b/core-ui/api/27.1.0.ignore
@@ -0,0 +1,21 @@
+21edeac
+c8f5cd8
+c6c4dfc
+3ee7015
+897caa3
+0a4a21e
+9a73d77
+2812bc8
+2b135f6
+6862ae7
+1bdc70f
+c79ca3e
+c9f0c98
+4a9b508
+0058a00
+28bb044
+8a30c7e
+19e12f3
+b7ca703
+c4280d0
+1017c49
diff --git a/core-ui/api/current.txt b/core-ui/api/current.txt
index 815d6e3..13abb73 100644
--- a/core-ui/api/current.txt
+++ b/core-ui/api/current.txt
@@ -1,100 +1,3 @@
-package android.support.design.widget {
-
-  public class CoordinatorLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingParent2 {
-    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 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 interface CoordinatorLayout.AttachedBehavior {
-    method public abstract android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
-  }
-
-  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 deprecated 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;
-  }
-
-}
-
 package android.support.v4.app {
 
   public deprecated class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
@@ -125,196 +28,6 @@
 
 }
 
-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 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 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 implements android.view.animation.Interpolator {
-    ctor public FastOutLinearInInterpolator();
-  }
-
-  public class FastOutSlowInInterpolator implements android.view.animation.Interpolator {
-    ctor public FastOutSlowInInterpolator();
-  }
-
-  public class LinearOutSlowInInterpolator implements android.view.animation.Interpolator {
-    ctor public LinearOutSlowInInterpolator();
-  }
-
-}
-
 package android.support.v4.widget {
 
   public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
@@ -344,42 +57,6 @@
     field public static final float RELATIVE_UNSPECIFIED = 0.0f;
   }
 
-  public class CircularProgressDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable {
-    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);
@@ -414,109 +91,6 @@
     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 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);
@@ -524,42 +98,6 @@
     method public void scrollTargetBy(int, int);
   }
 
-  public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild2 android.support.v4.view.NestedScrollingParent android.support.v4.view.ScrollingView {
-    ctor public NestedScrollView(android.content.Context);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet, int);
-    method public boolean arrowScroll(int);
-    method public int computeHorizontalScrollExtent();
-    method public int computeHorizontalScrollOffset();
-    method public int computeHorizontalScrollRange();
-    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
-    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 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);
@@ -592,56 +130,6 @@
     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 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 deprecated class Space extends android.view.View {
     ctor public deprecated Space(android.content.Context, android.util.AttributeSet, int);
     ctor public deprecated Space(android.content.Context, android.util.AttributeSet);
@@ -650,101 +138,5 @@
     method protected deprecated void onMeasure(int, int);
   }
 
-  public class SwipeRefreshLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
-    ctor public SwipeRefreshLayout(android.content.Context);
-    ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
-    method public boolean canChildScrollUp();
-    method public int getProgressCircleDiameter();
-    method public int getProgressViewEndOffset();
-    method public int getProgressViewStartOffset();
-    method public boolean isRefreshing();
-    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 4ff27cb..dc0c81e 100644
--- a/core-ui/build.gradle
+++ b/core-ui/build.gradle
@@ -9,7 +9,15 @@
 dependencies {
     api(project(":support-annotations"))
     api(project(":support-compat"))
-    api project(':support-core-utils')
+    api(project(":support-core-utils"))
+    api(project(":customview"))
+    api(project(":viewpager"))
+    api(project(":coordinatorlayout"))
+    api(project(":drawerlayout"))
+    api(project(":slidingpanelayout"))
+    api(project(":interpolator"))
+    api(project(":swiperefreshlayout"))
+    api(project(":asynclayoutinflater"))
 
     androidTestImplementation(TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
@@ -22,18 +30,6 @@
     testImplementation(JUNIT)
 }
 
-android {
-    sourceSets {
-        main.res.srcDirs = [
-                'res',
-                'res-public'
-        ]
-    }
-    buildTypes.all {
-        consumerProguardFiles 'proguard-rules.pro'
-    }
-}
-
 supportLibrary {
     name = "Android Support Library core UI"
     publish = true
@@ -41,5 +37,4 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2011"
     description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
-    legacySourceLocation = true
 }
diff --git a/core-ui/lint-baseline.xml b/core-ui/lint-baseline.xml
deleted file mode 100644
index 5869ece..0000000
--- a/core-ui/lint-baseline.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="4" by="lint 3.0.0-alpha9">
-
-    <issue
-        id="WrongConstant"
-        message="Must be one or more of: Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END"
-        errorLine1="                            + gravityToString(childGravity) + &quot; but this &quot; + TAG + &quot; already has a &quot;"
-        errorLine2="                                              ~~~~~~~~~~~~">
-        <location
-            file="java/android/support/v4/widget/DrawerLayout.java"
-            line="1075"
-            column="47"/>
-    </issue>
-
-</issues>
diff --git a/core-ui/tests/AndroidManifest.xml b/core-ui/src/androidTest/AndroidManifest.xml
similarity index 78%
rename from core-ui/tests/AndroidManifest.xml
rename to core-ui/src/androidTest/AndroidManifest.xml
index 4ea7691..cb53f76 100644
--- a/core-ui/tests/AndroidManifest.xml
+++ b/core-ui/src/androidTest/AndroidManifest.xml
@@ -28,18 +28,8 @@
         android:theme="@style/TestActivityTheme">
         <activity android:name="android.support.v4.widget.ExploreByTouchHelperTestActivity"/>
 
-        <activity android:name="android.support.v4.widget.CircularProgressDrawableActivity"/>
-
-        <activity android:name="android.support.v4.widget.SwipeRefreshLayoutActivity"/>
-
         <activity android:name="android.support.v4.widget.ContentLoadingProgressBarActivity"/>
 
-        <activity android:name="android.support.v4.view.ViewPagerWithTitleStripActivity"/>
-
-        <activity android:name="android.support.v4.view.ViewPagerWithTabStripActivity"/>
-
-        <activity android:name="android.support.v4.view.ViewPagerTest$ViewPagerActivity"/>
-
         <activity android:name="android.support.design.widget.CoordinatorLayoutActivity"/>
 
         <activity android:name="android.support.design.widget.DynamicCoordinatorLayoutActivity"/>
diff --git a/core-ui/tests/java/android/support/v4/BaseInstrumentationTestCase.java b/core-ui/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/BaseInstrumentationTestCase.java
rename to core-ui/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java
diff --git a/core-ui/tests/java/android/support/v4/BaseTestActivity.java b/core-ui/src/androidTest/java/android/support/v4/BaseTestActivity.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/BaseTestActivity.java
rename to core-ui/src/androidTest/java/android/support/v4/BaseTestActivity.java
diff --git a/core-ui/tests/java/android/support/v4/testutils/TestUtils.java b/core-ui/src/androidTest/java/android/support/v4/testutils/TestUtils.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/testutils/TestUtils.java
rename to core-ui/src/androidTest/java/android/support/v4/testutils/TestUtils.java
diff --git a/core-ui/tests/java/android/support/v4/widget/ContentLoadingProgressBarActivity.java b/core-ui/src/androidTest/java/android/support/v4/widget/ContentLoadingProgressBarActivity.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/widget/ContentLoadingProgressBarActivity.java
rename to core-ui/src/androidTest/java/android/support/v4/widget/ContentLoadingProgressBarActivity.java
diff --git a/core-ui/tests/java/android/support/v4/widget/ContentLoadingProgressBarTest.java b/core-ui/src/androidTest/java/android/support/v4/widget/ContentLoadingProgressBarTest.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/widget/ContentLoadingProgressBarTest.java
rename to core-ui/src/androidTest/java/android/support/v4/widget/ContentLoadingProgressBarTest.java
diff --git a/core-ui/tests/res/anim/fade_in.xml b/core-ui/src/androidTest/res/anim/fade_in.xml
similarity index 100%
rename from core-ui/tests/res/anim/fade_in.xml
rename to core-ui/src/androidTest/res/anim/fade_in.xml
diff --git a/core-ui/tests/res/anim/fade_out.xml b/core-ui/src/androidTest/res/anim/fade_out.xml
similarity index 100%
rename from core-ui/tests/res/anim/fade_out.xml
rename to core-ui/src/androidTest/res/anim/fade_out.xml
diff --git a/core-ui/tests/res/anim/long_fade_in.xml b/core-ui/src/androidTest/res/anim/long_fade_in.xml
similarity index 100%
rename from core-ui/tests/res/anim/long_fade_in.xml
rename to core-ui/src/androidTest/res/anim/long_fade_in.xml
diff --git a/core-ui/tests/res/anim/long_fade_out.xml b/core-ui/src/androidTest/res/anim/long_fade_out.xml
similarity index 100%
rename from core-ui/tests/res/anim/long_fade_out.xml
rename to core-ui/src/androidTest/res/anim/long_fade_out.xml
diff --git a/core-ui/tests/res/layout/activity_content.xml b/core-ui/src/androidTest/res/layout/activity_content.xml
similarity index 100%
rename from core-ui/tests/res/layout/activity_content.xml
rename to core-ui/src/androidTest/res/layout/activity_content.xml
diff --git a/core-ui/tests/res/layout/content_loading_progress_bar_activity.xml b/core-ui/src/androidTest/res/layout/content_loading_progress_bar_activity.xml
similarity index 100%
rename from core-ui/tests/res/layout/content_loading_progress_bar_activity.xml
rename to core-ui/src/androidTest/res/layout/content_loading_progress_bar_activity.xml
diff --git a/core-ui/tests/res/layout/fragment_a.xml b/core-ui/src/androidTest/res/layout/fragment_a.xml
similarity index 100%
rename from core-ui/tests/res/layout/fragment_a.xml
rename to core-ui/src/androidTest/res/layout/fragment_a.xml
diff --git a/core-ui/tests/res/layout/fragment_b.xml b/core-ui/src/androidTest/res/layout/fragment_b.xml
similarity index 100%
rename from core-ui/tests/res/layout/fragment_b.xml
rename to core-ui/src/androidTest/res/layout/fragment_b.xml
diff --git a/core-ui/tests/res/layout/fragment_c.xml b/core-ui/src/androidTest/res/layout/fragment_c.xml
similarity index 100%
rename from core-ui/tests/res/layout/fragment_c.xml
rename to core-ui/src/androidTest/res/layout/fragment_c.xml
diff --git a/core-ui/tests/res/layout/fragment_end.xml b/core-ui/src/androidTest/res/layout/fragment_end.xml
similarity index 100%
rename from core-ui/tests/res/layout/fragment_end.xml
rename to core-ui/src/androidTest/res/layout/fragment_end.xml
diff --git a/core-ui/tests/res/layout/fragment_middle.xml b/core-ui/src/androidTest/res/layout/fragment_middle.xml
similarity index 100%
rename from core-ui/tests/res/layout/fragment_middle.xml
rename to core-ui/src/androidTest/res/layout/fragment_middle.xml
diff --git a/core-ui/tests/res/layout/fragment_start.xml b/core-ui/src/androidTest/res/layout/fragment_start.xml
similarity index 100%
rename from core-ui/tests/res/layout/fragment_start.xml
rename to core-ui/src/androidTest/res/layout/fragment_start.xml
diff --git a/core-ui/tests/res/layout/strict_view_fragment.xml b/core-ui/src/androidTest/res/layout/strict_view_fragment.xml
similarity index 100%
rename from core-ui/tests/res/layout/strict_view_fragment.xml
rename to core-ui/src/androidTest/res/layout/strict_view_fragment.xml
diff --git a/core-ui/tests/res/transition/change_bounds.xml b/core-ui/src/androidTest/res/transition/change_bounds.xml
similarity index 100%
rename from core-ui/tests/res/transition/change_bounds.xml
rename to core-ui/src/androidTest/res/transition/change_bounds.xml
diff --git a/core-ui/tests/res/transition/fade.xml b/core-ui/src/androidTest/res/transition/fade.xml
similarity index 100%
rename from core-ui/tests/res/transition/fade.xml
rename to core-ui/src/androidTest/res/transition/fade.xml
diff --git a/core-ui/tests/res/values/colors.xml b/core-ui/src/androidTest/res/values/colors.xml
similarity index 100%
rename from core-ui/tests/res/values/colors.xml
rename to core-ui/src/androidTest/res/values/colors.xml
diff --git a/core-ui/tests/res/values/dimens.xml b/core-ui/src/androidTest/res/values/dimens.xml
similarity index 100%
rename from core-ui/tests/res/values/dimens.xml
rename to core-ui/src/androidTest/res/values/dimens.xml
diff --git a/core-ui/tests/res/values/strings.xml b/core-ui/src/androidTest/res/values/strings.xml
similarity index 100%
rename from core-ui/tests/res/values/strings.xml
rename to core-ui/src/androidTest/res/values/strings.xml
diff --git a/core-ui/tests/res/values/styles.xml b/core-ui/src/androidTest/res/values/styles.xml
similarity index 100%
rename from core-ui/tests/res/values/styles.xml
rename to core-ui/src/androidTest/res/values/styles.xml
diff --git a/core-ui/tests/NO_DOCS b/core-ui/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/core-ui/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/core-utils/api/27.1.0.ignore b/core-utils/api/27.1.0.ignore
new file mode 100644
index 0000000..57960fb
--- /dev/null
+++ b/core-utils/api/27.1.0.ignore
@@ -0,0 +1,3 @@
+8588484
+0261292
+d663798
diff --git a/core-utils/api/current.txt b/core-utils/api/current.txt
index d535653..2eb3482 100644
--- a/core-utils/api/current.txt
+++ b/core-utils/api/current.txt
@@ -158,14 +158,6 @@
     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[]);
@@ -261,61 +253,3 @@
 
 }
 
-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 2ab4fbb..df5daaa 100644
--- a/core-utils/build.gradle
+++ b/core-utils/build.gradle
@@ -9,6 +9,9 @@
 dependencies {
     api(project(":support-annotations"))
     api(project(":support-compat"))
+    api(project(":documentfile"))
+    api(project(":localbroadcastmanager"))
+    api(project(":print"))
 
     androidTestImplementation(TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
diff --git a/core-utils/src/androidTest/AndroidManifest.xml b/core-utils/src/androidTest/AndroidManifest.xml
index e3d060c..e3f1097 100644
--- a/core-utils/src/androidTest/AndroidManifest.xml
+++ b/core-utils/src/androidTest/AndroidManifest.xml
@@ -31,13 +31,6 @@
         <activity android:name="android.support.v4.app.FrameMetricsActivity"/>
         <activity android:name="android.support.v4.app.FrameMetricsSubActivity"/>
         <activity android:name="android.support.v4.widget.TestActivity"/>
-        <activity android:name="android.support.v4.provider.GrantActivity"
-                  android:label="_GrantActivity">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
-            </intent-filter>
-        </activity>
         <provider
             android:name="android.support.v4.content.FileProvider"
             android:authorities="moocow"
diff --git a/core-utils/src/androidTest/java/android/support/v4/provider/GrantActivity.java b/core-utils/src/androidTest/java/android/support/v4/provider/GrantActivity.java
deleted file mode 100644
index a354201..0000000
--- a/core-utils/src/androidTest/java/android/support/v4/provider/GrantActivity.java
+++ /dev/null
@@ -1,45 +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.provider;
-
-import android.app.Activity;
-import android.content.ContentResolver;
-import android.content.Intent;
-import android.os.Bundle;
-
-/**
- * Stub activity used to request a permission grant for
- * {@link DocumentFileTest}.
- */
-public class GrantActivity extends Activity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
-        startActivityForResult(intent, 12);
-    }
-
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (requestCode == 12 && resultCode == RESULT_OK) {
-            final ContentResolver resolver = getContentResolver();
-            resolver.takePersistableUriPermission(data.getData(),
-                    Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
-        }
-    }
-}
diff --git a/customtabs/build.gradle b/customtabs/build.gradle
index a15566a..ced95b8 100644
--- a/customtabs/build.gradle
+++ b/customtabs/build.gradle
@@ -17,12 +17,6 @@
     androidTestImplementation(project(":support-testutils"))
 }
 
-android {
-    sourceSets {
-        main.aidl.srcDirs = ["src/main/java"]
-    }
-}
-
 supportLibrary {
     name = "Android Support Custom Tabs"
     publish = true
@@ -30,6 +24,5 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2015"
     description = "Android Support Custom Tabs"
-    legacySourceLocation = true
     minSdkVersion = 15
 }
diff --git a/customtabs/tests/AndroidManifest.xml b/customtabs/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from customtabs/tests/AndroidManifest.xml
rename to customtabs/src/androidTest/AndroidManifest.xml
diff --git a/customtabs/tests/src/android/support/customtabs/CustomTabsIntentTest.java b/customtabs/src/androidTest/java/android/support/customtabs/CustomTabsIntentTest.java
similarity index 100%
rename from customtabs/tests/src/android/support/customtabs/CustomTabsIntentTest.java
rename to customtabs/src/androidTest/java/android/support/customtabs/CustomTabsIntentTest.java
diff --git a/customtabs/tests/src/android/support/customtabs/PostMessageServiceConnectionTest.java b/customtabs/src/androidTest/java/android/support/customtabs/PostMessageServiceConnectionTest.java
similarity index 100%
rename from customtabs/tests/src/android/support/customtabs/PostMessageServiceConnectionTest.java
rename to customtabs/src/androidTest/java/android/support/customtabs/PostMessageServiceConnectionTest.java
diff --git a/customtabs/tests/src/android/support/customtabs/PostMessageTest.java b/customtabs/src/androidTest/java/android/support/customtabs/PostMessageTest.java
similarity index 100%
rename from customtabs/tests/src/android/support/customtabs/PostMessageTest.java
rename to customtabs/src/androidTest/java/android/support/customtabs/PostMessageTest.java
diff --git a/customtabs/tests/src/android/support/customtabs/TestActivity.java b/customtabs/src/androidTest/java/android/support/customtabs/TestActivity.java
similarity index 100%
rename from customtabs/tests/src/android/support/customtabs/TestActivity.java
rename to customtabs/src/androidTest/java/android/support/customtabs/TestActivity.java
diff --git a/customtabs/tests/src/android/support/customtabs/TestCustomTabsCallback.java b/customtabs/src/androidTest/java/android/support/customtabs/TestCustomTabsCallback.java
similarity index 100%
rename from customtabs/tests/src/android/support/customtabs/TestCustomTabsCallback.java
rename to customtabs/src/androidTest/java/android/support/customtabs/TestCustomTabsCallback.java
diff --git a/customtabs/tests/src/android/support/customtabs/TestCustomTabsService.java b/customtabs/src/androidTest/java/android/support/customtabs/TestCustomTabsService.java
similarity index 100%
rename from customtabs/tests/src/android/support/customtabs/TestCustomTabsService.java
rename to customtabs/src/androidTest/java/android/support/customtabs/TestCustomTabsService.java
diff --git a/customtabs/tests/src/android/support/customtabs/TrustedWebUtilsTest.java b/customtabs/src/androidTest/java/android/support/customtabs/TrustedWebUtilsTest.java
similarity index 100%
rename from customtabs/tests/src/android/support/customtabs/TrustedWebUtilsTest.java
rename to customtabs/src/androidTest/java/android/support/customtabs/TrustedWebUtilsTest.java
diff --git a/customtabs/tests/src/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java b/customtabs/src/androidTest/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java
similarity index 100%
rename from customtabs/tests/src/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java
rename to customtabs/src/androidTest/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java
diff --git a/customtabs/tests/src/androidx/browser/browseractions/BrowserActionsIntentTest.java b/customtabs/src/androidTest/java/androidx/browser/browseractions/BrowserActionsIntentTest.java
similarity index 100%
rename from customtabs/tests/src/androidx/browser/browseractions/BrowserActionsIntentTest.java
rename to customtabs/src/androidTest/java/androidx/browser/browseractions/BrowserActionsIntentTest.java
diff --git a/customtabs/src/main/java/android/support/customtabs/ICustomTabsCallback.aidl b/customtabs/src/main/aidl/android/support/customtabs/ICustomTabsCallback.aidl
similarity index 100%
rename from customtabs/src/main/java/android/support/customtabs/ICustomTabsCallback.aidl
rename to customtabs/src/main/aidl/android/support/customtabs/ICustomTabsCallback.aidl
diff --git a/customtabs/src/main/java/android/support/customtabs/ICustomTabsService.aidl b/customtabs/src/main/aidl/android/support/customtabs/ICustomTabsService.aidl
similarity index 100%
rename from customtabs/src/main/java/android/support/customtabs/ICustomTabsService.aidl
rename to customtabs/src/main/aidl/android/support/customtabs/ICustomTabsService.aidl
diff --git a/customtabs/src/main/java/android/support/customtabs/IPostMessageService.aidl b/customtabs/src/main/aidl/android/support/customtabs/IPostMessageService.aidl
similarity index 100%
rename from customtabs/src/main/java/android/support/customtabs/IPostMessageService.aidl
rename to customtabs/src/main/aidl/android/support/customtabs/IPostMessageService.aidl
diff --git a/customtabs/tests/NO_DOCS b/customtabs/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/customtabs/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/customview/api/current.txt b/customview/api/current.txt
new file mode 100644
index 0000000..1e8a9c1
--- /dev/null
+++ b/customview/api/current.txt
@@ -0,0 +1,105 @@
+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;
+  }
+
+}
+
+package android.support.v4.widget {
+
+  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 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/customview/build.gradle b/customview/build.gradle
new file mode 100644
index 0000000..108ec71
--- /dev/null
+++ b/customview/build.gradle
@@ -0,0 +1,25 @@
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    api(project(":support-annotations"))
+    api(project(":support-compat"))
+
+    androidTestImplementation(JUNIT)
+    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(TEST_RULES)
+}
+
+supportLibrary {
+    name = "Android Support Library Custom View"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
+    inceptionYear = "2018"
+    description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
+}
diff --git a/customview/src/androidTest/AndroidManifest.xml b/customview/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..e65bd94
--- /dev/null
+++ b/customview/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.support.customview.test">
+    <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
+
+    <application android:supportsRtl="true">
+        <activity android:name="android.support.v4.widget.ExploreByTouchHelperTestActivity"/>
+    </application>
+
+</manifest>
diff --git a/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTest.java b/customview/src/androidTest/java/android/support/v4/widget/ExploreByTouchHelperTest.java
similarity index 88%
rename from core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTest.java
rename to customview/src/androidTest/java/android/support/v4/widget/ExploreByTouchHelperTest.java
index d78b49b..4fe9aa0 100644
--- a/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTest.java
+++ b/customview/src/androidTest/java/android/support/v4/widget/ExploreByTouchHelperTest.java
@@ -19,36 +19,40 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assume.assumeTrue;
 
 import android.graphics.Rect;
-import android.os.Build;
 import android.os.Bundle;
-import android.support.coreui.test.R;
+import android.support.annotation.NonNull;
+import android.support.customview.test.R;
 import android.support.test.annotation.UiThreadTest;
 import android.support.test.filters.SmallTest;
-import android.support.v4.BaseInstrumentationTestCase;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
 import android.support.v4.view.ViewCompat;
 import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
 import android.view.View;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
 import java.util.List;
 
 @SmallTest
-public class ExploreByTouchHelperTest extends BaseInstrumentationTestCase<ExploreByTouchHelperTestActivity> {
+@RunWith(AndroidJUnit4.class)
+public class ExploreByTouchHelperTest {
+    @Rule
+    public final ActivityTestRule<ExploreByTouchHelperTestActivity> mActivityTestRule;
+
     private View mHost;
 
     public ExploreByTouchHelperTest() {
-        super(ExploreByTouchHelperTestActivity.class);
+        mActivityTestRule = new ActivityTestRule<>(ExploreByTouchHelperTestActivity.class);
     }
 
     @Before
     public void setUp() {
-        // Accessibility delegates are only supported on API 14+.
-        assumeTrue(Build.VERSION.SDK_INT >= 14);
         mHost = mActivityTestRule.getActivity().findViewById(R.id.host_view);
     }
 
@@ -132,7 +136,8 @@
         }
 
         @Override
-        protected void onPopulateNodeForVirtualView(int virtualViewId, AccessibilityNodeInfoCompat node) {
+        protected void onPopulateNodeForVirtualView(int virtualViewId,
+                @NonNull AccessibilityNodeInfoCompat node) {
             if (virtualViewId == 1) {
                 node.setContentDescription("test");
 
@@ -142,7 +147,8 @@
         }
 
         @Override
-        protected boolean onPerformActionForVirtualView(int virtualViewId, int action, Bundle arguments) {
+        protected boolean onPerformActionForVirtualView(int virtualViewId, int action,
+                Bundle arguments) {
             return false;
         }
     }
diff --git a/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java b/customview/src/androidTest/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
similarity index 67%
rename from core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
rename to customview/src/androidTest/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
index 19d1598..16e3faa 100644
--- a/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
+++ b/customview/src/androidTest/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
@@ -16,12 +16,14 @@
 
 package android.support.v4.widget;
 
-import android.support.coreui.test.R;
-import android.support.v4.BaseTestActivity;
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.customview.test.R;
 
-public class ExploreByTouchHelperTestActivity extends BaseTestActivity {
+public class ExploreByTouchHelperTestActivity extends Activity {
     @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.explore_by_touch_helper_activity;
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.explore_by_touch_helper_activity);
     }
 }
diff --git a/core-ui/tests/res/layout/explore_by_touch_helper_activity.xml b/customview/src/androidTest/res/layout/explore_by_touch_helper_activity.xml
similarity index 100%
rename from core-ui/tests/res/layout/explore_by_touch_helper_activity.xml
rename to customview/src/androidTest/res/layout/explore_by_touch_helper_activity.xml
diff --git a/customview/src/main/AndroidManifest.xml b/customview/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..30bedbe
--- /dev/null
+++ b/customview/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest package="android.support.customview"/>
diff --git a/core-ui/src/main/java/android/support/v4/view/AbsSavedState.java b/customview/src/main/java/android/support/v4/view/AbsSavedState.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/AbsSavedState.java
rename to customview/src/main/java/android/support/v4/view/AbsSavedState.java
diff --git a/core-ui/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java b/customview/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java
similarity index 99%
rename from core-ui/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java
rename to customview/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java
index 2b5ed0a..d7de9be 100644
--- a/core-ui/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java
+++ b/customview/src/main/java/android/support/v4/widget/ExploreByTouchHelper.java
@@ -1251,8 +1251,8 @@
 
         @Override
         public AccessibilityNodeInfoCompat findFocus(int focusType) {
-            int focusedId = (focusType == AccessibilityNodeInfoCompat.FOCUS_ACCESSIBILITY) ?
-                    mAccessibilityFocusedVirtualViewId : mKeyboardFocusedVirtualViewId;
+            int focusedId = (focusType == AccessibilityNodeInfoCompat.FOCUS_ACCESSIBILITY)
+                    ? mAccessibilityFocusedVirtualViewId : mKeyboardFocusedVirtualViewId;
             if (focusedId == INVALID_ID) {
                 return null;
             }
diff --git a/core-ui/src/main/java/android/support/v4/widget/FocusStrategy.java b/customview/src/main/java/android/support/v4/widget/FocusStrategy.java
similarity index 98%
rename from core-ui/src/main/java/android/support/v4/widget/FocusStrategy.java
rename to customview/src/main/java/android/support/v4/widget/FocusStrategy.java
index 77353c5..cf112bf 100644
--- a/core-ui/src/main/java/android/support/v4/widget/FocusStrategy.java
+++ b/customview/src/main/java/android/support/v4/widget/FocusStrategy.java
@@ -19,10 +19,9 @@
 import android.graphics.Rect;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.view.View;
-
 import android.support.v4.view.ViewCompat.FocusRealDirection;
 import android.support.v4.view.ViewCompat.FocusRelativeDirection;
+import android.view.View;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -430,8 +429,7 @@
             case View.FOCUS_DOWN:
                 // the distance between the center horizontals
                 return Math.abs(
-                        ((source.left + source.width() / 2) -
-                                ((dest.left + dest.width() / 2))));
+                        ((source.left + source.width() / 2) - ((dest.left + dest.width() / 2))));
         }
         throw new IllegalArgumentException("direction must be one of "
                 + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
diff --git a/core-ui/src/main/java/android/support/v4/widget/ViewDragHelper.java b/customview/src/main/java/android/support/v4/widget/ViewDragHelper.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/ViewDragHelper.java
rename to customview/src/main/java/android/support/v4/widget/ViewDragHelper.java
diff --git a/documentfile/api/current.txt b/documentfile/api/current.txt
new file mode 100644
index 0000000..6d7790b
--- /dev/null
+++ b/documentfile/api/current.txt
@@ -0,0 +1,29 @@
+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/documentfile/build.gradle b/documentfile/build.gradle
new file mode 100644
index 0000000..2f59518
--- /dev/null
+++ b/documentfile/build.gradle
@@ -0,0 +1,19 @@
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    api(project(":support-annotations"))
+}
+
+supportLibrary {
+    name = "Android Support Library Document File"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
+    inceptionYear = "2018"
+    description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
+}
diff --git a/documentfile/src/main/AndroidManifest.xml b/documentfile/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..7602dd7
--- /dev/null
+++ b/documentfile/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest package="android.support.documentfile"/>
diff --git a/core-utils/src/main/java/android/support/v4/provider/DocumentFile.java b/documentfile/src/main/java/android/support/v4/provider/DocumentFile.java
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/provider/DocumentFile.java
rename to documentfile/src/main/java/android/support/v4/provider/DocumentFile.java
diff --git a/core-utils/src/main/java/android/support/v4/provider/DocumentsContractApi19.java b/documentfile/src/main/java/android/support/v4/provider/DocumentsContractApi19.java
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/provider/DocumentsContractApi19.java
rename to documentfile/src/main/java/android/support/v4/provider/DocumentsContractApi19.java
diff --git a/core-utils/src/main/java/android/support/v4/provider/RawDocumentFile.java b/documentfile/src/main/java/android/support/v4/provider/RawDocumentFile.java
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/provider/RawDocumentFile.java
rename to documentfile/src/main/java/android/support/v4/provider/RawDocumentFile.java
diff --git a/core-utils/src/main/java/android/support/v4/provider/SingleDocumentFile.java b/documentfile/src/main/java/android/support/v4/provider/SingleDocumentFile.java
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/provider/SingleDocumentFile.java
rename to documentfile/src/main/java/android/support/v4/provider/SingleDocumentFile.java
diff --git a/core-utils/src/main/java/android/support/v4/provider/TreeDocumentFile.java b/documentfile/src/main/java/android/support/v4/provider/TreeDocumentFile.java
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/provider/TreeDocumentFile.java
rename to documentfile/src/main/java/android/support/v4/provider/TreeDocumentFile.java
diff --git a/drawerlayout/api/current.txt b/drawerlayout/api/current.txt
new file mode 100644
index 0000000..c1a0b4c
--- /dev/null
+++ b/drawerlayout/api/current.txt
@@ -0,0 +1,81 @@
+package android.support.v4.widget {
+
+  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 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);
+  }
+
+}
+
diff --git a/drawerlayout/build.gradle b/drawerlayout/build.gradle
new file mode 100644
index 0000000..1d1476b
--- /dev/null
+++ b/drawerlayout/build.gradle
@@ -0,0 +1,21 @@
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    api(project(":support-annotations"))
+    api(project(":support-compat"))
+    api(project(":customview"))
+}
+
+supportLibrary {
+    name = "Android Support Library Drawer Layout"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
+    inceptionYear = "2018"
+    description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
+}
diff --git a/drawerlayout/src/main/AndroidManifest.xml b/drawerlayout/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..154538c
--- /dev/null
+++ b/drawerlayout/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest package="android.support.drawerlayout"/>
diff --git a/core-ui/src/main/java/android/support/v4/widget/DrawerLayout.java b/drawerlayout/src/main/java/android/support/v4/widget/DrawerLayout.java
similarity index 99%
rename from core-ui/src/main/java/android/support/v4/widget/DrawerLayout.java
rename to drawerlayout/src/main/java/android/support/v4/widget/DrawerLayout.java
index aa2077d..66104ea 100644
--- a/core-ui/src/main/java/android/support/v4/widget/DrawerLayout.java
+++ b/drawerlayout/src/main/java/android/support/v4/widget/DrawerLayout.java
@@ -19,6 +19,7 @@
 
 import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
+import android.annotation.SuppressLint;
 import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.res.TypedArray;
@@ -964,6 +965,7 @@
         mFirstLayout = true;
     }
 
+    @SuppressLint("WrongConstant")
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         int widthMode = MeasureSpec.getMode(widthMeasureSpec);
diff --git a/dynamic-animation/build.gradle b/dynamic-animation/build.gradle
index 10e49e0..451e874 100644
--- a/dynamic-animation/build.gradle
+++ b/dynamic-animation/build.gradle
@@ -22,5 +22,4 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2017"
     description = "Physics-based animation in support library, where the animations are driven by physics force. You can use this Animation library to create smooth and realistic animations."
-    legacySourceLocation = true
 }
\ No newline at end of file
diff --git a/dynamic-animation/tests/AndroidManifest.xml b/dynamic-animation/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from dynamic-animation/tests/AndroidManifest.xml
rename to dynamic-animation/src/androidTest/AndroidManifest.xml
diff --git a/dynamic-animation/tests/src/android/support/dynamicanimation/tests/AnimationActivity.java b/dynamic-animation/src/androidTest/java/android/support/dynamicanimation/tests/AnimationActivity.java
similarity index 100%
rename from dynamic-animation/tests/src/android/support/dynamicanimation/tests/AnimationActivity.java
rename to dynamic-animation/src/androidTest/java/android/support/dynamicanimation/tests/AnimationActivity.java
diff --git a/dynamic-animation/tests/src/android/support/dynamicanimation/tests/FlingTests.java b/dynamic-animation/src/androidTest/java/android/support/dynamicanimation/tests/FlingTests.java
similarity index 100%
rename from dynamic-animation/tests/src/android/support/dynamicanimation/tests/FlingTests.java
rename to dynamic-animation/src/androidTest/java/android/support/dynamicanimation/tests/FlingTests.java
diff --git a/dynamic-animation/tests/src/android/support/dynamicanimation/tests/SpringTests.java b/dynamic-animation/src/androidTest/java/android/support/dynamicanimation/tests/SpringTests.java
similarity index 100%
rename from dynamic-animation/tests/src/android/support/dynamicanimation/tests/SpringTests.java
rename to dynamic-animation/src/androidTest/java/android/support/dynamicanimation/tests/SpringTests.java
diff --git a/dynamic-animation/tests/res/layout/anim_layout.xml b/dynamic-animation/src/androidTest/res/layout/anim_layout.xml
similarity index 100%
rename from dynamic-animation/tests/res/layout/anim_layout.xml
rename to dynamic-animation/src/androidTest/res/layout/anim_layout.xml
diff --git a/dynamic-animation/tests/NO_DOCS b/dynamic-animation/tests/NO_DOCS
deleted file mode 100644
index 4dad694..0000000
--- a/dynamic-animation/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/emoji/appcompat/build.gradle b/emoji/appcompat/build.gradle
index a4aaff2..8a75f66 100644
--- a/emoji/appcompat/build.gradle
+++ b/emoji/appcompat/build.gradle
@@ -33,5 +33,4 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2017"
     description = "EmojiCompat Widgets for AppCompat integration"
-    legacySourceLocation = true
 }
\ No newline at end of file
diff --git a/emoji/bundled/build.gradle b/emoji/bundled/build.gradle
index a2760d3..7c3a76a 100644
--- a/emoji/bundled/build.gradle
+++ b/emoji/bundled/build.gradle
@@ -36,5 +36,4 @@
         name = "Unicode, Inc. License"
         url = "http://www.unicode.org/copyright.html#License"
     }
-    legacySourceLocation = true
 }
\ No newline at end of file
diff --git a/emoji/core/build.gradle b/emoji/core/build.gradle
index 8d470f0..449ebb1 100644
--- a/emoji/core/build.gradle
+++ b/emoji/core/build.gradle
@@ -44,11 +44,6 @@
         }
 
         androidTest {
-            // We use a non-standard test directory structure.
-            root 'tests'
-            java.srcDir 'tests/src'
-            res.srcDir 'tests/res'
-            manifest.srcFile 'tests/AndroidManifest.xml'
             assets {
                 srcDirs = [new File(fontDir, "font").getAbsolutePath(),
                            new File(fontDir, "supported-emojis").getAbsolutePath()]
diff --git a/emoji/core/tests/AndroidManifest.xml b/emoji/core/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from emoji/core/tests/AndroidManifest.xml
rename to emoji/core/src/androidTest/AndroidManifest.xml
diff --git a/emoji/core/tests/java/android/support/text/emoji/AllEmojisTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/AllEmojisTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/AllEmojisTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/AllEmojisTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/ConfigTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/ConfigTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/ConfigTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/ConfigTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/EmojiCompatTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/EmojiCompatTest.java
similarity index 99%
rename from emoji/core/tests/java/android/support/text/emoji/EmojiCompatTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/EmojiCompatTest.java
index 654da41..5d14876 100644
--- a/emoji/core/tests/java/android/support/text/emoji/EmojiCompatTest.java
+++ b/emoji/core/src/androidTest/java/android/support/text/emoji/EmojiCompatTest.java
@@ -552,7 +552,7 @@
         EmojiCompat.reset(config);
 
         final String string = new TestString(EMOJI_SINGLE_CODEPOINT).append(
-                EMOJI_FLAG).toString();
+                EMOJI_SINGLE_CODEPOINT).toString();
         CharSequence processed = EmojiCompat.get().process(string, 0, string.length(),
                 Integer.MAX_VALUE, EmojiCompat.REPLACE_STRATEGY_ALL);
 
diff --git a/emoji/core/tests/java/android/support/text/emoji/EmojiKeyboardTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/EmojiKeyboardTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/EmojiKeyboardTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/EmojiKeyboardTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/EmojiSpanInstrumentationTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/EmojiSpanInstrumentationTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/EmojiSpanInstrumentationTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/EmojiSpanInstrumentationTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/EmojiSpanTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/EmojiSpanTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/EmojiSpanTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/EmojiSpanTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/FontRequestEmojiCompatConfigTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/FontRequestEmojiCompatConfigTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/FontRequestEmojiCompatConfigTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/FontRequestEmojiCompatConfigTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/HardDeleteTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/HardDeleteTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/HardDeleteTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/HardDeleteTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/InitCallbackTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/InitCallbackTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/InitCallbackTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/InitCallbackTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/MetadataRepoTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/MetadataRepoTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/MetadataRepoTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/MetadataRepoTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/SoftDeleteTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/SoftDeleteTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/SoftDeleteTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/SoftDeleteTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/TestActivity.java b/emoji/core/src/androidTest/java/android/support/text/emoji/TestActivity.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/TestActivity.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/TestActivity.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/TestConfigBuilder.java b/emoji/core/src/androidTest/java/android/support/text/emoji/TestConfigBuilder.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/TestConfigBuilder.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/TestConfigBuilder.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/TestEmojiMetadata.java b/emoji/core/src/androidTest/java/android/support/text/emoji/TestEmojiMetadata.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/TestEmojiMetadata.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/TestEmojiMetadata.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/UninitializedStateTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/UninitializedStateTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/UninitializedStateTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/UninitializedStateTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/util/Emoji.java b/emoji/core/src/androidTest/java/android/support/text/emoji/util/Emoji.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/util/Emoji.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/util/Emoji.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/util/EmojiMatcher.java b/emoji/core/src/androidTest/java/android/support/text/emoji/util/EmojiMatcher.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/util/EmojiMatcher.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/util/EmojiMatcher.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/util/KeyboardUtil.java b/emoji/core/src/androidTest/java/android/support/text/emoji/util/KeyboardUtil.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/util/KeyboardUtil.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/util/KeyboardUtil.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/util/TestString.java b/emoji/core/src/androidTest/java/android/support/text/emoji/util/TestString.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/util/TestString.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/util/TestString.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperPre19Test.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditTextHelperPre19Test.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperPre19Test.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditTextHelperPre19Test.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditTextHelperTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditTextTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditTextTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditTextTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditableFactoryTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditableFactoryTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiEditableFactoryTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiEditableFactoryTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiExtractTextLayoutTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiExtractTextLayoutTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiExtractTextLayoutTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiExtractTextLayoutTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiInputConnectionTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiInputConnectionTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiInputConnectionTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiInputConnectionTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiInputFilterTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiInputFilterTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiInputFilterTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiInputFilterTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiKeyListenerTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiKeyListenerTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiKeyListenerTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiKeyListenerTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextViewHelperPre19Test.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiTextViewHelperPre19Test.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextViewHelperPre19Test.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiTextViewHelperPre19Test.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextViewHelperTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiTextViewHelperTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextViewHelperTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiTextViewHelperTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextWatcherTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiTextWatcherTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/EmojiTextWatcherTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/EmojiTextWatcherTest.java
diff --git a/emoji/core/tests/java/android/support/text/emoji/widget/SpannableBuilderTest.java b/emoji/core/src/androidTest/java/android/support/text/emoji/widget/SpannableBuilderTest.java
similarity index 100%
rename from emoji/core/tests/java/android/support/text/emoji/widget/SpannableBuilderTest.java
rename to emoji/core/src/androidTest/java/android/support/text/emoji/widget/SpannableBuilderTest.java
diff --git a/emoji/core/tests/res/layout/activity_default.xml b/emoji/core/src/androidTest/res/layout/activity_default.xml
similarity index 100%
rename from emoji/core/tests/res/layout/activity_default.xml
rename to emoji/core/src/androidTest/res/layout/activity_default.xml
diff --git a/emoji/core/tests/res/layout/extract_view.xml b/emoji/core/src/androidTest/res/layout/extract_view.xml
similarity index 100%
rename from emoji/core/tests/res/layout/extract_view.xml
rename to emoji/core/src/androidTest/res/layout/extract_view.xml
diff --git a/emoji/core/tests/res/layout/extract_view_with_attrs.xml b/emoji/core/src/androidTest/res/layout/extract_view_with_attrs.xml
similarity index 100%
rename from emoji/core/tests/res/layout/extract_view_with_attrs.xml
rename to emoji/core/src/androidTest/res/layout/extract_view_with_attrs.xml
diff --git a/exifinterface/src/androidTest/NO_DOCS b/exifinterface/src/androidTest/NO_DOCS
deleted file mode 100644
index bd77b1a..0000000
--- a/exifinterface/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
\ No newline at end of file
diff --git a/fragment/api/current.txt b/fragment/api/current.txt
index 5df18f8..6e452a8 100644
--- a/fragment/api/current.txt
+++ b/fragment/api/current.txt
@@ -388,9 +388,11 @@
     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 static <T extends android.arch.lifecycle.LifecycleOwner & android.arch.lifecycle.ViewModelStoreOwner> android.support.v4.app.LoaderManager getInstance(T);
     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 void markForRedelivery();
     method public abstract <D> android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
   }
 
diff --git a/fragment/src/androidTest/AndroidManifest.xml b/fragment/src/androidTest/AndroidManifest.xml
index 57ff953..dc58993 100644
--- a/fragment/src/androidTest/AndroidManifest.xml
+++ b/fragment/src/androidTest/AndroidManifest.xml
@@ -32,6 +32,7 @@
 
         <activity android:name="android.support.v4.app.test.FragmentResultActivity"/>
 
+        <activity android:name="android.support.v4.app.test.EmptyActivity"/>
         <activity android:name="android.support.v4.app.test.LoaderActivity"/>
 
         <activity android:name="android.support.v4.app.test.NewIntentActivity"
diff --git a/fragment/src/androidTest/java/android/support/v4/app/FragmentLifecycleTest.java b/fragment/src/androidTest/java/android/support/v4/app/FragmentLifecycleTest.java
index 89433df..f816dd8 100644
--- a/fragment/src/androidTest/java/android/support/v4/app/FragmentLifecycleTest.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/FragmentLifecycleTest.java
@@ -1098,8 +1098,8 @@
     }
 
     /**
-     * When there are no retained instance fragments, the FragmentManagerNonConfig should be
-     * null
+     * When there are no retained instance fragments, the FragmentManagerNonConfig's fragments
+     * should be null
      */
     @Test
     @UiThreadTest
@@ -1116,7 +1116,7 @@
         fm.executePendingTransactions();
         Pair<Parcelable, FragmentManagerNonConfig> savedState =
                 FragmentTestUtil.destroy(mActivityRule, fc);
-        assertNull(savedState.second);
+        assertNull(savedState.second.getFragments());
     }
 
     /**
diff --git a/fragment/src/androidTest/java/android/support/v4/app/LoaderInfoTest.java b/fragment/src/androidTest/java/android/support/v4/app/LoaderInfoTest.java
index 799b6ab..5df61dc 100644
--- a/fragment/src/androidTest/java/android/support/v4/app/LoaderInfoTest.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/LoaderInfoTest.java
@@ -18,14 +18,17 @@
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
 
+import android.content.Context;
 import android.os.SystemClock;
 import android.support.annotation.Nullable;
 import android.support.test.annotation.UiThreadTest;
 import android.support.test.filters.SmallTest;
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
-import android.support.v4.app.test.LoaderActivity;
+import android.support.v4.app.test.DummyLoaderCallbacks;
+import android.support.v4.app.test.EmptyActivity;
 import android.support.v4.content.AsyncTaskLoader;
 import android.support.v4.content.Loader;
 
@@ -41,15 +44,14 @@
 public class LoaderInfoTest {
 
     @Rule
-    public ActivityTestRule<LoaderActivity> mActivityRule =
-            new ActivityTestRule<>(LoaderActivity.class);
+    public ActivityTestRule<EmptyActivity> mActivityRule =
+            new ActivityTestRule<>(EmptyActivity.class);
 
     @Test
     public void testIsCallbackWaitingForData() throws Throwable {
-        final LoaderTest.DummyLoaderCallbacks loaderCallback =
-                new LoaderTest.DummyLoaderCallbacks(mActivityRule.getActivity());
+        final DummyLoaderCallbacks loaderCallback = new DummyLoaderCallbacks(mock(Context.class));
         final CountDownLatch deliverResultLatch = new CountDownLatch(1);
-        Loader<Boolean> delayLoader = new AsyncTaskLoader<Boolean>(mActivityRule.getActivity()) {
+        Loader<Boolean> delayLoader = new AsyncTaskLoader<Boolean>(mock(Context.class)) {
             @Override
             public Boolean loadInBackground() {
                 SystemClock.sleep(50);
@@ -93,8 +95,7 @@
     @UiThreadTest
     @Test
     public void testSetCallback() throws Throwable {
-        final LoaderTest.DummyLoaderCallbacks loaderCallback =
-                new LoaderTest.DummyLoaderCallbacks(mActivityRule.getActivity());
+        final DummyLoaderCallbacks loaderCallback = new DummyLoaderCallbacks(mock(Context.class));
         Loader<Boolean> loader = loaderCallback.onCreateLoader(0, null);
         final LoaderManagerImpl.LoaderInfo<Boolean> loaderInfo = new LoaderManagerImpl.LoaderInfo<>(
                 0, null, loader);
@@ -109,8 +110,7 @@
     @UiThreadTest
     @Test
     public void testSetCallback_replace() throws Throwable {
-        LoaderTest.DummyLoaderCallbacks initialCallback =
-                new LoaderTest.DummyLoaderCallbacks(mActivityRule.getActivity());
+        final DummyLoaderCallbacks initialCallback = new DummyLoaderCallbacks(mock(Context.class));
         Loader<Boolean> loader = initialCallback.onCreateLoader(0, null);
         LoaderManagerImpl.LoaderInfo<Boolean> loaderInfo = new LoaderManagerImpl.LoaderInfo<>(
                 0, null, loader);
@@ -121,8 +121,8 @@
         assertTrue("onLoadFinished for initial should be called after setCallback initial",
                 initialCallback.mOnLoadFinished);
 
-        final LoaderTest.DummyLoaderCallbacks replacementCallback =
-                new LoaderTest.DummyLoaderCallbacks(mActivityRule.getActivity());
+        final DummyLoaderCallbacks replacementCallback =
+                new DummyLoaderCallbacks(mActivityRule.getActivity());
         initialCallback.mOnLoadFinished = false;
 
         loaderInfo.setCallback(mActivityRule.getActivity(), replacementCallback);
@@ -137,8 +137,7 @@
     @UiThreadTest
     @Test
     public void testDestroy() throws Throwable {
-        final LoaderTest.DummyLoaderCallbacks loaderCallback =
-                new LoaderTest.DummyLoaderCallbacks(mActivityRule.getActivity());
+        final DummyLoaderCallbacks loaderCallback = new DummyLoaderCallbacks(mock(Context.class));
         final Loader<Boolean> loader = loaderCallback.onCreateLoader(0, null);
         final LoaderManagerImpl.LoaderInfo<Boolean> loaderInfo = new LoaderManagerImpl.LoaderInfo<>(
                 0, null, loader);
diff --git a/fragment/src/androidTest/java/android/support/v4/app/LoaderManagerTest.java b/fragment/src/androidTest/java/android/support/v4/app/LoaderManagerTest.java
new file mode 100644
index 0000000..3b55565
--- /dev/null
+++ b/fragment/src/androidTest/java/android/support/v4/app/LoaderManagerTest.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+
+import android.arch.lifecycle.Lifecycle;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.LifecycleRegistry;
+import android.arch.lifecycle.ViewModelStore;
+import android.arch.lifecycle.ViewModelStoreOwner;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.app.test.DummyLoaderCallbacks;
+import android.support.v4.app.test.EmptyActivity;
+import android.support.v4.content.Loader;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class LoaderManagerTest {
+
+    @Rule
+    public ActivityTestRule<EmptyActivity> mActivityRule =
+            new ActivityTestRule<>(EmptyActivity.class);
+
+    @Test
+    public void testDestroyFromOnCreateLoader() throws Throwable {
+        final LoaderOwner loaderOwner = new LoaderOwner();
+        final CountDownLatch onCreateLoaderLatch = new CountDownLatch(1);
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                LoaderManager.getInstance(loaderOwner).initLoader(65, null,
+                        new DummyLoaderCallbacks(mock(Context.class)) {
+                            @NonNull
+                            @Override
+                            public Loader<Boolean> onCreateLoader(int id, Bundle args) {
+                                try {
+                                    LoaderManager.getInstance(loaderOwner).destroyLoader(65);
+                                    fail("Calling destroyLoader in onCreateLoader should throw an "
+                                            + "IllegalStateException");
+                                } catch (IllegalStateException e) {
+                                    // Expected
+                                    onCreateLoaderLatch.countDown();
+                                }
+                                return super.onCreateLoader(id, args);
+                            }
+                        });
+            }
+        });
+        onCreateLoaderLatch.await(1, TimeUnit.SECONDS);
+    }
+
+    /**
+     * Test to ensure that loader operations, such as destroyLoader, can safely be called
+     * in onLoadFinished
+     */
+    @Test
+    public void testDestroyFromOnLoadFinished() throws Throwable {
+        final LoaderOwner loaderOwner = new LoaderOwner();
+        final CountDownLatch onLoadFinishedLatch = new CountDownLatch(1);
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                LoaderManager.getInstance(loaderOwner).initLoader(43, null,
+                        new DummyLoaderCallbacks(mock(Context.class)) {
+                            @Override
+                            public void onLoadFinished(@NonNull Loader<Boolean> loader,
+                                    Boolean data) {
+                                super.onLoadFinished(loader, data);
+                                LoaderManager.getInstance(loaderOwner).destroyLoader(43);
+                            }
+                        });
+            }
+        });
+        onLoadFinishedLatch.await(1, TimeUnit.SECONDS);
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void enforceOnMainThread_initLoader() {
+        LoaderOwner loaderOwner = new LoaderOwner();
+        LoaderManager.getInstance(loaderOwner).initLoader(-1, null,
+                new DummyLoaderCallbacks(mock(Context.class)));
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void enforceOnMainThread_restartLoader() {
+        LoaderOwner loaderOwner = new LoaderOwner();
+        LoaderManager.getInstance(loaderOwner).restartLoader(-1, null,
+                new DummyLoaderCallbacks(mock(Context.class)));
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void enforceOnMainThread_destroyLoader() {
+        LoaderOwner loaderOwner = new LoaderOwner();
+        LoaderManager.getInstance(loaderOwner).destroyLoader(-1);
+    }
+
+    class LoaderOwner implements LifecycleOwner, ViewModelStoreOwner {
+
+        private LifecycleRegistry mLifecycle = new LifecycleRegistry(this);
+        private ViewModelStore mViewModelStore = new ViewModelStore();
+
+        LoaderOwner() {
+            mLifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START);
+        }
+
+        @NonNull
+        @Override
+        public Lifecycle getLifecycle() {
+            return mLifecycle;
+        }
+
+        @NonNull
+        @Override
+        public ViewModelStore getViewModelStore() {
+            return mViewModelStore;
+        }
+    }
+}
diff --git a/fragment/src/androidTest/java/android/support/v4/app/LoaderObserverTest.java b/fragment/src/androidTest/java/android/support/v4/app/LoaderObserverTest.java
index 14c2321..2fb27f7 100644
--- a/fragment/src/androidTest/java/android/support/v4/app/LoaderObserverTest.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/LoaderObserverTest.java
@@ -22,6 +22,7 @@
 
 import android.content.Context;
 import android.support.test.filters.SmallTest;
+import android.support.v4.app.test.DummyLoaderCallbacks;
 import android.support.v4.content.Loader;
 
 import org.junit.Test;
@@ -34,8 +35,7 @@
 
     @Test
     public void testOnChanged() {
-        LoaderTest.DummyLoaderCallbacks callback =
-                new LoaderTest.DummyLoaderCallbacks(mock(Context.class));
+        DummyLoaderCallbacks callback = new DummyLoaderCallbacks(mock(Context.class));
         @SuppressWarnings("unchecked")
         LoaderManagerImpl.LoaderObserver<Boolean> observer = new LoaderManagerImpl.LoaderObserver<>(
                 mock(Loader.class), callback);
@@ -54,8 +54,7 @@
 
     @Test
     public void testReset() {
-        LoaderTest.DummyLoaderCallbacks callback =
-                new LoaderTest.DummyLoaderCallbacks(mock(Context.class));
+        DummyLoaderCallbacks callback = new DummyLoaderCallbacks(mock(Context.class));
         @SuppressWarnings("unchecked")
         LoaderManagerImpl.LoaderObserver<Boolean> observer = new LoaderManagerImpl.LoaderObserver<>(
                 mock(Loader.class), callback);
@@ -69,8 +68,7 @@
 
     @Test
     public void testResetWithOnChanged() {
-        LoaderTest.DummyLoaderCallbacks callback =
-                new LoaderTest.DummyLoaderCallbacks(mock(Context.class));
+        DummyLoaderCallbacks callback = new DummyLoaderCallbacks(mock(Context.class));
         @SuppressWarnings("unchecked")
         LoaderManagerImpl.LoaderObserver<Boolean> observer = new LoaderManagerImpl.LoaderObserver<>(
                 mock(Loader.class), callback);
diff --git a/fragment/src/androidTest/java/android/support/v4/app/LoaderTest.java b/fragment/src/androidTest/java/android/support/v4/app/LoaderTest.java
index 5a29135..1d89e27 100644
--- a/fragment/src/androidTest/java/android/support/v4/app/LoaderTest.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/LoaderTest.java
@@ -142,52 +142,6 @@
     }
 
     /**
-     * Test to ensure that loader operations, such as destroyLoader, can safely be called
-     * in onLoadFinished
-     */
-    @Test
-    public void testDestroyFromOnLoadFinished() throws Throwable {
-        final LoaderActivity activity = mActivityRule.getActivity();
-        final CountDownLatch onLoadFinishedLatch = new CountDownLatch(1);
-        mActivityRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                final LoaderManager loaderManager = activity.getSupportLoaderManager();
-                activity.getSupportLoaderManager().initLoader(43, null,
-                        new DummyLoaderCallbacks(activity) {
-                            @Override
-                            public void onLoadFinished(@NonNull Loader<Boolean> loader,
-                                    Boolean data) {
-                                super.onLoadFinished(loader, data);
-                                loaderManager.destroyLoader(43);
-                            }
-                        });
-            }
-        });
-        onLoadFinishedLatch.await(1, TimeUnit.SECONDS);
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void enforceOnMainThread_initLoader() {
-        LoaderActivity activity = mActivityRule.getActivity();
-        activity.getSupportLoaderManager().initLoader(-1, null,
-                new DummyLoaderCallbacks(activity));
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void enforceOnMainThread_restartLoader() {
-        LoaderActivity activity = mActivityRule.getActivity();
-        activity.getSupportLoaderManager().restartLoader(-1, null,
-                new DummyLoaderCallbacks(activity));
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void enforceOnMainThread_destroyLoader() {
-        LoaderActivity activity = mActivityRule.getActivity();
-        activity.getSupportLoaderManager().destroyLoader(-1);
-    }
-
-    /**
      * When a change is interrupted with stop, the data in the LoaderManager remains stale.
      */
     //@Test
@@ -201,7 +155,7 @@
             @Override
             public void run() {
                 final Loader<String> loader =
-                        activity.getSupportLoaderManager().initLoader(DELAY_LOADER, null,
+                        LoaderManager.getInstance(activity).initLoader(DELAY_LOADER, null,
                                 new LoaderManager.LoaderCallbacks<String>() {
                                     @NonNull
                                     @Override
@@ -272,54 +226,41 @@
         assertEquals("Second Value", activity.textViewB.getText().toString());
     }
 
-
-    public static class LoaderFragment extends Fragment {
+    public static class LoaderFragment extends Fragment implements
+            LoaderManager.LoaderCallbacks<Boolean> {
         private static final int LOADER_ID = 1;
 
         @Override
         public void onActivityCreated(@Nullable Bundle savedInstanceState) {
             super.onActivityCreated(savedInstanceState);
 
-            getLoaderManager().initLoader(LOADER_ID, null,
-                    new DummyLoaderCallbacks(getContext()));
-        }
-    }
-
-    static class DummyLoaderCallbacks implements LoaderManager.LoaderCallbacks<Boolean> {
-        private final Context mContext;
-
-        boolean mOnLoadFinished;
-        boolean mOnLoaderReset;
-
-        DummyLoaderCallbacks(Context context) {
-            mContext = context;
+            LoaderManager.getInstance(this).initLoader(LOADER_ID, null, this);
         }
 
         @NonNull
         @Override
-        public Loader<Boolean> onCreateLoader(int id, Bundle args) {
-            return new DummyLoader(mContext);
+        public Loader<Boolean> onCreateLoader(int id, @Nullable Bundle args) {
+            return new SimpleLoader(requireContext());
         }
 
         @Override
         public void onLoadFinished(@NonNull Loader<Boolean> loader, Boolean data) {
-            mOnLoadFinished = true;
         }
 
         @Override
         public void onLoaderReset(@NonNull Loader<Boolean> loader) {
-            mOnLoaderReset = true;
-        }
-    }
-
-    static class DummyLoader extends Loader<Boolean> {
-        DummyLoader(Context context) {
-            super(context);
         }
 
-        @Override
-        protected void onStartLoading() {
-            deliverResult(true);
+        static class SimpleLoader extends Loader<Boolean> {
+
+            SimpleLoader(@NonNull Context context) {
+                super(context);
+            }
+
+            @Override
+            protected void onStartLoading() {
+                deliverResult(true);
+            }
         }
     }
 }
diff --git a/fragment/src/androidTest/java/android/support/v4/app/LoaderViewModelTest.java b/fragment/src/androidTest/java/android/support/v4/app/LoaderViewModelTest.java
index 911e169..36384ce 100644
--- a/fragment/src/androidTest/java/android/support/v4/app/LoaderViewModelTest.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/LoaderViewModelTest.java
@@ -19,32 +19,27 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
 
 import android.content.Context;
 import android.support.test.filters.SmallTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-import android.support.v4.app.test.LoaderActivity;
+import android.support.v4.app.test.DummyLoader;
 
-import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
-@RunWith(AndroidJUnit4.class)
+@RunWith(JUnit4.class)
 @SmallTest
 public class LoaderViewModelTest {
 
-    @Rule
-    public ActivityTestRule<LoaderActivity> mActivityRule =
-            new ActivityTestRule<>(LoaderActivity.class);
-
     @Test
     public void testHasRunningLoaders() {
         LoaderManagerImpl.LoaderViewModel loaderViewModel = new LoaderManagerImpl.LoaderViewModel();
         assertFalse("LoaderViewModel should not be running with before putLoader",
                 loaderViewModel.hasRunningLoaders());
 
-        AlwaysRunningLoaderInfo info = new AlwaysRunningLoaderInfo(mActivityRule.getActivity());
+        AlwaysRunningLoaderInfo info = new AlwaysRunningLoaderInfo(mock(Context.class));
         loaderViewModel.putLoader(0, info);
         assertTrue("LoaderViewModel should be running after a running LoaderInfo is added",
                 loaderViewModel.hasRunningLoaders());
@@ -57,8 +52,7 @@
     @Test
     public void testOnCleared() {
         LoaderManagerImpl.LoaderViewModel loaderViewModel = new LoaderManagerImpl.LoaderViewModel();
-        AlwaysRunningLoaderInfo info = new AlwaysRunningLoaderInfo(
-                mActivityRule.getActivity());
+        AlwaysRunningLoaderInfo info = new AlwaysRunningLoaderInfo(mock(Context.class));
         loaderViewModel.putLoader(0, info);
 
         assertFalse("LoaderInfo shouldn't be destroyed before onCleared", info.mDestroyed);
@@ -72,7 +66,7 @@
         boolean mDestroyed = false;
 
         AlwaysRunningLoaderInfo(Context context) {
-            super(0, null, new LoaderTest.DummyLoader(context));
+            super(0, null, new DummyLoader(context));
         }
 
         @Override
diff --git a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java b/fragment/src/androidTest/java/android/support/v4/app/test/DummyLoader.java
similarity index 65%
copy from core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
copy to fragment/src/androidTest/java/android/support/v4/app/test/DummyLoader.java
index ac61704..1668397 100644
--- a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/test/DummyLoader.java
@@ -14,16 +14,18 @@
  * limitations under the License.
  */
 
-package android.support.design.widget;
+package android.support.v4.app.test;
 
-import android.support.coreui.test.R;
+import android.content.Context;
+import android.support.v4.content.Loader;
 
-/**
- * Test activity for testing various aspects of {@link CoordinatorLayout}.
- */
-public class DynamicCoordinatorLayoutActivity extends BaseTestActivity {
+public class DummyLoader extends Loader<Boolean> {
+    public DummyLoader(Context context) {
+        super(context);
+    }
+
     @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.dynamic_coordinator_layout;
+    protected void onStartLoading() {
+        deliverResult(true);
     }
 }
diff --git a/fragment/src/androidTest/java/android/support/v4/app/test/DummyLoaderCallbacks.java b/fragment/src/androidTest/java/android/support/v4/app/test/DummyLoaderCallbacks.java
new file mode 100644
index 0000000..2c09a2c
--- /dev/null
+++ b/fragment/src/androidTest/java/android/support/v4/app/test/DummyLoaderCallbacks.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.content.Context;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.Loader;
+
+public class DummyLoaderCallbacks implements LoaderManager.LoaderCallbacks<Boolean> {
+    private final Context mContext;
+
+    public boolean mOnLoadFinished;
+    public boolean mOnLoaderReset;
+
+    public DummyLoaderCallbacks(Context context) {
+        mContext = context;
+    }
+
+    @NonNull
+    @Override
+    public Loader<Boolean> onCreateLoader(int id, Bundle args) {
+        return new DummyLoader(mContext);
+    }
+
+    @Override
+    public void onLoadFinished(@NonNull Loader<Boolean> loader, Boolean data) {
+        mOnLoadFinished = true;
+    }
+
+    @Override
+    public void onLoaderReset(@NonNull Loader<Boolean> loader) {
+        mOnLoaderReset = true;
+    }
+}
diff --git a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java b/fragment/src/androidTest/java/android/support/v4/app/test/EmptyActivity.java
similarity index 63%
copy from core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
copy to fragment/src/androidTest/java/android/support/v4/app/test/EmptyActivity.java
index ac61704..7c069f4 100644
--- a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/test/EmptyActivity.java
@@ -14,16 +14,9 @@
  * limitations under the License.
  */
 
-package android.support.design.widget;
+package android.support.v4.app.test;
 
-import android.support.coreui.test.R;
+import android.support.v4.app.SupportActivity;
 
-/**
- * Test activity for testing various aspects of {@link CoordinatorLayout}.
- */
-public class DynamicCoordinatorLayoutActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.dynamic_coordinator_layout;
-    }
+public class EmptyActivity extends SupportActivity {
 }
diff --git a/fragment/src/androidTest/java/android/support/v4/app/test/LoaderActivity.java b/fragment/src/androidTest/java/android/support/v4/app/test/LoaderActivity.java
index 3ae5bab..f6ddf9c 100644
--- a/fragment/src/androidTest/java/android/support/v4/app/test/LoaderActivity.java
+++ b/fragment/src/androidTest/java/android/support/v4/app/test/LoaderActivity.java
@@ -57,7 +57,7 @@
     @Override
     protected void onResume() {
         super.onResume();
-        getSupportLoaderManager().initLoader(TEXT_LOADER_ID, null, this);
+        LoaderManager.getInstance(this).initLoader(TEXT_LOADER_ID, null, this);
     }
 
     @NonNull
@@ -98,7 +98,7 @@
         @Override
         public void onCreate(@Nullable Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
-            getLoaderManager().initLoader(TEXT_LOADER_ID, null, this);
+            LoaderManager.getInstance(this).initLoader(TEXT_LOADER_ID, null, this);
         }
 
         @Nullable
diff --git a/fragment/src/main/java/android/support/v4/app/Fragment.java b/fragment/src/main/java/android/support/v4/app/Fragment.java
index b15c49f..9eade40 100644
--- a/fragment/src/main/java/android/support/v4/app/Fragment.java
+++ b/fragment/src/main/java/android/support/v4/app/Fragment.java
@@ -209,8 +209,6 @@
     // Hint provided by the app that this fragment is currently visible to the user.
     boolean mUserVisibleHint = true;
 
-    LoaderManagerImpl mLoaderManager;
-
     // The animation and transition information for the fragment. This will be null
     // unless the elements are explicitly accessed and should remain null for Fragments
     // without Views.
@@ -971,14 +969,10 @@
     }
 
     /**
-     * Return the LoaderManager for this fragment, creating it if needed.
+     * Return the LoaderManager for this fragment.
      */
     public LoaderManager getLoaderManager() {
-        if (mLoaderManager != null) {
-            return mLoaderManager;
-        }
-        mLoaderManager = new LoaderManagerImpl(this, getViewModelStore());
-        return mLoaderManager;
+        return LoaderManager.getInstance(this);
     }
 
     /**
@@ -2272,10 +2266,7 @@
             writer.print("mStateAfterAnimating=");
             writer.println(getStateAfterAnimating());
         }
-        if (mLoaderManager != null) {
-            writer.print(prefix); writer.println("Loader Manager:");
-            mLoaderManager.dump(prefix + "  ", fd, writer, args);
-        }
+        LoaderManager.getInstance(this).dump(prefix, fd, writer, args);
         if (mChildFragmentManager != null) {
             writer.print(prefix); writer.println("Child " + mChildFragmentManager + ":");
             mChildFragmentManager.dump(prefix + "  ", fd, writer, args);
@@ -2564,13 +2555,11 @@
             throw new SuperNotCalledException("Fragment " + this
                     + " did not call through to super.onDestroyView()");
         }
-        if (mLoaderManager != null) {
-            // Handles the detach/reattach case where the view hierarchy
-            // is destroyed and recreated and an additional call to
-            // onLoadFinished may be needed to ensure the new view
-            // hierarchy is populated from data from the Loaders
-            mLoaderManager.markForRedelivery();
-        }
+        // Handles the detach/reattach case where the view hierarchy
+        // is destroyed and recreated and an additional call to
+        // onLoadFinished may be needed to ensure the new view
+        // hierarchy is populated from data from the Loaders
+        LoaderManager.getInstance(this).markForRedelivery();
         mPerformedCreateView = false;
     }
 
diff --git a/fragment/src/main/java/android/support/v4/app/FragmentActivity.java b/fragment/src/main/java/android/support/v4/app/FragmentActivity.java
index 18ac597..e47c505 100644
--- a/fragment/src/main/java/android/support/v4/app/FragmentActivity.java
+++ b/fragment/src/main/java/android/support/v4/app/FragmentActivity.java
@@ -100,7 +100,6 @@
 
     };
     final FragmentController mFragments = FragmentController.createController(new HostCallbacks());
-    LoaderManager mLoaderManager;
 
     private ViewModelStore mViewModelStore;
 
@@ -678,9 +677,7 @@
                 writer.print(mResumed); writer.print(" mStopped=");
                 writer.print(mStopped); writer.print(" mReallyStopped=");
                 writer.println(mReallyStopped);
-        if (mLoaderManager != null) {
-            mLoaderManager.dump(innerPrefix, fd, writer, args);
-        }
+        LoaderManager.getInstance(this).dump(innerPrefix, fd, writer, args);
         mFragments.getSupportFragmentManager().dump(prefix, fd, writer, args);
     }
 
@@ -728,11 +725,7 @@
     }
 
     public LoaderManager getSupportLoaderManager() {
-        if (mLoaderManager != null) {
-            return mLoaderManager;
-        }
-        mLoaderManager = new LoaderManagerImpl(this, getViewModelStore());
-        return mLoaderManager;
+        return LoaderManager.getInstance(this);
     }
 
     /**
diff --git a/fragment/src/main/java/android/support/v4/app/FragmentManager.java b/fragment/src/main/java/android/support/v4/app/FragmentManager.java
index f53bc32..dc99333 100644
--- a/fragment/src/main/java/android/support/v4/app/FragmentManager.java
+++ b/fragment/src/main/java/android/support/v4/app/FragmentManager.java
@@ -1819,8 +1819,8 @@
             for (int i = 0; i < numAdded; i++) {
                 Fragment f = mAdded.get(i);
                 moveFragmentToExpectedState(f);
-                if (f.mLoaderManager != null) {
-                    loadersRunning |= f.mLoaderManager.hasRunningLoaders();
+                if (f.mHost != null) {
+                    loadersRunning |= LoaderManager.getInstance(f).hasRunningLoaders();
                 }
             }
 
@@ -1831,8 +1831,8 @@
                 Fragment f = mActive.valueAt(i);
                 if (f != null && (f.mRemoving || f.mDetached) && !f.mIsNewlyAdded) {
                     moveFragmentToExpectedState(f);
-                    if (f.mLoaderManager != null) {
-                        loadersRunning |= f.mLoaderManager.hasRunningLoaders();
+                    if (f.mHost != null) {
+                        loadersRunning |= LoaderManager.getInstance(f).hasRunningLoaders();
                     }
                 }
             }
@@ -2695,8 +2695,8 @@
             boolean loadersRunning = false;
             for (int i = 0; i < mActive.size(); i++) {
                 Fragment f = mActive.valueAt(i);
-                if (f != null && f.mLoaderManager != null) {
-                    loadersRunning |= f.mLoaderManager.hasRunningLoaders();
+                if (f != null && f.mHost != null) {
+                    loadersRunning |= LoaderManager.getInstance(f).hasRunningLoaders();
                 }
             }
             if (!loadersRunning) {
diff --git a/fragment/src/main/java/android/support/v4/app/LoaderManager.java b/fragment/src/main/java/android/support/v4/app/LoaderManager.java
index 4b08aec..4774b7b 100644
--- a/fragment/src/main/java/android/support/v4/app/LoaderManager.java
+++ b/fragment/src/main/java/android/support/v4/app/LoaderManager.java
@@ -16,6 +16,8 @@
 
 package android.support.v4.app;
 
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.ViewModelStoreOwner;
 import android.os.Bundle;
 import android.support.annotation.MainThread;
 import android.support.annotation.NonNull;
@@ -110,6 +112,22 @@
     }
 
     /**
+     * Gets a LoaderManager associated with the given owner, such as a {@link FragmentActivity} or
+     * {@link Fragment}.
+     *
+     * @param owner The owner that should be used to create the returned LoaderManager
+     * @param <T> A class that maintains its own {@link android.arch.lifecycle.Lifecycle} and
+     *           {@link android.arch.lifecycle.ViewModelStore}. For instance,
+     *           {@link FragmentActivity} or {@link Fragment}.
+     * @return A valid LoaderManager
+     */
+    @NonNull
+    public static <T extends LifecycleOwner & ViewModelStoreOwner> LoaderManager getInstance(
+            @NonNull T owner) {
+        return new LoaderManagerImpl(owner, owner.getViewModelStore());
+    }
+
+    /**
      * Ensures a loader is initialized and active.  If the loader doesn't
      * already exist, one is created and (if the activity/fragment is currently
      * started) starts the loader.  Otherwise the last created
@@ -179,6 +197,22 @@
     public abstract <D> Loader<D> getLoader(int id);
 
     /**
+     * Mark all Loaders associated with this LoaderManager for redelivery of their current
+     * data (if any), waiting for the next time the Loader is started if it is currently stopped.
+     * In cases where no data has yet been delivered, this is effectively a no-op. In cases where
+     * data has already been delivered via {@link LoaderCallbacks#onLoadFinished(Loader, Object)},
+     * this will ensure that {@link LoaderCallbacks#onLoadFinished(Loader, Object)} is called again
+     * with the same data.
+     * <p>
+     * Call this only if you are implementing a {@link LifecycleOwner} where the views/elements that
+     * developers are likely to use in {@link LoaderCallbacks#onLoadFinished(Loader, Object)} can be
+     * created and destroyed multiple times without the {@link LifecycleOwner} itself being
+     * destroyed. Call this when the views/elements are being destroyed to ensure that the data
+     * is redelivered upon recreation.
+     */
+    public abstract void markForRedelivery();
+
+    /**
      * Print the LoaderManager's state into the given stream.
      *
      * @param prefix Text to print at the front of each line.
diff --git a/fragment/src/main/java/android/support/v4/app/LoaderManagerImpl.java b/fragment/src/main/java/android/support/v4/app/LoaderManagerImpl.java
index 17687ff..fbda089 100644
--- a/fragment/src/main/java/android/support/v4/app/LoaderManagerImpl.java
+++ b/fragment/src/main/java/android/support/v4/app/LoaderManagerImpl.java
@@ -264,6 +264,19 @@
         }
 
         private SparseArrayCompat<LoaderInfo> mLoaders = new SparseArrayCompat<>();
+        private boolean mCreatingLoader = false;
+
+        void startCreatingLoader() {
+            mCreatingLoader = true;
+        }
+
+        boolean isCreatingLoader() {
+            return mCreatingLoader;
+        }
+
+        void finishCreatingLoader() {
+            mCreatingLoader = false;
+        }
 
         void putLoader(int id, @NonNull LoaderInfo info) {
             mLoaders.put(id, info);
@@ -325,8 +338,6 @@
     private final @NonNull LifecycleOwner mLifecycleOwner;
     private final @NonNull LoaderViewModel mLoaderViewModel;
 
-    private boolean mCreatingLoader;
-
     LoaderManagerImpl(@NonNull LifecycleOwner lifecycleOwner,
             @NonNull ViewModelStore viewModelStore) {
         mLifecycleOwner = lifecycleOwner;
@@ -339,7 +350,7 @@
             @NonNull LoaderCallbacks<D> callback) {
         LoaderInfo<D> info;
         try {
-            mCreatingLoader = true;
+            mLoaderViewModel.startCreatingLoader();
             Loader<D> loader = callback.onCreateLoader(id, args);
             if (loader.getClass().isMemberClass()
                     && !Modifier.isStatic(loader.getClass().getModifiers())) {
@@ -351,7 +362,7 @@
             if (DEBUG) Log.v(TAG, "  Created new loader " + info);
             mLoaderViewModel.putLoader(id, info);
         } finally {
-            mCreatingLoader = false;
+            mLoaderViewModel.finishCreatingLoader();
         }
         return info.setCallback(mLifecycleOwner, callback);
     }
@@ -361,7 +372,7 @@
     @Override
     public <D> Loader<D> initLoader(int id, @Nullable Bundle args,
             @NonNull LoaderCallbacks<D> callback) {
-        if (mCreatingLoader) {
+        if (mLoaderViewModel.isCreatingLoader()) {
             throw new IllegalStateException("Called while creating a loader");
         }
         if (Looper.getMainLooper() != Looper.myLooper()) {
@@ -386,7 +397,7 @@
     @Override
     public <D> Loader<D> restartLoader(int id, @Nullable Bundle args,
             @NonNull LoaderCallbacks<D> callback) {
-        if (mCreatingLoader) {
+        if (mLoaderViewModel.isCreatingLoader()) {
             throw new IllegalStateException("Called while creating a loader");
         }
         if (Looper.getMainLooper() != Looper.myLooper()) {
@@ -403,7 +414,7 @@
     @MainThread
     @Override
     public void destroyLoader(int id) {
-        if (mCreatingLoader) {
+        if (mLoaderViewModel.isCreatingLoader()) {
             throw new IllegalStateException("Called while creating a loader");
         }
         if (Looper.getMainLooper() != Looper.myLooper()) {
@@ -421,7 +432,7 @@
     @Nullable
     @Override
     public <D> Loader<D> getLoader(int id) {
-        if (mCreatingLoader) {
+        if (mLoaderViewModel.isCreatingLoader()) {
             throw new IllegalStateException("Called while creating a loader");
         }
 
@@ -429,15 +440,8 @@
         return info != null ? info.getLoader() : null;
     }
 
-    /**
-     * Mark all Loaders associated with this LoaderManager for redelivery of their current
-     * data (if any) the next time the LifecycleOwner is started. In cases where no data has
-     * yet been delivered, this is effectively a no-op. In cases where data has already been
-     * delivered via {@link LoaderCallbacks#onLoadFinished(Loader, Object)}, this will ensure
-     * that {@link LoaderCallbacks#onLoadFinished(Loader, Object)} is called again with the
-     * same data.
-     */
-    void markForRedelivery() {
+    @Override
+    public void markForRedelivery() {
         mLoaderViewModel.markForRedelivery();
     }
 
diff --git a/graphics/drawable/animated/build.gradle b/graphics/drawable/animated/build.gradle
index 30827a9..2f18053 100644
--- a/graphics/drawable/animated/build.gradle
+++ b/graphics/drawable/animated/build.gradle
@@ -36,5 +36,4 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2015"
     description = "Android Support AnimatedVectorDrawable"
-    legacySourceLocation = true
 }
\ No newline at end of file
diff --git a/graphics/drawable/animated/tests/AndroidManifest.xml b/graphics/drawable/animated/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from graphics/drawable/animated/tests/AndroidManifest.xml
rename to graphics/drawable/animated/src/androidTest/AndroidManifest.xml
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableParameterizedTest.java b/graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/AnimatedVectorDrawableParameterizedTest.java
similarity index 100%
rename from graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableParameterizedTest.java
rename to graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/AnimatedVectorDrawableParameterizedTest.java
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java b/graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java
similarity index 100%
rename from graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java
rename to graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/AnimatedVectorDrawableTest.java
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/DrawableStubActivity.java b/graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/DrawableStubActivity.java
similarity index 100%
rename from graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/DrawableStubActivity.java
rename to graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/DrawableStubActivity.java
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/DrawableUtils.java b/graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/DrawableUtils.java
similarity index 100%
rename from graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/DrawableUtils.java
rename to graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/DrawableUtils.java
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorExceptionParameterizedTest.java b/graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/PathInterpolatorExceptionParameterizedTest.java
similarity index 100%
rename from graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorExceptionParameterizedTest.java
rename to graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/PathInterpolatorExceptionParameterizedTest.java
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorParameterizedTest.java b/graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/PathInterpolatorParameterizedTest.java
similarity index 100%
rename from graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorParameterizedTest.java
rename to graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/PathInterpolatorParameterizedTest.java
diff --git a/graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorValueParameterizedTest.java b/graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/PathInterpolatorValueParameterizedTest.java
similarity index 100%
rename from graphics/drawable/animated/tests/src/android/support/graphics/drawable/tests/PathInterpolatorValueParameterizedTest.java
rename to graphics/drawable/animated/src/androidTest/java/android/support/graphics/drawable/tests/PathInterpolatorValueParameterizedTest.java
diff --git a/graphics/drawable/animated/tests/res/anim/animation_grouping_1_01.xml b/graphics/drawable/animated/src/androidTest/res/anim/animation_grouping_1_01.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/animation_grouping_1_01.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/animation_grouping_1_01.xml
diff --git a/graphics/drawable/animated/tests/res/anim/animation_rect.xml b/graphics/drawable/animated/src/androidTest/res/anim/animation_rect.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/animation_rect.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/animation_rect.xml
diff --git a/graphics/drawable/animated/tests/res/anim/animation_rect_exception.xml b/graphics/drawable/animated/src/androidTest/res/anim/animation_rect_exception.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/animation_rect_exception.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/animation_rect_exception.xml
diff --git a/graphics/drawable/animated/tests/res/anim/color_anim.xml b/graphics/drawable/animated/src/androidTest/res/anim/color_anim.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/color_anim.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/color_anim.xml
diff --git a/graphics/drawable/animated/tests/res/anim/path_motion_object.xml b/graphics/drawable/animated/src/androidTest/res/anim/path_motion_object.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/path_motion_object.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/path_motion_object.xml
diff --git a/graphics/drawable/animated/tests/res/anim/shift_to_center_1.xml b/graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_1.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/shift_to_center_1.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_1.xml
diff --git a/graphics/drawable/animated/tests/res/anim/shift_to_center_2.xml b/graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_2.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/shift_to_center_2.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_2.xml
diff --git a/graphics/drawable/animated/tests/res/anim/shift_to_center_exception_1.xml b/graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_1.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/shift_to_center_exception_1.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_1.xml
diff --git a/graphics/drawable/animated/tests/res/anim/shift_to_center_exception_2.xml b/graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_2.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/shift_to_center_exception_2.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_2.xml
diff --git a/graphics/drawable/animated/tests/res/anim/shift_to_center_exception_3.xml b/graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_3.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/shift_to_center_exception_3.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_3.xml
diff --git a/graphics/drawable/animated/tests/res/anim/shift_to_center_exception_4.xml b/graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_4.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/shift_to_center_exception_4.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_4.xml
diff --git a/graphics/drawable/animated/tests/res/anim/shift_to_center_exception_5.xml b/graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_5.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/anim/shift_to_center_exception_5.xml
rename to graphics/drawable/animated/src/androidTest/res/anim/shift_to_center_exception_5.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animated_color_fill.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animated_color_fill.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animated_color_fill.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animated_color_fill.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animated_color_fill_copy.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animated_color_fill_copy.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animated_color_fill_copy.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animated_color_fill_copy.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_1.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_1.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_1.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_1.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_2.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_2.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_2.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_2.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_1.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_1.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_1.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_1.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_2.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_2.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_2.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_2.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_3.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_3.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_3.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_3.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_4.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_4.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_4.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_4.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_5.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_5.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_interpolator_exception_5.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_interpolator_exception_5.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_morphing_rect.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_morphing_rect.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_morphing_rect.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_morphing_rect.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_morphing_rect2.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_morphing_rect2.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_morphing_rect2.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_morphing_rect2.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_morphing_rect_exception.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_morphing_rect_exception.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_morphing_rect_exception.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_morphing_rect_exception.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_path_motion_rect.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_path_motion_rect.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_path_motion_rect.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_path_motion_rect.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_vector_drawable_circle.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_vector_drawable_circle.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_vector_drawable_circle.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_vector_drawable_circle.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/animation_vector_drawable_grouping_1.xml b/graphics/drawable/animated/src/androidTest/res/drawable/animation_vector_drawable_grouping_1.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/animation_vector_drawable_grouping_1.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/animation_vector_drawable_grouping_1.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/rect.xml b/graphics/drawable/animated/src/androidTest/res/drawable/rect.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/rect.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/rect.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/small_rect.xml b/graphics/drawable/animated/src/androidTest/res/drawable/small_rect.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/small_rect.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/small_rect.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/vector_drawable_circle.xml b/graphics/drawable/animated/src/androidTest/res/drawable/vector_drawable_circle.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/vector_drawable_circle.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/vector_drawable_circle.xml
diff --git a/graphics/drawable/animated/tests/res/drawable/vector_drawable_grouping_1.xml b/graphics/drawable/animated/src/androidTest/res/drawable/vector_drawable_grouping_1.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/drawable/vector_drawable_grouping_1.xml
rename to graphics/drawable/animated/src/androidTest/res/drawable/vector_drawable_grouping_1.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/control_points_interpolator.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/control_points_interpolator.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/control_points_interpolator.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/control_points_interpolator.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/path_interpolator.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/path_interpolator.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/path_interpolator.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/path_interpolator.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/single_control_point_interpolator.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/single_control_point_interpolator.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/single_control_point_interpolator.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/single_control_point_interpolator.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/wrong_control_point_interpolator.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/wrong_control_point_interpolator.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/wrong_control_point_interpolator.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/wrong_control_point_interpolator.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/wrong_control_points_interpolator.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/wrong_control_points_interpolator.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/wrong_control_points_interpolator.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/wrong_control_points_interpolator.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/wrong_path_interpolator_1.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/wrong_path_interpolator_1.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/wrong_path_interpolator_1.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/wrong_path_interpolator_1.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/wrong_path_interpolator_2.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/wrong_path_interpolator_2.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/wrong_path_interpolator_2.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/wrong_path_interpolator_2.xml
diff --git a/graphics/drawable/animated/tests/res/interpolator/wrong_path_interpolator_3.xml b/graphics/drawable/animated/src/androidTest/res/interpolator/wrong_path_interpolator_3.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/interpolator/wrong_path_interpolator_3.xml
rename to graphics/drawable/animated/src/androidTest/res/interpolator/wrong_path_interpolator_3.xml
diff --git a/graphics/drawable/animated/tests/res/layout/avd_layout.xml b/graphics/drawable/animated/src/androidTest/res/layout/avd_layout.xml
similarity index 100%
rename from graphics/drawable/animated/tests/res/layout/avd_layout.xml
rename to graphics/drawable/animated/src/androidTest/res/layout/avd_layout.xml
diff --git a/graphics/drawable/animated/tests/NO_DOCS b/graphics/drawable/animated/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/graphics/drawable/animated/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/graphics/drawable/static/build.gradle b/graphics/drawable/static/build.gradle
index f0ac9f0..9388480 100644
--- a/graphics/drawable/static/build.gradle
+++ b/graphics/drawable/static/build.gradle
@@ -31,5 +31,4 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2015"
     description = "Android Support VectorDrawable"
-    legacySourceLocation = true
 }
\ No newline at end of file
diff --git a/graphics/drawable/static/tests/AndroidManifest.xml b/graphics/drawable/static/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from graphics/drawable/static/tests/AndroidManifest.xml
rename to graphics/drawable/static/src/androidTest/AndroidManifest.xml
diff --git a/graphics/drawable/static/tests/src/android/support/graphics/drawable/tests/VectorDrawableTest.java b/graphics/drawable/static/src/androidTest/java/android/support/graphics/drawable/tests/VectorDrawableTest.java
similarity index 100%
rename from graphics/drawable/static/tests/src/android/support/graphics/drawable/tests/VectorDrawableTest.java
rename to graphics/drawable/static/src/androidTest/java/android/support/graphics/drawable/tests/VectorDrawableTest.java
diff --git a/graphics/drawable/static/tests/res/color/vector_icon_fill_state_list.xml b/graphics/drawable/static/src/androidTest/res/color/vector_icon_fill_state_list.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/color/vector_icon_fill_state_list.xml
rename to graphics/drawable/static/src/androidTest/res/color/vector_icon_fill_state_list.xml
diff --git a/graphics/drawable/static/tests/res/color/vector_icon_stroke_state_list.xml b/graphics/drawable/static/src/androidTest/res/color/vector_icon_stroke_state_list.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/color/vector_icon_stroke_state_list.xml
rename to graphics/drawable/static/src/androidTest/res/color/vector_icon_stroke_state_list.xml
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_clip_path_1_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_clip_path_1_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_clip_path_1_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_clip_path_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_create_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_create_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_create_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_create_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_delete_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_delete_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_delete_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_delete_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_filltype_evenodd_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_filltype_evenodd_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_filltype_evenodd_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_filltype_evenodd_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_filltype_nonzero_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_filltype_nonzero_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_filltype_nonzero_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_filltype_nonzero_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_five_bars_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_five_bars_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_five_bars_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_five_bars_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_group_clip_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_group_clip_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_group_clip_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_group_clip_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_heart_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_heart_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_heart_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_heart_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_random_path_1_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_random_path_1_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_random_path_1_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_random_path_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_random_path_2_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_random_path_2_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_random_path_2_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_random_path_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_render_order_1_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_render_order_1_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_render_order_1_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_render_order_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_render_order_2_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_render_order_2_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_render_order_2_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_render_order_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_cq_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_st_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_st_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_repeated_st_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_repeated_st_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_scale_1_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_scale_1_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_scale_1_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_scale_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_scale_2_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_scale_2_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_scale_2_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_scale_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_schedule_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_schedule_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_schedule_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_schedule_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_settings_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_settings_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_settings_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_settings_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_share_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_share_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_share_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_share_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_1_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_stroke_1_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_1_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_stroke_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_2_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_stroke_2_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_2_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_stroke_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_3_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_stroke_3_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_stroke_3_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_stroke_3_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_1_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_1_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_1_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_1_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_2_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_2_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_2_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_2_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_3_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_3_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_3_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_3_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_4_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_4_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_4_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_4_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_5_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_5_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_5_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_5_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_6_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_6_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_transformation_6_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_transformation_6_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_wishlist_golden.png b/graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_wishlist_golden.png
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable-nodpi/vector_icon_wishlist_golden.png
rename to graphics/drawable/static/src/androidTest/res/drawable-nodpi/vector_icon_wishlist_golden.png
Binary files differ
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_clip_path_1.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_clip_path_1.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_clip_path_1.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_clip_path_1.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_create.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_create.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_create.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_create.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_delete.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_delete.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_delete.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_delete.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_filltype_evenodd.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_filltype_evenodd.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_filltype_evenodd.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_filltype_evenodd.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_filltype_nonzero.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_filltype_nonzero.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_filltype_nonzero.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_filltype_nonzero.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_five_bars.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_five_bars.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_five_bars.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_five_bars.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_group_clip.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_group_clip.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_group_clip.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_group_clip.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_heart.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_heart.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_heart.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_heart.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_random_path_1.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_random_path_1.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_random_path_1.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_random_path_1.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_random_path_2.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_random_path_2.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_random_path_2.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_random_path_2.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_render_order_1.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_render_order_1.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_render_order_1.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_render_order_1.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_render_order_2.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_render_order_2.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_render_order_2.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_render_order_2.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_a_1.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_a_1.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_repeated_a_1.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_a_1.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_a_2.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_a_2.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_repeated_a_2.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_a_2.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_cq.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_cq.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_repeated_cq.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_cq.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_repeated_st.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_st.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_repeated_st.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_repeated_st.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_scale_1.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_scale_1.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_scale_1.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_scale_1.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_scale_2.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_scale_2.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_scale_2.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_scale_2.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_schedule.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_schedule.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_schedule.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_schedule.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_settings.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_settings.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_settings.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_settings.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_share.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_share.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_share.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_share.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_state_list.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_state_list.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_state_list.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_state_list.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_1.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_stroke_1.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_stroke_1.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_stroke_1.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_2.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_stroke_2.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_stroke_2.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_stroke_2.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_stroke_3.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_stroke_3.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_stroke_3.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_stroke_3.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_1.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_1.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_transformation_1.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_1.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_2.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_2.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_transformation_2.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_2.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_3.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_3.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_transformation_3.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_3.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_4.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_4.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_transformation_4.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_4.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_5.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_5.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_transformation_5.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_5.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_transformation_6.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_6.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_transformation_6.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_transformation_6.xml
diff --git a/graphics/drawable/static/tests/res/drawable/vector_icon_wishlist.xml b/graphics/drawable/static/src/androidTest/res/drawable/vector_icon_wishlist.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/drawable/vector_icon_wishlist.xml
rename to graphics/drawable/static/src/androidTest/res/drawable/vector_icon_wishlist.xml
diff --git a/graphics/drawable/static/tests/res/values/colors.xml b/graphics/drawable/static/src/androidTest/res/values/colors.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/values/colors.xml
rename to graphics/drawable/static/src/androidTest/res/values/colors.xml
diff --git a/graphics/drawable/static/tests/res/values/strings.xml b/graphics/drawable/static/src/androidTest/res/values/strings.xml
similarity index 100%
rename from graphics/drawable/static/tests/res/values/strings.xml
rename to graphics/drawable/static/src/androidTest/res/values/strings.xml
diff --git a/graphics/drawable/static/tests/NO_DOCS b/graphics/drawable/static/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/graphics/drawable/static/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/heifwriter/api/current.txt b/heifwriter/api/current.txt
new file mode 100644
index 0000000..3fbb5b8
--- /dev/null
+++ b/heifwriter/api/current.txt
@@ -0,0 +1,19 @@
+package androidx.media.heifwriter {
+
+  public final class HeifWriter implements java.lang.AutoCloseable {
+    ctor public HeifWriter(java.lang.String, int, int, boolean, int, int, int, int, android.os.Handler) throws java.io.IOException;
+    ctor public HeifWriter(java.io.FileDescriptor, int, int, boolean, int, int, int, int, android.os.Handler) throws java.io.IOException;
+    method public void addBitmap(android.graphics.Bitmap);
+    method public void addYuvBuffer(int, byte[]);
+    method public void close();
+    method public android.view.Surface getInputSurface();
+    method public void setInputEndOfStreamTimestamp(long);
+    method public void start();
+    method public void stop(long) throws java.lang.Exception;
+    field public static final int INPUT_MODE_BITMAP = 2; // 0x2
+    field public static final int INPUT_MODE_BUFFER = 0; // 0x0
+    field public static final int INPUT_MODE_SURFACE = 1; // 0x1
+  }
+
+}
+
diff --git a/heifwriter/build.gradle b/heifwriter/build.gradle
new file mode 100644
index 0000000..b66d8a8
--- /dev/null
+++ b/heifwriter/build.gradle
@@ -0,0 +1,29 @@
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+android {
+    defaultConfig {
+        targetSdkVersion = 'P'
+    }
+}
+
+dependencies {
+    api(project(":support-annotations"))
+
+    androidTestImplementation(TEST_RUNNER)
+}
+
+supportLibrary {
+    name = "Android Support HeifWriter"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
+    inceptionYear = "2018"
+    minSdkVersion = 'P'
+    description = "Android Support HeifWriter for writing HEIF still images"
+}
diff --git a/heifwriter/src/androidTest/AndroidManifest.xml b/heifwriter/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..755ac70
--- /dev/null
+++ b/heifwriter/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+   Copyright (C) 2018 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="androidx.media.heifwriter.test">
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+</manifest>
diff --git a/textclassifier/src/androidTest/NO_DOCS b/heifwriter/src/androidTest/NO_DOCS
similarity index 100%
rename from textclassifier/src/androidTest/NO_DOCS
rename to heifwriter/src/androidTest/NO_DOCS
diff --git a/heifwriter/src/androidTest/java/androidx/media/heifwriter/HeifWriterTest.java b/heifwriter/src/androidTest/java/androidx/media/heifwriter/HeifWriterTest.java
new file mode 100644
index 0000000..8673c5c
--- /dev/null
+++ b/heifwriter/src/androidTest/java/androidx/media/heifwriter/HeifWriterTest.java
@@ -0,0 +1,499 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.media.heifwriter;
+
+import static android.support.test.InstrumentationRegistry.getContext;
+
+import static androidx.media.heifwriter.HeifWriter.INPUT_MODE_BITMAP;
+import static androidx.media.heifwriter.HeifWriter.INPUT_MODE_BUFFER;
+import static androidx.media.heifwriter.HeifWriter.INPUT_MODE_SURFACE;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import android.graphics.Bitmap;
+import android.graphics.ImageFormat;
+import android.media.MediaExtractor;
+import android.media.MediaFormat;
+import android.media.MediaMetadataRetriever;
+import android.opengl.GLES20;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Process;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.Log;
+import androidx.media.heifwriter.test.R;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Arrays;
+
+/**
+ * Test {@link HeifWriter}.
+ */
+@RunWith(AndroidJUnit4.class)
+public class HeifWriterTest {
+    private static final String TAG = HeifWriterTest.class.getSimpleName();
+    private static final boolean DEBUG = false;
+    private static final boolean DUMP_YUV_INPUT = false;
+
+    private static byte[][] TEST_COLORS = {
+            {(byte) 255, (byte) 0, (byte) 0},
+            {(byte) 255, (byte) 0, (byte) 255},
+            {(byte) 255, (byte) 255, (byte) 255},
+            {(byte) 255, (byte) 255, (byte) 0},
+    };
+
+    private static final String TEST_HEIC = "test.heic";
+    private static final int[] IMAGE_RESOURCES = new int[] {
+            R.raw.test
+    };
+    private static final String[] IMAGE_FILENAMES = new String[] {
+            TEST_HEIC
+    };
+    private static final String OUTPUT_FILENAME = "output.heic";
+
+    private EglWindowSurface mInputEglSurface;
+    private Handler mHandler;
+    private int mInputIndex;
+
+    @Before
+    public void setUp() throws Exception {
+        for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
+            String outputPath = new File(Environment.getExternalStorageDirectory(),
+                    IMAGE_FILENAMES[i]).getAbsolutePath();
+
+            InputStream inputStream = null;
+            FileOutputStream outputStream = null;
+            try {
+                inputStream = getContext().getResources().openRawResource(IMAGE_RESOURCES[i]);
+                outputStream = new FileOutputStream(outputPath);
+                copy(inputStream, outputStream);
+            } finally {
+                closeQuietly(inputStream);
+                closeQuietly(outputStream);
+            }
+        }
+
+        HandlerThread handlerThread = new HandlerThread(
+                "HeifEncoderThread", Process.THREAD_PRIORITY_FOREGROUND);
+        handlerThread.start();
+        mHandler = new Handler(handlerThread.getLooper());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
+            String imageFilePath =
+                    new File(Environment.getExternalStorageDirectory(), IMAGE_FILENAMES[i])
+                            .getAbsolutePath();
+            File imageFile = new File(imageFilePath);
+            if (imageFile.exists()) {
+                imageFile.delete();
+            }
+        }
+    }
+
+    @Test
+    @LargeTest
+    public void testInputBuffer_NoGrid_NoHandler() throws Throwable {
+        doTest(new TestConfig(INPUT_MODE_BUFFER, false, false));
+    }
+
+    @Test
+    @LargeTest
+    public void testInputBuffer_Grid_NoHandler() throws Throwable {
+        doTest(new TestConfig(INPUT_MODE_BUFFER, true, false));
+    }
+
+    @Test
+    @LargeTest
+    public void testInputBuffer_NoGrid_Handler() throws Throwable {
+        doTest(new TestConfig(INPUT_MODE_BUFFER, false, true));
+    }
+
+    @Test
+    @LargeTest
+    public void testInputBuffer_Grid_Handler() throws Throwable {
+        doTest(new TestConfig(INPUT_MODE_BUFFER, true, true));
+    }
+
+    @Test
+    @LargeTest
+    public void testInputSurface_NoGrid_NoHandler() throws Throwable {
+        doTest(new TestConfig(INPUT_MODE_SURFACE, false, false));
+    }
+
+    @Test
+    @LargeTest
+    public void testInputSurface_Grid_NoHandler() throws Throwable {
+        doTest(new TestConfig(INPUT_MODE_SURFACE, true, false));
+    }
+
+    @Test
+    @LargeTest
+    public void testInputSurface_NoGrid_Handler() throws Throwable {
+        doTest(new TestConfig(INPUT_MODE_SURFACE, false, true));
+    }
+
+    @Test
+    @LargeTest
+    public void testInputSurface_Grid_Handler() throws Throwable {
+        doTest(new TestConfig(INPUT_MODE_SURFACE, true, true));
+    }
+
+    @Test
+    @LargeTest
+    public void testInputBitmap_NoGrid_NoHandler() throws Throwable {
+        for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
+            String inputPath = new File(Environment.getExternalStorageDirectory(),
+                    IMAGE_FILENAMES[i]).getAbsolutePath();
+            doTest(new TestConfig(
+                    INPUT_MODE_BITMAP, false, false, inputPath));
+        }
+    }
+
+    @Test
+    @LargeTest
+    public void testInputBitmap_Grid_NoHandler() throws Throwable {
+        for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
+            String inputPath = new File(Environment.getExternalStorageDirectory(),
+                    IMAGE_FILENAMES[i]).getAbsolutePath();
+            doTest(new TestConfig(
+                    INPUT_MODE_BITMAP, true, false, inputPath));
+        }
+    }
+
+    @Test
+    @LargeTest
+    public void testInputBitmap_NoGrid_Handler() throws Throwable {
+        for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
+            String inputPath = new File(Environment.getExternalStorageDirectory(),
+                    IMAGE_FILENAMES[i]).getAbsolutePath();
+            doTest(new TestConfig(
+                    INPUT_MODE_BITMAP, false, true, inputPath));
+        }
+    }
+
+    @Test
+    @LargeTest
+    public void testInputBitmap_Grid_Handler() throws Throwable {
+        for (int i = 0; i < IMAGE_RESOURCES.length; ++i) {
+            String inputPath = new File(Environment.getExternalStorageDirectory(),
+                    IMAGE_FILENAMES[i]).getAbsolutePath();
+            doTest(new TestConfig(
+                    INPUT_MODE_BITMAP, true, true, inputPath));
+        }
+    }
+
+    private void closeQuietly(Closeable closeable) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (RuntimeException rethrown) {
+                throw rethrown;
+            } catch (Exception ignored) {
+            }
+        }
+    }
+
+    private int copy(InputStream in, OutputStream out) throws IOException {
+        int total = 0;
+        byte[] buffer = new byte[8192];
+        int c;
+        while ((c = in.read(buffer)) != -1) {
+            total += c;
+            out.write(buffer, 0, c);
+        }
+        return total;
+    }
+
+    private static class TestConfig {
+        int inputMode;
+        boolean useGrid;
+        boolean useHandler;
+        int numImages;
+        int width;
+        int height;
+        int quality;
+        String inputPath;
+        String outputPath;
+        Bitmap[] bitmaps;
+
+        TestConfig(int _inputMode, boolean _useGrids, boolean _useHandler) {
+            this(_inputMode, _useGrids, _useHandler, null);
+        }
+
+        TestConfig(int _inputMode, boolean _useGrids, boolean _useHandler, String _inputPath) {
+            inputMode = _inputMode;
+            useGrid = _useGrids;
+            useHandler = _useHandler;
+            numImages = 4;
+            width = 1920;
+            height = 1080;
+            quality = 100;
+            inputPath = (inputMode == INPUT_MODE_BITMAP) ? _inputPath : null;
+            outputPath = new File(Environment.getExternalStorageDirectory(),
+                    OUTPUT_FILENAME).getAbsolutePath();;
+
+            cleanupStaleOutputs();
+            loadBitmapInputs();
+        }
+
+        private void loadBitmapInputs() {
+            if (inputMode != INPUT_MODE_BITMAP) {
+                return;
+            }
+            MediaMetadataRetriever retriever = new MediaMetadataRetriever();
+            retriever.setDataSource(inputPath);
+            String hasImage = retriever.extractMetadata(
+                    MediaMetadataRetriever.METADATA_KEY_HAS_IMAGE);
+            if (!"yes".equals(hasImage)) {
+                throw new IllegalArgumentException("no bitmap found!");
+            }
+            width = Integer.parseInt(retriever.extractMetadata(
+                    MediaMetadataRetriever.METADATA_KEY_IMAGE_WIDTH));
+            height = Integer.parseInt(retriever.extractMetadata(
+                    MediaMetadataRetriever.METADATA_KEY_IMAGE_HEIGHT));
+            numImages = Math.min(numImages, Integer.parseInt(retriever.extractMetadata(
+                    MediaMetadataRetriever.METADATA_KEY_IMAGE_COUNT)));
+            bitmaps = new Bitmap[numImages];
+            for (int i = 0; i < bitmaps.length; i++) {
+                bitmaps[i] = retriever.getImageAtIndex(i);
+            }
+            retriever.release();
+        }
+
+        private void cleanupStaleOutputs() {
+            File outputFile = new File(outputPath);
+            if (outputFile.exists()) {
+                outputFile.delete();
+            }
+        }
+
+        @Override
+        public String toString() {
+            return "TestConfig" +
+                    ": inputMode " + inputMode +
+                    ", useGrid " + useGrid +
+                    ", useHandler " + useHandler +
+                    ", numImages " + numImages +
+                    ", width " + width +
+                    ", height " + height +
+                    ", quality " + quality +
+                    ", inputPath " + inputPath +
+                    ", outputPath " + outputPath;
+        }
+    }
+
+    private void doTest(TestConfig testConfig) {
+        int width = testConfig.width;
+        int height = testConfig.height;
+        int numImages = testConfig.numImages;
+
+        mInputIndex = 0;
+        HeifWriter heifWriter = null;
+        FileInputStream inputStream = null;
+        FileOutputStream outputStream = null;
+        try {
+            if (DEBUG) Log.d(TAG, "started: " + testConfig);
+
+            heifWriter = new HeifWriter(testConfig.outputPath,
+                    width, height, testConfig.useGrid, testConfig.quality,
+                    numImages, numImages - 1
+                    , testConfig.inputMode,
+                    testConfig.useHandler ? mHandler : null);
+
+            if (testConfig.inputMode == INPUT_MODE_SURFACE) {
+                mInputEglSurface = new EglWindowSurface(heifWriter.getInputSurface());
+            }
+
+            heifWriter.start();
+
+            if (testConfig.inputMode == INPUT_MODE_BUFFER) {
+                byte[] data = new byte[width * height * 3 / 2];
+
+                if (testConfig.inputPath != null) {
+                    inputStream = new FileInputStream(testConfig.inputPath);
+                }
+
+                if (DUMP_YUV_INPUT) {
+                    File outputFile = new File("/sdcard/input.yuv");
+                    outputFile.createNewFile();
+                    outputStream = new FileOutputStream(outputFile);
+                }
+
+                for (int i = 0; i < numImages; i++) {
+                    if (DEBUG) Log.d(TAG, "fillYuvBuffer: " + i);
+                    fillYuvBuffer(i, data, width, height, inputStream);
+                    if (DUMP_YUV_INPUT) {
+                        Log.d(TAG, "@@@ dumping input YUV");
+                        outputStream.write(data);
+                    }
+                    heifWriter.addYuvBuffer(ImageFormat.YUV_420_888, data);
+                }
+            } else if (testConfig.inputMode == INPUT_MODE_SURFACE) {
+                // The input surface is a surface texture using single buffer mode, draws will be
+                // blocked until onFrameAvailable is done with the buffer, which is dependant on
+                // how fast MediaCodec processes them, which is further dependent on how fast the
+                // MediaCodec callbacks are handled. We can't put draws on the same looper that
+                // handles MediaCodec callback, it will cause deadlock.
+                for (int i = 0; i < numImages; i++) {
+                    if (DEBUG) Log.d(TAG, "drawFrame: " + i);
+                    drawFrame(width, height);
+                }
+                heifWriter.setInputEndOfStreamTimestamp(
+                        1000 * computePresentationTime(numImages - 1));
+            } else if (testConfig.inputMode == INPUT_MODE_BITMAP) {
+                Bitmap[] bitmaps = testConfig.bitmaps;
+                for (int i = 0; i < Math.min(bitmaps.length, numImages); i++) {
+                    if (DEBUG) Log.d(TAG, "addBitmap: " + i);
+                    heifWriter.addBitmap(bitmaps[i]);
+                    bitmaps[i].recycle();
+                }
+            }
+
+            heifWriter.stop(3000);
+            verifyResult(testConfig.outputPath, width, height, testConfig.useGrid, numImages);
+            if (DEBUG) Log.d(TAG, "finished: PASS");
+        } catch (Exception e) {
+            fail("finished: FAIL " + e.toString());
+        } finally {
+            try {
+                if (outputStream != null) {
+                    outputStream.close();
+                }
+                if (inputStream != null) {
+                    inputStream.close();
+                }
+            } catch (IOException e) {}
+
+            if (heifWriter != null) {
+                heifWriter.close();
+                heifWriter = null;
+            }
+            if (mInputEglSurface != null) {
+                // This also releases the surface from encoder.
+                mInputEglSurface.release();
+                mInputEglSurface = null;
+            }
+        }
+    }
+
+    private long computePresentationTime(int frameIndex) {
+        return 132 + (long)frameIndex * 1000000;
+    }
+
+    private void fillYuvBuffer(int frameIndex, @NonNull byte[] data, int width, int height,
+                               @Nullable FileInputStream inputStream) throws IOException {
+        if (inputStream != null) {
+            inputStream.read(data);
+        } else {
+            byte[] color = TEST_COLORS[frameIndex % TEST_COLORS.length];
+            int sizeY = width * height;
+            Arrays.fill(data, 0, sizeY, color[0]);
+            Arrays.fill(data, sizeY, sizeY * 5 / 4, color[1]);
+            Arrays.fill(data, sizeY * 5 / 4, sizeY * 3 / 2, color[2]);
+        }
+    }
+
+    private void drawFrame(int width, int height) {
+        mInputEglSurface.makeCurrent();
+        generateSurfaceFrame(mInputIndex, width, height);
+        mInputEglSurface.setPresentationTime(1000 * computePresentationTime(mInputIndex));
+        mInputEglSurface.swapBuffers();
+        mInputIndex++;
+    }
+
+    private void generateSurfaceFrame(int frameIndex, int width, int height) {
+        frameIndex %= 4;
+
+        GLES20.glViewport(0, 0, width, height);
+        GLES20.glDisable(GLES20.GL_SCISSOR_TEST);
+        GLES20.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
+        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+        GLES20.glEnable(GLES20.GL_SCISSOR_TEST);
+
+        int startX, startY;
+        int borderWidth = 16;
+        for (int i = 0; i < 7; i++) {
+            startX = (width - borderWidth * 2) * i / 7 + borderWidth;
+            GLES20.glScissor(startX, borderWidth,
+                    (width - borderWidth * 2) / 7, height - borderWidth * 2);
+            GLES20.glClearColor(((7 - i) & 0x4) * 0.16f,
+                    ((7 - i) & 0x2) * 0.32f,
+                    ((7 - i) & 0x1) * 0.64f,
+                    1.0f);
+            GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+        }
+
+        startX = (width / 6) + (width / 6) * frameIndex;
+        startY = height / 4;
+        GLES20.glScissor(startX, startY, width / 6, height / 3);
+        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
+        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+        GLES20.glScissor(startX + borderWidth, startY + borderWidth,
+                width / 6 - borderWidth * 2, height / 3 - borderWidth * 2);
+        GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
+        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+    }
+
+    private void verifyResult(
+            String filename, int width, int height, boolean useGrid, int numImages)
+            throws Exception {
+        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
+        retriever.setDataSource(filename);
+        String hasImage = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_IMAGE);
+        if (!"yes".equals(hasImage)) {
+            throw new Exception("No images found in file " + filename);
+        }
+        assertEquals("Wrong image count", numImages,
+                Integer.parseInt(retriever.extractMetadata(
+                MediaMetadataRetriever.METADATA_KEY_IMAGE_COUNT)));
+        assertEquals("Wrong width", width,
+                Integer.parseInt(retriever.extractMetadata(
+                MediaMetadataRetriever.METADATA_KEY_IMAGE_WIDTH)));
+        assertEquals("Wrong height", height,
+                Integer.parseInt(retriever.extractMetadata(
+                MediaMetadataRetriever.METADATA_KEY_IMAGE_HEIGHT)));
+        retriever.release();
+
+        if (useGrid) {
+            MediaExtractor extractor = new MediaExtractor();
+            extractor.setDataSource(filename);
+            MediaFormat format = extractor.getTrackFormat(0);
+            int gridWidth = format.getInteger(MediaFormat.KEY_GRID_WIDTH);
+            int gridHeight = format.getInteger(MediaFormat.KEY_GRID_HEIGHT);
+            assertEquals("Wrong grid width", 512, gridWidth);
+            assertEquals("Wrong grid height", 512, gridHeight);
+            extractor.release();
+        }
+    }
+}
diff --git a/heifwriter/src/androidTest/res/raw/test.heic b/heifwriter/src/androidTest/res/raw/test.heic
new file mode 100644
index 0000000..ceaff92
--- /dev/null
+++ b/heifwriter/src/androidTest/res/raw/test.heic
Binary files differ
diff --git a/heifwriter/src/main/AndroidManifest.xml b/heifwriter/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..b4d86af
--- /dev/null
+++ b/heifwriter/src/main/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="androidx.media.heifwriter">
+</manifest>
diff --git a/heifwriter/src/main/java/androidx/media/heifwriter/EglRectBlt.java b/heifwriter/src/main/java/androidx/media/heifwriter/EglRectBlt.java
new file mode 100644
index 0000000..f70d01c
--- /dev/null
+++ b/heifwriter/src/main/java/androidx/media/heifwriter/EglRectBlt.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2018 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.media.heifwriter;
+
+import android.graphics.Rect;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+/**
+ * This class represents a viewport-sized sprite that will be rendered with
+ * a subrect from a texture.
+ *
+ * @hide
+ */
+public class EglRectBlt {
+    private static final int SIZEOF_FLOAT = 4;
+
+    /**
+     * A "full" square, extending from -1 to +1 in both dimensions. When the
+     * model/view/projection matrix is identity, this will exactly cover the viewport.
+     */
+    private static final float FULL_RECTANGLE_COORDS[] = {
+            -1.0f, -1.0f,   // 0 bottom left
+             1.0f, -1.0f,   // 1 bottom right
+            -1.0f,  1.0f,   // 2 top left
+             1.0f,  1.0f,   // 3 top right
+    };
+
+    private static final FloatBuffer FULL_RECTANGLE_BUF =
+            createFloatBuffer(FULL_RECTANGLE_COORDS);
+
+    private final float mTexCoords[] = new float[8];
+    private final FloatBuffer mTexCoordArray = createFloatBuffer(mTexCoords);
+    private final int mTexWidth;
+    private final int mTexHeight;
+
+    private Texture2dProgram mProgram;
+
+    /**
+     * Allocates a direct float buffer, and populates it with the float array data.
+     */
+    public static FloatBuffer createFloatBuffer(float[] coords) {
+        // Allocate a direct ByteBuffer, using 4 bytes per float, and copy coords into it.
+        ByteBuffer bb = ByteBuffer.allocateDirect(coords.length * SIZEOF_FLOAT);
+        bb.order(ByteOrder.nativeOrder());
+        FloatBuffer fb = bb.asFloatBuffer();
+        fb.put(coords);
+        fb.position(0);
+        return fb;
+    }
+
+    /**
+     * Prepares the object.
+     *
+     * @param program The program to use. EglRectBlitter takes ownership, and will release
+     *     the program when no longer needed.
+     */
+    public EglRectBlt(Texture2dProgram program, int texWidth, int texHeight) {
+        mProgram = program;
+
+        mTexWidth = texWidth;
+        mTexHeight = texHeight;
+    }
+
+    /**
+     * Releases resources.
+     * <p>
+     * This must be called with the appropriate EGL context current (i.e. the one that was
+     * current when the constructor was called). If we're about to destroy the EGL context,
+     * there's no value in having the caller make it current just to do this cleanup, so you
+     * can pass a flag that will tell this function to skip any EGL-context-specific cleanup.
+     */
+    public void release(boolean doEglCleanup) {
+        if (mProgram != null) {
+            if (doEglCleanup) {
+                mProgram.release();
+            }
+            mProgram = null;
+        }
+    }
+
+    /**
+     * Creates a texture object suitable for use with drawFrame().
+     */
+    public int createTextureObject() {
+        return mProgram.createTextureObject();
+    }
+
+    /**
+     * Draws a viewport-filling rect, texturing it with the specified texture object and rect.
+     */
+    public void copyRect(int textureId, float[] texMatrix, Rect texRect) {
+        setTexRect(texRect);
+
+        // Use the identity matrix for MVP so our 2x2 FULL_RECTANGLE covers the viewport.
+        mProgram.draw(Texture2dProgram.IDENTITY_MATRIX, FULL_RECTANGLE_BUF, 0,
+                4, 2, 2 * SIZEOF_FLOAT,
+                texMatrix, mTexCoordArray, textureId, 2 * SIZEOF_FLOAT);
+    }
+
+    void setTexRect(Rect rect) {
+        mTexCoords[0] = rect.left / (float)mTexWidth;
+        mTexCoords[1] = 1.0f - rect.bottom / (float)mTexHeight;
+        mTexCoords[2] = rect.right / (float)mTexWidth;
+        mTexCoords[3] = 1.0f - rect.bottom / (float)mTexHeight;
+        mTexCoords[4] = rect.left / (float)mTexWidth;
+        mTexCoords[5] = 1.0f - rect.top / (float)mTexHeight;
+        mTexCoords[6] = rect.right / (float)mTexWidth;
+        mTexCoords[7] = 1.0f - rect.top / (float)mTexHeight;
+
+        mTexCoordArray.put(mTexCoords);
+        mTexCoordArray.position(0);
+    }
+}
diff --git a/heifwriter/src/main/java/androidx/media/heifwriter/EglWindowSurface.java b/heifwriter/src/main/java/androidx/media/heifwriter/EglWindowSurface.java
new file mode 100644
index 0000000..a73aac4
--- /dev/null
+++ b/heifwriter/src/main/java/androidx/media/heifwriter/EglWindowSurface.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.media.heifwriter;
+
+import android.opengl.EGL14;
+import android.opengl.EGLConfig;
+import android.opengl.EGLContext;
+import android.opengl.EGLDisplay;
+import android.opengl.EGLExt;
+import android.opengl.EGLSurface;
+import android.util.Log;
+import android.view.Surface;
+
+/**
+ * Holds state associated with a Surface used for MediaCodec encoder input.
+ * <p>
+ * The constructor takes a Surface obtained from MediaCodec.createInputSurface(), and uses that
+ * to create an EGL window surface. Calls to eglSwapBuffers() cause a frame of data to be sent
+ * to the video encoder.
+ *
+ * @hide
+ */
+public class EglWindowSurface {
+    private static final String TAG = "EglWindowSurface";
+
+    private EGLDisplay mEGLDisplay = EGL14.EGL_NO_DISPLAY;
+    private EGLContext mEGLContext = EGL14.EGL_NO_CONTEXT;
+    private EGLSurface mEGLSurface = EGL14.EGL_NO_SURFACE;
+    private EGLConfig[] mConfigs = new EGLConfig[1];
+
+    private Surface mSurface;
+    private int mWidth;
+    private int mHeight;
+
+    /**
+     * Creates an EglWindowSurface from a Surface.
+     */
+    public EglWindowSurface(Surface surface) {
+        if (surface == null) {
+            throw new NullPointerException();
+        }
+        mSurface = surface;
+
+        eglSetup();
+    }
+
+    /**
+     * Prepares EGL. We want a GLES 2.0 context and a surface that supports recording.
+     */
+    private void eglSetup() {
+        mEGLDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
+        if (mEGLDisplay == EGL14.EGL_NO_DISPLAY) {
+            throw new RuntimeException("unable to get EGL14 display");
+        }
+        int[] version = new int[2];
+        if (!EGL14.eglInitialize(mEGLDisplay, version, 0, version, 1)) {
+            mEGLDisplay = null;
+            throw new RuntimeException("unable to initialize EGL14");
+        }
+
+        // Configure EGL for recordable and OpenGL ES 2.0.  We want enough RGB bits
+        // to minimize artifacts from possible YUV conversion.
+        int[] attribList = {
+                EGL14.EGL_RED_SIZE, 8,
+                EGL14.EGL_GREEN_SIZE, 8,
+                EGL14.EGL_BLUE_SIZE, 8,
+                EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT,
+                EGLExt.EGL_RECORDABLE_ANDROID, 1,
+                EGL14.EGL_NONE
+        };
+        int[] numConfigs = new int[1];
+        if (!EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, mConfigs, 0, mConfigs.length,
+                numConfigs, 0)) {
+            throw new RuntimeException("unable to find RGB888+recordable ES2 EGL config");
+        }
+
+        // Configure context for OpenGL ES 2.0.
+        int[] attrib_list = {
+                EGL14.EGL_CONTEXT_CLIENT_VERSION, 2,
+                EGL14.EGL_NONE
+        };
+        mEGLContext = EGL14.eglCreateContext(mEGLDisplay, mConfigs[0], EGL14.EGL_NO_CONTEXT,
+                attrib_list, 0);
+        checkEglError("eglCreateContext");
+        if (mEGLContext == null) {
+            throw new RuntimeException("null context");
+        }
+
+        // Create a window surface, and attach it to the Surface we received.
+        createEGLSurface();
+
+        mWidth = getWidth();
+        mHeight = getHeight();
+    }
+
+    public void updateSize(int width, int height) {
+        if (width != mWidth || height != mHeight) {
+            Log.d(TAG, "re-create EGLSurface");
+            releaseEGLSurface();
+            createEGLSurface();
+            mWidth = getWidth();
+            mHeight = getHeight();
+        }
+    }
+
+    private void createEGLSurface() {
+        int[] surfaceAttribs = {
+                EGL14.EGL_NONE
+        };
+        mEGLSurface = EGL14.eglCreateWindowSurface(mEGLDisplay, mConfigs[0], mSurface,
+                surfaceAttribs, 0);
+        checkEglError("eglCreateWindowSurface");
+        if (mEGLSurface == null) {
+            throw new RuntimeException("surface was null");
+        }
+    }
+
+    private void releaseEGLSurface() {
+        if (mEGLDisplay != EGL14.EGL_NO_DISPLAY) {
+            EGL14.eglDestroySurface(mEGLDisplay, mEGLSurface);
+            mEGLSurface = EGL14.EGL_NO_SURFACE;
+        }
+    }
+
+    /**
+     * Discard all resources held by this class, notably the EGL context. Also releases the
+     * Surface that was passed to our constructor.
+     */
+    public void release() {
+        if (mEGLDisplay != EGL14.EGL_NO_DISPLAY) {
+            EGL14.eglDestroySurface(mEGLDisplay, mEGLSurface);
+            EGL14.eglDestroyContext(mEGLDisplay, mEGLContext);
+            EGL14.eglReleaseThread();
+            EGL14.eglTerminate(mEGLDisplay);
+        }
+
+        mSurface.release();
+
+        mEGLDisplay = EGL14.EGL_NO_DISPLAY;
+        mEGLContext = EGL14.EGL_NO_CONTEXT;
+        mEGLSurface = EGL14.EGL_NO_SURFACE;
+
+        mSurface = null;
+    }
+
+    /**
+     * Makes our EGL context and surface current.
+     */
+    public void makeCurrent() {
+        if (!EGL14.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)) {
+            throw new RuntimeException("eglMakeCurrent failed");
+        }
+    }
+
+    /**
+     * Makes our EGL context and surface not current.
+     */
+    public void makeUnCurrent() {
+        if (!EGL14.eglMakeCurrent(mEGLDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE,
+                EGL14.EGL_NO_CONTEXT)) {
+            throw new RuntimeException("eglMakeCurrent failed");
+        }
+    }
+
+    /**
+     * Calls eglSwapBuffers. Use this to "publish" the current frame.
+     */
+    public boolean swapBuffers() {
+        return EGL14.eglSwapBuffers(mEGLDisplay, mEGLSurface);
+    }
+
+    /**
+     * Returns the Surface that the MediaCodec receives buffers from.
+     */
+    public Surface getSurface() {
+        return mSurface;
+    }
+
+    /**
+     * Queries the surface's width.
+     */
+    public int getWidth() {
+        int[] value = new int[1];
+        EGL14.eglQuerySurface(mEGLDisplay, mEGLSurface, EGL14.EGL_WIDTH, value, 0);
+        return value[0];
+    }
+
+    /**
+     * Queries the surface's height.
+     */
+    public int getHeight() {
+        int[] value = new int[1];
+        EGL14.eglQuerySurface(mEGLDisplay, mEGLSurface, EGL14.EGL_HEIGHT, value, 0);
+        return value[0];
+    }
+
+    /**
+     * Sends the presentation time stamp to EGL. Time is expressed in nanoseconds.
+     */
+    public void setPresentationTime(long nsecs) {
+        EGLExt.eglPresentationTimeANDROID(mEGLDisplay, mEGLSurface, nsecs);
+    }
+
+    /**
+     * Checks for EGL errors.
+     */
+    private void checkEglError(String msg) {
+        int error;
+        if ((error = EGL14.eglGetError()) != EGL14.EGL_SUCCESS) {
+            throw new RuntimeException(msg + ": EGL error: 0x" + Integer.toHexString(error));
+        }
+    }
+}
diff --git a/heifwriter/src/main/java/androidx/media/heifwriter/HeifEncoder.java b/heifwriter/src/main/java/androidx/media/heifwriter/HeifEncoder.java
new file mode 100644
index 0000000..92fcbf4
--- /dev/null
+++ b/heifwriter/src/main/java/androidx/media/heifwriter/HeifEncoder.java
@@ -0,0 +1,832 @@
+/*
+ * Copyright 2018 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.media.heifwriter;
+
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.graphics.SurfaceTexture;
+import android.opengl.GLES20;
+import android.opengl.GLUtils;
+import android.os.Looper;
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.media.Image;
+import android.media.MediaCodec;
+import android.media.MediaCodec.BufferInfo;
+import android.media.MediaCodec.CodecException;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaFormat;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Process;
+import android.util.Log;
+import android.util.Range;
+import android.view.Surface;
+
+import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+
+/**
+ * This class encodes images into HEIF-compatible samples using HEVC encoder.
+ *
+ * It currently supports three input modes: {@link #INPUT_MODE_BUFFER},
+ * {@link #INPUT_MODE_SURFACE}, or {@link #INPUT_MODE_BITMAP}.
+ *
+ * The output format and samples are sent back in {@link
+ * Callback#onOutputFormatChanged(HeifEncoder, MediaFormat)} and {@link
+ * Callback#onDrainOutputBuffer(HeifEncoder, ByteBuffer)}. If the client
+ * requests to use grid, each tile will be sent back individually.
+ *
+ * HeifEncoder is made a separate class from {@link HeifWriter}, as some more
+ * advanced use cases might want to build solutions on top of the HeifEncoder directly.
+ * (eg. mux still images and video tracks into a single container).
+ *
+ * @hide
+ */
+public final class HeifEncoder implements AutoCloseable,
+        SurfaceTexture.OnFrameAvailableListener {
+    private static final String TAG = "HeifEncoder";
+    private static final boolean DEBUG = false;
+
+    private static final int GRID_WIDTH = 512;
+    private static final int GRID_HEIGHT = 512;
+    private static final double MAX_COMPRESS_RATIO = 0.25f;
+    private static final int INPUT_BUFFER_POOL_SIZE = 2;
+
+    private MediaCodec mEncoder;
+
+    private final Callback mCallback;
+    private final HandlerThread mHandlerThread;
+    private final Handler mHandler;
+    private final @InputMode int mInputMode;
+
+    private final int mWidth;
+    private final int mHeight;
+    private final int mGridWidth;
+    private final int mGridHeight;
+    private final int mGridRows;
+    private final int mGridCols;
+    private final int mNumTiles;
+
+    private int mInputIndex;
+    private boolean mInputEOS;
+    private final Rect mSrcRect;
+    private final Rect mDstRect;
+    private ByteBuffer mCurrentBuffer;
+    private final ArrayList<ByteBuffer> mEmptyBuffers = new ArrayList<>();
+    private final ArrayList<ByteBuffer> mFilledBuffers = new ArrayList<>();
+    private final ArrayList<Integer> mCodecInputBuffers = new ArrayList<>();
+
+    // Helper for tracking EOS when surface is used
+    private SurfaceEOSTracker mEOSTracker;
+
+    // Below variables are to handle GL copy from client's surface
+    // to encoder surface when tiles are used.
+    private SurfaceTexture mInputTexture;
+    private Surface mInputSurface;
+    private Surface mEncoderSurface;
+    private EglWindowSurface mEncoderEglSurface;
+    private EglRectBlt mRectBlt;
+    private int mTextureId;
+    private final float[] mTmpMatrix = new float[16];
+
+    public static final int INPUT_MODE_BUFFER = HeifWriter.INPUT_MODE_BUFFER;
+    public static final int INPUT_MODE_SURFACE = HeifWriter.INPUT_MODE_SURFACE;
+    public static final int INPUT_MODE_BITMAP = HeifWriter.INPUT_MODE_BITMAP;
+    @IntDef({
+        INPUT_MODE_BUFFER,
+        INPUT_MODE_SURFACE,
+        INPUT_MODE_BITMAP,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface InputMode {}
+
+    public static abstract class Callback {
+        /**
+         * Called when the output format has changed.
+         *
+         * @param encoder The HeifEncoder object.
+         * @param format The new output format.
+         */
+        public abstract void onOutputFormatChanged(
+                @NonNull HeifEncoder encoder, @NonNull MediaFormat format);
+
+        /**
+         * Called when an output buffer becomes available.
+         *
+         * @param encoder The HeifEncoder object.
+         * @param byteBuffer the available output buffer.
+         */
+        public abstract void onDrainOutputBuffer(
+                @NonNull HeifEncoder encoder, @NonNull ByteBuffer byteBuffer);
+
+        /**
+         * Called when encoding reached the end of stream without error.
+         *
+         * @param encoder The HeifEncoder object.
+         */
+        public abstract void onComplete(@NonNull HeifEncoder encoder);
+
+        /**
+         * Called when encoding hits an error.
+         *
+         * @param encoder The HeifEncoder object.
+         * @param e The exception that the codec reported.
+         */
+        public abstract void onError(@NonNull HeifEncoder encoder, @NonNull CodecException e);
+    }
+
+    /**
+     * Configure the heif encoding session. Should only be called once.
+     *
+     * @param width Width of the image.
+     * @param height Height of the image.
+     * @param useGrid Whether to encode image into tiles. If enabled, tile size will be
+     *                automatically chosen.
+     * @param quality A number between 0 and 100 (inclusive), with 100 indicating the best quality
+     *                supported by this implementation (which often results in larger file size).
+     * @param inputMode The input type of this encoding session.
+     * @param handler If not null, client will receive all callbacks on the handler's looper.
+     *                Otherwise, client will receive callbacks on a looper created by us.
+     * @param cb The callback to receive various messages from the heif encoder.
+     */
+    public HeifEncoder(int width, int height, boolean useGrid,
+                       int quality, @InputMode int inputMode,
+                       @Nullable Handler handler, @NonNull Callback cb) throws IOException {
+        if (DEBUG) Log.d(TAG, "width: " + width + ", height: " + height +
+                ", useGrid: " + useGrid + ", quality: " + quality + ", inputMode: " + inputMode);
+
+        if (width < 0 || height < 0 || quality < 0 || quality > 100) {
+            throw new IllegalArgumentException("invalid encoder inputs");
+        }
+
+        mEncoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_HEVC);
+
+        mWidth = width;
+        mHeight = height;
+
+        if (useGrid) {
+            mGridWidth = GRID_WIDTH;
+            mGridHeight = GRID_HEIGHT;
+            mGridRows = (height + GRID_HEIGHT - 1) / GRID_HEIGHT;
+            mGridCols = (width + GRID_WIDTH - 1) / GRID_WIDTH;
+        } else {
+            mGridWidth = mWidth;
+            mGridHeight = mHeight;
+            mGridRows = 1;
+            mGridCols = 1;
+        }
+
+        mNumTiles = mGridRows * mGridCols;
+
+        mInputMode = inputMode;
+
+        mCallback = cb;
+
+        Looper looper = (handler != null) ? handler.getLooper() : null;
+        if (looper == null) {
+            mHandlerThread = new HandlerThread("HeifEncoderThread",
+                    Process.THREAD_PRIORITY_FOREGROUND);
+            mHandlerThread.start();
+            looper = mHandlerThread.getLooper();
+        } else {
+            mHandlerThread = null;
+        }
+        mHandler = new Handler(looper);
+        boolean useSurfaceInternally =
+                (inputMode == INPUT_MODE_SURFACE) || (inputMode == INPUT_MODE_BITMAP);
+        int colorFormat = useSurfaceInternally ? CodecCapabilities.COLOR_FormatSurface :
+                CodecCapabilities.COLOR_FormatYUV420Flexible;
+
+        // TODO: determine how to set bitrate and framerate, or use constant quality
+        MediaFormat codecFormat = MediaFormat.createVideoFormat(
+                MediaFormat.MIMETYPE_VIDEO_HEVC, mGridWidth, mGridHeight);
+        codecFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 0);
+        codecFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
+
+        MediaCodecInfo.CodecCapabilities caps =
+                mEncoder.getCodecInfo().getCapabilitiesForType(MediaFormat.MIMETYPE_VIDEO_HEVC);
+        MediaCodecInfo.EncoderCapabilities encoderCaps = caps.getEncoderCapabilities();
+
+        codecFormat.setInteger(MediaFormat.KEY_FRAME_RATE, mNumTiles);
+        codecFormat.setInteger(MediaFormat.KEY_CAPTURE_RATE, mNumTiles * 30);
+        if (encoderCaps.isBitrateModeSupported(
+                MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CQ)) {
+            Log.d(TAG, "Setting bitrate mode to constant quality");
+            Range<Integer> qualityRange = encoderCaps.getQualityRange();
+            Log.d(TAG, "Quality range: " + qualityRange);
+            codecFormat.setInteger(MediaFormat.KEY_BITRATE_MODE,
+                    MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CQ);
+            codecFormat.setInteger(MediaFormat.KEY_QUALITY, (int) (qualityRange.getLower() +
+                            (qualityRange.getUpper() - qualityRange.getLower()) * quality / 100.0));
+        } else {
+            if (encoderCaps.isBitrateModeSupported(
+                    MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR)) {
+                Log.d(TAG, "Setting bitrate mode to variable bitrate");
+                codecFormat.setInteger(MediaFormat.KEY_BITRATE_MODE,
+                        MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR);
+            } else { // assume CBR
+                Log.d(TAG, "Setting bitrate mode to constant bitrate");
+                codecFormat.setInteger(MediaFormat.KEY_BITRATE_MODE,
+                        MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR);
+            }
+            // Calculate the bitrate based on image dimension, max compression ratio and quality.
+            // Note that we set the frame rate to the number of tiles, so the bitrate would be the
+            // intended bits for one image.
+            int bitrate = (int) (width * height * 1.5 * 8 * MAX_COMPRESS_RATIO * quality / 100.0f);
+            codecFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
+        }
+
+        mEncoder.setCallback(new EncoderCallback(), mHandler);
+        mEncoder.configure(codecFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
+
+        if (useSurfaceInternally) {
+            mEncoderSurface = mEncoder.createInputSurface();
+
+            boolean useGLCopy = (mNumTiles > 1) || (inputMode == INPUT_MODE_BITMAP);
+            mEOSTracker = new SurfaceEOSTracker(useGLCopy);
+
+            if (useGLCopy) {
+                mEncoderEglSurface = new EglWindowSurface(mEncoderSurface);
+                mEncoderEglSurface.makeCurrent();
+
+                mRectBlt = new EglRectBlt(
+                        new Texture2dProgram((inputMode == INPUT_MODE_BITMAP) ?
+                                Texture2dProgram.TEXTURE_2D :
+                                Texture2dProgram.TEXTURE_EXT),
+                        mWidth, mHeight);
+
+                mTextureId = mRectBlt.createTextureObject();
+
+                if (inputMode == INPUT_MODE_SURFACE) {
+                    // use single buffer mode to block on input
+                    mInputTexture = new SurfaceTexture(mTextureId, true);
+                    mInputTexture.setOnFrameAvailableListener(this);
+                    mInputTexture.setDefaultBufferSize(mWidth, mHeight);
+                    mInputSurface = new Surface(mInputTexture);
+                }
+
+                // make uncurrent since the onFrameAvailable could be called on arbituray thread.
+                // making the context current on a different thread will cause error.
+                mEncoderEglSurface.makeUnCurrent();
+            } else {
+                mInputSurface = mEncoderSurface;
+            }
+        } else {
+            for (int i = 0; i < INPUT_BUFFER_POOL_SIZE; i++) {
+                mEmptyBuffers.add(ByteBuffer.allocateDirect(mWidth * mHeight * 3 / 2));
+            }
+        }
+
+        mDstRect = new Rect(0, 0, mGridWidth, mGridHeight);
+        mSrcRect = new Rect();
+    }
+
+    @Override
+    public void onFrameAvailable(SurfaceTexture surfaceTexture) {
+        mEncoderEglSurface.makeCurrent();
+
+        surfaceTexture.updateTexImage();
+        surfaceTexture.getTransformMatrix(mTmpMatrix);
+
+        long timestampNs = surfaceTexture.getTimestamp();
+
+        if (DEBUG) Log.d(TAG, "onFrameAvailable: timestampUs " + (timestampNs / 1000));
+
+        boolean takeFrame = mEOSTracker.updateLastInputAndEncoderTime(timestampNs,
+                computePresentationTime(mInputIndex + mNumTiles - 1));
+
+        if (takeFrame) {
+            copyTilesGL(mTmpMatrix);
+        }
+
+        surfaceTexture.releaseTexImage();
+
+        // make uncurrent since the onFrameAvailable could be called on arbituray thread.
+        // making the context current on a different thread will cause error.
+        mEncoderEglSurface.makeUnCurrent();
+    }
+
+    /**
+     * Start the encoding process.
+     */
+    public void start() {
+        mEncoder.start();
+    }
+
+    /**
+     * Add one YUV buffer to be encoded. This might block if the encoder can't process the input
+     * buffers fast enough.
+     *
+     * After the call returns, the client can reuse the data array.
+     *
+     * @param format The YUV format as defined in {@link android.graphics.ImageFormat}, currently
+     *               only support YUV_420_888.
+     *
+     * @param data byte array containing the YUV data. If the format has more than one planes,
+     *             they must be concatenated.
+     */
+    public void addYuvBuffer(int format, @NonNull byte[] data) {
+        if (mInputMode != INPUT_MODE_BUFFER) {
+            throw new IllegalStateException(
+                    "addYuvBuffer is only allowed in buffer input mode");
+        }
+        if (data == null || data.length != mWidth * mHeight * 3 / 2) {
+            throw new IllegalArgumentException("invalid data");
+        }
+        addYuvBufferInternal(data);
+    }
+
+    /**
+     * Retrieves the input surface for encoding.
+     *
+     * Will only return valid value if configured to use surface input.
+     */
+    public @NonNull Surface getInputSurface() {
+        if (mInputMode != INPUT_MODE_SURFACE) {
+            throw new IllegalStateException(
+                    "getInputSurface is only allowed in surface input mode");
+        }
+        return mInputSurface;
+    }
+
+    /**
+     * Sets the timestamp (in nano seconds) of the last input frame to encode. Frames with
+     * timestamps larger than the specified value will not be encoded. However, if a frame
+     * already started encoding when this is set, all tiles within that frame will be encoded.
+     *
+     * This method only applies when surface is used.
+     */
+    public void setEndOfInputStreamTimestamp(long timestampNs) {
+        if (mInputMode != INPUT_MODE_SURFACE) {
+            throw new IllegalStateException(
+                    "setEndOfInputStreamTimestamp is only allowed in surface input mode");
+        }
+        if (mEOSTracker != null) {
+            mEOSTracker.updateInputEOSTime(timestampNs);
+        }
+    }
+
+    /**
+     * Adds one bitmap to be encoded.
+     */
+    public void addBitmap(@NonNull Bitmap bitmap) {
+        if (mInputMode != INPUT_MODE_BITMAP) {
+            throw new IllegalStateException("addBitmap is only allowed in bitmap input mode");
+        }
+
+        boolean takeFrame = mEOSTracker.updateLastInputAndEncoderTime(
+                computePresentationTime(mInputIndex),
+                computePresentationTime(mInputIndex + mNumTiles - 1));
+
+        if (takeFrame) {
+            mEncoderEglSurface.makeCurrent();
+
+            // load the bitmap to texture
+            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureId);
+            GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
+
+            copyTilesGL(Texture2dProgram.V_FLIP_MATRIX);
+
+            // make uncurrent since the onFrameAvailable could be called on arbituray thread.
+            // making the context current on a different thread will cause error.
+            mEncoderEglSurface.makeUnCurrent();
+        }
+    }
+
+    /**
+     * Sends input EOS to the encoder. Result will be notified asynchronously via
+     * {@link Callback#onComplete(HeifEncoder)} if encoder reaches EOS without error, or
+     * {@link Callback#onError(HeifEncoder, CodecException)} otherwise.
+     */
+    public void stopAsync() {
+        if (mInputMode == INPUT_MODE_BITMAP) {
+            // here we simply set the EOS timestamp to 0, so that the cut off will be the last
+            // bitmap ever added.
+            mEOSTracker.updateInputEOSTime(0);
+        } else if (mInputMode == INPUT_MODE_BUFFER) {
+            addYuvBufferInternal(null);
+        }
+    }
+
+    /**
+     * Generates the presentation time for input frame N, in microseconds.
+     * The timestamp advances 1 sec for every whole frame.
+     */
+    private long computePresentationTime(int frameIndex) {
+        return 132 + (long)frameIndex * 1000000 / mNumTiles;
+    }
+
+    /**
+     * Obtains one empty input buffer and copies the data into it. Before input
+     * EOS is sent, this would block until the data is copied. After input EOS
+     * is sent, this would return immediately.
+     */
+    private void addYuvBufferInternal(@Nullable byte[] data) {
+        ByteBuffer buffer = acquireEmptyBuffer();
+        if (buffer == null) {
+            return;
+        }
+        buffer.clear();
+        if (data != null) {
+            buffer.put(data);
+        }
+        buffer.flip();
+        synchronized (mFilledBuffers) {
+            mFilledBuffers.add(buffer);
+        }
+        mHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                maybeCopyOneTileYUV();
+            }
+        });
+    }
+
+    /**
+     * Routine to copy one tile if we have both input and codec buffer available.
+     *
+     * Must be called on the handler looper that also handles the MediaCodec callback.
+     */
+    private void maybeCopyOneTileYUV() {
+        ByteBuffer currentBuffer;
+        while ((currentBuffer = getCurrentBuffer()) != null && !mCodecInputBuffers.isEmpty()) {
+            int index = mCodecInputBuffers.remove(0);
+
+            // 0-length input means EOS.
+            boolean inputEOS = (mInputIndex % mNumTiles == 0) && (currentBuffer.remaining() == 0);
+
+            if (!inputEOS) {
+                Image image = mEncoder.getInputImage(index);
+                int left = mGridWidth * (mInputIndex % mGridCols);
+                int top = mGridHeight * (mInputIndex / mGridCols % mGridRows);
+                mSrcRect.set(left, top, left + mGridWidth, top + mGridHeight);
+                copyOneTileYUV(currentBuffer, image, mWidth, mHeight, mSrcRect, mDstRect);
+            }
+
+            mEncoder.queueInputBuffer(index, 0,
+                    inputEOS ? 0 : mEncoder.getInputBuffer(index).capacity(),
+                    computePresentationTime(mInputIndex++),
+                    inputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+
+            if (inputEOS || mInputIndex % mNumTiles == 0) {
+                returnEmptyBufferAndNotify(inputEOS);
+            }
+        }
+    }
+
+    /**
+     * Copies from a rect from src buffer to dst image.
+     * TOOD: This will be replaced by JNI.
+     */
+    private static void copyOneTileYUV(
+            ByteBuffer srcBuffer, Image dstImage,
+            int srcWidth, int srcHeight,
+            Rect srcRect, Rect dstRect) {
+        if (srcRect.width() != dstRect.width() || srcRect.height() != dstRect.height()) {
+            throw new IllegalArgumentException("src and dst rect size are different!");
+        }
+        if (srcWidth % 2 != 0      || srcHeight % 2 != 0      ||
+                srcRect.left % 2 != 0  || srcRect.top % 2 != 0    ||
+                srcRect.right % 2 != 0 || srcRect.bottom % 2 != 0 ||
+                dstRect.left % 2 != 0  || dstRect.top % 2 != 0    ||
+                dstRect.right % 2 != 0 || dstRect.bottom % 2 != 0) {
+            throw new IllegalArgumentException("src or dst are not aligned!");
+        }
+
+        Image.Plane[] planes = dstImage.getPlanes();
+        for (int n = 0; n < planes.length; n++) {
+            ByteBuffer dstBuffer = planes[n].getBuffer();
+            int colStride = planes[n].getPixelStride();
+            int copyWidth = Math.min(srcRect.width(), srcWidth - srcRect.left);
+            int copyHeight = Math.min(srcRect.height(), srcHeight - srcRect.top);
+            int srcPlanePos = 0, div = 1;
+            if (n > 0) {
+                div = 2;
+                srcPlanePos = srcWidth * srcHeight * (n + 3) / 4;
+            }
+            for (int i = 0; i < copyHeight / div; i++) {
+                srcBuffer.position(srcPlanePos +
+                        (i + srcRect.top / div) * srcWidth / div + srcRect.left / div);
+                dstBuffer.position((i + dstRect.top / div) * planes[n].getRowStride()
+                        + dstRect.left * colStride / div);
+
+                for (int j = 0; j < copyWidth / div; j++) {
+                    dstBuffer.put(srcBuffer.get());
+                    if (colStride > 1 && j != copyWidth / div - 1) {
+                        dstBuffer.position(dstBuffer.position() + colStride - 1);
+                    }
+                }
+            }
+        }
+    }
+
+    private ByteBuffer acquireEmptyBuffer() {
+        synchronized (mEmptyBuffers) {
+            // wait for an empty input buffer first
+            while (!mInputEOS && mEmptyBuffers.isEmpty()) {
+                try {
+                    mEmptyBuffers.wait();
+                } catch (InterruptedException e) {}
+            }
+
+            // if already EOS, return null to stop further encoding.
+            return mInputEOS ? null : mEmptyBuffers.remove(0);
+        }
+    }
+
+    /**
+     * Routine to get the current input buffer to copy from.
+     * Only called on callback handler thread.
+     */
+    private ByteBuffer getCurrentBuffer() {
+        if (!mInputEOS && mCurrentBuffer == null) {
+            synchronized (mFilledBuffers) {
+                mCurrentBuffer = mFilledBuffers.isEmpty() ?
+                        null : mFilledBuffers.remove(0);
+            }
+        }
+        return mInputEOS ? null : mCurrentBuffer;
+    }
+
+    /**
+     * Routine to put the consumed input buffer back into the empty buffer pool.
+     * Only called on callback handler thread.
+     */
+    private void returnEmptyBufferAndNotify(boolean inputEOS) {
+        synchronized (mEmptyBuffers) {
+            mInputEOS |= inputEOS;
+            mEmptyBuffers.add(mCurrentBuffer);
+            mEmptyBuffers.notifyAll();
+        }
+        mCurrentBuffer = null;
+    }
+
+    /**
+     * Copies from source frame to encoder inputs using GL. The source could be either
+     * client's input surface, or the input bitmap loaded to texture.
+     *
+     * @param texMatrix The texture matrix to use. See the shader program in
+     * {@link Texture2dProgram} as well as {@link SurfaceTexture} for more details.
+     */
+    private void copyTilesGL(float[] texMatrix) {
+        GLES20.glViewport(0, 0, mGridWidth, mGridHeight);
+
+        for (int row = 0; row < mGridRows; row++) {
+            for (int col = 0; col < mGridCols; col++) {
+                int left = col * mGridWidth;
+                int top = row * mGridHeight;
+                mSrcRect.set(left, top, left + mGridWidth, top + mGridHeight);
+                mRectBlt.copyRect(mTextureId, texMatrix, mSrcRect);
+                mEncoderEglSurface.setPresentationTime(1000 * computePresentationTime(mInputIndex++));
+                mEncoderEglSurface.swapBuffers();
+            }
+        }
+    }
+
+    /**
+     * Routine to release all resources. Must be run on the same looper that
+     * handles the MediaCodec callbacks.
+     */
+    private void stopInternal() {
+        if (DEBUG) Log.d(TAG, "stopInternal");
+
+        if (mEncoder != null) {
+            mEncoder.stop();
+            mEncoder.release();
+            mEncoder = null;
+        }
+
+        // unblock the addBuffer() if we're tearing down before EOS is sent.
+        synchronized (mEmptyBuffers) {
+            mInputEOS = true;
+            mEmptyBuffers.notifyAll();
+        }
+
+        if (mRectBlt != null) {
+            mRectBlt.release(false);
+            mRectBlt = null;
+        }
+        if (mEncoderEglSurface != null)  {
+            // Note that this frees mEncoderSurface too. If mEncoderEglSurface is not
+            // there, client is responsible to release the input surface it got from us,
+            // we don't release mEncoderSurface here.
+            mEncoderEglSurface.release();
+            mEncoderEglSurface = null;
+        }
+        if (mInputTexture != null) {
+            mInputTexture.release();
+            mInputTexture = null;
+        }
+    }
+
+    /**
+     * This class handles EOS for surface or bitmap inputs.
+     *
+     * When encoding from surface or bitmap, we can't call {@link MediaCodec#signalEndOfInputStream()}
+     * immediately after input is drawn, since this could drop all pending frames in the
+     * buffer queue. When there are tiles, this could leave us a partially encoded image.
+     *
+     * So here we track the EOS status by timestamps, and only signal EOS to the encoder
+     * when we collected all images we need.
+     *
+     * Since this is updated from multiple threads ({@link #setEndOfInputStreamTimestamp(long)},
+     * {@link EncoderCallback#onOutputBufferAvailable(MediaCodec, int, BufferInfo)},
+     * {@link #addBitmap(Bitmap)} and {@link #onFrameAvailable(SurfaceTexture)}), it must be fully
+     * synchronized.
+     *
+     * Note that when buffer input is used, the EOS flag is set in
+     * {@link EncoderCallback#onInputBufferAvailable(MediaCodec, int)} and this class is not used.
+     */
+    private class SurfaceEOSTracker {
+        private static final boolean DEBUG_EOS = false;
+
+        final boolean mUseGLCopy;
+        long mInputEOSTimeNs = -1;
+        long mLastInputTimeNs = -1;
+        long mEncoderEOSTimeUs = -1;
+        long mLastEncoderTimeUs = -1;
+        long mLastOutputTimeUs = -1;
+        boolean mSignaled;
+
+        SurfaceEOSTracker(boolean useGLCopy) {
+            mUseGLCopy = useGLCopy;
+        }
+
+        synchronized void updateInputEOSTime(long timestampNs) {
+            if (DEBUG_EOS) Log.d(TAG, "updateInputEOSTime: " + timestampNs);
+
+            if (mUseGLCopy) {
+                if (mInputEOSTimeNs < 0) {
+                    mInputEOSTimeNs = timestampNs;
+                }
+            } else {
+                if (mEncoderEOSTimeUs < 0) {
+                    mEncoderEOSTimeUs = timestampNs / 1000;
+                }
+            }
+            updateEOSLocked();
+        }
+
+        synchronized boolean updateLastInputAndEncoderTime(long inputTimeNs, long encoderTimeUs) {
+            if (DEBUG_EOS) Log.d(TAG,
+                    "updateLastInputAndEncoderTime: " + inputTimeNs + ", " + encoderTimeUs);
+
+            boolean shouldTakeFrame = mInputEOSTimeNs < 0 || inputTimeNs <= mInputEOSTimeNs;
+            if (shouldTakeFrame) {
+                mLastEncoderTimeUs = encoderTimeUs;
+            }
+            mLastInputTimeNs = inputTimeNs;
+            updateEOSLocked();
+            return shouldTakeFrame;
+        }
+
+        synchronized void updateLastOutputTime(long outputTimeUs) {
+            if (DEBUG_EOS) Log.d(TAG, "updateLastOutputTime: " + outputTimeUs);
+
+            mLastOutputTimeUs = outputTimeUs;
+            updateEOSLocked();
+        }
+
+        private void updateEOSLocked() {
+            if (mSignaled) {
+                return;
+            }
+            if (mEncoderEOSTimeUs < 0) {
+                if (mInputEOSTimeNs >= 0 && mLastInputTimeNs >= mInputEOSTimeNs) {
+                    if (mLastEncoderTimeUs < 0) {
+                        doSignalEOSLocked();
+                        return;
+                    }
+                    // mEncoderEOSTimeUs tracks the timestamp of the last output buffer we
+                    // will wait for. When that buffer arrives, encoder will be signalled EOS.
+                    mEncoderEOSTimeUs = mLastEncoderTimeUs;
+                    if (DEBUG_EOS) Log.d(TAG,
+                            "updateEOSLocked: mEncoderEOSTimeUs " + mEncoderEOSTimeUs);
+                }
+            }
+            if (mEncoderEOSTimeUs >= 0 && mEncoderEOSTimeUs <= mLastOutputTimeUs) {
+                doSignalEOSLocked();
+            }
+        }
+
+        private void doSignalEOSLocked() {
+            if (DEBUG_EOS) Log.d(TAG, "doSignalEOSLocked");
+
+            mEncoder.signalEndOfInputStream();
+            mSignaled = true;
+        }
+    }
+
+    /**
+     * MediaCodec callback for HEVC encoding.
+     */
+    private class EncoderCallback extends MediaCodec.Callback {
+        private boolean mOutputEOS;
+
+        @Override
+        public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {
+            if (codec != mEncoder) return;
+
+            if (DEBUG) Log.d(TAG, "onOutputFormatChanged: " + format);
+
+            format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_IMAGE_ANDROID_HEIC);
+            format.setInteger(MediaFormat.KEY_WIDTH, mWidth);
+            format.setInteger(MediaFormat.KEY_HEIGHT, mHeight);
+
+            if (mNumTiles > 1) {
+                format.setInteger(MediaFormat.KEY_GRID_WIDTH, mGridWidth);
+                format.setInteger(MediaFormat.KEY_GRID_HEIGHT, mGridHeight);
+                format.setInteger(MediaFormat.KEY_GRID_ROWS, mGridRows);
+                format.setInteger(MediaFormat.KEY_GRID_COLS, mGridCols);
+            }
+
+            mCallback.onOutputFormatChanged(HeifEncoder.this, format);
+        }
+
+        @Override
+        public void onInputBufferAvailable(MediaCodec codec, int index) {
+            if (codec != mEncoder || mInputEOS) return;
+
+            if (DEBUG) Log.d(TAG, "onInputBufferAvailable: " + index);
+            mCodecInputBuffers.add(index);
+            maybeCopyOneTileYUV();
+        }
+
+        @Override
+        public void onOutputBufferAvailable(MediaCodec codec, int index, BufferInfo info) {
+            if (codec != mEncoder || mOutputEOS) return;
+
+            if (DEBUG) Log.d(TAG, "onInputBufferAvailable: " + index + ", time "
+                    + info.presentationTimeUs + ", size " + info.size + ", flags " + info.flags);
+
+            if ((info.size > 0) && ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) == 0)) {
+                ByteBuffer outputBuffer = codec.getOutputBuffer(index);
+
+                // reset position as addBuffer() modifies it
+                outputBuffer.position(info.offset);
+                outputBuffer.limit(info.offset + info.size);
+
+                if (mEOSTracker != null) {
+                    mEOSTracker.updateLastOutputTime(info.presentationTimeUs);
+                }
+
+                mCallback.onDrainOutputBuffer(HeifEncoder.this, outputBuffer);
+            }
+
+            mOutputEOS |= ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0);
+
+            codec.releaseOutputBuffer(index, false);
+
+            if (mOutputEOS) {
+                stopAndNotify(null);
+            }
+        }
+
+        @Override
+        public void onError(MediaCodec codec, CodecException e) {
+            if (codec != mEncoder) return;
+
+            Log.e(TAG, "onError: " + e);
+            stopAndNotify(e);
+        }
+
+        private void stopAndNotify(@Nullable CodecException e) {
+            stopInternal();
+            if (e == null) {
+                mCallback.onComplete(HeifEncoder.this);
+            } else {
+                mCallback.onError(HeifEncoder.this, e);
+            }
+        }
+    }
+
+    @Override
+    public void close() {
+        mHandler.postAtFrontOfQueue(new Runnable() {
+            @Override
+            public void run() {
+                stopInternal();
+            }
+        });
+    }
+}
\ No newline at end of file
diff --git a/heifwriter/src/main/java/androidx/media/heifwriter/HeifWriter.java b/heifwriter/src/main/java/androidx/media/heifwriter/HeifWriter.java
new file mode 100644
index 0000000..b9c1959
--- /dev/null
+++ b/heifwriter/src/main/java/androidx/media/heifwriter/HeifWriter.java
@@ -0,0 +1,521 @@
+/*
+ * Copyright 2018 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.media.heifwriter;
+
+import android.annotation.SuppressLint;
+import android.graphics.Bitmap;
+import android.media.MediaCodec;
+import android.media.MediaFormat;
+import android.media.MediaMuxer;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Process;
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.util.Log;
+import android.view.Surface;
+
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.nio.ByteBuffer;
+import java.util.concurrent.TimeoutException;
+
+import static android.media.MediaMuxer.OutputFormat.MUXER_OUTPUT_HEIF;
+
+/**
+ * This class writes one or more still images (of the same dimensions) into
+ * a heif file.
+ *
+ * It currently supports three input modes: {@link #INPUT_MODE_BUFFER},
+ * {@link #INPUT_MODE_SURFACE}, or {@link #INPUT_MODE_BITMAP}.
+ *
+ * The general sequence (in pseudo-code) to write a heif file using this class is as follows:
+ *
+ * 1) Construct the writer:
+ * HeifWriter heifwriter = new HeifWriter(...);
+ *
+ * 2) If using surface input mode, obtain the input surface:
+ * Surface surface = heifwriter.getInputSurface();
+ *
+ * 3) Call start:
+ * heifwriter.start();
+ *
+ * 4) Depending on the chosen input mode, add one or more images using one of these methods:
+ * heifwriter.addYuvBuffer(...);   Or
+ * heifwriter.addBitmap(...);   Or
+ * render to the previously obtained surface
+ *
+ * 5) Call stop:
+ * heifwriter.stop(...);
+ *
+ * 6) Close the writer:
+ * heifwriter.close();
+ *
+ * Please refer to the documentations on individual methods for the exact usage.
+ */
+public final class HeifWriter implements AutoCloseable {
+    private static final String TAG = "HeifWriter";
+    private static final boolean DEBUG = false;
+
+    private final @InputMode int mInputMode;
+    private final HandlerThread mHandlerThread;
+    private final Handler mHandler;
+    private int mNumTiles;
+    private final int mNumImages;
+    private final int mPrimaryIndex;
+    private final ResultWaiter mResultWaiter = new ResultWaiter();
+
+    private MediaMuxer mMuxer;
+    private HeifEncoder mHeifEncoder;
+    private int[] mTrackIndexArray;
+    private int mOutputIndex;
+    private boolean mStarted;
+
+    /**
+     * The input mode where the client adds input buffers with YUV data.
+     *
+     * @see #addYuvBuffer(int, byte[])
+     */
+    public static final int INPUT_MODE_BUFFER = 0;
+
+    /**
+     * The input mode where the client renders the images to an input Surface
+     * created by the writer.
+     *
+     * @see #getInputSurface()
+     */
+    public static final int INPUT_MODE_SURFACE = 1;
+
+    /**
+     * The input mode where the client adds bitmaps.
+     *
+     * @see #addBitmap(Bitmap)
+     */
+    public static final int INPUT_MODE_BITMAP = 2;
+
+    /** @hide */
+    @IntDef({
+            INPUT_MODE_BUFFER, INPUT_MODE_SURFACE, INPUT_MODE_BITMAP,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface InputMode {}
+
+    /**
+     * Construct a heif writer that writes to a file specified by its path.
+     *
+     * @param path Path of the file to be written.
+     * @param width Width of the image.
+     * @param height Height of the image.
+     * @param useGrid Whether to encode image into tiles. If enabled, the tile size will be
+     *                automatically chosen.
+     * @param quality A number between 0 and 100 (inclusive), with 100 indicating the best quality
+     *                supported by this implementation (which often results in larger file size).
+     * @param numImages Max number of images to write. Frames exceeding this number will not be
+     *                  written to file. The writing can be stopped earlier before this number of
+     *                  images are written by {@link #stop(long)}, except for the input mode of
+     *                  {@link #INPUT_MODE_SURFACE}, where the EOS timestamp must be specified (via
+     *                 {@link #setInputEndOfStreamTimestamp(long)} and reached.
+     * @param primaryIndex Index of the image that should be marked as primary, must be within range
+     *                     [0, numImages - 1] inclusive.
+     * @param inputMode Input mode for this writer, must be one of {@link #INPUT_MODE_BUFFER},
+     *                  {@link #INPUT_MODE_SURFACE}, or {@link #INPUT_MODE_BITMAP}.
+     * @param handler If not null, client will receive all callbacks on the handler's looper.
+     *                Otherwise, client will receive callbacks on a looper created by the writer.
+     *
+     * @throws IOException if failed to construct MediaMuxer or HeifEncoder.
+     */
+    @SuppressLint("WrongConstant")
+    public HeifWriter(@NonNull String path,
+                      int width, int height, boolean useGrid,
+                      int quality, int numImages, int primaryIndex,
+                      @InputMode int inputMode,
+                      @Nullable Handler handler) throws IOException {
+        this(width, height, useGrid, quality, numImages, primaryIndex, inputMode, handler,
+                new MediaMuxer(path, MUXER_OUTPUT_HEIF));
+    }
+
+    /**
+     * Construct a heif writer that writes to a file specified by file descriptor.
+     *
+     * @param fd File descriptor of the file to be written.
+     * @param width Width of the image.
+     * @param height Height of the image.
+     * @param useGrid Whether to encode image into tiles. If enabled, the tile size will be
+     *                automatically chosen.
+     * @param quality A number between 0 and 100 (inclusive), with 100 indicating the best quality
+     *                supported by this implementation (which often results in larger file size).
+     * @param numImages Max number of images to write. Frames exceeding this number will not be
+     *                  written to file. The writing can be stopped earlier before this number of
+     *                  images are written by {@link #stop(long)}, except for the input mode of
+     *                  {@link #INPUT_MODE_SURFACE}, where the EOS timestamp must be specified (via
+     *                 {@link #setInputEndOfStreamTimestamp(long)} and reached.
+     * @param primaryIndex Index of the image that should be marked as primary, must be within range
+     *                     [0, numImages - 1] inclusive.
+     * @param inputMode Input mode for this writer, must be one of {@link #INPUT_MODE_BUFFER},
+     *                  {@link #INPUT_MODE_SURFACE}, or {@link #INPUT_MODE_BITMAP}.
+     * @param handler If not null, client will receive all callbacks on the handler's looper.
+     *                Otherwise, client will receive callbacks on a looper created by the writer.
+     *
+     * @throws IOException if failed to construct MediaMuxer or HeifEncoder.
+     */
+    @SuppressLint("WrongConstant")
+    public HeifWriter(@NonNull FileDescriptor fd,
+                      int width, int height, boolean useGrid,
+                      int quality, int numImages, int primaryIndex,
+                      @InputMode int inputMode,
+                      @Nullable Handler handler) throws IOException {
+        this(width, height, useGrid, quality, numImages, primaryIndex, inputMode, handler,
+                new MediaMuxer(fd, MUXER_OUTPUT_HEIF));
+    }
+
+    private HeifWriter(int width, int height, boolean useGrid,
+                       int quality, int numImages, int primaryIndex,
+                       @InputMode int inputMode,
+                       @Nullable Handler handler,
+                       @NonNull MediaMuxer muxer) throws IOException {
+        if (numImages <= 0 || primaryIndex < 0 || primaryIndex >= numImages) {
+            throw new IllegalArgumentException(
+                    "Invalid numImages (" + numImages + ") or primaryIndex (" + primaryIndex + ")");
+        }
+
+        MediaFormat format = MediaFormat.createVideoFormat(
+                MediaFormat.MIMETYPE_IMAGE_ANDROID_HEIC, width, height);
+
+        if (DEBUG) {
+            Log.d(TAG, "format: " + format + ", inputMode: " + inputMode +
+                    ", numImage: " + numImages + ", primaryIndex: " + primaryIndex);
+        }
+
+        // set to 1 initially, and wait for output format to know for sure
+        mNumTiles = 1;
+
+        mInputMode = inputMode;
+        mNumImages = numImages;
+        mPrimaryIndex = primaryIndex;
+
+        Looper looper = (handler != null) ? handler.getLooper() : null;
+        if (looper == null) {
+            mHandlerThread = new HandlerThread("HeifEncoderThread",
+                    Process.THREAD_PRIORITY_FOREGROUND);
+            mHandlerThread.start();
+            looper = mHandlerThread.getLooper();
+        } else {
+            mHandlerThread = null;
+        }
+        mHandler = new Handler(looper);
+
+        mMuxer = muxer;
+
+        mHeifEncoder = new HeifEncoder(width, height, useGrid, quality,
+                mInputMode, mHandler, new HeifCallback());
+    }
+
+    /**
+     * Start the heif writer. Can only be called once.
+     *
+     * @throws IllegalStateException if called more than once.
+     */
+    public void start() {
+        checkStarted(false);
+        mStarted = true;
+        mHeifEncoder.start();
+    }
+
+    /**
+     * Add one YUV buffer to the heif file.
+     *
+     * @param format The YUV format as defined in {@link android.graphics.ImageFormat}, currently
+     *               only support YUV_420_888.
+     *
+     * @param data byte array containing the YUV data. If the format has more than one planes,
+     *             they must be concatenated.
+     *
+     * @throws IllegalStateException if not started or not configured to use buffer input.
+     */
+    public void addYuvBuffer(int format, @NonNull byte[] data) {
+        checkStartedAndMode(INPUT_MODE_BUFFER);
+        mHeifEncoder.addYuvBuffer(format, data);
+    }
+
+    /**
+     * Retrieves the input surface for encoding.
+     *
+     * @return the input surface if configured to use surface input.
+     *
+     * @throws IllegalStateException if called after start or not configured to use surface input.
+     */
+    public @NonNull Surface getInputSurface() {
+        checkStarted(false);
+        checkMode(INPUT_MODE_SURFACE);
+        return mHeifEncoder.getInputSurface();
+    }
+
+    /**
+     * Set the timestamp (in nano seconds) of the last input frame to encode.
+     *
+     * This call is only valid for surface input. Client can use this to stop the heif writer
+     * earlier before the maximum number of images are written. If not called, the writer will
+     * only stop when the maximum number of images are written.
+     *
+     * @param timestampNs timestamp (in nano seconds) of the last frame that will be written to the
+     *                    heif file. Frames with timestamps larger than the specified value will not
+     *                    be written. However, if a frame already started encoding when this is set,
+     *                    all tiles within that frame will be encoded.
+     *
+     * @throws IllegalStateException if not started or not configured to use surface input.
+     */
+    public void setInputEndOfStreamTimestamp(long timestampNs) {
+        checkStartedAndMode(INPUT_MODE_SURFACE);
+        mHeifEncoder.setEndOfInputStreamTimestamp(timestampNs);
+    }
+
+    /**
+     * Add one bitmap to the heif file.
+     *
+     * @param bitmap the bitmap to be added to the file.
+     * @throws IllegalStateException if not started or not configured to use bitmap input.
+     */
+    public void addBitmap(@NonNull Bitmap bitmap) {
+        checkStartedAndMode(INPUT_MODE_BITMAP);
+        mHeifEncoder.addBitmap(bitmap);
+    }
+
+    /**
+     * Stop the heif writer synchronously. Throws exception if the writer didn't finish writing
+     * successfully. Upon a success return:
+     *
+     * - For buffer and bitmap inputs, all images sent before stop will be written.
+     *
+     * - For surface input, images with timestamp on or before that specified in
+     *   {@link #setInputEndOfStreamTimestamp(long)} will be written. In case where
+     *   {@link #setInputEndOfStreamTimestamp(long)} was never called, stop will block
+     *   until maximum number of images are received.
+     *
+     * @param timeoutMs Maximum time (in microsec) to wait for the writer to complete, with zero
+     *                  indicating waiting indefinitely.
+     * @see #setInputEndOfStreamTimestamp(long)
+     * @throws Exception if encountered error, in which case the output file may not be valid. In
+     *                   particular, {@link TimeoutException} is thrown when timed out, and {@link
+     *                   MediaCodec.CodecException} is thrown when encountered codec error.
+     */
+    public void stop(long timeoutMs) throws Exception {
+        checkStarted(true);
+        mHeifEncoder.stopAsync();
+        mResultWaiter.waitForResult(timeoutMs);
+    }
+
+    private void checkStarted(boolean requiredStarted) {
+        if (mStarted != requiredStarted) {
+            throw new IllegalStateException("Already started");
+        }
+    }
+
+    private void checkMode(@InputMode int requiredMode) {
+        if (mInputMode != requiredMode) {
+            throw new IllegalStateException("Not valid in input mode " + mInputMode);
+        }
+    }
+
+    private void checkStartedAndMode(@InputMode int requiredMode) {
+        checkStarted(true);
+        checkMode(requiredMode);
+    }
+
+    /**
+     * Routine to stop and release writer, must be called on the same looper
+     * that receives heif encoder callbacks.
+     */
+    private void closeInternal() {
+        if (DEBUG) Log.d(TAG, "closeInternal");
+
+        if (mMuxer != null) {
+            mMuxer.stop();
+            mMuxer.release();
+            mMuxer = null;
+        }
+
+        if (mHeifEncoder != null) {
+            mHeifEncoder.close();
+            mHeifEncoder = null;
+        }
+    }
+
+    /**
+     * Callback from the heif encoder.
+     */
+    private class HeifCallback extends HeifEncoder.Callback {
+        /**
+         * Upon receiving output format from the encoder, add the requested number of
+         * image tracks to the muxer and start the muxer.
+         */
+        @Override
+        public void onOutputFormatChanged(
+                @NonNull HeifEncoder encoder, @NonNull MediaFormat format) {
+            if (encoder != mHeifEncoder) return;
+
+            if (DEBUG) {
+                Log.d(TAG, "onOutputFormatChanged: " + format);
+            }
+            if (mTrackIndexArray != null) {
+                stopAndNotify(new IllegalStateException(
+                        "Output format changed after muxer started"));
+                return;
+            }
+
+            try {
+                int gridRows = format.getInteger(MediaFormat.KEY_GRID_ROWS);
+                int gridCols = format.getInteger(MediaFormat.KEY_GRID_COLS);
+                mNumTiles = gridRows * gridCols;
+            } catch (NullPointerException | ClassCastException  e) {
+                mNumTiles = 1;
+            }
+
+            // add mNumImages image tracks of the same format
+            mTrackIndexArray = new int[mNumImages];
+            for (int i = 0; i < mTrackIndexArray.length; i++) {
+                // mark primary
+                if (i == mPrimaryIndex) {
+                    format.setInteger(MediaFormat.KEY_IS_DEFAULT, 1);
+                }
+                mTrackIndexArray[i] = mMuxer.addTrack(format);
+            }
+            mMuxer.start();
+        }
+
+        /**
+         * Upon receiving an output buffer from the encoder (which is one image when
+         * grid is not used, or one tile if grid is used), add that sample to the muxer.
+         */
+        @Override
+        public void onDrainOutputBuffer(
+                @NonNull HeifEncoder encoder, @NonNull ByteBuffer byteBuffer) {
+            if (encoder != mHeifEncoder) return;
+
+            if (DEBUG) {
+                Log.d(TAG, "onDrainOutputBuffer: " + mOutputIndex);
+            }
+            if (mTrackIndexArray == null) {
+                stopAndNotify(new IllegalStateException(
+                        "Output buffer received before format info"));
+                return;
+            }
+
+            if (mOutputIndex < mNumImages * mNumTiles) {
+                MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
+                info.set(byteBuffer.position(), byteBuffer.remaining(), 0, 0);
+                mMuxer.writeSampleData(
+                        mTrackIndexArray[mOutputIndex / mNumTiles], byteBuffer, info);
+            }
+
+            mOutputIndex++;
+
+            // post EOS if reached max number of images allowed.
+            if (mOutputIndex == mNumImages * mNumTiles) {
+                stopAndNotify(null);
+            }
+        }
+
+        @Override
+        public void onComplete(@NonNull HeifEncoder encoder) {
+            if (encoder != mHeifEncoder) return;
+
+            stopAndNotify(null);
+        }
+
+        @Override
+        public void onError(@NonNull HeifEncoder encoder, @NonNull MediaCodec.CodecException e) {
+            if (encoder != mHeifEncoder) return;
+
+            stopAndNotify(e);
+        }
+
+        private void stopAndNotify(@Nullable Exception error) {
+            try {
+                closeInternal();
+            } catch (Exception e) {
+                // if there is an error during muxer stop, that must be propagated,
+                // unless error exists already.
+                if (error == null) {
+                    error = e;
+                }
+            }
+            mResultWaiter.signalResult(error);
+        }
+    }
+
+    private static class ResultWaiter {
+        private boolean mDone;
+        private Exception mException;
+
+        synchronized void waitForResult(long timeoutMs) throws Exception {
+            if (timeoutMs < 0) {
+                throw new IllegalArgumentException("timeoutMs is negative");
+            }
+            if (timeoutMs == 0) {
+                while (!mDone) {
+                    try {
+                        wait();
+                    } catch (InterruptedException ex) {}
+                }
+            } else {
+                final long startTimeMs = System.currentTimeMillis();
+                long remainingWaitTimeMs = timeoutMs;
+                // avoid early termination by "spurious" wakeup.
+                while (!mDone && remainingWaitTimeMs > 0) {
+                    try {
+                        wait(remainingWaitTimeMs);
+                    } catch (InterruptedException ex) {}
+                    remainingWaitTimeMs -= (System.currentTimeMillis() - startTimeMs);
+                }
+            }
+            if (!mDone) {
+                mDone = true;
+                mException = new TimeoutException("timed out waiting for result");
+            }
+            if (mException != null) {
+                throw mException;
+            }
+        }
+
+        synchronized void signalResult(@Nullable Exception e) {
+            if (!mDone) {
+                mDone = true;
+                mException = e;
+                notifyAll();
+            }
+        }
+    }
+
+    @Override
+    public void close() {
+        mHandler.postAtFrontOfQueue(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    closeInternal();
+                } catch (Exception e) {
+                    // If the client called stop() properly, any errors would have been
+                    // reported there. We don't want to crash when closing.
+                }
+            }
+        });
+    }
+}
diff --git a/heifwriter/src/main/java/androidx/media/heifwriter/Texture2dProgram.java b/heifwriter/src/main/java/androidx/media/heifwriter/Texture2dProgram.java
new file mode 100644
index 0000000..b6e720d
--- /dev/null
+++ b/heifwriter/src/main/java/androidx/media/heifwriter/Texture2dProgram.java
@@ -0,0 +1,337 @@
+/*
+ * Copyright 2018 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.media.heifwriter;
+
+import android.support.annotation.IntDef;
+import android.opengl.GLES11Ext;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.util.Log;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.nio.FloatBuffer;
+
+/**
+ * GL program and supporting functions for textured 2D shapes.
+ *
+ * (Contains mostly code borrowed from Grafika)
+ *
+ * @hide
+ */
+public class Texture2dProgram {
+    private static final String TAG = "Texture2dProgram";
+
+    /** Identity matrix for general use. Don't modify or life will get weird. */
+    public static final float[] IDENTITY_MATRIX;
+
+    /**
+     * Following matrix is for texturing from bitmap. We set up the frame rects
+     * to work with SurfaceTexture's texcoords and texmatrix, but then the bitmap
+     * texturing must flip it vertically. (Don't modify or life gets weird too.)
+     */
+    public static final float[] V_FLIP_MATRIX;
+
+    static {
+        IDENTITY_MATRIX = new float[16];
+        Matrix.setIdentityM(IDENTITY_MATRIX, 0);
+
+        V_FLIP_MATRIX = new float[16];
+        Matrix.setIdentityM(V_FLIP_MATRIX, 0);
+        Matrix.translateM(V_FLIP_MATRIX, 0, 0.0f, 1.0f, 0.0f);
+        Matrix.scaleM(V_FLIP_MATRIX, 0, 1.0f, -1.0f, 1.0f);
+    }
+
+    public static final int TEXTURE_2D = 0;
+    public static final int TEXTURE_EXT = 1;
+
+    /** @hide */
+    @IntDef({
+        TEXTURE_2D,
+        TEXTURE_EXT,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ProgramType {}
+
+    // Simple vertex shader, used for all programs.
+    private static final String VERTEX_SHADER =
+            "uniform mat4 uMVPMatrix;\n" +
+            "uniform mat4 uTexMatrix;\n" +
+            "attribute vec4 aPosition;\n" +
+            "attribute vec4 aTextureCoord;\n" +
+            "varying vec2 vTextureCoord;\n" +
+            "void main() {\n" +
+            "    gl_Position = uMVPMatrix * aPosition;\n" +
+            "    vTextureCoord = (uTexMatrix * aTextureCoord).xy;\n" +
+            "}\n";
+
+    // Simple fragment shader for use with "normal" 2D textures.
+    private static final String FRAGMENT_SHADER_2D =
+            "precision mediump float;\n" +
+            "varying vec2 vTextureCoord;\n" +
+            "uniform sampler2D sTexture;\n" +
+            "void main() {\n" +
+            "    gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
+            "}\n";
+
+    // Simple fragment shader for use with external 2D textures (e.g. what we get from
+    // SurfaceTexture).
+    private static final String FRAGMENT_SHADER_EXT =
+            "#extension GL_OES_EGL_image_external : require\n" +
+            "precision mediump float;\n" +
+            "varying vec2 vTextureCoord;\n" +
+            "uniform samplerExternalOES sTexture;\n" +
+            "void main() {\n" +
+            "    gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
+            "}\n";
+
+    private @ProgramType int mProgramType;
+
+    // Handles to the GL program and various components of it.
+    private int mProgramHandle;
+    private int muMVPMatrixLoc;
+    private int muTexMatrixLoc;
+    private int maPositionLoc;
+    private int maTextureCoordLoc;
+    private int mTextureTarget;
+
+    /**
+     * Prepares the program in the current EGL context.
+     */
+    public Texture2dProgram(@ProgramType int programType) {
+        mProgramType = programType;
+
+        switch (programType) {
+            case TEXTURE_2D:
+                mTextureTarget = GLES20.GL_TEXTURE_2D;
+                mProgramHandle = createProgram(VERTEX_SHADER, FRAGMENT_SHADER_2D);
+                break;
+            case TEXTURE_EXT:
+                mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES;
+                mProgramHandle = createProgram(VERTEX_SHADER, FRAGMENT_SHADER_EXT);
+                break;
+            default:
+                throw new RuntimeException("Unhandled type " + programType);
+        }
+        if (mProgramHandle == 0) {
+            throw new RuntimeException("Unable to create program");
+        }
+        Log.d(TAG, "Created program " + mProgramHandle + " (" + programType + ")");
+
+        // get locations of attributes and uniforms
+
+        maPositionLoc = GLES20.glGetAttribLocation(mProgramHandle, "aPosition");
+        checkLocation(maPositionLoc, "aPosition");
+        maTextureCoordLoc = GLES20.glGetAttribLocation(mProgramHandle, "aTextureCoord");
+        checkLocation(maTextureCoordLoc, "aTextureCoord");
+        muMVPMatrixLoc = GLES20.glGetUniformLocation(mProgramHandle, "uMVPMatrix");
+        checkLocation(muMVPMatrixLoc, "uMVPMatrix");
+        muTexMatrixLoc = GLES20.glGetUniformLocation(mProgramHandle, "uTexMatrix");
+        checkLocation(muTexMatrixLoc, "uTexMatrix");
+    }
+
+    /**
+     * Releases the program.
+     * <p>
+     * The appropriate EGL context must be current (i.e. the one that was used to create
+     * the program).
+     */
+    public void release() {
+        Log.d(TAG, "deleting program " + mProgramHandle);
+        GLES20.glDeleteProgram(mProgramHandle);
+        mProgramHandle = -1;
+    }
+
+    /**
+     * Returns the program type.
+     */
+    public @ProgramType int getProgramType() {
+        return mProgramType;
+    }
+
+    /**
+     * Creates a texture object suitable for use with this program.
+     * <p>
+     * On exit, the texture will be bound.
+     */
+    public int createTextureObject() {
+        int[] textures = new int[1];
+        GLES20.glGenTextures(1, textures, 0);
+        checkGlError("glGenTextures");
+
+        int texId = textures[0];
+        GLES20.glBindTexture(mTextureTarget, texId);
+        checkGlError("glBindTexture " + texId);
+
+        GLES20.glTexParameterf(mTextureTarget, GLES20.GL_TEXTURE_MIN_FILTER,
+                GLES20.GL_NEAREST);
+        GLES20.glTexParameterf(mTextureTarget, GLES20.GL_TEXTURE_MAG_FILTER,
+                (mTextureTarget == GLES20.GL_TEXTURE_2D) ? GLES20.GL_NEAREST : GLES20.GL_LINEAR);
+        GLES20.glTexParameteri(mTextureTarget, GLES20.GL_TEXTURE_WRAP_S,
+                GLES20.GL_CLAMP_TO_EDGE);
+        GLES20.glTexParameteri(mTextureTarget, GLES20.GL_TEXTURE_WRAP_T,
+                GLES20.GL_CLAMP_TO_EDGE);
+        checkGlError("glTexParameter");
+
+        return texId;
+    }
+
+    /**
+     * Issues the draw call.  Does the full setup on every call.
+     *
+     * @param mvpMatrix The 4x4 projection matrix.
+     * @param vertexBuffer Buffer with vertex position data.
+     * @param firstVertex Index of first vertex to use in vertexBuffer.
+     * @param vertexCount Number of vertices in vertexBuffer.
+     * @param coordsPerVertex The number of coordinates per vertex (e.g. x,y is 2).
+     * @param vertexStride Width, in bytes, of the position data for each vertex (often
+     *        vertexCount * sizeof(float)).
+     * @param texMatrix A 4x4 transformation matrix for texture coords.  (Primarily intended
+     *        for use with SurfaceTexture.)
+     * @param texBuffer Buffer with vertex texture data.
+     * @param texStride Width, in bytes, of the texture data for each vertex.
+     */
+    public void draw(float[] mvpMatrix, FloatBuffer vertexBuffer, int firstVertex,
+            int vertexCount, int coordsPerVertex, int vertexStride,
+            float[] texMatrix, FloatBuffer texBuffer, int textureId, int texStride) {
+        checkGlError("draw start");
+
+        // Select the program.
+        GLES20.glUseProgram(mProgramHandle);
+        checkGlError("glUseProgram");
+
+        // Set the texture.
+        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
+        GLES20.glBindTexture(mTextureTarget, textureId);
+
+        // Copy the model / view / projection matrix over.
+        GLES20.glUniformMatrix4fv(muMVPMatrixLoc, 1, false, mvpMatrix, 0);
+        checkGlError("glUniformMatrix4fv");
+
+        // Copy the texture transformation matrix over.
+        GLES20.glUniformMatrix4fv(muTexMatrixLoc, 1, false, texMatrix, 0);
+        checkGlError("glUniformMatrix4fv");
+
+        // Enable the "aPosition" vertex attribute.
+        GLES20.glEnableVertexAttribArray(maPositionLoc);
+        checkGlError("glEnableVertexAttribArray");
+
+        // Connect vertexBuffer to "aPosition".
+        GLES20.glVertexAttribPointer(maPositionLoc, coordsPerVertex,
+            GLES20.GL_FLOAT, false, vertexStride, vertexBuffer);
+        checkGlError("glVertexAttribPointer");
+
+        // Enable the "aTextureCoord" vertex attribute.
+        GLES20.glEnableVertexAttribArray(maTextureCoordLoc);
+        checkGlError("glEnableVertexAttribArray");
+
+        // Connect texBuffer to "aTextureCoord".
+        GLES20.glVertexAttribPointer(maTextureCoordLoc, 2,
+                GLES20.GL_FLOAT, false, texStride, texBuffer);
+            checkGlError("glVertexAttribPointer");
+
+        // Draw the rect.
+        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, firstVertex, vertexCount);
+        checkGlError("glDrawArrays");
+
+        // Done -- disable vertex array, texture, and program.
+        GLES20.glDisableVertexAttribArray(maPositionLoc);
+        GLES20.glDisableVertexAttribArray(maTextureCoordLoc);
+        GLES20.glBindTexture(mTextureTarget, 0);
+        GLES20.glUseProgram(0);
+    }
+
+    /**
+     * Creates a new program from the supplied vertex and fragment shaders.
+     *
+     * @return A handle to the program, or 0 on failure.
+     */
+    public static int createProgram(String vertexSource, String fragmentSource) {
+        int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
+        if (vertexShader == 0) {
+            return 0;
+        }
+        int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
+        if (pixelShader == 0) {
+            return 0;
+        }
+
+        int program = GLES20.glCreateProgram();
+        checkGlError("glCreateProgram");
+        if (program == 0) {
+            Log.e(TAG, "Could not create program");
+        }
+        GLES20.glAttachShader(program, vertexShader);
+        checkGlError("glAttachShader");
+        GLES20.glAttachShader(program, pixelShader);
+        checkGlError("glAttachShader");
+        GLES20.glLinkProgram(program);
+        int[] linkStatus = new int[1];
+        GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
+        if (linkStatus[0] != GLES20.GL_TRUE) {
+            Log.e(TAG, "Could not link program: ");
+            Log.e(TAG, GLES20.glGetProgramInfoLog(program));
+            GLES20.glDeleteProgram(program);
+            program = 0;
+        }
+        return program;
+    }
+
+    /**
+     * Compiles the provided shader source.
+     *
+     * @return A handle to the shader, or 0 on failure.
+     */
+    public static int loadShader(int shaderType, String source) {
+        int shader = GLES20.glCreateShader(shaderType);
+        checkGlError("glCreateShader type=" + shaderType);
+        GLES20.glShaderSource(shader, source);
+        GLES20.glCompileShader(shader);
+        int[] compiled = new int[1];
+        GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
+        if (compiled[0] == 0) {
+            Log.e(TAG, "Could not compile shader " + shaderType + ":");
+            Log.e(TAG, " " + GLES20.glGetShaderInfoLog(shader));
+            GLES20.glDeleteShader(shader);
+            shader = 0;
+        }
+        return shader;
+    }
+
+    /**
+     * Checks to see if the location we obtained is valid.  GLES returns -1 if a label
+     * could not be found, but does not set the GL error.
+     * <p>
+     * Throws a RuntimeException if the location is invalid.
+     */
+    public static void checkLocation(int location, String label) {
+        if (location < 0) {
+            throw new RuntimeException("Unable to locate '" + label + "' in program");
+        }
+    }
+
+    /**
+     * Checks to see if a GLES error has been raised.
+     */
+    public static void checkGlError(String op) {
+        int error = GLES20.glGetError();
+        if (error != GLES20.GL_NO_ERROR) {
+            String msg = op + ": glError 0x" + Integer.toHexString(error);
+            Log.e(TAG, msg);
+            throw new RuntimeException(msg);
+        }
+    }
+}
diff --git a/interpolator/api/current.txt b/interpolator/api/current.txt
new file mode 100644
index 0000000..7de1883
--- /dev/null
+++ b/interpolator/api/current.txt
@@ -0,0 +1,16 @@
+package android.support.v4.view.animation {
+
+  public class FastOutLinearInInterpolator implements android.view.animation.Interpolator {
+    ctor public FastOutLinearInInterpolator();
+  }
+
+  public class FastOutSlowInInterpolator implements android.view.animation.Interpolator {
+    ctor public FastOutSlowInInterpolator();
+  }
+
+  public class LinearOutSlowInInterpolator implements android.view.animation.Interpolator {
+    ctor public LinearOutSlowInInterpolator();
+  }
+
+}
+
diff --git a/interpolator/build.gradle b/interpolator/build.gradle
new file mode 100644
index 0000000..6bc6e04
--- /dev/null
+++ b/interpolator/build.gradle
@@ -0,0 +1,19 @@
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    api(project(":support-annotations"))
+}
+
+supportLibrary {
+    name = "Android Support Library Interpolators"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
+    inceptionYear = "2018"
+    description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
+}
diff --git a/interpolator/src/main/AndroidManifest.xml b/interpolator/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..7d63897
--- /dev/null
+++ b/interpolator/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest package="android.support.interpolator"/>
diff --git a/core-ui/src/main/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java b/interpolator/src/main/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java
rename to interpolator/src/main/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java
diff --git a/core-ui/src/main/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java b/interpolator/src/main/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java
rename to interpolator/src/main/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java
diff --git a/core-ui/src/main/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java b/interpolator/src/main/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java
rename to interpolator/src/main/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java
diff --git a/core-ui/src/main/java/android/support/v4/view/animation/LookupTableInterpolator.java b/interpolator/src/main/java/android/support/v4/view/animation/LookupTableInterpolator.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/animation/LookupTableInterpolator.java
rename to interpolator/src/main/java/android/support/v4/view/animation/LookupTableInterpolator.java
diff --git a/jetifier/jetifier/core/build.gradle b/jetifier/jetifier/core/build.gradle
index 2bf4d08..683a020 100644
--- a/jetifier/jetifier/core/build.gradle
+++ b/jetifier/jetifier/core/build.gradle
@@ -30,7 +30,7 @@
     compile("org.jdom:jdom2:2.0.6")
     compile(KOTLIN_STDLIB)
     testCompile("junit:junit:4.12")
-    testCompile("com.google.truth:truth:0.31")
+    testCompile("com.google.truth:truth:0.34")
 }
 
 supportLibrary {
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt
index aa2e1e3..1f0b901 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt
@@ -74,9 +74,10 @@
 
         /**
          * Creates a new instance of the [Processor].
-         * [config] Transformation configuration
-         * [reversedMode] Whether the processor should run in reversed mode
-         * [rewritingSupportLib] Whether we are rewriting the support library itself
+         *
+         * @param config Transformation configuration
+         * @param reversedMode Whether the processor should run in reversed mode
+         * @param rewritingSupportLib Whether we are rewriting the support library itself
          */
         fun createProcessor(
             config: Config,
@@ -110,17 +111,26 @@
 
     /**
      * Transforms the input libraries given in [inputLibraries] using all the registered
-     * [Transformer]s and returns new libraries stored in [outputPath].
+     * [Transformer]s and returns a list of replacement libraries (the newly created libraries are
+     * get stored into [outputPath]).
      *
      * Currently we have the following transformers:
      * - [ByteCodeTransformer] for java native code
      * - [XmlResourcesTransformer] for java native code
      * - [ProGuardTransformer] for PorGuard files
+     *
+     * @param outputPath Path where to save the generated library / libraries.
+     * @param outputIsDir Whether the [outputPath] represents a single file or a directory. In case
+     * of a single file, only one library can be given as input.
+     * @param copyUnmodifiedLibsAlso Whether archives that were not modified should be also copied
+     * to the given [outputPath]
+     * @return List of files (existing and generated) that should replace the given [inputLibraries]
      */
     fun transform(inputLibraries: Set<File>,
             outputPath: Path,
-            outputIsDir: Boolean
-    ): TransformationResult {
+            outputIsDir: Boolean,
+            copyUnmodifiedLibsAlso: Boolean = true
+    ): Set<File> {
         // 0) Validate arguments
         if (!outputIsDir && inputLibraries.size > 1) {
             throw IllegalArgumentException("Cannot process more than 1 library (" + inputLibraries +
@@ -148,19 +158,29 @@
         // 4) Transform the previously discovered POM files
         transformPomFiles(pomFiles)
 
-        // 5) Repackage the libraries back to archives
-        val outputLibraries = libraries.map {
-            if (outputIsDir) {
-                it.writeSelfToDir(outputPath)
-            } else {
-                it.writeSelfToFile(outputPath)
+        // 5) Repackage the libraries back to archive files
+        val generatedLibraries = libraries
+            .filter { copyUnmodifiedLibsAlso || it.wasChanged }
+            .map {
+                if (outputIsDir) {
+                    it.writeSelfToDir(outputPath)
+                } else {
+                    it.writeSelfToFile(outputPath)
+                }
             }
-        }.toSet()
+            .toSet()
 
-        // TODO: Filter out only the libraries that have been really changed
-        return TransformationResult(
-            filesToRemove = inputLibraries,
-            filesToAdd = outputLibraries)
+        if (copyUnmodifiedLibsAlso) {
+            return generatedLibraries
+        }
+
+        // 6) Create a set of files that should be removed (because they've been changed).
+        val filesToRemove = libraries
+            .filter { it.wasChanged }
+            .map { it.relativePath.toFile() }
+            .toSet()
+
+        return inputLibraries.minus(filesToRemove).plus(generatedLibraries)
     }
 
     private fun loadLibraries(inputLibraries: Iterable<File>): List<Archive> {
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/Archive.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/Archive.kt
index bac2ffb..38d810b 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/Archive.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/Archive.kt
@@ -48,6 +48,9 @@
 
     override val fileName: String = relativePath.fileName.toString()
 
+    override val wasChanged: Boolean
+        get() = files.any { it.wasChanged }
+
     override fun accept(visitor: ArchiveItemVisitor) {
         visitor.visit(this)
     }
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveFile.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveFile.kt
index 8443773..81c166e 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveFile.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveFile.kt
@@ -23,7 +23,7 @@
 /**
  * Represents a file in the archive that is not an archive.
  */
-class ArchiveFile(relativePath: Path, var data: ByteArray) : ArchiveItem {
+class ArchiveFile(relativePath: Path, data: ByteArray) : ArchiveItem {
 
     override var relativePath = relativePath
         private set
@@ -31,6 +31,12 @@
     override var fileName: String = relativePath.fileName.toString()
         private set
 
+    override var wasChanged: Boolean = false
+        private set
+
+    var data: ByteArray = data
+        private set
+
     override fun accept(visitor: ArchiveItemVisitor) {
         visitor.visit(this)
     }
@@ -41,7 +47,16 @@
     }
 
     fun updateRelativePath(newRelativePath: Path) {
-        this.relativePath = newRelativePath
-        this.fileName = relativePath.fileName.toString()
+        if (relativePath != newRelativePath) {
+            wasChanged = true
+        }
+
+        relativePath = newRelativePath
+        fileName = relativePath.fileName.toString()
+    }
+
+    fun setNewData(newData: ByteArray) {
+        data = newData
+        wasChanged = true
     }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveItem.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveItem.kt
index 2d35e13..63c795a 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveItem.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/archive/ArchiveItem.kt
@@ -20,7 +20,8 @@
 import java.nio.file.Path
 
 /**
- * Abstraction to represent archive and its files as a one thing.
+ * Abstraction to represent archive and its files as a one thing before and after transformation
+ * together with information if any changes happened during the transformation.
  */
 interface ArchiveItem {
 
@@ -30,12 +31,17 @@
      * Files in a nested archive have a path relative to that archive not to the parent of
      * the archive. The root archive has the file system path set as its relative path.
      */
-    val relativePath : Path
+    val relativePath: Path
 
     /**
      * Name of the file.
      */
-    val fileName : String
+    val fileName: String
+
+    /**
+     * Whether the item's content or its children were changed by Jetifier.
+     */
+    val wasChanged: Boolean
 
     /**
      * Accepts visitor.
@@ -47,7 +53,6 @@
      */
     fun writeSelfTo(outputStream: OutputStream)
 
-
     fun isPomFile() = fileName.equals("pom.xml", ignoreCase = true)
 
     fun isClassFile() = fileName.endsWith(".class", ignoreCase = true)
@@ -55,5 +60,4 @@
     fun isXmlFile() = fileName.endsWith(".xml", ignoreCase = true)
 
     fun isProGuardFile () = fileName.equals("proguard.txt", ignoreCase = true)
-
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/Transformer.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/Transformer.kt
index 0c6c8aa..51335e2 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/Transformer.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/Transformer.kt
@@ -32,5 +32,4 @@
      * Runs transformation of the given file.
      */
     fun runTransform(file: ArchiveFile)
-
-}
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/ByteCodeTransformer.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/ByteCodeTransformer.kt
index 296ce49..9024ff1 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/ByteCodeTransformer.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/ByteCodeTransformer.kt
@@ -25,9 +25,9 @@
 /**
  * The [Transformer] responsible for java byte code refactoring.
  */
-class ByteCodeTransformer internal constructor(context: TransformationContext) : Transformer {
-
-    private val remapper: CoreRemapperImpl = CoreRemapperImpl(context)
+class ByteCodeTransformer internal constructor(
+    private val context: TransformationContext
+) : Transformer {
 
     override fun canTransform(file: ArchiveFile) = file.isClassFile()
 
@@ -35,11 +35,14 @@
         val reader = ClassReader(file.data)
         val writer = ClassWriter(0 /* flags */)
 
-        val visitor = remapper.createClassRemapper(writer)
+        val remapper = CoreRemapperImpl(context, writer)
+        reader.accept(remapper.classRemapper, 0 /* flags */)
 
-        reader.accept(visitor, 0 /* flags */)
+        if (!remapper.changesDone) {
+            return
+        }
 
-        file.data = writer.toByteArray()
+        file.setNewData(writer.toByteArray())
         file.updateRelativePath(remapper.rewritePath(file.relativePath))
     }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt
index 2ff0081..4603ae0 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/bytecode/CoreRemapperImpl.kt
@@ -28,7 +28,10 @@
 /**
  * Applies mappings defined in [TypesMap] during the remapping process.
  */
-class CoreRemapperImpl(private val context: TransformationContext) : CoreRemapper {
+class CoreRemapperImpl(
+    private val context: TransformationContext,
+    visitor: ClassVisitor
+) : CoreRemapper {
 
     companion object {
         const val TAG = "CoreRemapperImpl"
@@ -36,9 +39,10 @@
 
     private val typesMap = context.config.typesMap
 
-    fun createClassRemapper(visitor: ClassVisitor): ClassRemapper {
-        return ClassRemapper(visitor, CustomRemapper(this))
-    }
+    var changesDone = false
+        private set
+
+    val classRemapper = ClassRemapper(visitor, CustomRemapper(this))
 
     override fun rewriteType(type: JavaType): JavaType {
         if (!context.isEligibleForRewrite(type)) {
@@ -47,6 +51,7 @@
 
         val result = typesMap.types[type]
         if (result != null) {
+            changesDone = changesDone || result != type
             Log.i(TAG, "  map: %s -> %s", type, result)
             return result
         }
@@ -64,6 +69,7 @@
 
         val result = typesMap.types[type]
         if (result != null) {
+            changesDone = changesDone || result != type
             Log.i(TAG, "  map string: %s -> %s", type, result)
             return result.toDotNotation()
         }
@@ -85,6 +91,7 @@
 
         val result = rewriteType(type)
         if (result != type) {
+            changesDone = true
             return path.fileSystem.getPath(result.fullName + ".class")
         }
 
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformer.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformer.kt
index 3220dae..333d776 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformer.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformer.kt
@@ -61,6 +61,6 @@
             return
         }
 
-        file.data = to.toByteArray()
+        file.setNewData(to.toByteArray())
     }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocument.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocument.kt
index d5bdc3a..7dcd826 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocument.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocument.kt
@@ -29,7 +29,7 @@
     companion object {
         private const val TAG = "Pom"
 
-        fun loadFrom(file: ArchiveFile) : PomDocument {
+        fun loadFrom(file: ArchiveFile): PomDocument {
             val document = XmlUtils.createDocumentFromByteArray(file.data)
             val pomDoc = PomDocument(file, document)
             pomDoc.initialize()
@@ -37,10 +37,10 @@
         }
     }
 
-    val dependencies : MutableSet<PomDependency> = mutableSetOf()
-    private val properties : MutableMap<String, String> = mutableMapOf()
-    private var dependenciesGroup : Element? = null
-    private var hasChanged : Boolean = false
+    val dependencies: MutableSet<PomDependency> = mutableSetOf()
+    private val properties: MutableMap<String, String> = mutableMapOf()
+    private var dependenciesGroup: Element? = null
+    private var hasChanged: Boolean = false
 
     private fun initialize() {
         val propertiesGroup = document.rootElement
@@ -64,7 +64,7 @@
      * Currently it checks that all the dependencies that are going to be rewritten by the given
      * rules satisfy the minimal version requirements defined by the rules.
      */
-    fun validate(rules: List<PomRewriteRule>) : Boolean {
+    fun validate(rules: List<PomRewriteRule>): Boolean {
         if (dependenciesGroup == null) {
             // Nothing to validate as this file has no dependencies section
             return true
@@ -96,7 +96,7 @@
                 newDependencies.add(dependency)
             } else {
                 // Replace with new dependencies
-                newDependencies.addAll(rule.to.mapTo(newDependencies){ it.rewrite(dependency) })
+                newDependencies.addAll(rule.to.mapTo(newDependencies) { it.rewrite(dependency) })
             }
         }
 
@@ -118,7 +118,7 @@
             return
         }
 
-        file.data =  XmlUtils.convertDocumentToByteArray(document)
+        file.setNewData(XmlUtils.convertDocumentToByteArray(document))
     }
 
     /**
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTransformer.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTransformer.kt
index 423bf05..b7536c7 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTransformer.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTransformer.kt
@@ -39,9 +39,14 @@
     }
 
     override fun runTransform(file: ArchiveFile) {
-        val sb = StringBuilder(file.data.toString(StandardCharsets.UTF_8))
-        val result = replacer.applyReplacers(sb.toString())
-        file.data = result.toByteArray()
+        val content = StringBuilder(file.data.toString(StandardCharsets.UTF_8)).toString()
+        val result = replacer.applyReplacers(content)
+
+        if (result == content) {
+            return
+        }
+
+        file.setNewData(result.toByteArray())
     }
 }
 
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformer.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformer.kt
index 4f81c71..18c8994 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformer.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformer.kt
@@ -89,7 +89,7 @@
         }
 
         if (changesDone) {
-            file.data = sb.toString().toByteArray(charset)
+            file.setNewData(sb.toString().toByteArray(charset))
         }
     }
 
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/ChangeDetectionTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/ChangeDetectionTest.kt
new file mode 100644
index 0000000..1eeabdc
--- /dev/null
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/ChangeDetectionTest.kt
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.tools.jetifier.core
+
+import android.support.tools.jetifier.core.archive.Archive
+import android.support.tools.jetifier.core.archive.ArchiveFile
+import android.support.tools.jetifier.core.config.Config
+import android.support.tools.jetifier.core.map.TypesMap
+import android.support.tools.jetifier.core.rules.JavaType
+import android.support.tools.jetifier.core.rules.RewriteRule
+import android.support.tools.jetifier.core.transform.PackageMap
+import android.support.tools.jetifier.core.transform.pom.PomDependency
+import android.support.tools.jetifier.core.transform.pom.PomRewriteRule
+import android.support.tools.jetifier.core.transform.proguard.ProGuardTypesMap
+import com.google.common.truth.Truth
+import org.junit.Test
+import java.io.File
+import java.nio.file.Files
+import java.nio.file.Paths
+
+/**
+ * Tests that transformed artifacts are properly marked as changed / unchanged base on whether there
+ * was something to rewrite or not.
+ */
+class ChangeDetectionTest {
+    private val emptyConfig = Config(
+        restrictToPackagePrefixes = emptyList(),
+        rewriteRules = emptyList(),
+        slRules = emptyList(),
+        pomRewriteRules = emptyList(),
+        typesMap = TypesMap.EMPTY,
+        proGuardMap = ProGuardTypesMap.EMPTY,
+        packageMap = PackageMap.EMPTY
+    )
+
+    private val prefRewriteConfig = Config(
+        restrictToPackagePrefixes = listOf("android/support/v7/preference"),
+        rewriteRules =
+        listOf(
+            RewriteRule(from = "android/support/v7/preference/Preference(.+)", to = "ignore"),
+            RewriteRule(from = "(.*)/R(.*)", to = "ignore")
+        ),
+        slRules = emptyList(),
+        pomRewriteRules = listOf(
+            PomRewriteRule(
+                PomDependency(
+                    groupId = "supportGroup", artifactId = "supportArtifact", version = "4.0"),
+                listOf(
+                    PomDependency(
+                        groupId = "testGroup", artifactId = "testArtifact", version = "1.0")
+                )
+        )),
+        typesMap = TypesMap(mapOf(
+            JavaType("android/support/v7/preference/Preference")
+                to JavaType("android/test/pref/Preference")
+        )),
+        proGuardMap = ProGuardTypesMap.EMPTY,
+        packageMap = PackageMap.EMPTY
+    )
+
+    @Test
+    fun xmlRewrite_archiveChanged() {
+        testChange(
+            config = prefRewriteConfig,
+            fileContent =
+                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
+                "<android.support.v7.preference.Preference/>",
+            fileName = "test.xml",
+            areChangesExpected = true
+        )
+    }
+
+    @Test
+    fun xmlRewrite_archiveNotChanged() {
+        testChange(
+            config = emptyConfig,
+            fileContent =
+                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
+                "<android.support.v7.preference.Preference/>",
+            fileName = "test.xml",
+            areChangesExpected = false
+        )
+    }
+
+    @Test
+    fun proGuard_archiveChanged() {
+        testChange(
+            config = prefRewriteConfig,
+            fileContent =
+                "-keep public class * extends android.support.v7.preference.Preference { \n" +
+                "  <fields>; \n" +
+                "}",
+            fileName = "proguard.txt",
+            areChangesExpected = true
+        )
+    }
+
+    @Test
+    fun proGuard_archiveNotChanged() {
+        testChange(
+            config = emptyConfig,
+            fileContent =
+                "-keep public class * extends android.support.v7.preference.Preference { \n" +
+                "  <fields>; \n" +
+                "}",
+            fileName = "test.xml",
+            areChangesExpected = false
+        )
+    }
+
+    @Test
+    fun pom_archiveChanged() {
+        testChange(
+            config = prefRewriteConfig,
+            fileContent =
+                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
+                "  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
+                "  xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0" +
+                "  http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n" +
+                "  <dependencies>\n" +
+                "    <dependency>\n" +
+                "      <groupId>supportGroup</groupId>\n" +
+                "      <artifactId>supportArtifact</artifactId>\n" +
+                "      <version>4.0</version>\n" +
+                "    </dependency>\n" +
+                "  </dependencies>" +
+                "</project>\n",
+            fileName = "pom.xml",
+            areChangesExpected = true
+        )
+    }
+
+    @Test
+    fun pom_archiveNotChanged() {
+        testChange(
+            config = emptyConfig,
+            fileContent =
+                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
+                "  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
+                "  xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0" +
+                "  http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n" +
+                "  <dependencies>\n" +
+                "    <dependency>\n" +
+                "      <groupId>supportGroup</groupId>\n" +
+                "      <artifactId>supportArtifact</artifactId>\n" +
+                "      <version>4.0</version>\n" +
+                "    </dependency>\n" +
+                "  </dependencies>" +
+                "</project>\n",
+            fileName = "pom.xml",
+            areChangesExpected = true
+        )
+    }
+
+    @Test
+    fun javaClass_archiveChanged() {
+        val inputClassPath = "/changeDetectionTest/testPreference.class"
+        val inputFile = File(javaClass.getResource(inputClassPath).file)
+
+        testChange(
+            config = prefRewriteConfig,
+            file = ArchiveFile(Paths.get("/", "preference.class"), inputFile.readBytes()),
+            areChangesExpected = true
+        )
+    }
+
+    @Test
+    fun javaClass_archiveNotChanged() {
+        val inputClassPath = "/changeDetectionTest/testPreference.class"
+        val inputFile = File(javaClass.getResource(inputClassPath).file)
+
+        testChange(
+            config = emptyConfig,
+            file = ArchiveFile(Paths.get("/", "preference.class"), inputFile.readBytes()),
+            areChangesExpected = false
+        )
+    }
+
+    private fun testChange(
+        config: Config,
+        fileContent: String,
+        fileName: String,
+        areChangesExpected: Boolean
+    ) {
+        testChange(
+            config = config,
+            file = ArchiveFile(Paths.get("/", fileName), fileContent.toByteArray()),
+            areChangesExpected = areChangesExpected)
+    }
+
+    /**
+     * Runs the whole transformation process over the given file and verifies if the parent
+     * artifacts was properly marked as changed / unchanged base on [areChangesExpected] param.
+     */
+    private fun testChange(
+        config: Config,
+        file: ArchiveFile,
+        areChangesExpected: Boolean
+    ) {
+        val archive = Archive(Paths.get("some/path"), listOf(file))
+        val sourceArchive = archive.writeSelfToFile(Files.createTempFile("test", ".zip"))
+
+        val expectedFileIfRefactored = Files.createTempFile("testRefactored", ".zip")
+        val processor = Processor.createProcessor(config)
+        val resultFiles = processor.transform(
+            setOf(sourceArchive),
+            outputPath = expectedFileIfRefactored,
+            outputIsDir = false,
+            copyUnmodifiedLibsAlso = false)
+
+        if (areChangesExpected) {
+            Truth.assertThat(resultFiles).containsExactly(expectedFileIfRefactored.toFile())
+        } else {
+            Truth.assertThat(resultFiles).containsExactly(sourceArchive)
+        }
+    }
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt
index 3b189e6..6876976 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.tools.jetifier.core.transform.bytecode
 
 import android.support.tools.jetifier.core.Processor
@@ -85,10 +101,10 @@
         val inputFile = File(javaClass.getResource(inputZipPath).file)
 
         val tempDir = createTempDir()
-        val result = processor.transform(setOf(inputFile), tempDir.toPath(), true)
+        val resultFiles = processor.transform(setOf(inputFile), tempDir.toPath(), true)
 
-        Truth.assertThat(result.filesToAdd).hasSize(1)
-        testArchivesAreSame(result.filesToAdd.first(),
+        Truth.assertThat(resultFiles).hasSize(1)
+        testArchivesAreSame(resultFiles.first(),
             File(javaClass.getResource(expectedZipPath).file))
 
         tempDir.delete()
@@ -106,10 +122,10 @@
         val inputFile = File(javaClass.getResource(inputZipPath).file)
 
         val tempDir = createTempDir()
-        val result = processor.transform(setOf(inputFile), tempDir.toPath(), true)
+        val resultFiles = processor.transform(setOf(inputFile), tempDir.toPath(), true)
 
-        Truth.assertThat(result.filesToAdd).hasSize(1)
-        testArchivesAreSame(result.filesToAdd.first(),
+        Truth.assertThat(resultFiles).hasSize(1)
+        testArchivesAreSame(resultFiles.first(),
             File(javaClass.getResource(expectedZipPath).file))
 
         tempDir.delete()
@@ -129,15 +145,15 @@
             rewritingSupportLib = true)
         val inputFile = File(javaClass.getResource(inputZipPath).file)
         val tempDir = createTempDir()
-        val result = processor.transform(setOf(inputFile), tempDir.toPath(), true)
+        val resultFiles = processor.transform(setOf(inputFile), tempDir.toPath(), true)
 
         // Take previous result & reverse it
         val processor2 = Processor.createProcessor(TEST_CONFIG,
             rewritingSupportLib = true,
             reversedMode = true)
-        val result2 = processor2.transform(setOf(result.filesToAdd.first()), tempDir.toPath(), true)
+        val resultFiles2 = processor2.transform(setOf(resultFiles.first()), tempDir.toPath(), true)
 
-        testArchivesAreSame(result2.filesToAdd.first(),
+        testArchivesAreSame(resultFiles2.first(),
             File(javaClass.getResource(inputZipPath).file))
 
         tempDir.delete()
@@ -154,10 +170,10 @@
         val inputFile = File(javaClass.getResource(inputZipPath).file)
 
         val tempDir = createTempDir()
-        val result = processor.transform(setOf(inputFile), tempDir.toPath(), true)
+        val resultFiles = processor.transform(setOf(inputFile), tempDir.toPath(), true)
 
-        Truth.assertThat(result.filesToAdd).hasSize(1)
-        testArchivesAreSame(result.filesToAdd.first(),
+        Truth.assertThat(resultFiles).hasSize(1)
+        testArchivesAreSame(resultFiles.first(),
             File(javaClass.getResource(inputZipPath).file))
 
         tempDir.delete()
diff --git a/jetifier/jetifier/core/src/test/resources/changeDetectionTest/testPreference.class b/jetifier/jetifier/core/src/test/resources/changeDetectionTest/testPreference.class
new file mode 100644
index 0000000..50d7d11
--- /dev/null
+++ b/jetifier/jetifier/core/src/test/resources/changeDetectionTest/testPreference.class
Binary files differ
diff --git a/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/JetifyGlobalTask.kt b/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/JetifyGlobalTask.kt
index 4d35625..22f4308 100644
--- a/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/JetifyGlobalTask.kt
+++ b/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/JetifyGlobalTask.kt
@@ -48,7 +48,7 @@
 
         const val OUTPUT_DIR_APPENDIX = "jetifier"
 
-        fun resolveTask(project: Project) : JetifyGlobalTask {
+        fun resolveTask(project: Project): JetifyGlobalTask {
             val task = project.tasks.findByName(TASK_NAME) as? JetifyGlobalTask
             if (task != null) {
                 return task
@@ -61,7 +61,6 @@
 
     private val outputDir = File(project.buildDir, OUTPUT_DIR_APPENDIX)
 
-
     override fun getGroup() = GROUP_ID
 
     override fun getDescription() = DESCRIPTION
@@ -93,7 +92,7 @@
                 if (fileDep != null) {
                     fileDep.files.forEach {
                         dependenciesMap
-                            .getOrPut(it, { mutableSetOf<Dependency>() } )
+                            .getOrPut(it, { mutableSetOf<Dependency>() })
                             .add(fileDep)
                     }
                 } else {
@@ -108,7 +107,7 @@
                     detached.dependencies.add(dep)
                     detached.resolvedConfiguration.resolvedArtifacts.forEach {
                         dependenciesMap
-                            .getOrPut(it.file, { mutableSetOf<Dependency>() } )
+                            .getOrPut(it.file, { mutableSetOf<Dependency>() })
                             .add(dep)
                     }
                 }
@@ -116,21 +115,27 @@
         }
 
         // Process the files using Jetifier
-        val result = TasksCommon.processFiles(config, dependenciesMap.keys, project.logger, outputDir)
+        val result = TasksCommon.processFiles(config, dependenciesMap.keys, project.logger,
+            outputDir)
 
-        // Apply changes
         configurationsToProcess.forEach { conf ->
-            // Apply that on our set
-            result.filesToRemove.forEach { file ->
-                dependenciesMap[file]!!.forEach {
-                    conf.dependencies.remove(it)
+            // Remove files that we don't need anymore
+            dependenciesMap.keys
+                .toTypedArray()
+                .forEach { file ->
+                    if (!result.contains(file)) {
+                        dependenciesMap[file]!!.forEach {
+                            conf.dependencies.remove(it)
+                        }
+                    }
                 }
-            }
 
-            result.filesToAdd.forEach {
-                project.dependencies.add(conf.name, project.files(it))
+            // Add new generated files
+            result.forEach { file ->
+                if (!dependenciesMap.contains(file)) {
+                    project.dependencies.add(conf.name, project.files(file))
+                }
             }
         }
     }
-
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/TasksCommon.kt b/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/TasksCommon.kt
index 082034fb..88b5cc1 100644
--- a/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/TasksCommon.kt
+++ b/jetifier/jetifier/gradle-plugin/src/main/kotlin/android/support/tools/jetifier/plugin/gradle/TasksCommon.kt
@@ -17,7 +17,6 @@
 package android.support.tools.jetifier.plugin.gradle
 
 import android.support.tools.jetifier.core.Processor
-import android.support.tools.jetifier.core.TransformationResult
 import android.support.tools.jetifier.core.config.Config
 import android.support.tools.jetifier.core.utils.Log
 import org.gradle.api.logging.LogLevel
@@ -31,10 +30,12 @@
 
         var configFilePath: Path? = null
 
-        fun processFiles(config: Config,
-                         filesToProcess: Set<File>,
-                         logger: Logger,
-                         outputDir: File): TransformationResult {
+        fun processFiles(
+            config: Config,
+            filesToProcess: Set<File>,
+            logger: Logger,
+            outputDir: File
+        ): Set<File> {
             outputDir.mkdirs()
 
             logger.log(LogLevel.DEBUG, "Jetifier will now process the following files:")
@@ -46,7 +47,11 @@
             Log.logConsumer = JetifierLoggerAdapter(logger)
 
             val processor = Processor.createProcessor(config)
-            return processor.transform(filesToProcess, outputDir.toPath(), true)
+            return processor.transform(
+                filesToProcess,
+                outputDir.toPath(),
+                outputIsDir = true,
+                copyUnmodifiedLibsAlso = false)
         }
 
         fun shouldSkipArtifact(artifactId: String, groupId: String?, config: Config): Boolean {
diff --git a/leanback/build.gradle b/leanback/build.gradle
index d1d45e3..36ba9e2 100644
--- a/leanback/build.gradle
+++ b/leanback/build.gradle
@@ -37,6 +37,5 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2014"
     description = "Android Support Leanback v17"
-    legacySourceLocation = true
     minSdkVersion = 17
 }
diff --git a/leanback/tests/AndroidManifest.xml b/leanback/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from leanback/tests/AndroidManifest.xml
rename to leanback/src/androidTest/AndroidManifest.xml
diff --git a/leanback/tests/generatev4.py b/leanback/src/androidTest/generatev4.py
similarity index 100%
rename from leanback/tests/generatev4.py
rename to leanback/src/androidTest/generatev4.py
diff --git a/leanback/tests/java/android/support/v17/leanback/app/BackgroundManagerTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/BackgroundManagerTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/BackgroundManagerTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/BackgroundManagerTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/BrowseTestFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseTestFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/BrowseTestFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseTestFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/DetailsFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/DetailsFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/DetailsSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/DetailsSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/DetailsTestFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsTestFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/DetailsTestFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsTestFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/DetailsTestSupportFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsTestSupportFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/DetailsTestSupportFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/DetailsTestSupportFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepFragmentTestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepFragmentTestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepFragmentTestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepFragmentTestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepFragmentTestBase.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepFragmentTestBase.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepFragmentTestBase.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepFragmentTestBase.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestBase.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestBase.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestBase.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepSupportFragmentTestBase.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepTestFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepTestFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepTestFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepTestFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/GuidedStepTestSupportFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepTestSupportFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/GuidedStepTestSupportFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/GuidedStepTestSupportFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/HeadersFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/HeadersFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/HeadersFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/HeadersFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/HeadersSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/HeadersSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/HeadersSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/HeadersSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/ListRowDataAdapterTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/ListRowDataAdapterTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/ListRowDataAdapterTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/ListRowDataAdapterTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/PhotoItem.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/PhotoItem.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/PhotoItem.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/PhotoItem.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/PlaybackFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/PlaybackFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/PlaybackSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/PlaybackSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/PlaybackTestFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackTestFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/PlaybackTestFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackTestFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/PlaybackTestSupportFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackTestSupportFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/PlaybackTestSupportFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/PlaybackTestSupportFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/ProgressBarManagerTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/ProgressBarManagerTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/ProgressBarManagerTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/ProgressBarManagerTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/RowsFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/RowsFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/RowsFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/RowsFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/RowsSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/RowsSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/RowsSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/RowsSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/SingleFragmentTestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/SingleFragmentTestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/SingleFragmentTestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/SingleFragmentTestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/SingleFragmentTestBase.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/SingleFragmentTestBase.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/SingleFragmentTestBase.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/SingleFragmentTestBase.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/SingleSupportFragmentTestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/SingleSupportFragmentTestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/SingleSupportFragmentTestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/SingleSupportFragmentTestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/SingleSupportFragmentTestBase.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/SingleSupportFragmentTestBase.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/SingleSupportFragmentTestBase.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/SingleSupportFragmentTestBase.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/StringPresenter.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/StringPresenter.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/StringPresenter.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/StringPresenter.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/TestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/TestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/TestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/TestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/VerticalGridFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/VerticalGridFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/VerticalGridFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/VerticalGridFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/VerticalGridSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/VerticalGridSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/VerticalGridSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/VerticalGridSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/VideoFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/VideoFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/VideoFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/VideoFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/VideoSupportFragmentTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/VideoSupportFragmentTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/VideoSupportFragmentTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/VideoSupportFragmentTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedDatePickerTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedDatePickerTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedDatePickerTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedDatePickerTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestFragment.java b/leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestFragment.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestFragment.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestFragment.java
diff --git a/leanback/tests/java/android/support/v17/leanback/graphics/CompositeDrawableTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/graphics/CompositeDrawableTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/graphics/CompositeDrawableTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/graphics/CompositeDrawableTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/graphics/FitWidthBitmapDrawableTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/graphics/FitWidthBitmapDrawableTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/graphics/FitWidthBitmapDrawableTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/graphics/FitWidthBitmapDrawableTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/media/MediaControllerAdapterTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/media/MediaControllerAdapterTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/media/MediaControllerAdapterTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/media/MediaControllerAdapterTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/media/MediaPlayerGlueTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/media/MediaPlayerGlueTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/media/MediaPlayerGlueTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/media/MediaPlayerGlueTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/media/PlaybackBannerControlGlueTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackBannerControlGlueTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/media/PlaybackBannerControlGlueTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackBannerControlGlueTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/media/PlaybackControlGlueTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackControlGlueTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/media/PlaybackControlGlueTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackControlGlueTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/media/PlaybackGlueHostImpl.java b/leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackGlueHostImpl.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/media/PlaybackGlueHostImpl.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackGlueHostImpl.java
diff --git a/leanback/tests/java/android/support/v17/leanback/media/PlaybackGlueTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackGlueTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/media/PlaybackGlueTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackGlueTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/media/PlaybackTransportControlGlueTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackTransportControlGlueTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/media/PlaybackTransportControlGlueTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/media/PlaybackTransportControlGlueTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/testutils/PollingCheck.java b/leanback/src/androidTest/java/android/support/v17/leanback/testutils/PollingCheck.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/testutils/PollingCheck.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/testutils/PollingCheck.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/AssertHelper.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/AssertHelper.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/AssertHelper.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/AssertHelper.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/BaseCardViewTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/BaseCardViewTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/BaseCardViewTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/BaseCardViewTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ControlBarTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ControlBarTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ControlBarTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ControlBarTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/GridActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/GridActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/GridActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/GridActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/GridTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/GridTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/GridTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/GridTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetPrefetchTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/GridWidgetPrefetchTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/GridWidgetPrefetchTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/GridWidgetPrefetchTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/GridWidgetTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/GridWidgetTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/GuidedActionStylistTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/GuidedActionStylistTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/GuidedActionStylistTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/GuidedActionStylistTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/HorizontalGridViewEx.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/HorizontalGridViewEx.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/HorizontalGridViewEx.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/HorizontalGridViewEx.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ImageCardViewTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ImageCardViewTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ImageCardViewTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ImageCardViewTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ListRowPresenterTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ListRowPresenterTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ListRowPresenterTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ListRowPresenterTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/MediaNowPlayingViewTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/MediaNowPlayingViewTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/MediaNowPlayingViewTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/MediaNowPlayingViewTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ObjectAdapterTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ObjectAdapterTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ObjectAdapterTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ObjectAdapterTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/PagingIndicatorTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/PagingIndicatorTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/PagingIndicatorTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/PagingIndicatorTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ParallaxFloatEffectTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxFloatEffectTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ParallaxFloatEffectTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxFloatEffectTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ParallaxFloatTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxFloatTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ParallaxFloatTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxFloatTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ParallaxIntEffectTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxIntEffectTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ParallaxIntEffectTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxIntEffectTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ParallaxIntTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxIntTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ParallaxIntTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ParallaxIntTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/PlaybackGlueHostImplWithViewHolder.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/PlaybackGlueHostImplWithViewHolder.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/PlaybackGlueHostImplWithViewHolder.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/PlaybackGlueHostImplWithViewHolder.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/PlaybackSeekProviderSample.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/PlaybackSeekProviderSample.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/PlaybackSeekProviderSample.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/PlaybackSeekProviderSample.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/PlaybackTransportRowPresenterTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/PlaybackTransportRowPresenterTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/PlaybackTransportRowPresenterTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/PlaybackTransportRowPresenterTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/PresenterTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/PresenterTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/PresenterTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/PresenterTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/SingleRowTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/SingleRowTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/SingleRowTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/SingleRowTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/ThumbsBarTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/ThumbsBarTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/ThumbsBarTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/ThumbsBarTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/TitleViewAdapterTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/TitleViewAdapterTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/TitleViewAdapterTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/TitleViewAdapterTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/VerticalGridViewEx.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/VerticalGridViewEx.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/VerticalGridViewEx.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/VerticalGridViewEx.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/DatePickerActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/DatePickerActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/DatePickerTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/DatePickerTest.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerActivity.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/TimePickerActivity.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerActivity.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/TimePickerActivity.java
diff --git a/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerTest.java b/leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/TimePickerTest.java
similarity index 100%
rename from leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerTest.java
rename to leanback/src/androidTest/java/android/support/v17/leanback/widget/picker/TimePickerTest.java
diff --git a/leanback/tests/res/drawable/ic_action_a.png b/leanback/src/androidTest/res/drawable/ic_action_a.png
similarity index 100%
rename from leanback/tests/res/drawable/ic_action_a.png
rename to leanback/src/androidTest/res/drawable/ic_action_a.png
Binary files differ
diff --git a/leanback/tests/res/drawable/spiderman.jpg b/leanback/src/androidTest/res/drawable/spiderman.jpg
similarity index 100%
rename from leanback/tests/res/drawable/spiderman.jpg
rename to leanback/src/androidTest/res/drawable/spiderman.jpg
Binary files differ
diff --git a/leanback/tests/res/layout/browse.xml b/leanback/src/androidTest/res/layout/browse.xml
similarity index 100%
rename from leanback/tests/res/layout/browse.xml
rename to leanback/src/androidTest/res/layout/browse.xml
diff --git a/leanback/tests/res/layout/datepicker_alone.xml b/leanback/src/androidTest/res/layout/datepicker_alone.xml
similarity index 100%
rename from leanback/tests/res/layout/datepicker_alone.xml
rename to leanback/src/androidTest/res/layout/datepicker_alone.xml
diff --git a/leanback/tests/res/layout/datepicker_with_other_widgets.xml b/leanback/src/androidTest/res/layout/datepicker_with_other_widgets.xml
similarity index 100%
rename from leanback/tests/res/layout/datepicker_with_other_widgets.xml
rename to leanback/src/androidTest/res/layout/datepicker_with_other_widgets.xml
diff --git a/leanback/tests/res/layout/details.xml b/leanback/src/androidTest/res/layout/details.xml
similarity index 100%
rename from leanback/tests/res/layout/details.xml
rename to leanback/src/androidTest/res/layout/details.xml
diff --git a/leanback/tests/res/layout/horizontal_grid.xml b/leanback/src/androidTest/res/layout/horizontal_grid.xml
similarity index 100%
rename from leanback/tests/res/layout/horizontal_grid.xml
rename to leanback/src/androidTest/res/layout/horizontal_grid.xml
diff --git a/leanback/tests/res/layout/horizontal_grid_testredundantappendremove2.xml b/leanback/src/androidTest/res/layout/horizontal_grid_testredundantappendremove2.xml
similarity index 100%
rename from leanback/tests/res/layout/horizontal_grid_testredundantappendremove2.xml
rename to leanback/src/androidTest/res/layout/horizontal_grid_testredundantappendremove2.xml
diff --git a/leanback/tests/res/layout/horizontal_grid_wrap.xml b/leanback/src/androidTest/res/layout/horizontal_grid_wrap.xml
similarity index 100%
rename from leanback/tests/res/layout/horizontal_grid_wrap.xml
rename to leanback/src/androidTest/res/layout/horizontal_grid_wrap.xml
diff --git a/leanback/tests/res/layout/horizontal_item.xml b/leanback/src/androidTest/res/layout/horizontal_item.xml
similarity index 100%
rename from leanback/tests/res/layout/horizontal_item.xml
rename to leanback/src/androidTest/res/layout/horizontal_item.xml
diff --git a/leanback/tests/res/layout/horizontal_linear.xml b/leanback/src/androidTest/res/layout/horizontal_linear.xml
similarity index 100%
rename from leanback/tests/res/layout/horizontal_linear.xml
rename to leanback/src/androidTest/res/layout/horizontal_linear.xml
diff --git a/leanback/tests/res/layout/horizontal_linear_rtl.xml b/leanback/src/androidTest/res/layout/horizontal_linear_rtl.xml
similarity index 100%
rename from leanback/tests/res/layout/horizontal_linear_rtl.xml
rename to leanback/src/androidTest/res/layout/horizontal_linear_rtl.xml
diff --git a/leanback/tests/res/layout/horizontal_linear_wrap_content.xml b/leanback/src/androidTest/res/layout/horizontal_linear_wrap_content.xml
similarity index 100%
rename from leanback/tests/res/layout/horizontal_linear_wrap_content.xml
rename to leanback/src/androidTest/res/layout/horizontal_linear_wrap_content.xml
diff --git a/leanback/tests/res/layout/item_button_at_bottom.xml b/leanback/src/androidTest/res/layout/item_button_at_bottom.xml
similarity index 100%
rename from leanback/tests/res/layout/item_button_at_bottom.xml
rename to leanback/src/androidTest/res/layout/item_button_at_bottom.xml
diff --git a/leanback/tests/res/layout/item_button_at_top.xml b/leanback/src/androidTest/res/layout/item_button_at_top.xml
similarity index 100%
rename from leanback/tests/res/layout/item_button_at_top.xml
rename to leanback/src/androidTest/res/layout/item_button_at_top.xml
diff --git a/leanback/tests/res/layout/page_fragment.xml b/leanback/src/androidTest/res/layout/page_fragment.xml
similarity index 100%
rename from leanback/tests/res/layout/page_fragment.xml
rename to leanback/src/androidTest/res/layout/page_fragment.xml
diff --git a/leanback/tests/res/layout/playback_controls_with_video.xml b/leanback/src/androidTest/res/layout/playback_controls_with_video.xml
similarity index 100%
rename from leanback/tests/res/layout/playback_controls_with_video.xml
rename to leanback/src/androidTest/res/layout/playback_controls_with_video.xml
diff --git a/leanback/tests/res/layout/relative_layout.xml b/leanback/src/androidTest/res/layout/relative_layout.xml
similarity index 100%
rename from leanback/tests/res/layout/relative_layout.xml
rename to leanback/src/androidTest/res/layout/relative_layout.xml
diff --git a/leanback/tests/res/layout/relative_layout2.xml b/leanback/src/androidTest/res/layout/relative_layout2.xml
similarity index 100%
rename from leanback/tests/res/layout/relative_layout2.xml
rename to leanback/src/androidTest/res/layout/relative_layout2.xml
diff --git a/leanback/tests/res/layout/relative_layout3.xml b/leanback/src/androidTest/res/layout/relative_layout3.xml
similarity index 100%
rename from leanback/tests/res/layout/relative_layout3.xml
rename to leanback/src/androidTest/res/layout/relative_layout3.xml
diff --git a/leanback/tests/res/layout/selectable_text_view.xml b/leanback/src/androidTest/res/layout/selectable_text_view.xml
similarity index 100%
rename from leanback/tests/res/layout/selectable_text_view.xml
rename to leanback/src/androidTest/res/layout/selectable_text_view.xml
diff --git a/leanback/tests/res/layout/single_fragment.xml b/leanback/src/androidTest/res/layout/single_fragment.xml
similarity index 100%
rename from leanback/tests/res/layout/single_fragment.xml
rename to leanback/src/androidTest/res/layout/single_fragment.xml
diff --git a/leanback/tests/res/layout/timepicker_alone.xml b/leanback/src/androidTest/res/layout/timepicker_alone.xml
similarity index 100%
rename from leanback/tests/res/layout/timepicker_alone.xml
rename to leanback/src/androidTest/res/layout/timepicker_alone.xml
diff --git a/leanback/tests/res/layout/timepicker_with_other_widgets.xml b/leanback/src/androidTest/res/layout/timepicker_with_other_widgets.xml
similarity index 100%
rename from leanback/tests/res/layout/timepicker_with_other_widgets.xml
rename to leanback/src/androidTest/res/layout/timepicker_with_other_widgets.xml
diff --git a/leanback/tests/res/layout/vertical_grid.xml b/leanback/src/androidTest/res/layout/vertical_grid.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_grid.xml
rename to leanback/src/androidTest/res/layout/vertical_grid.xml
diff --git a/leanback/tests/res/layout/vertical_grid_ltr.xml b/leanback/src/androidTest/res/layout/vertical_grid_ltr.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_grid_ltr.xml
rename to leanback/src/androidTest/res/layout/vertical_grid_ltr.xml
diff --git a/leanback/tests/res/layout/vertical_grid_rtl.xml b/leanback/src/androidTest/res/layout/vertical_grid_rtl.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_grid_rtl.xml
rename to leanback/src/androidTest/res/layout/vertical_grid_rtl.xml
diff --git a/leanback/tests/res/layout/vertical_grid_testredundantappendremove.xml b/leanback/src/androidTest/res/layout/vertical_grid_testredundantappendremove.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_grid_testredundantappendremove.xml
rename to leanback/src/androidTest/res/layout/vertical_grid_testredundantappendremove.xml
diff --git a/leanback/tests/res/layout/vertical_linear.xml b/leanback/src/androidTest/res/layout/vertical_linear.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_linear.xml
rename to leanback/src/androidTest/res/layout/vertical_linear.xml
diff --git a/leanback/tests/res/layout/vertical_linear_measured_with_zero.xml b/leanback/src/androidTest/res/layout/vertical_linear_measured_with_zero.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_linear_measured_with_zero.xml
rename to leanback/src/androidTest/res/layout/vertical_linear_measured_with_zero.xml
diff --git a/leanback/tests/res/layout/vertical_linear_with_button.xml b/leanback/src/androidTest/res/layout/vertical_linear_with_button.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_linear_with_button.xml
rename to leanback/src/androidTest/res/layout/vertical_linear_with_button.xml
diff --git a/leanback/tests/res/layout/vertical_linear_with_button_onleft.xml b/leanback/src/androidTest/res/layout/vertical_linear_with_button_onleft.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_linear_with_button_onleft.xml
rename to leanback/src/androidTest/res/layout/vertical_linear_with_button_onleft.xml
diff --git a/leanback/tests/res/layout/vertical_linear_wrap_content.xml b/leanback/src/androidTest/res/layout/vertical_linear_wrap_content.xml
similarity index 100%
rename from leanback/tests/res/layout/vertical_linear_wrap_content.xml
rename to leanback/src/androidTest/res/layout/vertical_linear_wrap_content.xml
diff --git a/leanback/tests/res/layout/video_fragment_with_controls.xml b/leanback/src/androidTest/res/layout/video_fragment_with_controls.xml
similarity index 100%
rename from leanback/tests/res/layout/video_fragment_with_controls.xml
rename to leanback/src/androidTest/res/layout/video_fragment_with_controls.xml
diff --git a/leanback/tests/res/raw/track_01.mp3 b/leanback/src/androidTest/res/raw/track_01.mp3
similarity index 100%
rename from leanback/tests/res/raw/track_01.mp3
rename to leanback/src/androidTest/res/raw/track_01.mp3
Binary files differ
diff --git a/leanback/tests/res/raw/video.mp4 b/leanback/src/androidTest/res/raw/video.mp4
similarity index 100%
rename from leanback/tests/res/raw/video.mp4
rename to leanback/src/androidTest/res/raw/video.mp4
Binary files differ
diff --git a/leanback/tests/res/values/strings.xml b/leanback/src/androidTest/res/values/strings.xml
similarity index 100%
rename from leanback/tests/res/values/strings.xml
rename to leanback/src/androidTest/res/values/strings.xml
diff --git a/leanback/tests/NO_DOCS b/leanback/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/leanback/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/localbroadcastmanager/api/current.txt b/localbroadcastmanager/api/current.txt
new file mode 100644
index 0000000..5c02abe
--- /dev/null
+++ b/localbroadcastmanager/api/current.txt
@@ -0,0 +1,12 @@
+package android.support.v4.content {
+
+  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);
+  }
+
+}
+
diff --git a/localbroadcastmanager/build.gradle b/localbroadcastmanager/build.gradle
new file mode 100644
index 0000000..a3d35bf
--- /dev/null
+++ b/localbroadcastmanager/build.gradle
@@ -0,0 +1,19 @@
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    api(project(":support-annotations"))
+}
+
+supportLibrary {
+    name = "Android Support Library Local Broadcast Manager"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
+    inceptionYear = "2018"
+    description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
+}
diff --git a/localbroadcastmanager/src/main/AndroidManifest.xml b/localbroadcastmanager/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..611729b
--- /dev/null
+++ b/localbroadcastmanager/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest package="android.support.localbroadcastmanager"/>
diff --git a/core-utils/src/main/java/android/support/v4/content/LocalBroadcastManager.java b/localbroadcastmanager/src/main/java/android/support/v4/content/LocalBroadcastManager.java
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/content/LocalBroadcastManager.java
rename to localbroadcastmanager/src/main/java/android/support/v4/content/LocalBroadcastManager.java
diff --git a/media-compat/build.gradle b/media-compat/build.gradle
index ad782e7..29c91b7 100644
--- a/media-compat/build.gradle
+++ b/media-compat/build.gradle
@@ -26,7 +26,6 @@
                 'api24',
                 'api26',
         ]
-        main.aidl.srcDirs = ['src/main/java']
         main.res.srcDirs += 'src/main/res-public'
     }
 
@@ -42,5 +41,4 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2011"
     description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
-    legacySourceLocation = true
 }
diff --git a/media-compat/src/main/java/android/support/v4/media/MediaDescriptionCompat.aidl b/media-compat/src/main/aidl/android/support/v4/media/MediaDescriptionCompat.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/MediaDescriptionCompat.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/MediaDescriptionCompat.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/MediaMetadataCompat.aidl b/media-compat/src/main/aidl/android/support/v4/media/MediaMetadataCompat.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/MediaMetadataCompat.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/MediaMetadataCompat.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/RatingCompat.aidl b/media-compat/src/main/aidl/android/support/v4/media/RatingCompat.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/RatingCompat.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/RatingCompat.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/session/IMediaControllerCallback.aidl b/media-compat/src/main/aidl/android/support/v4/media/session/IMediaControllerCallback.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/session/IMediaControllerCallback.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/session/IMediaControllerCallback.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/session/IMediaSession.aidl b/media-compat/src/main/aidl/android/support/v4/media/session/IMediaSession.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/session/IMediaSession.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/session/IMediaSession.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/session/MediaSessionCompat.aidl b/media-compat/src/main/aidl/android/support/v4/media/session/MediaSessionCompat.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/session/MediaSessionCompat.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/session/MediaSessionCompat.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/session/ParcelableVolumeInfo.aidl b/media-compat/src/main/aidl/android/support/v4/media/session/ParcelableVolumeInfo.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/session/ParcelableVolumeInfo.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/session/ParcelableVolumeInfo.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/session/PlaybackStateCompat.aidl b/media-compat/src/main/aidl/android/support/v4/media/session/PlaybackStateCompat.aidl
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/session/PlaybackStateCompat.aidl
rename to media-compat/src/main/aidl/android/support/v4/media/session/PlaybackStateCompat.aidl
diff --git a/media-compat/tests/NO_DOCS b/media-compat/tests/NO_DOCS
deleted file mode 100644
index 092a39c..0000000
--- a/media-compat/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/media-compat/version-compat-tests/current/client/build.gradle b/media-compat/version-compat-tests/current/client/build.gradle
index 9c4f879..2a247df 100644
--- a/media-compat/version-compat-tests/current/client/build.gradle
+++ b/media-compat/version-compat-tests/current/client/build.gradle
@@ -26,7 +26,3 @@
 
     androidTestImplementation(TEST_RUNNER)
 }
-
-supportLibrary {
-    legacySourceLocation = true
-}
\ No newline at end of file
diff --git a/media-compat/version-compat-tests/current/client/tests/AndroidManifest.xml b/media-compat/version-compat-tests/current/client/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/current/client/tests/AndroidManifest.xml
rename to media-compat/version-compat-tests/current/client/src/androidTest/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/AudioAttributesCompatTest.java b/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/AudioAttributesCompatTest.java
similarity index 100%
rename from media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/AudioAttributesCompatTest.java
rename to media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/AudioAttributesCompatTest.java
diff --git a/media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/ClientBroadcastReceiver.java b/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/ClientBroadcastReceiver.java
similarity index 100%
rename from media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/ClientBroadcastReceiver.java
rename to media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/ClientBroadcastReceiver.java
diff --git a/media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/MediaBrowserCompatTest.java b/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserCompatTest.java
similarity index 100%
rename from media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/MediaBrowserCompatTest.java
rename to media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserCompatTest.java
diff --git a/media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java b/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
similarity index 100%
rename from media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
rename to media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
diff --git a/media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/MediaItemTest.java b/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaItemTest.java
similarity index 100%
rename from media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/MediaItemTest.java
rename to media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaItemTest.java
diff --git a/media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/PlaybackStateCompatTest.java b/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/PlaybackStateCompatTest.java
similarity index 100%
rename from media-compat/version-compat-tests/current/client/tests/src/android/support/mediacompat/client/PlaybackStateCompatTest.java
rename to media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/PlaybackStateCompatTest.java
diff --git a/media-compat/version-compat-tests/current/client/tests/NO_DOCS b/media-compat/version-compat-tests/current/client/tests/NO_DOCS
deleted file mode 100644
index 61c9b1a..0000000
--- a/media-compat/version-compat-tests/current/client/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/media-compat/version-compat-tests/current/service/build.gradle b/media-compat/version-compat-tests/current/service/build.gradle
index 3cb3a49..2a247df 100644
--- a/media-compat/version-compat-tests/current/service/build.gradle
+++ b/media-compat/version-compat-tests/current/service/build.gradle
@@ -26,7 +26,3 @@
 
     androidTestImplementation(TEST_RUNNER)
 }
-
-supportLibrary {
-    legacySourceLocation = true
-}
diff --git a/media-compat/version-compat-tests/current/service/tests/AndroidManifest.xml b/media-compat/version-compat-tests/current/service/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/current/service/tests/AndroidManifest.xml
rename to media-compat/version-compat-tests/current/service/src/androidTest/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/current/service/tests/NO_DOCS b/media-compat/version-compat-tests/current/service/src/androidTest/NO_DOCS
similarity index 100%
rename from media-compat/version-compat-tests/current/service/tests/NO_DOCS
rename to media-compat/version-compat-tests/current/service/src/androidTest/NO_DOCS
diff --git a/media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java b/media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
similarity index 100%
rename from media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
rename to media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
diff --git a/media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/ServiceBroadcastReceiver.java b/media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/ServiceBroadcastReceiver.java
similarity index 100%
rename from media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/ServiceBroadcastReceiver.java
rename to media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/ServiceBroadcastReceiver.java
diff --git a/media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java b/media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
similarity index 100%
rename from media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
rename to media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
diff --git a/media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java b/media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
similarity index 100%
rename from media-compat/version-compat-tests/current/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
rename to media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
diff --git a/media-compat/version-compat-tests/lib/build.gradle b/media-compat/version-compat-tests/lib/build.gradle
index db9f2ae..caa6c7e 100644
--- a/media-compat/version-compat-tests/lib/build.gradle
+++ b/media-compat/version-compat-tests/lib/build.gradle
@@ -23,7 +23,3 @@
 dependencies {
     implementation(JUNIT)
 }
-
-supportLibrary {
-    legacySourceLocation = true
-}
diff --git a/media-compat/version-compat-tests/previous/client/build.gradle b/media-compat/version-compat-tests/previous/client/build.gradle
index 2788a1a..31f33fe 100644
--- a/media-compat/version-compat-tests/previous/client/build.gradle
+++ b/media-compat/version-compat-tests/previous/client/build.gradle
@@ -26,13 +26,3 @@
 
     androidTestImplementation(TEST_RUNNER)
 }
-
-android {
-    defaultConfig {
-        minSdkVersion 14
-    }
-}
-
-supportLibrary {
-    legacySourceLocation = true
-}
\ No newline at end of file
diff --git a/media-compat/version-compat-tests/previous/client/tests/AndroidManifest.xml b/media-compat/version-compat-tests/previous/client/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/tests/AndroidManifest.xml
rename to media-compat/version-compat-tests/previous/client/src/androidTest/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/AudioAttributesCompatTest.java b/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/AudioAttributesCompatTest.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/AudioAttributesCompatTest.java
rename to media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/AudioAttributesCompatTest.java
diff --git a/media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/ClientBroadcastReceiver.java b/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/ClientBroadcastReceiver.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/ClientBroadcastReceiver.java
rename to media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/ClientBroadcastReceiver.java
diff --git a/media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/MediaBrowserCompatTest.java b/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserCompatTest.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/MediaBrowserCompatTest.java
rename to media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserCompatTest.java
diff --git a/media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java b/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
rename to media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
diff --git a/media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/MediaItemTest.java b/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaItemTest.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/MediaItemTest.java
rename to media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaItemTest.java
diff --git a/media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/PlaybackStateCompatTest.java b/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/PlaybackStateCompatTest.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/tests/src/android/support/mediacompat/client/PlaybackStateCompatTest.java
rename to media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/PlaybackStateCompatTest.java
diff --git a/media-compat/version-compat-tests/previous/client/tests/NO_DOCS b/media-compat/version-compat-tests/previous/client/tests/NO_DOCS
deleted file mode 100644
index 61c9b1a..0000000
--- a/media-compat/version-compat-tests/previous/client/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/media-compat/version-compat-tests/previous/service/build.gradle b/media-compat/version-compat-tests/previous/service/build.gradle
index 469f6e4..765e406 100644
--- a/media-compat/version-compat-tests/previous/service/build.gradle
+++ b/media-compat/version-compat-tests/previous/service/build.gradle
@@ -21,18 +21,8 @@
 }
 
 dependencies {
-    androidTestImplementation project(':support-media-compat-test-lib')
+    androidTestImplementation(project(":support-media-compat-test-lib"))
     androidTestImplementation "com.android.support:support-media-compat:27.0.1"
 
     androidTestImplementation(TEST_RUNNER)
 }
-
-android {
-    defaultConfig {
-        minSdkVersion 14
-    }
-}
-
-supportLibrary {
-    legacySourceLocation = true
-}
diff --git a/media-compat/version-compat-tests/previous/service/tests/AndroidManifest.xml b/media-compat/version-compat-tests/previous/service/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/tests/AndroidManifest.xml
rename to media-compat/version-compat-tests/previous/service/src/androidTest/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/previous/service/tests/NO_DOCS b/media-compat/version-compat-tests/previous/service/src/androidTest/NO_DOCS
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/tests/NO_DOCS
rename to media-compat/version-compat-tests/previous/service/src/androidTest/NO_DOCS
diff --git a/media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java b/media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
rename to media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
diff --git a/media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/ServiceBroadcastReceiver.java b/media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/ServiceBroadcastReceiver.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/ServiceBroadcastReceiver.java
rename to media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/ServiceBroadcastReceiver.java
diff --git a/media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java b/media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
rename to media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
diff --git a/media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java b/media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/tests/src/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
rename to media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
diff --git a/paging/integration-tests/testapp/build.gradle b/paging/integration-tests/testapp/build.gradle
index b26ca78..d1b0aec 100644
--- a/paging/integration-tests/testapp/build.gradle
+++ b/paging/integration-tests/testapp/build.gradle
@@ -30,8 +30,8 @@
     implementation(project(":lifecycle:common"))
     implementation(project(":paging:runtime"))
     implementation(MULTIDEX)
-    implementation(SUPPORT_RECYCLERVIEW, libs.support_exclude_config)
-    implementation(SUPPORT_APPCOMPAT, libs.support_exclude_config)
+    implementation(SUPPORT_RECYCLERVIEW_27, libs.support_exclude_config)
+    implementation(SUPPORT_APPCOMPAT_27, libs.support_exclude_config)
 }
 
 tasks['check'].dependsOn(tasks['connectedCheck'])
diff --git a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/Item.java b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/Item.java
index 70f2133..94d25a8 100644
--- a/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/Item.java
+++ b/paging/integration-tests/testapp/src/main/java/android/arch/paging/integration/testapp/Item.java
@@ -17,7 +17,7 @@
 package android.arch.paging.integration.testapp;
 
 import android.support.annotation.NonNull;
-import android.support.v7.recyclerview.extensions.DiffCallback;
+import android.support.v7.util.DiffUtil;
 
 /**
  * Sample item.
@@ -45,7 +45,7 @@
                 && this.text.equals(item.text);
     }
 
-    static final DiffCallback<Item> DIFF_CALLBACK = new DiffCallback<Item>() {
+    static final DiffUtil.ItemCallback<Item> DIFF_CALLBACK = new DiffUtil.ItemCallback<Item>() {
         @Override
         public boolean areContentsTheSame(@NonNull Item oldItem, @NonNull Item newItem) {
             return oldItem.equals(newItem);
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 d1ae5ab..9432124 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 PagedList item Adapter, which uses a PagedListAdapterHelper.
+ * Sample PagedList item Adapter, which uses a AsyncPagedListDiffer.
  */
 class PagedListItemAdapter extends PagedListAdapter<Item, RecyclerView.ViewHolder> {
 
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 f1f233f..f031cdb 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
@@ -44,7 +44,7 @@
         viewModel.getLivePagedList().observe(this, new Observer<PagedList<Item>>() {
             @Override
             public void onChanged(@Nullable PagedList<Item> items) {
-                adapter.setList(items);
+                adapter.submitList(items);
             }
         });
         final Button button = findViewById(R.id.button);
diff --git a/paging/runtime/build.gradle b/paging/runtime/build.gradle
index 7e9d73c..4c42b30 100644
--- a/paging/runtime/build.gradle
+++ b/paging/runtime/build.gradle
@@ -30,7 +30,7 @@
     api(project(":lifecycle:runtime"))
     api(project(":lifecycle:livedata"))
 
-    api(SUPPORT_RECYCLERVIEW, libs.support_exclude_config)
+    api(SUPPORT_RECYCLERVIEW_27, libs.support_exclude_config)
 
     androidTestImplementation(JUNIT)
     androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
@@ -48,4 +48,4 @@
     inceptionYear = "2017"
     description = "Android Paging-Runtime"
     url = SupportLibraryExtension.ARCHITECTURE_URL
-}
\ No newline at end of file
+}
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/PagedListAdapterHelperTest.kt b/paging/runtime/src/androidTest/java/android/arch/paging/AsyncPagedListDifferTest.kt
similarity index 87%
rename from paging/runtime/src/androidTest/java/android/arch/paging/PagedListAdapterHelperTest.kt
rename to paging/runtime/src/androidTest/java/android/arch/paging/AsyncPagedListDifferTest.kt
index d50b8d9..4817c6c 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/PagedListAdapterHelperTest.kt
+++ b/paging/runtime/src/androidTest/java/android/arch/paging/AsyncPagedListDifferTest.kt
@@ -17,8 +17,8 @@
 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.recyclerview.extensions.AsyncDifferConfig
+import android.support.v7.util.DiffUtil
 import android.support.v7.util.ListUpdateCallback
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertFalse
@@ -36,16 +36,15 @@
 
 @SmallTest
 @RunWith(JUnit4::class)
-class PagedListAdapterHelperTest {
+class AsyncPagedListDifferTest {
     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)
+                                 diffCallback: DiffUtil.ItemCallback<T>): AsyncPagedListDiffer<T> {
+        return AsyncPagedListDiffer(listUpdateCallback,
+                AsyncDifferConfig.Builder<T>(diffCallback)
                         .setMainThreadExecutor(mMainThread)
                         .setBackgroundThreadExecutor(mDiffThread)
                         .build())
@@ -73,7 +72,7 @@
     fun setFullList() {
         val callback = mock(ListUpdateCallback::class.java)
         val helper = createHelper(callback, STRING_DIFF_CALLBACK)
-        helper.setList(StringPagedList(0, 0, "a", "b"))
+        helper.submitList(StringPagedList(0, 0, "a", "b"))
 
         assertEquals(2, helper.itemCount)
         assertEquals("a", helper.getItem(0))
@@ -94,14 +93,14 @@
     @Test(expected = IndexOutOfBoundsException::class)
     fun getNegative() {
         val helper = createHelper(IGNORE_CALLBACK, STRING_DIFF_CALLBACK)
-        helper.setList(StringPagedList(0, 0, "a", "b"))
+        helper.submitList(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.submitList(StringPagedList(0, 0, "a", "b"))
         helper.getItem(2)
     }
 
@@ -112,7 +111,7 @@
 
         assertEquals(0, helper.itemCount)
 
-        helper.setList(StringPagedList(2, 2, "a", "b"))
+        helper.submitList(StringPagedList(2, 2, "a", "b"))
 
         verify(callback).onInserted(0, 6)
         verifyNoMoreInteractions(callback)
@@ -137,7 +136,7 @@
         val callback = mock(ListUpdateCallback::class.java)
         val helper = createHelper(callback, STRING_DIFF_CALLBACK)
 
-        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
+        helper.submitList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
         verify(callback).onInserted(0, ALPHABET_LIST.size)
         verifyNoMoreInteractions(callback)
         drain()
@@ -166,7 +165,7 @@
         verifyNoMoreInteractions(callback)
 
         // finally, clear
-        helper.setList(null)
+        helper.submitList(null)
         verify(callback).onRemoved(0, 26)
         drain()
         verifyNoMoreInteractions(callback)
@@ -183,7 +182,7 @@
         val helper = createHelper(callback, STRING_DIFF_CALLBACK)
 
         // initial list missing one item (immediate)
-        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST.subList(0, 25), 0))
+        helper.submitList(createPagedListFromListAndPos(config, ALPHABET_LIST.subList(0, 25), 0))
         verify(callback).onInserted(0, 25)
         verifyNoMoreInteractions(callback)
         assertEquals(helper.itemCount, 25)
@@ -191,7 +190,7 @@
         verifyNoMoreInteractions(callback)
 
         // pass second list with full data
-        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 0))
+        helper.submitList(createPagedListFromListAndPos(config, ALPHABET_LIST, 0))
         verifyNoMoreInteractions(callback)
         drain()
         verify(callback).onInserted(25, 1)
@@ -199,7 +198,7 @@
         assertEquals(helper.itemCount, 26)
 
         // finally, clear (immediate)
-        helper.setList(null)
+        helper.submitList(null)
         verify(callback).onRemoved(0, 26)
         verifyNoMoreInteractions(callback)
         drain()
@@ -217,7 +216,7 @@
         val callback = mock(ListUpdateCallback::class.java)
         val helper = createHelper(callback, STRING_DIFF_CALLBACK)
 
-        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
+        helper.submitList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
         verify(callback).onInserted(0, ALPHABET_LIST.size)
         verifyNoMoreInteractions(callback)
         drain()
@@ -227,7 +226,7 @@
 
         // trigger page loading
         helper.getItem(10)
-        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
+        helper.submitList(createPagedListFromListAndPos(config, ALPHABET_LIST, 2))
         verifyNoMoreInteractions(callback)
 
         // drain page fetching, but list became immutable, page will be ignored
@@ -249,7 +248,7 @@
 
         val expectedCount = intArrayOf(0)
         // provides access to helper, which must be constructed after callback
-        val helperAccessor = arrayOf<PagedListAdapterHelper<*>?>(null)
+        val helperAccessor = arrayOf<AsyncPagedListDiffer<*>?>(null)
 
         val callback = object : ListUpdateCallback {
             override fun onInserted(position: Int, count: Int) {
@@ -279,20 +278,20 @@
         // in the fast-add case...
         expectedCount[0] = 5
         assertEquals(0, helper.itemCount)
-        helper.setList(createPagedListFromListAndPos(config, ALPHABET_LIST.subList(0, 5), 0))
+        helper.submitList(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))
+        helper.submitList(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)
+        helper.submitList(null)
         assertEquals(0, helper.itemCount)
     }
 
@@ -316,7 +315,7 @@
     companion object {
         private val ALPHABET_LIST = List(26) { "" + 'a' + it }
 
-        private val STRING_DIFF_CALLBACK = object : DiffCallback<String>() {
+        private val STRING_DIFF_CALLBACK = object : DiffUtil.ItemCallback<String>() {
             override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
                 return oldItem == newItem
             }
diff --git a/paging/runtime/src/androidTest/java/android/arch/paging/PagedStorageDiffHelperTest.kt b/paging/runtime/src/androidTest/java/android/arch/paging/PagedStorageDiffHelperTest.kt
index 44a98e9..8b885f2 100644
--- a/paging/runtime/src/androidTest/java/android/arch/paging/PagedStorageDiffHelperTest.kt
+++ b/paging/runtime/src/androidTest/java/android/arch/paging/PagedStorageDiffHelperTest.kt
@@ -17,7 +17,7 @@
 package android.arch.paging
 
 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.Assert.assertEquals
 import org.junit.Test
@@ -97,7 +97,7 @@
     }
 
     companion object {
-        private val DIFF_CALLBACK = object : DiffCallback<String>() {
+        private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<String>() {
             override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
                 // first char means same item
                 return oldItem[0] == newItem[0]
@@ -111,8 +111,7 @@
         private fun validateTwoListDiff(oldList: PagedStorage<String>,
                                         newList: PagedStorage<String>,
                                         validator: (callback: ListUpdateCallback) -> Unit) {
-            val diffResult = PagedStorageDiffHelper.computeDiff(
-                    oldList, newList, DIFF_CALLBACK)
+            val diffResult = PagedStorageDiffHelper.computeDiff(oldList, newList, DIFF_CALLBACK)
 
             val listUpdateCallback = mock(ListUpdateCallback::class.java)
             PagedStorageDiffHelper.dispatchDiff(listUpdateCallback, oldList, newList, diffResult)
diff --git a/paging/runtime/src/main/java/android/arch/paging/PagedListAdapterHelper.java b/paging/runtime/src/main/java/android/arch/paging/AsyncPagedListDiffer.java
similarity index 86%
rename from paging/runtime/src/main/java/android/arch/paging/PagedListAdapterHelper.java
rename to paging/runtime/src/main/java/android/arch/paging/AsyncPagedListDiffer.java
index ba8ffab..f01bc5c 100644
--- a/paging/runtime/src/main/java/android/arch/paging/PagedListAdapterHelper.java
+++ b/paging/runtime/src/main/java/android/arch/paging/AsyncPagedListDiffer.java
@@ -17,10 +17,10 @@
 package android.arch.paging;
 
 import android.arch.lifecycle.LiveData;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.v7.recyclerview.extensions.DiffCallback;
-import android.support.v7.recyclerview.extensions.ListAdapterConfig;
-import android.support.v7.recyclerview.extensions.ListAdapterHelper;
+import android.support.v7.recyclerview.extensions.AsyncDifferConfig;
+import android.support.v7.util.AdapterListUpdateCallback;
 import android.support.v7.util.DiffUtil;
 import android.support.v7.util.ListUpdateCallback;
 import android.support.v7.widget.RecyclerView;
@@ -36,7 +36,7 @@
  * Both the internal paging of the list as more data is loaded, and updates in the form of new
  * PagedLists.
  * <p>
- * The PagedListAdapterHelper can be bound to a {@link LiveData} of PagedList and present the data
+ * The AsyncPagedListDiffer can be bound to a {@link LiveData} of PagedList and present the data
  * simply for an adapter. It listens to PagedList loading callbacks, and uses DiffUtil on a
  * background thread to compute updates as new PagedLists are received.
  * <p>
@@ -66,28 +66,28 @@
  *         MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
  *         RecyclerView recyclerView = findViewById(R.id.user_list);
  *         final UserAdapter&lt;User> adapter = new UserAdapter();
- *         viewModel.usersList.observe(this, pagedList -> adapter.setList(pagedList));
+ *         viewModel.usersList.observe(this, pagedList -> adapter.submitList(pagedList));
  *         recyclerView.setAdapter(adapter);
  *     }
  * }
  *
  * class UserAdapter extends RecyclerView.Adapter&lt;UserViewHolder> {
- *     private final PagedListAdapterHelper&lt;User> mHelper
- *             = new PagedListAdapterHelper(this, DIFF_CALLBACK);
+ *     private final AsyncPagedListDiffer&lt;User> mDiffer
+ *             = new AsyncPagedListDiffer(this, DIFF_CALLBACK);
  *     {@literal @}Override
  *     public int getItemCount() {
- *         return mHelper.getItemCount();
+ *         return mDiffer.getItemCount();
  *     }
- *     public void setList(PagedList&lt;User> pagedList) {
- *         mHelper.setList(pagedList);
+ *     public void submitList(PagedList&lt;User> pagedList) {
+ *         mDiffer.submitList(pagedList);
  *     }
  *     {@literal @}Override
  *     public void onBindViewHolder(UserViewHolder holder, int position) {
- *         User user = mHelper.getItem(position);
+ *         User user = mDiffer.getItem(position);
  *         if (user != null) {
  *             holder.bindTo(user);
  *         } else {
- *             // Null defines a placeholder item - PagedListAdapterHelper will automatically
+ *             // Null defines a placeholder item - AsyncPagedListDiffer will automatically
  *             // invalidate this row when the actual object is loaded from the database
  *             holder.clear();
  *         }
@@ -111,11 +111,11 @@
  *
  * @param <T> Type of the PagedLists this helper will receive.
  */
-public class PagedListAdapterHelper<T> {
+public class AsyncPagedListDiffer<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;
+    private final AsyncDifferConfig<T> mConfig;
 
     // TODO: REAL API
     interface PagedListListener<T> {
@@ -134,21 +134,23 @@
     private int mMaxScheduledGeneration;
 
     /**
-     * Convenience for {@code PagedListAdapterHelper(new ListAdapterHelper.AdapterCallback(adapter),
-     * new ListAdapterConfig.Builder<T>().setDiffCallback(diffCallback).build());
+     * Convenience for {@code AsyncPagedListDiffer(new AdapterListUpdateCallback(adapter),
+     * new AsyncDifferConfig.Builder<T>(diffCallback).build();}
      *
      * @param adapter Adapter that will receive update signals.
-     * @param diffCallback The {@link DiffCallback } instance to compare items in the list.
+     * @param diffCallback The {@link DiffUtil.ItemCallback DiffUtil.ItemCallback} instance to
+     * compare items in the list.
      */
     @SuppressWarnings("WeakerAccess")
-    public PagedListAdapterHelper(RecyclerView.Adapter adapter, DiffCallback<T> diffCallback) {
-        mUpdateCallback = new ListAdapterHelper.AdapterCallback(adapter);
-        mConfig = new ListAdapterConfig.Builder<T>().setDiffCallback(diffCallback).build();
+    public AsyncPagedListDiffer(@NonNull RecyclerView.Adapter adapter,
+            @NonNull DiffUtil.ItemCallback<T> diffCallback) {
+        mUpdateCallback = new AdapterListUpdateCallback(adapter);
+        mConfig = new AsyncDifferConfig.Builder<T>(diffCallback).build();
     }
 
     @SuppressWarnings("WeakerAccess")
-    public PagedListAdapterHelper(ListUpdateCallback listUpdateCallback,
-            ListAdapterConfig<T> config) {
+    public AsyncPagedListDiffer(@NonNull ListUpdateCallback listUpdateCallback,
+            @NonNull AsyncDifferConfig<T> config) {
         mUpdateCallback = listUpdateCallback;
         mConfig = config;
     }
@@ -219,7 +221,7 @@
      *
      * @param pagedList The new PagedList.
      */
-    public void setList(final PagedList<T> pagedList) {
+    public void submitList(final PagedList<T> pagedList) {
         if (pagedList != null) {
             if (mPagedList == null && mSnapshot == null) {
                 mIsContiguous = pagedList.isContiguous();
@@ -285,6 +287,7 @@
         final PagedList<T> newSnapshot = (PagedList<T>) pagedList.snapshot();
         mConfig.getBackgroundThreadExecutor().execute(new Runnable() {
             @Override
+            @SuppressWarnings("RestrictedApi")
             public void run() {
                 final DiffUtil.DiffResult result;
                 result = PagedStorageDiffHelper.computeDiff(
@@ -328,9 +331,9 @@
     /**
      * Returns the list currently being displayed by the AdapterHelper.
      * <p>
-     * This is not necessarily the most recent list passed to {@link #setList(PagedList)}, because a
-     * diff is computed asynchronously between the new list and the current list before updating the
-     * currentList value.
+     * This is not necessarily the most recent list passed to {@link #submitList(PagedList)},
+     * because a diff is computed asynchronously between the new list and the current list before
+     * updating the currentList value.
      *
      * @return The list currently being displayed.
      */
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 be23271..0470da1 100644
--- a/paging/runtime/src/main/java/android/arch/paging/PagedListAdapter.java
+++ b/paging/runtime/src/main/java/android/arch/paging/PagedListAdapter.java
@@ -18,20 +18,20 @@
 
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.v7.recyclerview.extensions.DiffCallback;
-import android.support.v7.recyclerview.extensions.ListAdapterConfig;
-import android.support.v7.recyclerview.extensions.ListAdapterHelper;
+import android.support.v7.recyclerview.extensions.AsyncDifferConfig;
+import android.support.v7.util.AdapterListUpdateCallback;
+import android.support.v7.util.DiffUtil;
 import android.support.v7.widget.RecyclerView;
 
 /**
  * {@link RecyclerView.Adapter RecyclerView.Adapter} base class for presenting paged data from
  * {@link PagedList}s in a {@link RecyclerView}.
  * <p>
- * This class is a convenience wrapper around PagedListAdapterHelper that implements common default
+ * This class is a convenience wrapper around AsyncPagedListDiffer that implements common default
  * behavior for item counting, and listening to PagedList update callbacks.
  * <p>
  * While using a LiveData&lt;PagedList> is an easy way to provide data to the adapter, it isn't
- * required - you can use {@link #setList(PagedList)} when new lists are available.
+ * required - you can use {@link #submitList(PagedList)} when new lists are available.
  * <p>
  * PagedListAdapter listens to PagedList loading callbacks as pages are loaded, and uses DiffUtil on
  * a background thread to compute fine grained updates as new PagedLists are received.
@@ -62,7 +62,7 @@
  *         MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
  *         RecyclerView recyclerView = findViewById(R.id.user_list);
  *         UserAdapter&lt;User> adapter = new UserAdapter();
- *         viewModel.usersList.observe(this, pagedList -> adapter.setList(pagedList));
+ *         viewModel.usersList.observe(this, pagedList -> adapter.submitList(pagedList));
  *         recyclerView.setAdapter(adapter);
  *     }
  * }
@@ -100,7 +100,7 @@
  * }</pre>
  *
  * Advanced users that wish for more control over adapter behavior, or to provide a specific base
- * class should refer to {@link PagedListAdapterHelper}, which provides the mapping from paging
+ * class should refer to {@link AsyncPagedListDiffer}, which provides the mapping from paging
  * events to adapter-friendly callbacks.
  *
  * @param <T> Type of the PagedLists this helper will receive.
@@ -108,9 +108,9 @@
  */
 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>() {
+    private final AsyncPagedListDiffer<T> mHelper;
+    private final AsyncPagedListDiffer.PagedListListener<T> mListener =
+            new AsyncPagedListDiffer.PagedListListener<T>() {
         @Override
         public void onCurrentListChanged(@Nullable PagedList<T> currentList) {
             PagedListAdapter.this.onCurrentListChanged(currentList);
@@ -121,19 +121,20 @@
      * Creates a PagedListAdapter with default threading and
      * {@link android.support.v7.util.ListUpdateCallback}.
      *
-     * Convenience for {@link #PagedListAdapter(ListAdapterConfig)}, which uses default threading
+     * Convenience for {@link #PagedListAdapter(AsyncDifferConfig)}, which uses default threading
      * behavior.
      *
-     * @param diffCallback The {@link DiffCallback} instance to compare items in the list.
+     * @param diffCallback The {@link DiffUtil.ItemCallback DiffUtil.ItemCallback} instance to
+     *                     compare items in the list.
      */
-    protected PagedListAdapter(@NonNull DiffCallback<T> diffCallback) {
-        mHelper = new PagedListAdapterHelper<>(this, diffCallback);
+    protected PagedListAdapter(@NonNull DiffUtil.ItemCallback<T> diffCallback) {
+        mHelper = new AsyncPagedListDiffer<>(this, diffCallback);
         mHelper.mListener = mListener;
     }
 
     @SuppressWarnings("unused, WeakerAccess")
-    protected PagedListAdapter(@NonNull ListAdapterConfig<T> config) {
-        mHelper = new PagedListAdapterHelper<>(new ListAdapterHelper.AdapterCallback(this), config);
+    protected PagedListAdapter(@NonNull AsyncDifferConfig<T> config) {
+        mHelper = new AsyncPagedListDiffer<>(new AdapterListUpdateCallback(this), config);
         mHelper.mListener = mListener;
     }
 
@@ -145,8 +146,8 @@
      *
      * @param pagedList The new list to be displayed.
      */
-    public void setList(PagedList<T> pagedList) {
-        mHelper.setList(pagedList);
+    public void submitList(PagedList<T> pagedList) {
+        mHelper.submitList(pagedList);
     }
 
     @Nullable
@@ -162,9 +163,9 @@
     /**
      * Returns the list currently being displayed by the Adapter.
      * <p>
-     * This is not necessarily the most recent list passed to {@link #setList(PagedList)}, because a
-     * diff is computed asynchronously between the new list and the current list before updating the
-     * currentList value.
+     * This is not necessarily the most recent list passed to {@link #submitList(PagedList)},
+     * because a diff is computed asynchronously between the new list and the current list before
+     * updating the currentList value.
      *
      * @return The list currently being displayed.
      */
@@ -176,7 +177,7 @@
     /**
      * Called when the current PagedList is updated.
      * <p>
-     * This may be dispatched as part of {@link #setList(PagedList)} if a background diff isn't
+     * This may be dispatched as part of {@link #submitList(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)}.
diff --git a/paging/runtime/src/main/java/android/arch/paging/PagedStorageDiffHelper.java b/paging/runtime/src/main/java/android/arch/paging/PagedStorageDiffHelper.java
index d991b72..f495608 100644
--- a/paging/runtime/src/main/java/android/arch/paging/PagedStorageDiffHelper.java
+++ b/paging/runtime/src/main/java/android/arch/paging/PagedStorageDiffHelper.java
@@ -17,7 +17,6 @@
 package android.arch.paging;
 
 import android.support.annotation.Nullable;
-import android.support.v7.recyclerview.extensions.DiffCallback;
 import android.support.v7.util.DiffUtil;
 import android.support.v7.util.ListUpdateCallback;
 
@@ -28,7 +27,7 @@
     static <T> DiffUtil.DiffResult computeDiff(
             final PagedStorage<T> oldList,
             final PagedStorage<T> newList,
-            final DiffCallback<T> diffCallback) {
+            final DiffUtil.ItemCallback<T> diffCallback) {
         final int oldOffset = oldList.computeLeadingNulls();
         final int newOffset = newList.computeLeadingNulls();
 
diff --git a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/DiffCallback.java b/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/DiffCallback.java
index 70fc049..2083a5f 100644
--- a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/DiffCallback.java
+++ b/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/DiffCallback.java
@@ -16,50 +16,21 @@
 
 package android.support.v7.recyclerview.extensions;
 
-import android.arch.paging.PagedListAdapterHelper;
-import android.support.annotation.NonNull;
+import android.arch.paging.AsyncPagedListDiffer;
+import android.support.v7.util.DiffUtil;
 
 /**
- * Callback that informs {@link PagedListAdapterHelper} how to compute list updates when using
+ * Callback that informs {@link AsyncPagedListDiffer} how to compute list updates when using
  * {@link android.support.v7.util.DiffUtil} on a background thread.
  * <p>
  * The AdapterHelper will pass items from different lists to this callback in order to implement
  * the {@link android.support.v7.util.DiffUtil.Callback} it uses to compute differences between
  * lists.
- * <p>
- * Note that this class is likely to move prior to the final release of the Paging library.
  *
  * @param <T> Type of items to compare.
+ *
+ * @deprecated use {@link DiffUtil.ItemCallback DiffUtil.ItemCallback} directly starting in 27.1.0
  */
-public abstract class DiffCallback<T> {
-    /**
-     * Called to decide whether two objects represent the same item.
-     *
-     * @param oldItem The item in the old list.
-     * @param newItem The item in the new list.
-     * @return True if the two items represent the same object or false if they are different.
-     * @see android.support.v7.util.DiffUtil.Callback#areItemsTheSame(int, int)
-     */
-    public abstract boolean areItemsTheSame(@NonNull T oldItem, @NonNull T newItem);
-
-    /**
-     * Called to decide whether two items have the same data. This information is used to detect if
-     * the contents of an item have changed.
-     *
-     * @param oldItem The item in the old list.
-     * @param newItem The item in the new list.
-     * @return True if the contents of the items are the same or false if they are different.
-     * @see android.support.v7.util.DiffUtil.Callback#areContentsTheSame(int, int)
-     */
-    public abstract boolean areContentsTheSame(@NonNull T oldItem, @NonNull T newItem);
-
-    /**
-     * Called to get a change payload between an old and new version of an item.
-     *
-     * @see android.support.v7.util.DiffUtil.Callback#getChangePayload(int, int)
-     */
-    @SuppressWarnings("WeakerAccess")
-    public Object getChangePayload(@NonNull T oldItem, @NonNull T newItem) {
-        return null;
-    }
+@Deprecated
+public abstract class DiffCallback<T> extends DiffUtil.ItemCallback<T> {
 }
diff --git a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapter.java b/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapter.java
deleted file mode 100644
index 8b28072..0000000
--- a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapter.java
+++ /dev/null
@@ -1,129 +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 android.support.annotation.NonNull;
-import android.support.v7.widget.RecyclerView;
-
-import java.util.List;
-
-/**
- * {@link RecyclerView.Adapter RecyclerView.Adapter} base class for presenting List data in a
- * {@link RecyclerView}, including computing diffs between Lists on a background thread.
- * <p>
- * This class is a convenience wrapper around ListAdapterHelper that implements common default
- * behavior for item access and counting.
- * <p>
- * While using a LiveData&lt;List> is an easy way to provide data to the adapter, it isn't required
- * - you can use {@link #setList(List)} when new lists are available.
- * <p>
- * A complete usage pattern with Room would look like this:
- * <pre>
- * {@literal @}Dao
- * interface UserDao {
- *     {@literal @}Query("SELECT * FROM user ORDER BY lastName ASC")
- *     public abstract LiveData&lt;List&lt;User>> usersByLastName();
- * }
- *
- * class MyViewModel extends ViewModel {
- *     public final LiveData&lt;List&lt;User>> usersList;
- *     public MyViewModel(UserDao userDao) {
- *         usersList = userDao.usersByLastName();
- *     }
- * }
- *
- * class MyActivity extends AppCompatActivity {
- *     {@literal @}Override
- *     public void onCreate(Bundle savedState) {
- *         super.onCreate(savedState);
- *         MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
- *         RecyclerView recyclerView = findViewById(R.id.user_list);
- *         UserAdapter&lt;User> adapter = new UserAdapter();
- *         viewModel.usersList.observe(this, list -> adapter.setList(list));
- *         recyclerView.setAdapter(adapter);
- *     }
- * }
- *
- * class UserAdapter extends ListAdapter&lt;User, UserViewHolder> {
- *     public UserAdapter() {
- *         super(User.DIFF_CALLBACK);
- *     }
- *     {@literal @}Override
- *     public void onBindViewHolder(UserViewHolder holder, int position) {
- *         holder.bindTo(getItem(position));
- *     }
- *     public static final DiffCallback&lt;User> DIFF_CALLBACK = new DiffCallback&lt;User>() {
- *         {@literal @}Override
- *         public boolean areItemsTheSame(
- *                 {@literal @}NonNull User oldUser, {@literal @}NonNull User newUser) {
- *             // User properties may have changed if reloaded from the DB, but ID is fixed
- *             return oldUser.getId() == newUser.getId();
- *         }
- *         {@literal @}Override
- *         public boolean areContentsTheSame(
- *                 {@literal @}NonNull User oldUser, {@literal @}NonNull User newUser) {
- *             // NOTE: if you use equals, your object must properly override Object#equals()
- *             // Incorrectly returning false here will result in too many animations.
- *             return oldUser.equals(newUser);
- *         }
- *     }
- * }</pre>
- *
- * Advanced users that wish for more control over adapter behavior, or to provide a specific base
- * class should refer to {@link ListAdapterHelper}, which provides custom mapping from diff events
- * to adapter positions.
- *
- * @param <T> Type of the Lists this Adapter will receive.
- * @param <VH> A class that extends ViewHolder that will be used by the adapter.
- */
-public abstract class ListAdapter<T, VH extends RecyclerView.ViewHolder>
-        extends RecyclerView.Adapter<VH> {
-    private final ListAdapterHelper<T> mHelper;
-
-    @SuppressWarnings("unused")
-    protected ListAdapter(@NonNull DiffCallback<T> diffCallback) {
-        mHelper = new ListAdapterHelper<>(new ListAdapterHelper.AdapterCallback(this),
-                new ListAdapterConfig.Builder<T>().setDiffCallback(diffCallback).build());
-    }
-
-    @SuppressWarnings("unused")
-    protected ListAdapter(@NonNull ListAdapterConfig<T> config) {
-        mHelper = new ListAdapterHelper<>(new ListAdapterHelper.AdapterCallback(this), config);
-    }
-
-    /**
-     * Set the new list to be displayed.
-     * <p>
-     * If a list is already being displayed, a diff will be computed on a background thread, which
-     * will dispatch Adapter.notifyItem events on the main thread.
-     *
-     * @param list The new list to be displayed.
-     */
-    public void setList(List<T> list) {
-        mHelper.setList(list);
-    }
-
-    @SuppressWarnings("unused")
-    protected T getItem(int position) {
-        return mHelper.getItem(position);
-    }
-
-    @Override
-    public int getItemCount() {
-        return mHelper.getItemCount();
-    }
-}
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 25697a1..13036a7 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
@@ -17,25 +17,35 @@
 package android.support.v7.recyclerview.extensions;
 
 import android.arch.core.executor.ArchTaskExecutor;
+import android.support.v7.util.DiffUtil;
 
 import java.util.concurrent.Executor;
 
 /**
- * Configuration object for {@link ListAdapter}, {@link ListAdapterHelper}, and similar
+ * Configuration object for {@link ListAdapterHelper}, and similar
  * background-thread list diffing adapter logic.
  * <p>
- * At minimum, defines item diffing behavior with a {@link DiffCallback}, used to compute item
- * differences to pass to a RecyclerView adapter.
+ * At minimum, defines item diffing behavior with a {@link DiffUtil.ItemCallback}, used to compute
+ * item differences to pass to a RecyclerView adapter.
  *
- * @param <T> Type of items in the lists, and being compared.
+ * @param <T> List item type being compared by the {@link DiffUtil.ItemCallback}.
+ *
+ * @deprecated use {@link android.support.v7.recyclerview.extensions.AsyncDifferConfig} in the
+ * RecyclerView module, starting in 27.1.0. It can be used with
+ * {@link android.support.v7.recyclerview.extensions.ListAdapter} and
+ * {@link android.support.v7.recyclerview.extensions.AsyncListDiffer} in the recyclerview module, as
+ * well as {@link android.arch.paging.PagedListAdapter} and
+ * {@link android.arch.paging.AsyncPagedListDiffer} in the paging library. It is being moved from
+ * the Paging Library to RecyclerView since it is useful independent of paging.
  */
+@Deprecated
 public final class ListAdapterConfig<T> {
     private final Executor mMainThreadExecutor;
     private final Executor mBackgroundThreadExecutor;
-    private final DiffCallback<T> mDiffCallback;
+    private final DiffUtil.ItemCallback<T> mDiffCallback;
 
     private ListAdapterConfig(Executor mainThreadExecutor, Executor backgroundThreadExecutor,
-            DiffCallback<T> diffCallback) {
+            DiffUtil.ItemCallback<T> diffCallback) {
         mMainThreadExecutor = mainThreadExecutor;
         mBackgroundThreadExecutor = backgroundThreadExecutor;
         mDiffCallback = diffCallback;
@@ -49,31 +59,33 @@
         return mBackgroundThreadExecutor;
     }
 
-    public DiffCallback<T> getDiffCallback() {
+    public DiffUtil.ItemCallback<T> getDiffCallback() {
         return mDiffCallback;
     }
 
     /**
      * Builder class for {@link ListAdapterConfig}.
      * <p>
-     * You must at minimum specify a DiffCallback with {@link #setDiffCallback(DiffCallback)}
+     * You must at minimum specify a DiffUtil.ItemCallback with
+     * {@link #setDiffCallback(DiffUtil.ItemCallback)}
      *
      * @param <T>
      */
     public static class Builder<T> {
         private Executor mMainThreadExecutor;
         private Executor mBackgroundThreadExecutor;
-        private DiffCallback<T> mDiffCallback;
+        private DiffUtil.ItemCallback<T> mDiffCallback;
 
         /**
-         * The {@link DiffCallback} to be used while diffing an old list with the updated one.
-         * Must be provided.
+         * The {@link DiffUtil.ItemCallback} to be used while diffing an old list with the updated
+         * one. Must be provided.
          *
-         * @param diffCallback The {@link DiffCallback} instance to compare items in the list.
+         * @param diffCallback The {@link DiffUtil.ItemCallback} instance to compare items in the
+         *                     list.
          * @return this
          */
         @SuppressWarnings("WeakerAccess")
-        public ListAdapterConfig.Builder<T> setDiffCallback(DiffCallback<T> diffCallback) {
+        public ListAdapterConfig.Builder<T> setDiffCallback(DiffUtil.ItemCallback<T> diffCallback) {
             mDiffCallback = diffCallback;
             return this;
         }
diff --git a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterHelper.java b/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterHelper.java
index 0c7806f..81d8a20 100644
--- a/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterHelper.java
+++ b/paging/runtime/src/main/java/android/support/v7/recyclerview/extensions/ListAdapterHelper.java
@@ -17,21 +17,19 @@
 package android.support.v7.recyclerview.extensions;
 
 import android.arch.lifecycle.LiveData;
-import android.support.annotation.RestrictTo;
 import android.support.v7.util.DiffUtil;
 import android.support.v7.util.ListUpdateCallback;
-import android.support.v7.widget.RecyclerView;
 
 import java.util.List;
 
 /**
- * Helper object for displaying a List in {@link RecyclerView.Adapter RecyclerView.Adapter}, which
- * signals the adapter of changes when the List is changed by computing changes with DiffUtil in the
- * background.
+ * Helper object for displaying a List in {@link android.support.v7.widget.RecyclerView.Adapter
+ * RecyclerView.Adapter}, which signals the adapter of changes when the List is changed by computing
+ * changes with DiffUtil in the background.
  * <p>
- * For simplicity, the {@link ListAdapter} wrapper class can often be used instead of the
- * helper directly. This helper class is exposed for complex cases, and where overriding an adapter
- * base class to support List diffing isn't convenient.
+ * For simplicity, the {@link android.support.v7.recyclerview.extensions.ListAdapter} wrapper class
+ * can often be used instead of the helper directly. This helper class is exposed for complex cases,
+ * and where overriding an adapter base class to support List diffing isn't convenient.
  * <p>
  * The ListAdapterHelper can take a {@link LiveData} of List and present the data simply for an
  * adapter. It computes differences in List contents via DiffUtil on a background thread as new
@@ -39,68 +37,13 @@
  * <p>
  * It provides a simple list-like API with {@link #getItem(int)} and {@link #getItemCount()} for an
  * adapter to acquire and present data objects.
- * <p>
- * A complete usage pattern with Room would look like this:
- * <pre>
- * {@literal @}Dao
- * interface UserDao {
- *     {@literal @}Query("SELECT * FROM user ORDER BY lastName ASC")
- *     public abstract LiveData&lt;List&lt;User>> usersByLastName();
- * }
- *
- * class MyViewModel extends ViewModel {
- *     public final LiveData&lt;List&lt;User>> usersList;
- *     public MyViewModel(UserDao userDao) {
- *         usersList = userDao.usersByLastName();
- *     }
- * }
- *
- * class MyActivity extends AppCompatActivity {
- *     {@literal @}Override
- *     public void onCreate(Bundle savedState) {
- *         super.onCreate(savedState);
- *         MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
- *         RecyclerView recyclerView = findViewById(R.id.user_list);
- *         UserAdapter&lt;User> adapter = new UserAdapter();
- *         viewModel.usersList.observe(this, list -> adapter.setList(list));
- *         recyclerView.setAdapter(adapter);
- *     }
- * }
- *
- * class UserAdapter extends RecyclerView.Adapter&lt;UserViewHolder> {
- *     private final ListAdapterHelper&lt;User> mHelper
- *             = new ListAdapterHelper(this, User.DIFF_CALLBACK);
- *     {@literal @}Override
- *     public int getItemCount() {
- *         return mHelper.getItemCount();
- *     }
- *     public void setList(List&lt;User> list) {
- *         mHelper.setList(list);
- *     }
- *     {@literal @}Override
- *     public void onBindViewHolder(UserViewHolder holder, int position) {
- *         User user = mHelper.getItem(position);
- *         holder.bindTo(user);
- *     }
- *     public static final DiffCallback&lt;User> DIFF_CALLBACK = new DiffCallback&lt;User>() {
- *         {@literal @}Override
- *         public boolean areItemsTheSame(
- *                 {@literal @}NonNull User oldUser, {@literal @}NonNull User newUser) {
- *             // User properties may have changed if reloaded from the DB, but ID is fixed
- *             return oldUser.getId() == newUser.getId();
- *         }
- *         {@literal @}Override
- *         public boolean areContentsTheSame(
- *                 {@literal @}NonNull User oldUser, {@literal @}NonNull User newUser) {
- *             // NOTE: if you use equals, your object must properly override Object#equals()
- *             // Incorrectly returning false here will result in too many animations.
- *             return oldUser.equals(newUser);
- *         }
- *     }
- * }</pre>
  *
  * @param <T> Type of the lists this helper will receive.
+ * @deprecated use {@link android.support.v7.recyclerview.extensions.AsyncListDiffer} in the
+ * RecyclerView module, starting in 27.1.0. It is being moved from the Paging Library to
+ * RecyclerView since it is useful independent of paging.
  */
+@Deprecated
 public class ListAdapterHelper<T> {
     private final ListUpdateCallback mUpdateCallback;
     private final ListAdapterConfig<T> mConfig;
@@ -112,42 +55,6 @@
         mConfig = config;
     }
 
-    /**
-     * Default ListUpdateCallback that dispatches directly to an adapter. Can be replaced by a
-     * custom ListUpdateCallback if e.g. your adapter has a header in it, and so has an offset
-     * between list positions and adapter positions.
-     *
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public static class AdapterCallback implements ListUpdateCallback {
-        private final RecyclerView.Adapter mAdapter;
-
-        public AdapterCallback(RecyclerView.Adapter adapter) {
-            mAdapter = adapter;
-        }
-
-        @Override
-        public void onInserted(int position, int count) {
-            mAdapter.notifyItemRangeInserted(position, count);
-        }
-
-        @Override
-        public void onRemoved(int position, int count) {
-            mAdapter.notifyItemRangeRemoved(position, count);
-        }
-
-        @Override
-        public void onMoved(int fromPosition, int toPosition) {
-            mAdapter.notifyItemMoved(fromPosition, toPosition);
-        }
-
-        @Override
-        public void onChanged(int position, int count, Object payload) {
-            mAdapter.notifyItemRangeChanged(position, count, payload);
-        }
-    }
-
     private List<T> mList;
 
     // Max generation of currently scheduled runnable
@@ -171,7 +78,7 @@
 
     /**
      * Get the number of items currently presented by this AdapterHelper. This value can be directly
-     * returned to {@link RecyclerView.Adapter#getItemCount()}.
+     * returned to {@link android.support.v7.widget.RecyclerView.Adapter#getItemCount()}.
      *
      * @return Number of items being presented.
      */
diff --git a/pathmap.mk b/pathmap.mk
index a71eb54..ebc023e 100644
--- a/pathmap.mk
+++ b/pathmap.mk
@@ -29,6 +29,7 @@
     android-support-dynamic-animation \
     android-support-exifinterface \
     android-support-fragment \
+    android-support-heifwriter \
     android-support-media-compat \
     android-support-percent \
     android-support-recommendation \
diff --git a/percent/build.gradle b/percent/build.gradle
index 951a0e0..9585323 100644
--- a/percent/build.gradle
+++ b/percent/build.gradle
@@ -26,5 +26,4 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2015"
     description = "Android Percent Support Library"
-    legacySourceLocation = true
 }
diff --git a/percent/tests/AndroidManifest.xml b/percent/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from percent/tests/AndroidManifest.xml
rename to percent/src/androidTest/AndroidManifest.xml
diff --git a/percent/tests/java/android/support/percent/BaseInstrumentationTestCase.java b/percent/src/androidTest/java/android/support/percent/BaseInstrumentationTestCase.java
similarity index 100%
rename from percent/tests/java/android/support/percent/BaseInstrumentationTestCase.java
rename to percent/src/androidTest/java/android/support/percent/BaseInstrumentationTestCase.java
diff --git a/percent/tests/java/android/support/percent/BaseTestActivity.java b/percent/src/androidTest/java/android/support/percent/BaseTestActivity.java
similarity index 100%
rename from percent/tests/java/android/support/percent/BaseTestActivity.java
rename to percent/src/androidTest/java/android/support/percent/BaseTestActivity.java
diff --git a/percent/tests/java/android/support/percent/LayoutDirectionActions.java b/percent/src/androidTest/java/android/support/percent/LayoutDirectionActions.java
similarity index 100%
rename from percent/tests/java/android/support/percent/LayoutDirectionActions.java
rename to percent/src/androidTest/java/android/support/percent/LayoutDirectionActions.java
diff --git a/percent/tests/java/android/support/percent/PercentDynamicLayoutActivity.java b/percent/src/androidTest/java/android/support/percent/PercentDynamicLayoutActivity.java
similarity index 100%
rename from percent/tests/java/android/support/percent/PercentDynamicLayoutActivity.java
rename to percent/src/androidTest/java/android/support/percent/PercentDynamicLayoutActivity.java
diff --git a/percent/tests/java/android/support/percent/PercentDynamicLayoutTest.java b/percent/src/androidTest/java/android/support/percent/PercentDynamicLayoutTest.java
similarity index 100%
rename from percent/tests/java/android/support/percent/PercentDynamicLayoutTest.java
rename to percent/src/androidTest/java/android/support/percent/PercentDynamicLayoutTest.java
diff --git a/percent/tests/java/android/support/percent/PercentFrameTest.java b/percent/src/androidTest/java/android/support/percent/PercentFrameTest.java
similarity index 100%
rename from percent/tests/java/android/support/percent/PercentFrameTest.java
rename to percent/src/androidTest/java/android/support/percent/PercentFrameTest.java
diff --git a/percent/tests/java/android/support/percent/PercentRelativeRtlTest.java b/percent/src/androidTest/java/android/support/percent/PercentRelativeRtlTest.java
similarity index 100%
rename from percent/tests/java/android/support/percent/PercentRelativeRtlTest.java
rename to percent/src/androidTest/java/android/support/percent/PercentRelativeRtlTest.java
diff --git a/percent/tests/java/android/support/percent/PercentRelativeTest.java b/percent/src/androidTest/java/android/support/percent/PercentRelativeTest.java
similarity index 100%
rename from percent/tests/java/android/support/percent/PercentRelativeTest.java
rename to percent/src/androidTest/java/android/support/percent/PercentRelativeTest.java
diff --git a/percent/tests/java/android/support/percent/TestFrameActivity.java b/percent/src/androidTest/java/android/support/percent/TestFrameActivity.java
similarity index 100%
rename from percent/tests/java/android/support/percent/TestFrameActivity.java
rename to percent/src/androidTest/java/android/support/percent/TestFrameActivity.java
diff --git a/percent/tests/java/android/support/percent/TestRelativeActivity.java b/percent/src/androidTest/java/android/support/percent/TestRelativeActivity.java
similarity index 100%
rename from percent/tests/java/android/support/percent/TestRelativeActivity.java
rename to percent/src/androidTest/java/android/support/percent/TestRelativeActivity.java
diff --git a/percent/tests/java/android/support/percent/TestRelativeRtlActivity.java b/percent/src/androidTest/java/android/support/percent/TestRelativeRtlActivity.java
similarity index 100%
rename from percent/tests/java/android/support/percent/TestRelativeRtlActivity.java
rename to percent/src/androidTest/java/android/support/percent/TestRelativeRtlActivity.java
diff --git a/percent/tests/res/layout/percent_dynamic_layout.xml b/percent/src/androidTest/res/layout/percent_dynamic_layout.xml
similarity index 100%
rename from percent/tests/res/layout/percent_dynamic_layout.xml
rename to percent/src/androidTest/res/layout/percent_dynamic_layout.xml
diff --git a/percent/tests/res/layout/percent_frame_layout.xml b/percent/src/androidTest/res/layout/percent_frame_layout.xml
similarity index 100%
rename from percent/tests/res/layout/percent_frame_layout.xml
rename to percent/src/androidTest/res/layout/percent_frame_layout.xml
diff --git a/percent/tests/res/layout/percent_frame_layout_hpaddings.xml b/percent/src/androidTest/res/layout/percent_frame_layout_hpaddings.xml
similarity index 100%
rename from percent/tests/res/layout/percent_frame_layout_hpaddings.xml
rename to percent/src/androidTest/res/layout/percent_frame_layout_hpaddings.xml
diff --git a/percent/tests/res/layout/percent_frame_layout_vpaddings.xml b/percent/src/androidTest/res/layout/percent_frame_layout_vpaddings.xml
similarity index 100%
rename from percent/tests/res/layout/percent_frame_layout_vpaddings.xml
rename to percent/src/androidTest/res/layout/percent_frame_layout_vpaddings.xml
diff --git a/percent/tests/res/layout/percent_relative_layout.xml b/percent/src/androidTest/res/layout/percent_relative_layout.xml
similarity index 100%
rename from percent/tests/res/layout/percent_relative_layout.xml
rename to percent/src/androidTest/res/layout/percent_relative_layout.xml
diff --git a/percent/tests/res/layout/percent_relative_layout_hpaddings.xml b/percent/src/androidTest/res/layout/percent_relative_layout_hpaddings.xml
similarity index 100%
rename from percent/tests/res/layout/percent_relative_layout_hpaddings.xml
rename to percent/src/androidTest/res/layout/percent_relative_layout_hpaddings.xml
diff --git a/percent/tests/res/layout/percent_relative_layout_rtl.xml b/percent/src/androidTest/res/layout/percent_relative_layout_rtl.xml
similarity index 100%
rename from percent/tests/res/layout/percent_relative_layout_rtl.xml
rename to percent/src/androidTest/res/layout/percent_relative_layout_rtl.xml
diff --git a/percent/tests/res/layout/percent_relative_layout_vpaddings.xml b/percent/src/androidTest/res/layout/percent_relative_layout_vpaddings.xml
similarity index 100%
rename from percent/tests/res/layout/percent_relative_layout_vpaddings.xml
rename to percent/src/androidTest/res/layout/percent_relative_layout_vpaddings.xml
diff --git a/percent/tests/NO_DOCS b/percent/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/percent/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/preference-leanback/build.gradle b/preference-leanback/build.gradle
index 26b1bda..fc88f28 100644
--- a/preference-leanback/build.gradle
+++ b/preference-leanback/build.gradle
@@ -29,6 +29,5 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2015"
     description = "Android Support Leanback Preference v17"
-    legacySourceLocation = true
     minSdkVersion = 17
 }
\ No newline at end of file
diff --git a/core-utils/src/main/java/android/support/v4/print/OWNERS b/print/OWNERS
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/print/OWNERS
rename to print/OWNERS
diff --git a/print/api/current.txt b/print/api/current.txt
new file mode 100644
index 0000000..5277150
--- /dev/null
+++ b/print/api/current.txt
@@ -0,0 +1,29 @@
+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();
+  }
+
+}
+
diff --git a/print/build.gradle b/print/build.gradle
new file mode 100644
index 0000000..78fc9db
--- /dev/null
+++ b/print/build.gradle
@@ -0,0 +1,19 @@
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    api(project(":support-annotations"))
+}
+
+supportLibrary {
+    name = "Android Support Library Print"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
+    inceptionYear = "2018"
+    description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
+}
diff --git a/print/src/main/AndroidManifest.xml b/print/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..bccf7e2
--- /dev/null
+++ b/print/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest package="android.support.print"/>
diff --git a/core-utils/src/main/java/android/support/v4/print/PrintHelper.java b/print/src/main/java/android/support/v4/print/PrintHelper.java
similarity index 100%
rename from core-utils/src/main/java/android/support/v4/print/PrintHelper.java
rename to print/src/main/java/android/support/v4/print/PrintHelper.java
diff --git a/recommendation/build.gradle b/recommendation/build.gradle
index bf2265d..b401eb8 100644
--- a/recommendation/build.gradle
+++ b/recommendation/build.gradle
@@ -16,6 +16,5 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2015"
     description = "Android Support Recommendation"
-    legacySourceLocation = true
     minSdkVersion = 21
 }
diff --git a/recyclerview-selection/build.gradle b/recyclerview-selection/build.gradle
index d468582..c0915bc 100644
--- a/recyclerview-selection/build.gradle
+++ b/recyclerview-selection/build.gradle
@@ -23,9 +23,9 @@
 }
 
 dependencies {
-    api project(':recyclerview-v7')
-    api project(':support-annotations')
-    api project(':support-compat')
+    api(project(":recyclerview-v7"))
+    api(project(":support-annotations"))
+    api(project(":support-compat"))
 
     androidTestImplementation(TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
@@ -34,21 +34,11 @@
     androidTestImplementation(JUNIT)
 }
 
-android {
-    defaultConfig {
-        minSdkVersion 14
-    }
-    sourceSets {
-        main.res.srcDirs 'res', 'res-public'
-    }
-}
-
 supportLibrary {
-    name 'Android RecyclerView Selection'
-    publish false
+    name = "Android RecyclerView Selection"
+    publish = false
     mavenVersion = LibraryVersions.SUPPORT_LIBRARY
     mavenGroup = LibraryGroups.SUPPORT
-    inceptionYear '2017'
-    description 'Library providing item selection framework for RecyclerView. Support for touch based and band selection is provided.'
-    legacySourceLocation true
+    inceptionYear = "2017"
+    description = "Library providing item selection framework for RecyclerView. Support for touch based and band selection is provided."
 }
diff --git a/recyclerview-selection/tests/AndroidManifest.xml b/recyclerview-selection/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from recyclerview-selection/tests/AndroidManifest.xml
rename to recyclerview-selection/src/androidTest/AndroidManifest.xml
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/BandSelectionHelperTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/BandSelectionHelperTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/BandSelectionHelperTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/BandSelectionHelperTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/DefaultSelectionTrackerTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/DefaultSelectionTrackerTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/DefaultSelectionTrackerTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/DefaultSelectionTrackerTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GestureRouterTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GestureRouterTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GestureRouterTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GestureRouterTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GestureSelectionHelperTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GestureSelectionHelperTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GestureSelectionHelperTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GestureSelectionHelperTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GestureSelectionHelper_RecyclerViewDelegateTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GestureSelectionHelper_RecyclerViewDelegateTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GestureSelectionHelper_RecyclerViewDelegateTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GestureSelectionHelper_RecyclerViewDelegateTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GridModelTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GridModelTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/GridModelTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/GridModelTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/MouseInputHandlerTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/MouseInputHandlerTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/MouseInputHandlerTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/MouseInputHandlerTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/MouseInputHandler_RangeTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/MouseInputHandler_RangeTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/MouseInputHandler_RangeTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/MouseInputHandler_RangeTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/OperationMonitorTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/OperationMonitorTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/OperationMonitorTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/OperationMonitorTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/RangeTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/RangeTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/RangeTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/RangeTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/SelectionTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/SelectionTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/SelectionTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/SelectionTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/SelectionTracker_InstanceStateTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/SelectionTracker_InstanceStateTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/SelectionTracker_InstanceStateTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/SelectionTracker_InstanceStateTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/StorageStrategy_LongTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/StorageStrategy_LongTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/StorageStrategy_LongTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/StorageStrategy_LongTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/StorageStrategy_ParcelableTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/StorageStrategy_ParcelableTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/StorageStrategy_ParcelableTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/StorageStrategy_ParcelableTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/StorageStrategy_StringTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/StorageStrategy_StringTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/StorageStrategy_StringTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/StorageStrategy_StringTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/TouchInputHandlerTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/TouchInputHandlerTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/TouchInputHandlerTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/TouchInputHandlerTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/ViewAutoScrollerTest.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/ViewAutoScrollerTest.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/ViewAutoScrollerTest.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/ViewAutoScrollerTest.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/Bundles.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/Bundles.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/Bundles.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/Bundles.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/SelectionProbe.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/SelectionProbe.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/SelectionProbe.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/SelectionProbe.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/SelectionTrackers.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/SelectionTrackers.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/SelectionTrackers.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/SelectionTrackers.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestAdapter.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestAdapter.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestAdapter.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestAdapter.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestAutoScroller.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestAutoScroller.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestAutoScroller.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestAutoScroller.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestBandPredicate.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestBandPredicate.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestBandPredicate.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestBandPredicate.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestData.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestData.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestData.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestData.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestEvents.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestEvents.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestEvents.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestEvents.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestFocusDelegate.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestFocusDelegate.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestFocusDelegate.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestFocusDelegate.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestHolder.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestHolder.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestHolder.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestHolder.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestItemDetails.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestItemDetails.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestItemDetails.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestItemDetails.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestItemDetailsLookup.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestItemDetailsLookup.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestItemDetailsLookup.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestItemDetailsLookup.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestItemKeyProvider.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestItemKeyProvider.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestItemKeyProvider.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestItemKeyProvider.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestOnContextClickListener.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestOnContextClickListener.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestOnContextClickListener.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestOnContextClickListener.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestOnItemActivatedListener.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestOnItemActivatedListener.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestOnItemActivatedListener.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestOnItemActivatedListener.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestRunnable.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestRunnable.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestRunnable.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestRunnable.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestSelectionObserver.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestSelectionObserver.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestSelectionObserver.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestSelectionObserver.java
diff --git a/recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestSelectionPredicate.java b/recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestSelectionPredicate.java
similarity index 100%
rename from recyclerview-selection/tests/java/androidx/widget/recyclerview/selection/testing/TestSelectionPredicate.java
rename to recyclerview-selection/src/androidTest/java/androidx/widget/recyclerview/selection/testing/TestSelectionPredicate.java
diff --git a/recyclerview-selection/res/drawable/selection_band_overlay.xml b/recyclerview-selection/src/main/res/drawable/selection_band_overlay.xml
similarity index 100%
rename from recyclerview-selection/res/drawable/selection_band_overlay.xml
rename to recyclerview-selection/src/main/res/drawable/selection_band_overlay.xml
diff --git a/recyclerview-selection/tests/NO_DOCS b/recyclerview-selection/tests/NO_DOCS
deleted file mode 100644
index 61c9b1a..0000000
--- a/recyclerview-selection/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/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 fc0df44..313f968 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
@@ -49,7 +49,7 @@
 
 class EntityProcessor(baseContext: Context,
                       val element: TypeElement,
-                      val referenceStack: LinkedHashSet<Name> = LinkedHashSet<Name>()) {
+                      private val referenceStack: LinkedHashSet<Name> = LinkedHashSet()) {
     val context = baseContext.fork(element)
 
     fun process(): Entity {
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoMethodProcessor.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoMethodProcessor.kt
new file mode 100644
index 0000000..e08b816
--- /dev/null
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/processor/PojoMethodProcessor.kt
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.processor
+
+import android.arch.persistence.room.vo.PojoMethod
+import com.google.auto.common.MoreTypes
+import javax.lang.model.element.ExecutableElement
+import javax.lang.model.type.DeclaredType
+
+/**
+ * processes an executable element as member of the owning class
+ */
+class PojoMethodProcessor(
+        private val context: Context,
+        private val element: ExecutableElement,
+        private val owner: DeclaredType) {
+    fun process(): PojoMethod {
+        val asMember = context.processingEnv.typeUtils.asMemberOf(owner, element)
+        val name = element.simpleName.toString()
+        return PojoMethod(
+                element = element,
+                resolvedType = MoreTypes.asExecutable(asMember),
+                name = name
+        )
+    }
+}
\ No newline at end of file
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 46e9089..d5cd8d2 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
@@ -43,6 +43,7 @@
 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.PojoMethod
 import android.arch.persistence.room.vo.Warning
 import com.google.auto.common.AnnotationMirrors
 import com.google.auto.common.MoreElements
@@ -72,11 +73,12 @@
 /**
  * Processes any class as if it is a Pojo.
  */
-class PojoProcessor(baseContext: Context,
-                    val element: TypeElement,
-                    val bindingScope: FieldProcessor.BindingScope,
-                    val parent: EmbeddedField?,
-                    val referenceStack: LinkedHashSet<Name> = LinkedHashSet())
+class PojoProcessor(
+        baseContext: Context,
+        val element: TypeElement,
+        val bindingScope: FieldProcessor.BindingScope,
+        val parent: EmbeddedField?,
+        val referenceStack: LinkedHashSet<Name> = LinkedHashSet())
     : KotlinMetadataUtils {
     val context = baseContext.fork(element)
 
@@ -184,13 +186,20 @@
                             && !it.hasAnnotation(Ignore::class)
                 }
                 .map { MoreElements.asExecutable(it) }
+                .map {
+                    PojoMethodProcessor(
+                            context = context,
+                            element = it,
+                            owner = declaredType
+                    ).process()
+                }
 
         val getterCandidates = methods.filter {
-            it.parameters.size == 0 && it.returnType.kind != TypeKind.VOID
+            it.element.parameters.size == 0 && it.resolvedType.returnType.kind != TypeKind.VOID
         }
 
         val setterCandidates = methods.filter {
-            it.parameters.size == 1 && it.returnType.kind == TypeKind.VOID
+            it.element.parameters.size == 1 && it.resolvedType.returnType.kind == TypeKind.VOID
         }
 
         // don't try to find a constructor for binding to statement.
@@ -585,18 +594,18 @@
         return referenceRecursionList.joinToString(" -> ")
     }
 
-    private fun assignGetters(fields: List<Field>, getterCandidates: List<ExecutableElement>) {
+    private fun assignGetters(fields: List<Field>, getterCandidates: List<PojoMethod>) {
         fields.forEach { field ->
             assignGetter(field, getterCandidates)
         }
     }
 
-    private fun assignGetter(field: Field, getterCandidates: List<ExecutableElement>) {
+    private fun assignGetter(field: Field, getterCandidates: List<PojoMethod>) {
         val success = chooseAssignment(field = field,
                 candidates = getterCandidates,
                 nameVariations = field.getterNameWithVariations,
                 getType = { method ->
-                    method.returnType
+                    method.resolvedType.returnType
                 },
                 assignFromField = {
                     field.getter = FieldGetter(
@@ -606,8 +615,8 @@
                 },
                 assignFromMethod = { match ->
                     field.getter = FieldGetter(
-                            name = match.simpleName.toString(),
-                            type = match.returnType,
+                            name = match.name,
+                            type = match.resolvedType.returnType,
                             callType = CallType.METHOD)
                 },
                 reportAmbiguity = { matching ->
@@ -617,15 +626,19 @@
         context.checker.check(success, field.element, CANNOT_FIND_GETTER_FOR_FIELD)
     }
 
-    private fun assignSetters(fields: List<Field>, setterCandidates: List<ExecutableElement>,
-                              constructor: Constructor?) {
+    private fun assignSetters(
+            fields: List<Field>,
+            setterCandidates: List<PojoMethod>,
+            constructor: Constructor?) {
         fields.forEach { field ->
             assignSetter(field, setterCandidates, constructor)
         }
     }
 
-    private fun assignSetter(field: Field, setterCandidates: List<ExecutableElement>,
-                             constructor: Constructor?) {
+    private fun assignSetter(
+            field: Field,
+            setterCandidates: List<PojoMethod>,
+            constructor: Constructor?) {
         if (constructor != null && constructor.hasField(field)) {
             field.setter = FieldSetter(field.name, field.type, CallType.CONSTRUCTOR)
             return
@@ -634,7 +647,7 @@
                 candidates = setterCandidates,
                 nameVariations = field.setterNameWithVariations,
                 getType = { method ->
-                    method.parameters.first().asType()
+                    method.resolvedType.parameterTypes.first()
                 },
                 assignFromField = {
                     field.setter = FieldSetter(
@@ -643,9 +656,9 @@
                             callType = CallType.FIELD)
                 },
                 assignFromMethod = { match ->
-                    val paramType = match.parameters.first().asType()
+                    val paramType = match.resolvedType.parameterTypes.first()
                     field.setter = FieldSetter(
-                            name = match.simpleName.toString(),
+                            name = match.name,
                             type = paramType,
                             callType = CallType.METHOD)
                 },
@@ -662,12 +675,15 @@
      * At worst case, it sets to the field as if it is accessible so that the rest of the
      * compilation can continue.
      */
-    private fun chooseAssignment(field: Field, candidates: List<ExecutableElement>,
-                                 nameVariations: List<String>,
-                                 getType: (ExecutableElement) -> TypeMirror,
-                                 assignFromField: () -> Unit,
-                                 assignFromMethod: (ExecutableElement) -> Unit,
-                                 reportAmbiguity: (List<String>) -> Unit): Boolean {
+    private fun chooseAssignment(
+            field: Field,
+            candidates: List<PojoMethod>,
+            nameVariations: List<String>,
+            getType: (PojoMethod) -> TypeMirror,
+            assignFromField: () -> Unit,
+            assignFromMethod: (PojoMethod) -> Unit,
+            reportAmbiguity: (List<String>) -> Unit
+    ): Boolean {
         if (field.element.hasAnyOf(PUBLIC)) {
             assignFromField()
             return true
@@ -677,12 +693,12 @@
         val matching = candidates
                 .filter {
                     // b/69164099
-                    types.isAssignableWithoutVariance(getType(it), field.element.asType())
-                            && (field.nameWithVariations.contains(it.simpleName.toString())
-                            || nameVariations.contains(it.simpleName.toString()))
+                    types.isAssignableWithoutVariance(getType(it), field.type)
+                            && (field.nameWithVariations.contains(it.name)
+                            || nameVariations.contains(it.name))
                 }
                 .groupBy {
-                    if (it.hasAnyOf(PUBLIC)) PUBLIC else PROTECTED
+                    if (it.element.hasAnyOf(PUBLIC)) PUBLIC else PROTECTED
                 }
         if (matching.isEmpty()) {
             // we always assign to avoid NPEs in the rest of the compilation.
@@ -691,8 +707,8 @@
             // if not, compiler will tell, we didn't have any better alternative anyways.
             return !field.element.hasAnyOf(PRIVATE)
         }
-        val match = verifyAndChooseOneFrom(matching[PUBLIC], reportAmbiguity) ?:
-                verifyAndChooseOneFrom(matching[PROTECTED], reportAmbiguity)
+        val match = verifyAndChooseOneFrom(matching[PUBLIC], reportAmbiguity)
+                ?: verifyAndChooseOneFrom(matching[PROTECTED], reportAmbiguity)
         if (match == null) {
             assignFromField()
             return false
@@ -703,14 +719,14 @@
     }
 
     private fun verifyAndChooseOneFrom(
-            candidates: List<ExecutableElement>?,
+            candidates: List<PojoMethod>?,
             reportAmbiguity: (List<String>) -> Unit
-    ): ExecutableElement? {
+    ): PojoMethod? {
         if (candidates == null) {
             return null
         }
         if (candidates.size > 1) {
-            reportAmbiguity(candidates.map { it.simpleName.toString() })
+            reportAmbiguity(candidates.map { it.name })
         }
         return candidates.first()
     }
diff --git a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java b/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/PojoMethod.kt
similarity index 63%
copy from core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
copy to room/compiler/src/main/kotlin/android/arch/persistence/room/vo/PojoMethod.kt
index ac61704..2a59ef8 100644
--- a/core-ui/tests/java/android/support/design/widget/DynamicCoordinatorLayoutActivity.java
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/vo/PojoMethod.kt
@@ -14,16 +14,15 @@
  * limitations under the License.
  */
 
-package android.support.design.widget;
+package android.arch.persistence.room.vo
 
-import android.support.coreui.test.R;
+import javax.lang.model.element.ExecutableElement
+import javax.lang.model.type.ExecutableType
 
 /**
- * Test activity for testing various aspects of {@link CoordinatorLayout}.
+ * An executable element processed as member of a class (pojo or entity)
  */
-public class DynamicCoordinatorLayoutActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.dynamic_coordinator_layout;
-    }
-}
+class PojoMethod(
+        val element: ExecutableElement,
+        val resolvedType: ExecutableType,
+        val name: String)
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/build.gradle b/room/integration-tests/kotlintestapp/build.gradle
index 8203416..1dc0a79 100644
--- a/room/integration-tests/kotlintestapp/build.gradle
+++ b/room/integration-tests/kotlintestapp/build.gradle
@@ -44,8 +44,7 @@
     implementation(project(":persistence:db-framework"))
     implementation(project(":room:runtime"))
     implementation(project(":arch:runtime"))
-
-    implementation(SUPPORT_APPCOMPAT, libs.support_exclude_config)
+    implementation(project(":lifecycle:extensions"))
     kaptAndroidTest project(":room:compiler")
 
     androidTestImplementation(TEST_RUNNER) {
@@ -76,4 +75,4 @@
 supportTestApp {
     // to assert that room generates somewhat OK code.
     enableErrorProne = true
-}
\ No newline at end of file
+}
diff --git a/room/integration-tests/testapp/build.gradle b/room/integration-tests/testapp/build.gradle
index 00712f8..45ec9c6 100644
--- a/room/integration-tests/testapp/build.gradle
+++ b/room/integration-tests/testapp/build.gradle
@@ -47,8 +47,8 @@
     implementation(project(":room:rxjava2"))
     implementation(project(":paging:runtime"))
 
-    implementation(SUPPORT_RECYCLERVIEW, libs.support_exclude_config)
-    implementation(SUPPORT_APPCOMPAT, libs.support_exclude_config)
+    implementation(SUPPORT_RECYCLERVIEW_27, libs.support_exclude_config)
+    implementation(SUPPORT_APPCOMPAT_27, libs.support_exclude_config)
     annotationProcessor project(":room:compiler")
     androidTestAnnotationProcessor project(":room:compiler")
 
@@ -75,4 +75,4 @@
 supportTestApp {
     // to assert that room generates somewhat OK code.
     enableErrorProne = true
-}
\ No newline at end of file
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/GenericEntityTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/GenericEntityTest.java
new file mode 100644
index 0000000..6db28d4
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/GenericEntityTest.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.MatcherAssert.assertThat;
+
+import android.arch.persistence.room.Dao;
+import android.arch.persistence.room.Database;
+import android.arch.persistence.room.Entity;
+import android.arch.persistence.room.Insert;
+import android.arch.persistence.room.PrimaryKey;
+import android.arch.persistence.room.Query;
+import android.arch.persistence.room.Room;
+import android.arch.persistence.room.RoomDatabase;
+import android.support.annotation.NonNull;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Objects;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class GenericEntityTest {
+    private GenericDb mDb;
+    private GenericDao mDao;
+
+    @Before
+    public void init() {
+        mDb = Room.inMemoryDatabaseBuilder(
+                InstrumentationRegistry.getTargetContext(),
+                GenericDb.class
+        ).build();
+        mDao = mDb.getDao();
+    }
+
+    @After
+    public void close() {
+        mDb.close();
+    }
+
+    @Test
+    public void readWriteEntity() {
+        EntityItem item = new EntityItem("abc", "def");
+        mDao.insert(item);
+        EntityItem received = mDao.get("abc");
+        assertThat(received, is(item));
+    }
+
+    @Test
+    public void readPojo() {
+        EntityItem item = new EntityItem("abc", "def");
+        mDao.insert(item);
+        PojoItem received = mDao.getPojo("abc");
+        assertThat(received.id, is("abc"));
+    }
+
+    static class Item<P, F> {
+        @NonNull
+        @PrimaryKey
+        public final P id;
+        private F mField;
+
+        Item(@NonNull P id) {
+            this.id = id;
+        }
+
+        public F getField() {
+            return mField;
+        }
+
+        public void setField(F field) {
+            mField = field;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            Item<?, ?> item = (Item<?, ?>) o;
+            return Objects.equals(id, item.id)
+                    && Objects.equals(mField, item.mField);
+        }
+
+        @Override
+        public int hashCode() {
+
+            return Objects.hash(id, mField);
+        }
+    }
+
+    static class PojoItem extends Item<String, Integer> {
+        PojoItem(String id) {
+            super(id);
+        }
+    }
+
+    @Entity
+    static class EntityItem extends Item<String, Integer> {
+        public final String name;
+
+        EntityItem(String id, String name) {
+            super(id);
+            this.name = name;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            EntityItem item = (EntityItem) o;
+            return Objects.equals(name, item.name);
+        }
+
+        @Override
+        public int hashCode() {
+
+            return Objects.hash(name);
+        }
+    }
+
+    @Dao
+    public interface GenericDao {
+        @Insert
+        void insert(EntityItem... items);
+
+        @Query("SELECT * FROM EntityItem WHERE id = :id")
+        EntityItem get(String id);
+
+        @Query("SELECT * FROM EntityItem WHERE id = :id")
+        PojoItem getPojo(String id);
+    }
+
+    @Database(version = 1, entities = {EntityItem.class}, exportSchema = false)
+    public abstract static class GenericDb extends RoomDatabase {
+        abstract GenericDao getDao();
+    }
+}
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/PagedListCustomerAdapter.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/PagedListCustomerAdapter.java
index b5f635c..eacea99 100644
--- a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/PagedListCustomerAdapter.java
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/PagedListCustomerAdapter.java
@@ -27,7 +27,7 @@
 import android.widget.TextView;
 
 /**
- * Sample adapter which uses a PagedListAdapterHelper.
+ * Sample adapter which uses a AsyncPagedListDiffer.
  */
 class PagedListCustomerAdapter extends PagedListAdapter<Customer, RecyclerView.ViewHolder> {
     private RecyclerView mRecyclerView;
@@ -78,8 +78,8 @@
     }
 
     @Override
-    public void setList(PagedList<Customer> pagedList) {
-        super.setList(pagedList);
+    public void submitList(PagedList<Customer> pagedList) {
+        super.submitList(pagedList);
 
         if (pagedList != null) {
             final boolean firstSet = !mSetObserved;
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 0c79aee..66620ef 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
@@ -17,17 +17,14 @@
 package android.arch.persistence.room.integration.testapp;
 
 import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.Observer;
 import android.arch.lifecycle.ViewModelProviders;
 import android.arch.paging.PagedList;
 import android.arch.persistence.room.integration.testapp.database.Customer;
 import android.arch.persistence.room.integration.testapp.database.LastNameAscCustomerDataSource;
 import android.os.Bundle;
-import android.support.annotation.Nullable;
 import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
-import android.view.View;
 import android.widget.Button;
 
 /**
@@ -68,19 +65,9 @@
             }
             livePagedList = viewModel.getLivePagedList(position);
         }
-        livePagedList.observe(this, new Observer<PagedList<Customer>>() {
-            @Override
-            public void onChanged(@Nullable PagedList<Customer> items) {
-                mAdapter.setList(items);
-            }
-        });
+        livePagedList.observe(this, items -> mAdapter.submitList(items));
         final Button button = findViewById(R.id.addButton);
-        button.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                viewModel.insertCustomer();
-            }
-        });
+        button.setOnClickListener(v -> viewModel.insertCustomer());
     }
 
     @Override
diff --git a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/Customer.java b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/Customer.java
index 65e9828..54fa531 100644
--- a/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/Customer.java
+++ b/room/integration-tests/testapp/src/main/java/android/arch/persistence/room/integration/testapp/database/Customer.java
@@ -19,7 +19,7 @@
 import android.arch.persistence.room.Entity;
 import android.arch.persistence.room.PrimaryKey;
 import android.support.annotation.NonNull;
-import android.support.v7.recyclerview.extensions.DiffCallback;
+import android.support.v7.util.DiffUtil;
 
 /**
  * Sample entity
@@ -96,7 +96,8 @@
                 + '}';
     }
 
-    public static final DiffCallback<Customer> DIFF_CALLBACK = new DiffCallback<Customer>() {
+    public static final DiffUtil.ItemCallback<Customer> DIFF_CALLBACK =
+            new DiffUtil.ItemCallback<Customer>() {
         @Override
         public boolean areContentsTheSame(@NonNull Customer oldItem, @NonNull Customer newItem) {
             return oldItem.equals(newItem);
diff --git a/samples/SupportDesignDemos/proguard.flags b/samples/SupportDesignDemos/proguard.flags
deleted file mode 100644
index 9ebd737..0000000
--- a/samples/SupportDesignDemos/proguard.flags
+++ /dev/null
@@ -1,7 +0,0 @@
--keep public class * extends android.support.design.widget.CoordinatorLayout$Behavior {
-    public <init>(android.content.Context, android.util.AttributeSet);
-}
-
--keep public class * extends android.support.v7.widget.LinearLayoutManager {
-    public <init>(android.content.Context, android.util.AttributeSet, int, int);
-}
diff --git a/samples/SupportPreferenceDemos/proguard.flags b/samples/SupportPreferenceDemos/proguard.flags
deleted file mode 100644
index 9ebd737..0000000
--- a/samples/SupportPreferenceDemos/proguard.flags
+++ /dev/null
@@ -1,7 +0,0 @@
--keep public class * extends android.support.design.widget.CoordinatorLayout$Behavior {
-    public <init>(android.content.Context, android.util.AttributeSet);
-}
-
--keep public class * extends android.support.v7.widget.LinearLayoutManager {
-    public <init>(android.content.Context, android.util.AttributeSet, int, int);
-}
diff --git a/samples/SupportTransitionDemos/proguard.flags b/samples/SupportTransitionDemos/proguard.flags
deleted file mode 100644
index e69de29..0000000
--- a/samples/SupportTransitionDemos/proguard.flags
+++ /dev/null
diff --git a/settings.gradle b/settings.gradle
index 03eba38..a87dcfe 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -35,28 +35,39 @@
 
 includeProject(":animated-vector-drawable", "graphics/drawable/animated")
 includeProject(":appcompat-v7", "v7/appcompat")
+includeProject(":asynclayoutinflater", "asynclayoutinflater")
 includeProject(":car", "car")
 includeProject(":cardview-v7", "v7/cardview")
+includeProject(":collections", "collections")
+includeProject(":coordinatorlayout", "coordinatorlayout")
 includeProject(":customtabs", "customtabs")
+includeProject(":customview", "customview")
+includeProject(":documentfile", "documentfile")
+includeProject(":drawerlayout", "drawerlayout")
 includeProject(":exifinterface", "exifinterface")
 includeProject(":gridlayout-v7", "v7/gridlayout")
+includeProject(":heifwriter", "heifwriter")
+includeProject(":interpolator", "interpolator")
 includeProject(":jetifier-core", "jetifier/jetifier/core")
 includeProject(":jetifier-gradle-plugin", "jetifier/jetifier/gradle-plugin")
 includeProject(":jetifier-standalone", "jetifier/jetifier/standalone")
 includeProject(":jetifier-preprocessor", "jetifier/jetifier/preprocessor")
 includeProject(":leanback-v17", "leanback")
+includeProject(":localbroadcastmanager", "localbroadcastmanager")
 includeProject(":mediarouter-v7", "v7/mediarouter")
 includeProject(":palette-v7", "v7/palette")
 includeProject(":percent", "percent")
 includeProject(":preference-v7", "v7/preference")
 includeProject(":preference-v14", "v14/preference")
 includeProject(":preference-leanback-v17", "preference-leanback")
+includeProject(":print", "print")
 includeProject(":recommendation", "recommendation")
 includeProject(":recyclerview-v7", "v7/recyclerview")
 includeProject(":recyclerview-selection", "recyclerview-selection")
 includeProject(":slices-core", "slices/core")
 includeProject(":slices-view", "slices/view")
 includeProject(":slices-builders", "slices/builders")
+includeProject(":slidingpanelayout", "slidingpanelayout")
 includeProject(":support-annotations", "annotations")
 includeProject(":support-compat", "compat")
 includeProject(":support-content", "content")
@@ -72,8 +83,10 @@
 includeProject(":support-vector-drawable", "graphics/drawable/static")
 includeProject(":support-v4", "v4")
 includeProject(":support-v13", "v13")
+includeProject(":swiperefreshlayout", "swiperefreshlayout")
 includeProject(":textclassifier", "textclassifier")
 includeProject(":transition", "transition")
+includeProject(":viewpager", "viewpager")
 includeProject(":viewpager2", "viewpager2")
 includeProject(":wear", "wear")
 includeProject(":webkit", "webkit")
@@ -136,6 +149,7 @@
 File externalRoot = new File(rootDir, "../../external")
 
 includeProject(":noto-emoji-compat", new File(externalRoot, "noto-fonts/emoji-compat"))
+includeProject(":webview-support-interfaces", new File(externalRoot, "webview_support_interfaces"))
 
 ///// FLATFOOT START
 
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/ListBuilder.java b/slices/builders/src/main/java/androidx/app/slice/builders/ListBuilder.java
index b7ba1b8..fd7ac96 100644
--- a/slices/builders/src/main/java/androidx/app/slice/builders/ListBuilder.java
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/ListBuilder.java
@@ -24,6 +24,7 @@
 import android.graphics.drawable.Icon;
 import android.net.Uri;
 import android.os.Build;
+import android.support.annotation.ColorInt;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
@@ -160,7 +161,7 @@
      */
     @RestrictTo(LIBRARY_GROUP)
     @NonNull
-    public ListBuilder setColor(int color) {
+    public ListBuilder setColor(@ColorInt int color) {
         mImpl.setColor(color);
         return this;
     }
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilder.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilder.java
index 7291143..c16da2b 100644
--- a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilder.java
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilder.java
@@ -21,6 +21,7 @@
 import android.app.PendingIntent;
 import android.graphics.drawable.Icon;
 import android.net.Uri;
+import android.support.annotation.ColorInt;
 import android.support.annotation.NonNull;
 import android.support.annotation.RestrictTo;
 
@@ -89,7 +90,7 @@
     /**
      * Sets the color to tint items displayed by this template (e.g. icons).
      */
-    void setColor(int color);
+    void setColor(@ColorInt int color);
 
     /**
      * Create a builder that implements {@link RowBuilder}.
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderBasicImpl.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderBasicImpl.java
index 175bc33..b47e7f2 100644
--- a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderBasicImpl.java
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderBasicImpl.java
@@ -21,6 +21,7 @@
 import android.app.PendingIntent;
 import android.graphics.drawable.Icon;
 import android.net.Uri;
+import android.support.annotation.ColorInt;
 import android.support.annotation.NonNull;
 import android.support.annotation.RestrictTo;
 
@@ -93,7 +94,7 @@
     /**
      */
     @Override
-    public void setColor(int color) {
+    public void setColor(@ColorInt int color) {
     }
 
     /**
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderV1Impl.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderV1Impl.java
index c659bc6..0a73f34 100644
--- a/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderV1Impl.java
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/ListBuilderV1Impl.java
@@ -36,6 +36,7 @@
 import android.app.PendingIntent;
 import android.graphics.drawable.Icon;
 import android.net.Uri;
+import android.support.annotation.ColorInt;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
@@ -222,7 +223,7 @@
      */
     @NonNull
     @Override
-    public void setColor(int color) {
+    public void setColor(@ColorInt int color) {
         getBuilder().addInt(color, SUBTYPE_COLOR);
     }
 
diff --git a/slices/core/src/androidTest/NO_DOCS b/slices/core/src/androidTest/NO_DOCS
deleted file mode 100644
index 092a39c..0000000
--- a/slices/core/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/slices/view/src/androidTest/NO_DOCS b/slices/view/src/androidTest/NO_DOCS
deleted file mode 100644
index 4dad694..0000000
--- a/slices/view/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java b/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java
index b6ba39a..f267bdb 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java
@@ -162,7 +162,7 @@
         if (gc.getContentIntent() != null) {
             EventInfo info = new EventInfo(getMode(), EventInfo.ACTION_TYPE_CONTENT,
                     EventInfo.ROW_TYPE_GRID, mRowIndex);
-            Pair<SliceItem, EventInfo> tagItem = new Pair(gc.getContentIntent(), info);
+            Pair<SliceItem, EventInfo> tagItem = new Pair<>(gc.getContentIntent(), info);
             mViewContainer.setTag(tagItem);
             makeClickable(mViewContainer);
         }
@@ -266,7 +266,7 @@
                 EventInfo info = new EventInfo(getMode(), EventInfo.ACTION_TYPE_BUTTON,
                         EventInfo.ROW_TYPE_GRID, mRowIndex);
                 info.setPosition(EventInfo.POSITION_CELL, index, total);
-                Pair<SliceItem, EventInfo> tagItem = new Pair(contentIntentItem, info);
+                Pair<SliceItem, EventInfo> tagItem = new Pair<>(contentIntentItem, info);
                 cellContainer.setTag(tagItem);
                 makeClickable(cellContainer);
             }
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/LargeSliceAdapter.java b/slices/view/src/main/java/androidx/app/slice/widget/LargeSliceAdapter.java
index c84db5f..b64cd01 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/LargeSliceAdapter.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/LargeSliceAdapter.java
@@ -23,6 +23,8 @@
 import static android.app.slice.SliceItem.FORMAT_INT;
 import static android.app.slice.SliceItem.FORMAT_TEXT;
 
+import static androidx.app.slice.widget.SliceView.MODE_LARGE;
+
 import android.annotation.TargetApi;
 import android.app.slice.Slice;
 import android.content.Context;
@@ -149,16 +151,21 @@
     }
 
     private View inflateForType(int viewType) {
+        View v = new RowView(mContext);
         switch (viewType) {
             case TYPE_GRID:
-                return LayoutInflater.from(mContext).inflate(R.layout.abc_slice_grid, null);
+                v = LayoutInflater.from(mContext).inflate(R.layout.abc_slice_grid, null);
+                break;
             case TYPE_MESSAGE:
-                return LayoutInflater.from(mContext).inflate(R.layout.abc_slice_message, null);
+                v = LayoutInflater.from(mContext).inflate(R.layout.abc_slice_message, null);
+                break;
             case TYPE_MESSAGE_LOCAL:
-                return LayoutInflater.from(mContext).inflate(R.layout.abc_slice_message_local,
+                v = LayoutInflater.from(mContext).inflate(R.layout.abc_slice_message_local,
                         null);
+                break;
         }
-        return new RowView(mContext);
+        ((SliceChildView) v).setMode(MODE_LARGE);
+        return v;
     }
 
     protected static class SliceWrapper {
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java b/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java
index 39da785..9a5279f 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java
@@ -60,7 +60,7 @@
 
 
     /**
-     * @return the mode of the slice being presented.
+     * Set the mode of the slice being presented.
      */
     public void setMode(int mode) {
         mMode = mode;
@@ -69,6 +69,7 @@
     /**
      * @return the mode of the slice being presented.
      */
+    @SliceView.SliceMode
     public int getMode() {
         return mMode;
     }
diff --git a/slidingpanelayout/api/current.txt b/slidingpanelayout/api/current.txt
new file mode 100644
index 0000000..07e71d9
--- /dev/null
+++ b/slidingpanelayout/api/current.txt
@@ -0,0 +1,54 @@
+package android.support.v4.widget {
+
+  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 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);
+  }
+
+}
+
diff --git a/slidingpanelayout/build.gradle b/slidingpanelayout/build.gradle
new file mode 100644
index 0000000..d084e63
--- /dev/null
+++ b/slidingpanelayout/build.gradle
@@ -0,0 +1,21 @@
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    api(project(":support-annotations"))
+    api(project(":support-compat"))
+    api(project(":customview"))
+}
+
+supportLibrary {
+    name = "Android Support Library Sliding Pane Layout"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
+    inceptionYear = "2018"
+    description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
+}
diff --git a/slidingpanelayout/src/main/AndroidManifest.xml b/slidingpanelayout/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..0df47df
--- /dev/null
+++ b/slidingpanelayout/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest package="android.support.slidingpanelayout"/>
diff --git a/core-ui/src/main/java/android/support/v4/widget/SlidingPaneLayout.java b/slidingpanelayout/src/main/java/android/support/v4/widget/SlidingPaneLayout.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/SlidingPaneLayout.java
rename to slidingpanelayout/src/main/java/android/support/v4/widget/SlidingPaneLayout.java
diff --git a/swiperefreshlayout/api/current.txt b/swiperefreshlayout/api/current.txt
new file mode 100644
index 0000000..ce68f0b
--- /dev/null
+++ b/swiperefreshlayout/api/current.txt
@@ -0,0 +1,76 @@
+package android.support.v4.widget {
+
+  public class CircularProgressDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable {
+    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 SwipeRefreshLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
+    ctor public SwipeRefreshLayout(android.content.Context);
+    ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
+    method public boolean canChildScrollUp();
+    method public int getProgressCircleDiameter();
+    method public int getProgressViewEndOffset();
+    method public int getProgressViewStartOffset();
+    method public boolean isRefreshing();
+    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();
+  }
+
+}
+
diff --git a/swiperefreshlayout/build.gradle b/swiperefreshlayout/build.gradle
new file mode 100644
index 0000000..0479bbe
--- /dev/null
+++ b/swiperefreshlayout/build.gradle
@@ -0,0 +1,33 @@
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    api(project(":support-annotations"))
+    api(project(":support-compat"))
+    api(project(":interpolator"))
+
+    androidTestImplementation(JUNIT)
+    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(TEST_RULES)
+    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(ESPRESSO_CONTRIB, libs.exclude_support)
+    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation project(':support-testutils'), {
+        exclude group: 'com.android.support', module: 'swiperefreshlayout'
+    }
+}
+
+supportLibrary {
+    name = "Android Support Library Custom View"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
+    inceptionYear = "2018"
+    description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
+}
diff --git a/swiperefreshlayout/src/androidTest/AndroidManifest.xml b/swiperefreshlayout/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..1b84249
--- /dev/null
+++ b/swiperefreshlayout/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.support.swiperefreshlayout.test">
+    <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
+
+    <application
+        android:supportsRtl="true"
+        android:theme="@style/TestActivityTheme">
+        <activity android:name="android.support.v4.widget.CircularProgressDrawableActivity"/>
+        <activity android:name="android.support.v4.widget.SwipeRefreshLayoutActivity"/>
+    </application>
+
+</manifest>
diff --git a/core-ui/tests/java/android/support/v4/widget/CircularProgressDrawableActivity.java b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/CircularProgressDrawableActivity.java
similarity index 66%
rename from core-ui/tests/java/android/support/v4/widget/CircularProgressDrawableActivity.java
rename to swiperefreshlayout/src/androidTest/java/android/support/v4/widget/CircularProgressDrawableActivity.java
index 743cd7d..3353c9f 100644
--- a/core-ui/tests/java/android/support/v4/widget/CircularProgressDrawableActivity.java
+++ b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/CircularProgressDrawableActivity.java
@@ -16,12 +16,14 @@
 
 package android.support.v4.widget;
 
-import android.support.coreui.test.R;
-import android.support.v4.BaseTestActivity;
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.swiperefreshlayout.test.R;
 
-public class CircularProgressDrawableActivity extends BaseTestActivity {
+public class CircularProgressDrawableActivity extends Activity {
     @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.circular_progress_drawable_activity;
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.circular_progress_drawable_activity);
     }
 }
diff --git a/core-ui/tests/java/android/support/v4/widget/CircularProgressDrawableTest.java b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/CircularProgressDrawableTest.java
similarity index 88%
rename from core-ui/tests/java/android/support/v4/widget/CircularProgressDrawableTest.java
rename to swiperefreshlayout/src/androidTest/java/android/support/v4/widget/CircularProgressDrawableTest.java
index cf31952..2a0870e 100644
--- a/core-ui/tests/java/android/support/v4/widget/CircularProgressDrawableTest.java
+++ b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/CircularProgressDrawableTest.java
@@ -30,22 +30,24 @@
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.support.test.filters.SmallTest;
-import android.support.v4.BaseInstrumentationTestCase;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 
 /**
  * Tests for CircularProgressDrawable
  */
-public class CircularProgressDrawableTest extends
-        BaseInstrumentationTestCase<CircularProgressDrawableActivity> {
-
-    public CircularProgressDrawableTest() {
-        super(CircularProgressDrawableActivity.class);
-    }
+@RunWith(AndroidJUnit4.class)
+public class CircularProgressDrawableTest {
+    @Rule
+    public final ActivityTestRule<CircularProgressDrawableActivity> mActivityTestRule =
+            new ActivityTestRule<>(CircularProgressDrawableActivity.class);
 
     private CircularProgressDrawable mDrawableUnderTest;
 
diff --git a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActions.java b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutActions.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActions.java
rename to swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutActions.java
diff --git a/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java
similarity index 67%
copy from core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
copy to swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java
index 19d1598..3d8493d 100644
--- a/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
+++ b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java
@@ -16,12 +16,14 @@
 
 package android.support.v4.widget;
 
-import android.support.coreui.test.R;
-import android.support.v4.BaseTestActivity;
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.swiperefreshlayout.test.R;
 
-public class ExploreByTouchHelperTestActivity extends BaseTestActivity {
+public class SwipeRefreshLayoutActivity extends Activity {
     @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.explore_by_touch_helper_activity;
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.swipe_refresh_layout_activity);
     }
 }
diff --git a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
similarity index 92%
rename from core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
rename to swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
index 04a2835..fe53293 100644
--- a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
+++ b/swiperefreshlayout/src/androidTest/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
@@ -32,17 +32,20 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.support.coreui.test.R;
+import android.support.swiperefreshlayout.test.R;
 import android.support.test.espresso.action.ViewActions;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.MediumTest;
 import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
 import android.support.testutils.PollingCheck;
-import android.support.v4.BaseInstrumentationTestCase;
 import android.view.View;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -50,21 +53,20 @@
 /**
  * Tests SwipeRefreshLayout widget.
  */
-public class SwipeRefreshLayoutTest
-        extends BaseInstrumentationTestCase<SwipeRefreshLayoutActivity> {
+@RunWith(AndroidJUnit4.class)
+public class SwipeRefreshLayoutTest {
+    @Rule
+    public final ActivityTestRule<SwipeRefreshLayoutActivity> mActivityTestRule =
+            new ActivityTestRule<>(SwipeRefreshLayoutActivity.class);
+
     private static final long TIMEOUT = 1000;
     private static final int INVALID_SIZE = 1000;
 
     private SwipeRefreshLayout mSwipeRefresh;
 
-    public SwipeRefreshLayoutTest() {
-        super(SwipeRefreshLayoutActivity.class);
-    }
-
     @Before
     public void setUp() {
-        mSwipeRefresh = (SwipeRefreshLayout) mActivityTestRule.getActivity().findViewById(
-                R.id.swipe_refresh);
+        mSwipeRefresh = mActivityTestRule.getActivity().findViewById(R.id.swipe_refresh);
     }
 
     @Test
diff --git a/core-ui/tests/res/layout/circular_progress_drawable_activity.xml b/swiperefreshlayout/src/androidTest/res/layout/circular_progress_drawable_activity.xml
similarity index 100%
rename from core-ui/tests/res/layout/circular_progress_drawable_activity.xml
rename to swiperefreshlayout/src/androidTest/res/layout/circular_progress_drawable_activity.xml
diff --git a/core-ui/tests/res/layout/swipe_refresh_layout_activity.xml b/swiperefreshlayout/src/androidTest/res/layout/swipe_refresh_layout_activity.xml
similarity index 100%
rename from core-ui/tests/res/layout/swipe_refresh_layout_activity.xml
rename to swiperefreshlayout/src/androidTest/res/layout/swipe_refresh_layout_activity.xml
diff --git a/core-ui/tests/res/layout/swipe_refresh_layout_disabled_activity.xml b/swiperefreshlayout/src/androidTest/res/layout/swipe_refresh_layout_disabled_activity.xml
similarity index 100%
rename from core-ui/tests/res/layout/swipe_refresh_layout_disabled_activity.xml
rename to swiperefreshlayout/src/androidTest/res/layout/swipe_refresh_layout_disabled_activity.xml
diff --git a/core-ui/tests/res/values/styles.xml b/swiperefreshlayout/src/androidTest/res/values/styles.xml
similarity index 100%
copy from core-ui/tests/res/values/styles.xml
copy to swiperefreshlayout/src/androidTest/res/values/styles.xml
diff --git a/swiperefreshlayout/src/main/AndroidManifest.xml b/swiperefreshlayout/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..abc5680
--- /dev/null
+++ b/swiperefreshlayout/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest package="android.support.swiperefreshlayout"/>
diff --git a/core-ui/src/main/java/android/support/v4/widget/CircleImageView.java b/swiperefreshlayout/src/main/java/android/support/v4/widget/CircleImageView.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/CircleImageView.java
rename to swiperefreshlayout/src/main/java/android/support/v4/widget/CircleImageView.java
diff --git a/core-ui/src/main/java/android/support/v4/widget/CircularProgressDrawable.java b/swiperefreshlayout/src/main/java/android/support/v4/widget/CircularProgressDrawable.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/CircularProgressDrawable.java
rename to swiperefreshlayout/src/main/java/android/support/v4/widget/CircularProgressDrawable.java
diff --git a/core-ui/src/main/java/android/support/v4/widget/SwipeRefreshLayout.java b/swiperefreshlayout/src/main/java/android/support/v4/widget/SwipeRefreshLayout.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/widget/SwipeRefreshLayout.java
rename to swiperefreshlayout/src/main/java/android/support/v4/widget/SwipeRefreshLayout.java
diff --git a/testutils/build.gradle b/testutils/build.gradle
index 6a340b0..d75b6b7 100644
--- a/testutils/build.gradle
+++ b/testutils/build.gradle
@@ -36,7 +36,3 @@
         disable 'InvalidPackage' // Lint is unhappy about junit package
     }
 }
-
-supportLibrary {
-    legacySourceLocation = true
-}
\ No newline at end of file
diff --git a/transition/src/androidTest/NO_DOCS b/transition/src/androidTest/NO_DOCS
deleted file mode 100644
index 092a39c..0000000
--- a/transition/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/tv-provider/src/androidTest/NO_DOCS b/tv-provider/src/androidTest/NO_DOCS
deleted file mode 100644
index 092a39c..0000000
--- a/tv-provider/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/v7/appcompat/build.gradle b/v7/appcompat/build.gradle
index 106d0aa..799b7b3 100644
--- a/v7/appcompat/build.gradle
+++ b/v7/appcompat/build.gradle
@@ -45,5 +45,4 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2011"
     description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren\'t a part of the framework APIs. Compatible on devices running API 14 or later."
-    legacySourceLocation = true
 }
diff --git a/v7/appcompat/res/values/colors_material.xml b/v7/appcompat/res/values/colors_material.xml
index cf21172..7d5ca2c 100644
--- a/v7/appcompat/res/values/colors_material.xml
+++ b/v7/appcompat/res/values/colors_material.xml
@@ -99,7 +99,8 @@
     <color name="primary_text_disabled_material_dark">#4Dffffff</color>
     <color name="secondary_text_disabled_material_dark">#36ffffff</color>
 
-    <color name="error_color_material">#F4511E</color>
+    <color name="error_color_material_dark">#ff7043</color><!-- deep orange 400 -->
+    <color name="error_color_material_light">#ff5722</color><!-- deep orange 500 -->
 
     <!-- Primary & accent colors -->
     <eat-comment />
diff --git a/v7/appcompat/res/values/themes_base.xml b/v7/appcompat/res/values/themes_base.xml
index f628499..def6423 100644
--- a/v7/appcompat/res/values/themes_base.xml
+++ b/v7/appcompat/res/values/themes_base.xml
@@ -316,7 +316,7 @@
         <item name="tooltipFrameBackground">@drawable/tooltip_frame_light</item>
         <item name="tooltipForegroundColor">@color/foreground_material_light</item>
 
-        <item name="colorError">@color/error_color_material</item>
+        <item name="colorError">@color/error_color_material_dark</item>
     </style>
 
     <!-- Base platform-dependent theme providing an action bar in a light-themed activity. -->
@@ -487,7 +487,7 @@
         <item name="tooltipFrameBackground">@drawable/tooltip_frame_dark</item>
         <item name="tooltipForegroundColor">@color/foreground_material_dark</item>
 
-        <item name="colorError">@color/error_color_material</item>
+        <item name="colorError">@color/error_color_material_light</item>
     </style>
 
     <style name="Base.Theme.AppCompat" parent="Base.V7.Theme.AppCompat">
diff --git a/v7/appcompat/tests/AndroidManifest.xml b/v7/appcompat/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from v7/appcompat/tests/AndroidManifest.xml
rename to v7/appcompat/src/androidTest/AndroidManifest.xml
diff --git a/v7/appcompat/tests/fonts_readme.txt b/v7/appcompat/src/androidTest/fonts_readme.txt
similarity index 100%
rename from v7/appcompat/tests/fonts_readme.txt
rename to v7/appcompat/src/androidTest/fonts_readme.txt
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AlertDialogCursorTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AlertDialogCursorTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AlertDialogCursorTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AlertDialogCursorTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AlertDialogTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AlertDialogTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AlertDialogTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AlertDialogTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AlertDialogTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AlertDialogTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AlertDialogTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AlertDialogTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterBadClassNameActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterBadClassNameActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterBadClassNameActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterBadClassNameActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterBadClassNameTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterBadClassNameTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterBadClassNameTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterBadClassNameTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterCustomActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterCustomActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterCustomActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterCustomActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterCustomTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterCustomTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterCustomTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterCustomTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterDefaultActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterDefaultActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterDefaultActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterDefaultActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterDefaultTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterDefaultTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterDefaultTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterDefaultTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterNullActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterNullActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterNullActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterNullActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterNullTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterNullTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterNullTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterNullTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterPassTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterPassTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatInflaterPassTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatInflaterPassTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemIconTintingTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemIconTintingTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemIconTintingTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemIconTintingTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemIconTintingTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemIconTintingTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemIconTintingTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemIconTintingTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemShortcutsTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemShortcutsTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemShortcutsTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemShortcutsTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemShortcutsTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemShortcutsTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatMenuItemShortcutsTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatMenuItemShortcutsTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatVectorDrawableIntegrationActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatVectorDrawableIntegrationActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatVectorDrawableIntegrationActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatVectorDrawableIntegrationActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/AppCompatVectorDrawableIntegrationTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatVectorDrawableIntegrationTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/AppCompatVectorDrawableIntegrationTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/AppCompatVectorDrawableIntegrationTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/BaseBasicsTestCase.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/BaseBasicsTestCase.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/BaseBasicsTestCase.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/BaseBasicsTestCase.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/BaseKeyEventsTestCase.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/BaseKeyEventsTestCase.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/BaseKeyEventsTestCase.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/BaseKeyEventsTestCase.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/BaseKeyboardShortcutsTestCase.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/BaseKeyboardShortcutsTestCase.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/BaseKeyboardShortcutsTestCase.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/BaseKeyboardShortcutsTestCase.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithToolbar.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/BasicsTestCaseWithToolbar.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithToolbar.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/BasicsTestCaseWithToolbar.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithWindowDecor.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/BasicsTestCaseWithWindowDecor.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/BasicsTestCaseWithWindowDecor.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/BasicsTestCaseWithWindowDecor.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/CustomCollapsibleView.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/CustomCollapsibleView.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/CustomCollapsibleView.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/CustomCollapsibleView.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DialogTestCase.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/DialogTestCase.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/DialogTestCase.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/DialogTestCase.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerDynamicLayoutActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerDynamicLayoutActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/DrawerDynamicLayoutActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerDynamicLayoutActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerDynamicLayoutTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerDynamicLayoutTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/DrawerDynamicLayoutTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerDynamicLayoutTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutDoubleActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutDoubleActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutDoubleActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutDoubleActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutDoubleTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutDoubleTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutDoubleTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutDoubleTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/DrawerLayoutTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/FragmentContentIdActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/FragmentContentIdActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/FragmentContentIdActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/FragmentContentIdActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/FragmentContentIdTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/FragmentContentIdTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/FragmentContentIdTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/FragmentContentIdTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithToolbar.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/KeyEventsTestCaseWithToolbar.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithToolbar.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/KeyEventsTestCaseWithToolbar.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithWindowDecor.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/KeyEventsTestCaseWithWindowDecor.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/KeyEventsTestCaseWithWindowDecor.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/KeyEventsTestCaseWithWindowDecor.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/KeyboardShortcutsTestCaseWithToolbar.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithWindowDecor.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/KeyboardShortcutsTestCaseWithWindowDecor.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/KeyboardShortcutsTestCaseWithWindowDecor.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/KeyboardShortcutsTestCaseWithWindowDecor.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/LayoutInflaterFactoryTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/LayoutInflaterFactoryTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/LayoutInflaterFactoryTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/LayoutInflaterFactoryTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/LayoutInflaterFactoryTestCase.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/LayoutInflaterFactoryTestCase.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/LayoutInflaterFactoryTestCase.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/LayoutInflaterFactoryTestCase.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/MenuBuilderTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/MenuBuilderTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/MenuBuilderTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/MenuBuilderTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/NightModeActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/NightModeActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/NightModeActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/NightModeActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/NightModeTestCase.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/NightModeTestCase.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/NightModeTestCase.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/NightModeTestCase.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/ToolbarAppCompatActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/ToolbarAppCompatActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/ToolbarAppCompatActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/ToolbarAppCompatActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/WindowDecorAppCompatActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/WindowDecorAppCompatActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/WindowDecorAppCompatActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/WindowDecorAppCompatActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/inflater/CustomViewInflater.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/inflater/CustomViewInflater.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/inflater/CustomViewInflater.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/inflater/CustomViewInflater.java
diff --git a/v7/appcompat/tests/src/android/support/v7/app/inflater/MisbehavingViewInflater.java b/v7/appcompat/src/androidTest/java/android/support/v7/app/inflater/MisbehavingViewInflater.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/app/inflater/MisbehavingViewInflater.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/app/inflater/MisbehavingViewInflater.java
diff --git a/v7/appcompat/tests/src/android/support/v7/custom/ContextWrapperFrameLayout.java b/v7/appcompat/src/androidTest/java/android/support/v7/custom/ContextWrapperFrameLayout.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/custom/ContextWrapperFrameLayout.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/custom/ContextWrapperFrameLayout.java
diff --git a/v7/appcompat/tests/src/android/support/v7/custom/CustomDrawerLayout.java b/v7/appcompat/src/androidTest/java/android/support/v7/custom/CustomDrawerLayout.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/custom/CustomDrawerLayout.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/custom/CustomDrawerLayout.java
diff --git a/v7/appcompat/tests/src/android/support/v7/custom/FitWindowsContentLayout.java b/v7/appcompat/src/androidTest/java/android/support/v7/custom/FitWindowsContentLayout.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/custom/FitWindowsContentLayout.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/custom/FitWindowsContentLayout.java
diff --git a/v7/appcompat/tests/src/android/support/v7/res/content/AppCompatResourcesTestCase.java b/v7/appcompat/src/androidTest/java/android/support/v7/res/content/AppCompatResourcesTestCase.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/res/content/AppCompatResourcesTestCase.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/res/content/AppCompatResourcesTestCase.java
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/AppCompatTintableViewActions.java b/v7/appcompat/src/androidTest/java/android/support/v7/testutils/AppCompatTintableViewActions.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/testutils/AppCompatTintableViewActions.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/testutils/AppCompatTintableViewActions.java
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/BaseTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/testutils/BaseTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/testutils/BaseTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/testutils/BaseTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/DrawerLayoutActions.java b/v7/appcompat/src/androidTest/java/android/support/v7/testutils/DrawerLayoutActions.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/testutils/DrawerLayoutActions.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/testutils/DrawerLayoutActions.java
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/Shakespeare.java b/v7/appcompat/src/androidTest/java/android/support/v7/testutils/Shakespeare.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/testutils/Shakespeare.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/testutils/Shakespeare.java
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/TestUtils.java b/v7/appcompat/src/androidTest/java/android/support/v7/testutils/TestUtils.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/testutils/TestUtils.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/testutils/TestUtils.java
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/TestUtilsActions.java b/v7/appcompat/src/androidTest/java/android/support/v7/testutils/TestUtilsActions.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/testutils/TestUtilsActions.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/testutils/TestUtilsActions.java
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/TestUtilsMatchers.java b/v7/appcompat/src/androidTest/java/android/support/v7/testutils/TestUtilsMatchers.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/testutils/TestUtilsMatchers.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/testutils/TestUtilsMatchers.java
diff --git a/v7/appcompat/tests/src/android/support/v7/view/ContextThemeWrapperTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/view/ContextThemeWrapperTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/view/ContextThemeWrapperTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/view/ContextThemeWrapperTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/view/SupportMenuInflaterTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/view/SupportMenuInflaterTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/view/SupportMenuInflaterTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/view/SupportMenuInflaterTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/view/SupportMenuInflaterTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/view/SupportMenuInflaterTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/view/SupportMenuInflaterTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/view/SupportMenuInflaterTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatBaseAutoSizeTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatBaseAutoSizeTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatBaseAutoSizeTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatBaseAutoSizeTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatBaseImageViewTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatBaseImageViewTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatBaseImageViewTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatBaseImageViewTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatBaseViewTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatBaseViewTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatBaseViewTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatBaseViewTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonAutoSizeActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonAutoSizeActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonAutoSizeActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonAutoSizeActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonAutoSizeTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonAutoSizeTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonAutoSizeTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonAutoSizeTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatButtonTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatEditTextTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatEditTextTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatEditTextTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatEditTextTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageButtonActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageButtonActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageButtonActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageButtonActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageButtonTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageButtonTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageButtonTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageButtonTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageViewActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageViewActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageViewActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageViewActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageViewTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageViewTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatImageViewTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatImageViewTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatRadioButtonActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatRadioButtonActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatRadioButtonActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatRadioButtonActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatRadioButtonTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatRadioButtonTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatRadioButtonTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatRadioButtonTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatSpinnerActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatSpinnerActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatSpinnerActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatSpinnerActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatSpinnerTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatSpinnerTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatSpinnerTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatSpinnerTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewAutoSizeActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewAutoSizeActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewAutoSizeActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewAutoSizeActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewAutoSizeTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewAutoSizeTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewAutoSizeTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewAutoSizeTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/AppCompatTextViewTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/ListPopupWindowTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/ListPopupWindowTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/ListPopupWindowTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/ListPopupWindowTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/PopupMenuTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/PopupMenuTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/PopupMenuTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/PopupMenuTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/PopupTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/PopupTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/PopupTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/PopupTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/SearchViewTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/SearchViewTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/SearchViewTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/SearchViewTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/SearchViewTestActivity.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/SearchViewTestActivity.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/SearchViewTestActivity.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/SearchViewTestActivity.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/SearchView_CursorTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/SearchView_CursorTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/SearchView_CursorTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/SearchView_CursorTest.java
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/TintResourcesTest.java b/v7/appcompat/src/androidTest/java/android/support/v7/widget/TintResourcesTest.java
similarity index 100%
rename from v7/appcompat/tests/src/android/support/v7/widget/TintResourcesTest.java
rename to v7/appcompat/src/androidTest/java/android/support/v7/widget/TintResourcesTest.java
diff --git a/v7/appcompat/tests/res/color-v23/color_state_list_themed_attrs.xml b/v7/appcompat/src/androidTest/res/color-v23/color_state_list_themed_attrs.xml
similarity index 100%
rename from v7/appcompat/tests/res/color-v23/color_state_list_themed_attrs.xml
rename to v7/appcompat/src/androidTest/res/color-v23/color_state_list_themed_attrs.xml
diff --git a/v7/appcompat/tests/res/color/color_state_list_emerald_translucent.xml b/v7/appcompat/src/androidTest/res/color/color_state_list_emerald_translucent.xml
similarity index 100%
rename from v7/appcompat/tests/res/color/color_state_list_emerald_translucent.xml
rename to v7/appcompat/src/androidTest/res/color/color_state_list_emerald_translucent.xml
diff --git a/v7/appcompat/tests/res/color/color_state_list_lilac.xml b/v7/appcompat/src/androidTest/res/color/color_state_list_lilac.xml
similarity index 100%
rename from v7/appcompat/tests/res/color/color_state_list_lilac.xml
rename to v7/appcompat/src/androidTest/res/color/color_state_list_lilac.xml
diff --git a/v7/appcompat/tests/res/color/color_state_list_link.xml b/v7/appcompat/src/androidTest/res/color/color_state_list_link.xml
similarity index 100%
rename from v7/appcompat/tests/res/color/color_state_list_link.xml
rename to v7/appcompat/src/androidTest/res/color/color_state_list_link.xml
diff --git a/v7/appcompat/tests/res/color/color_state_list_ocean.xml b/v7/appcompat/src/androidTest/res/color/color_state_list_ocean.xml
similarity index 100%
rename from v7/appcompat/tests/res/color/color_state_list_ocean.xml
rename to v7/appcompat/src/androidTest/res/color/color_state_list_ocean.xml
diff --git a/v7/appcompat/tests/res/color/color_state_list_sand.xml b/v7/appcompat/src/androidTest/res/color/color_state_list_sand.xml
similarity index 100%
rename from v7/appcompat/tests/res/color/color_state_list_sand.xml
rename to v7/appcompat/src/androidTest/res/color/color_state_list_sand.xml
diff --git a/v7/appcompat/tests/res/color/color_state_list_themed_attrs.xml b/v7/appcompat/src/androidTest/res/color/color_state_list_themed_attrs.xml
similarity index 100%
rename from v7/appcompat/tests/res/color/color_state_list_themed_attrs.xml
rename to v7/appcompat/src/androidTest/res/color/color_state_list_themed_attrs.xml
diff --git a/v7/appcompat/tests/res/drawable-hdpi/drawer_shadow.9.png b/v7/appcompat/src/androidTest/res/drawable-hdpi/drawer_shadow.9.png
similarity index 100%
rename from v7/appcompat/tests/res/drawable-hdpi/drawer_shadow.9.png
rename to v7/appcompat/src/androidTest/res/drawable-hdpi/drawer_shadow.9.png
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable-mdpi/drawer_shadow.9.png b/v7/appcompat/src/androidTest/res/drawable-mdpi/drawer_shadow.9.png
similarity index 100%
rename from v7/appcompat/tests/res/drawable-mdpi/drawer_shadow.9.png
rename to v7/appcompat/src/androidTest/res/drawable-mdpi/drawer_shadow.9.png
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable-mdpi/test_drawable.png b/v7/appcompat/src/androidTest/res/drawable-mdpi/test_drawable.png
similarity index 100%
rename from v7/appcompat/tests/res/drawable-mdpi/test_drawable.png
rename to v7/appcompat/src/androidTest/res/drawable-mdpi/test_drawable.png
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable-xhdpi/drawer_shadow.9.png b/v7/appcompat/src/androidTest/res/drawable-xhdpi/drawer_shadow.9.png
similarity index 100%
rename from v7/appcompat/tests/res/drawable-xhdpi/drawer_shadow.9.png
rename to v7/appcompat/src/androidTest/res/drawable-xhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/black_rect.xml b/v7/appcompat/src/androidTest/res/drawable/black_rect.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/black_rect.xml
rename to v7/appcompat/src/androidTest/res/drawable/black_rect.xml
diff --git a/v7/appcompat/tests/res/drawable/icon_black.jpg b/v7/appcompat/src/androidTest/res/drawable/icon_black.jpg
similarity index 100%
rename from v7/appcompat/tests/res/drawable/icon_black.jpg
rename to v7/appcompat/src/androidTest/res/drawable/icon_black.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/icon_blue.jpg b/v7/appcompat/src/androidTest/res/drawable/icon_blue.jpg
similarity index 100%
rename from v7/appcompat/tests/res/drawable/icon_blue.jpg
rename to v7/appcompat/src/androidTest/res/drawable/icon_blue.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/icon_green.jpg b/v7/appcompat/src/androidTest/res/drawable/icon_green.jpg
similarity index 100%
rename from v7/appcompat/tests/res/drawable/icon_green.jpg
rename to v7/appcompat/src/androidTest/res/drawable/icon_green.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/icon_red.jpg b/v7/appcompat/src/androidTest/res/drawable/icon_red.jpg
similarity index 100%
rename from v7/appcompat/tests/res/drawable/icon_red.jpg
rename to v7/appcompat/src/androidTest/res/drawable/icon_red.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/icon_yellow.jpg b/v7/appcompat/src/androidTest/res/drawable/icon_yellow.jpg
similarity index 100%
rename from v7/appcompat/tests/res/drawable/icon_yellow.jpg
rename to v7/appcompat/src/androidTest/res/drawable/icon_yellow.jpg
Binary files differ
diff --git a/v7/appcompat/tests/res/drawable/test_background_blue.xml b/v7/appcompat/src/androidTest/res/drawable/test_background_blue.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_background_blue.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_background_blue.xml
diff --git a/v7/appcompat/tests/res/drawable/test_background_green.xml b/v7/appcompat/src/androidTest/res/drawable/test_background_green.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_background_green.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_background_green.xml
diff --git a/v7/appcompat/tests/res/drawable/test_background_red.xml b/v7/appcompat/src/androidTest/res/drawable/test_background_red.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_background_red.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_background_red.xml
diff --git a/v7/appcompat/tests/res/drawable/test_drawable_blue.xml b/v7/appcompat/src/androidTest/res/drawable/test_drawable_blue.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_drawable_blue.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_drawable_blue.xml
diff --git a/v7/appcompat/tests/res/drawable/test_drawable_green.xml b/v7/appcompat/src/androidTest/res/drawable/test_drawable_green.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_drawable_green.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_drawable_green.xml
diff --git a/v7/appcompat/tests/res/drawable/test_drawable_red.xml b/v7/appcompat/src/androidTest/res/drawable/test_drawable_red.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_drawable_red.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_drawable_red.xml
diff --git a/v7/appcompat/tests/res/drawable/test_night_color_conversion_background.xml b/v7/appcompat/src/androidTest/res/drawable/test_night_color_conversion_background.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_night_color_conversion_background.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_night_color_conversion_background.xml
diff --git a/v7/appcompat/tests/res/drawable/test_vector_left_white_right_black.xml b/v7/appcompat/src/androidTest/res/drawable/test_vector_left_white_right_black.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_vector_left_white_right_black.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_vector_left_white_right_black.xml
diff --git a/v7/appcompat/tests/res/drawable/test_vector_level.xml b/v7/appcompat/src/androidTest/res/drawable/test_vector_level.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_vector_level.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_vector_level.xml
diff --git a/v7/appcompat/tests/res/drawable/test_vector_off.xml b/v7/appcompat/src/androidTest/res/drawable/test_vector_off.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_vector_off.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_vector_off.xml
diff --git a/v7/appcompat/tests/res/drawable/test_vector_on.xml b/v7/appcompat/src/androidTest/res/drawable/test_vector_on.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_vector_on.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_vector_on.xml
diff --git a/v7/appcompat/tests/res/drawable/test_vector_state.xml b/v7/appcompat/src/androidTest/res/drawable/test_vector_state.xml
similarity index 100%
rename from v7/appcompat/tests/res/drawable/test_vector_state.xml
rename to v7/appcompat/src/androidTest/res/drawable/test_vector_state.xml
diff --git a/v7/appcompat/tests/res/font/samplefont.ttf b/v7/appcompat/src/androidTest/res/font/samplefont.ttf
similarity index 100%
rename from v7/appcompat/tests/res/font/samplefont.ttf
rename to v7/appcompat/src/androidTest/res/font/samplefont.ttf
Binary files differ
diff --git a/v7/appcompat/tests/res/font/samplefont2.ttf b/v7/appcompat/src/androidTest/res/font/samplefont2.ttf
similarity index 100%
rename from v7/appcompat/tests/res/font/samplefont2.ttf
rename to v7/appcompat/src/androidTest/res/font/samplefont2.ttf
Binary files differ
diff --git a/v7/appcompat/tests/res/font/samplefont3.ttf b/v7/appcompat/src/androidTest/res/font/samplefont3.ttf
similarity index 100%
rename from v7/appcompat/tests/res/font/samplefont3.ttf
rename to v7/appcompat/src/androidTest/res/font/samplefont3.ttf
Binary files differ
diff --git a/v7/appcompat/tests/res/font/samplefont4.ttf b/v7/appcompat/src/androidTest/res/font/samplefont4.ttf
similarity index 100%
rename from v7/appcompat/tests/res/font/samplefont4.ttf
rename to v7/appcompat/src/androidTest/res/font/samplefont4.ttf
Binary files differ
diff --git a/v7/appcompat/tests/res/font/samplexmldownloadedfont.xml b/v7/appcompat/src/androidTest/res/font/samplexmldownloadedfont.xml
similarity index 100%
rename from v7/appcompat/tests/res/font/samplexmldownloadedfont.xml
rename to v7/appcompat/src/androidTest/res/font/samplexmldownloadedfont.xml
diff --git a/v7/appcompat/tests/res/font/samplexmlfont.xml b/v7/appcompat/src/androidTest/res/font/samplexmlfont.xml
similarity index 100%
rename from v7/appcompat/tests/res/font/samplexmlfont.xml
rename to v7/appcompat/src/androidTest/res/font/samplexmlfont.xml
diff --git a/v7/appcompat/tests/res/layout/activity_night_mode.xml b/v7/appcompat/src/androidTest/res/layout/activity_night_mode.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/activity_night_mode.xml
rename to v7/appcompat/src/androidTest/res/layout/activity_night_mode.xml
diff --git a/v7/appcompat/tests/res/layout/alert_dialog_activity.xml b/v7/appcompat/src/androidTest/res/layout/alert_dialog_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/alert_dialog_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/alert_dialog_activity.xml
diff --git a/v7/appcompat/tests/res/layout/alert_dialog_custom_title.xml b/v7/appcompat/src/androidTest/res/layout/alert_dialog_custom_title.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/alert_dialog_custom_title.xml
rename to v7/appcompat/src/androidTest/res/layout/alert_dialog_custom_title.xml
diff --git a/v7/appcompat/tests/res/layout/alert_dialog_custom_view.xml b/v7/appcompat/src/androidTest/res/layout/alert_dialog_custom_view.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/alert_dialog_custom_view.xml
rename to v7/appcompat/src/androidTest/res/layout/alert_dialog_custom_view.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_button_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_button_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_button_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_button_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_button_autosize_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_button_autosize_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_button_autosize_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_button_autosize_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_imagebutton_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_imagebutton_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_imagebutton_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_imagebutton_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_imageview_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_imageview_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_imageview_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_imageview_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_inflater_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_inflater_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_inflater_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_inflater_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_radiobutton_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_radiobutton_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_radiobutton_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_radiobutton_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_searchview_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_searchview_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_searchview_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_searchview_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_spinner_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_spinner_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_spinner_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_spinner_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_textview_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_textview_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_textview_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_textview_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_textview_autosize_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_textview_autosize_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_textview_autosize_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_textview_autosize_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_toolbar_activity.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_toolbar_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_toolbar_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_toolbar_activity.xml
diff --git a/v7/appcompat/tests/res/layout/appcompat_vectordrawable_integration.xml b/v7/appcompat/src/androidTest/res/layout/appcompat_vectordrawable_integration.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/appcompat_vectordrawable_integration.xml
rename to v7/appcompat/src/androidTest/res/layout/appcompat_vectordrawable_integration.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_double_layout.xml b/v7/appcompat/src/androidTest/res/layout/drawer_double_layout.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_double_layout.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_double_layout.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_content_double_end.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_end.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_content_double_end.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_end.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_content_double_end_single_start.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_end_single_start.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_content_double_end_single_start.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_end_single_start.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_content_double_start.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_start.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_content_double_start.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_start.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_content_double_start_single_end.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_start_single_end.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_content_double_start_single_end.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_double_start_single_end.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_content_single_end.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_single_end.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_content_single_end.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_single_end.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_content_single_start.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_single_start.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_content_single_start.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_single_start.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_content_start_end.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_start_end.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_content_start_end.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_content_start_end.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_dynamic_layout.xml b/v7/appcompat/src/androidTest/res/layout/drawer_dynamic_layout.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_dynamic_layout.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_dynamic_layout.xml
diff --git a/v7/appcompat/tests/res/layout/drawer_layout.xml b/v7/appcompat/src/androidTest/res/layout/drawer_layout.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/drawer_layout.xml
rename to v7/appcompat/src/androidTest/res/layout/drawer_layout.xml
diff --git a/v7/appcompat/tests/res/layout/layout_actv.xml b/v7/appcompat/src/androidTest/res/layout/layout_actv.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_actv.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_actv.xml
diff --git a/v7/appcompat/tests/res/layout/layout_android_theme.xml b/v7/appcompat/src/androidTest/res/layout/layout_android_theme.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_android_theme.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_android_theme.xml
diff --git a/v7/appcompat/tests/res/layout/layout_android_theme_children.xml b/v7/appcompat/src/androidTest/res/layout/layout_android_theme_children.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_android_theme_children.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_android_theme_children.xml
diff --git a/v7/appcompat/tests/res/layout/layout_app_theme.xml b/v7/appcompat/src/androidTest/res/layout/layout_app_theme.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_app_theme.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_app_theme.xml
diff --git a/v7/appcompat/tests/res/layout/layout_button.xml b/v7/appcompat/src/androidTest/res/layout/layout_button.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_button.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_button.xml
diff --git a/v7/appcompat/tests/res/layout/layout_button_themed_onclick.xml b/v7/appcompat/src/androidTest/res/layout/layout_button_themed_onclick.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_button_themed_onclick.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_button_themed_onclick.xml
diff --git a/v7/appcompat/tests/res/layout/layout_checkbox.xml b/v7/appcompat/src/androidTest/res/layout/layout_checkbox.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_checkbox.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_checkbox.xml
diff --git a/v7/appcompat/tests/res/layout/layout_children.xml b/v7/appcompat/src/androidTest/res/layout/layout_children.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_children.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_children.xml
diff --git a/v7/appcompat/tests/res/layout/layout_contextwrapperparent_imageview_vector.xml b/v7/appcompat/src/androidTest/res/layout/layout_contextwrapperparent_imageview_vector.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_contextwrapperparent_imageview_vector.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_contextwrapperparent_imageview_vector.xml
diff --git a/v7/appcompat/tests/res/layout/layout_edittext.xml b/v7/appcompat/src/androidTest/res/layout/layout_edittext.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_edittext.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_edittext.xml
diff --git a/v7/appcompat/tests/res/layout/layout_imageview_vector.xml b/v7/appcompat/src/androidTest/res/layout/layout_imageview_vector.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_imageview_vector.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_imageview_vector.xml
diff --git a/v7/appcompat/tests/res/layout/layout_mactv.xml b/v7/appcompat/src/androidTest/res/layout/layout_mactv.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_mactv.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_mactv.xml
diff --git a/v7/appcompat/tests/res/layout/layout_radiobutton.xml b/v7/appcompat/src/androidTest/res/layout/layout_radiobutton.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_radiobutton.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_radiobutton.xml
diff --git a/v7/appcompat/tests/res/layout/layout_radiobutton_vector.xml b/v7/appcompat/src/androidTest/res/layout/layout_radiobutton_vector.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_radiobutton_vector.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_radiobutton_vector.xml
diff --git a/v7/appcompat/tests/res/layout/layout_ratingbar.xml b/v7/appcompat/src/androidTest/res/layout/layout_ratingbar.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_ratingbar.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_ratingbar.xml
diff --git a/v7/appcompat/tests/res/layout/layout_spinner.xml b/v7/appcompat/src/androidTest/res/layout/layout_spinner.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/layout_spinner.xml
rename to v7/appcompat/src/androidTest/res/layout/layout_spinner.xml
diff --git a/v7/appcompat/tests/res/layout/popup_test_activity.xml b/v7/appcompat/src/androidTest/res/layout/popup_test_activity.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/popup_test_activity.xml
rename to v7/appcompat/src/androidTest/res/layout/popup_test_activity.xml
diff --git a/v7/appcompat/tests/res/layout/popup_window_item.xml b/v7/appcompat/src/androidTest/res/layout/popup_window_item.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/popup_window_item.xml
rename to v7/appcompat/src/androidTest/res/layout/popup_window_item.xml
diff --git a/v7/appcompat/tests/res/layout/searchview_suggestion_item.xml b/v7/appcompat/src/androidTest/res/layout/searchview_suggestion_item.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/searchview_suggestion_item.xml
rename to v7/appcompat/src/androidTest/res/layout/searchview_suggestion_item.xml
diff --git a/v7/appcompat/tests/res/layout/textview_autosize_maxlines.xml b/v7/appcompat/src/androidTest/res/layout/textview_autosize_maxlines.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/textview_autosize_maxlines.xml
rename to v7/appcompat/src/androidTest/res/layout/textview_autosize_maxlines.xml
diff --git a/v7/appcompat/tests/res/layout/toolbar_decor_content.xml b/v7/appcompat/src/androidTest/res/layout/toolbar_decor_content.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/toolbar_decor_content.xml
rename to v7/appcompat/src/androidTest/res/layout/toolbar_decor_content.xml
diff --git a/v7/appcompat/tests/res/layout/window_decor_content.xml b/v7/appcompat/src/androidTest/res/layout/window_decor_content.xml
similarity index 100%
rename from v7/appcompat/tests/res/layout/window_decor_content.xml
rename to v7/appcompat/src/androidTest/res/layout/window_decor_content.xml
diff --git a/v7/appcompat/tests/res/menu/appcompat_menu_icon_tinting.xml b/v7/appcompat/src/androidTest/res/menu/appcompat_menu_icon_tinting.xml
similarity index 100%
rename from v7/appcompat/tests/res/menu/appcompat_menu_icon_tinting.xml
rename to v7/appcompat/src/androidTest/res/menu/appcompat_menu_icon_tinting.xml
diff --git a/v7/appcompat/tests/res/menu/appcompat_menu_shortcut.xml b/v7/appcompat/src/androidTest/res/menu/appcompat_menu_shortcut.xml
similarity index 100%
rename from v7/appcompat/tests/res/menu/appcompat_menu_shortcut.xml
rename to v7/appcompat/src/androidTest/res/menu/appcompat_menu_shortcut.xml
diff --git a/v7/appcompat/tests/res/menu/popup_menu.xml b/v7/appcompat/src/androidTest/res/menu/popup_menu.xml
similarity index 100%
rename from v7/appcompat/tests/res/menu/popup_menu.xml
rename to v7/appcompat/src/androidTest/res/menu/popup_menu.xml
diff --git a/v7/appcompat/tests/res/menu/sample_actions.xml b/v7/appcompat/src/androidTest/res/menu/sample_actions.xml
similarity index 100%
rename from v7/appcompat/tests/res/menu/sample_actions.xml
rename to v7/appcompat/src/androidTest/res/menu/sample_actions.xml
diff --git a/v7/appcompat/tests/res/menu/shortcut.xml b/v7/appcompat/src/androidTest/res/menu/shortcut.xml
similarity index 100%
rename from v7/appcompat/tests/res/menu/shortcut.xml
rename to v7/appcompat/src/androidTest/res/menu/shortcut.xml
diff --git a/v7/appcompat/tests/res/values-night/colors.xml b/v7/appcompat/src/androidTest/res/values-night/colors.xml
similarity index 100%
rename from v7/appcompat/tests/res/values-night/colors.xml
rename to v7/appcompat/src/androidTest/res/values-night/colors.xml
diff --git a/v7/appcompat/tests/res/values-night/strings.xml b/v7/appcompat/src/androidTest/res/values-night/strings.xml
similarity index 100%
rename from v7/appcompat/tests/res/values-night/strings.xml
rename to v7/appcompat/src/androidTest/res/values-night/strings.xml
diff --git a/v7/appcompat/tests/res/values/arrays.xml b/v7/appcompat/src/androidTest/res/values/arrays.xml
similarity index 100%
rename from v7/appcompat/tests/res/values/arrays.xml
rename to v7/appcompat/src/androidTest/res/values/arrays.xml
diff --git a/v7/appcompat/tests/res/values/colors.xml b/v7/appcompat/src/androidTest/res/values/colors.xml
similarity index 100%
rename from v7/appcompat/tests/res/values/colors.xml
rename to v7/appcompat/src/androidTest/res/values/colors.xml
diff --git a/v7/appcompat/tests/res/values/dimens.xml b/v7/appcompat/src/androidTest/res/values/dimens.xml
similarity index 100%
rename from v7/appcompat/tests/res/values/dimens.xml
rename to v7/appcompat/src/androidTest/res/values/dimens.xml
diff --git a/v7/appcompat/tests/res/values/ids.xml b/v7/appcompat/src/androidTest/res/values/ids.xml
similarity index 100%
rename from v7/appcompat/tests/res/values/ids.xml
rename to v7/appcompat/src/androidTest/res/values/ids.xml
diff --git a/v7/appcompat/tests/res/values/strings.xml b/v7/appcompat/src/androidTest/res/values/strings.xml
similarity index 100%
rename from v7/appcompat/tests/res/values/strings.xml
rename to v7/appcompat/src/androidTest/res/values/strings.xml
diff --git a/v7/appcompat/tests/res/values/styles.xml b/v7/appcompat/src/androidTest/res/values/styles.xml
similarity index 100%
rename from v7/appcompat/tests/res/values/styles.xml
rename to v7/appcompat/src/androidTest/res/values/styles.xml
diff --git a/v7/appcompat/tests/NO_DOCS b/v7/appcompat/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/v7/appcompat/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/v7/gridlayout/build.gradle b/v7/gridlayout/build.gradle
index ae8bac0..329cb00 100644
--- a/v7/gridlayout/build.gradle
+++ b/v7/gridlayout/build.gradle
@@ -14,12 +14,6 @@
     androidTestImplementation(ESPRESSO_CORE)
 }
 
-android {
-    sourceSets {
-        main.res.srcDir 'res'
-    }
-}
-
 supportLibrary {
     name = "Android Support Grid Layout"
     publish = true
@@ -27,5 +21,4 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2013"
     description = "Android Support Grid Layout"
-    legacySourceLocation = true
 }
diff --git a/v7/gridlayout/tests/AndroidManifest.xml b/v7/gridlayout/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from v7/gridlayout/tests/AndroidManifest.xml
rename to v7/gridlayout/src/androidTest/AndroidManifest.xml
diff --git a/v7/gridlayout/tests/src/android/support/v7/widget/GridLayoutTest.java b/v7/gridlayout/src/androidTest/java/android/support/v7/widget/GridLayoutTest.java
similarity index 100%
rename from v7/gridlayout/tests/src/android/support/v7/widget/GridLayoutTest.java
rename to v7/gridlayout/src/androidTest/java/android/support/v7/widget/GridLayoutTest.java
diff --git a/v7/gridlayout/tests/src/android/support/v7/widget/GridLayoutTestActivity.java b/v7/gridlayout/src/androidTest/java/android/support/v7/widget/GridLayoutTestActivity.java
similarity index 100%
rename from v7/gridlayout/tests/src/android/support/v7/widget/GridLayoutTestActivity.java
rename to v7/gridlayout/src/androidTest/java/android/support/v7/widget/GridLayoutTestActivity.java
diff --git a/v7/gridlayout/tests/res/layout/fill_horizontal_test.xml b/v7/gridlayout/src/androidTest/res/layout/fill_horizontal_test.xml
similarity index 100%
rename from v7/gridlayout/tests/res/layout/fill_horizontal_test.xml
rename to v7/gridlayout/src/androidTest/res/layout/fill_horizontal_test.xml
diff --git a/v7/gridlayout/tests/res/layout/height_wrap_content_test.xml b/v7/gridlayout/src/androidTest/res/layout/height_wrap_content_test.xml
similarity index 100%
rename from v7/gridlayout/tests/res/layout/height_wrap_content_test.xml
rename to v7/gridlayout/src/androidTest/res/layout/height_wrap_content_test.xml
diff --git a/v7/gridlayout/tests/res/layout/make_view_gone_test.xml b/v7/gridlayout/src/androidTest/res/layout/make_view_gone_test.xml
similarity index 100%
rename from v7/gridlayout/tests/res/layout/make_view_gone_test.xml
rename to v7/gridlayout/src/androidTest/res/layout/make_view_gone_test.xml
diff --git a/v7/gridlayout/tests/res/layout/use_default_margin_test.xml b/v7/gridlayout/src/androidTest/res/layout/use_default_margin_test.xml
similarity index 100%
rename from v7/gridlayout/tests/res/layout/use_default_margin_test.xml
rename to v7/gridlayout/src/androidTest/res/layout/use_default_margin_test.xml
diff --git a/v7/gridlayout/tests/res/values/colors.xml b/v7/gridlayout/src/androidTest/res/values/colors.xml
similarity index 100%
rename from v7/gridlayout/tests/res/values/colors.xml
rename to v7/gridlayout/src/androidTest/res/values/colors.xml
diff --git a/v7/gridlayout/res/values/attrs.xml b/v7/gridlayout/src/main/res/values/attrs.xml
similarity index 100%
rename from v7/gridlayout/res/values/attrs.xml
rename to v7/gridlayout/src/main/res/values/attrs.xml
diff --git a/v7/gridlayout/res/values/dimens.xml b/v7/gridlayout/src/main/res/values/dimens.xml
similarity index 100%
rename from v7/gridlayout/res/values/dimens.xml
rename to v7/gridlayout/src/main/res/values/dimens.xml
diff --git a/v7/gridlayout/tests/NO_DOCS b/v7/gridlayout/tests/NO_DOCS
deleted file mode 100644
index 092a39c..0000000
--- a/v7/gridlayout/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/v7/mediarouter/build.gradle b/v7/mediarouter/build.gradle
index eb25488..f28938b 100644
--- a/v7/mediarouter/build.gradle
+++ b/v7/mediarouter/build.gradle
@@ -34,5 +34,4 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2013"
     description = "Android MediaRouter Support Library"
-    legacySourceLocation = true
 }
diff --git a/v7/mediarouter/tests/AndroidManifest.xml b/v7/mediarouter/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from v7/mediarouter/tests/AndroidManifest.xml
rename to v7/mediarouter/src/androidTest/AndroidManifest.xml
diff --git a/v7/mediarouter/tests/src/android/support/v7/app/MediaRouteChooserDialogTest.java b/v7/mediarouter/src/androidTest/java/android/support/v7/app/MediaRouteChooserDialogTest.java
similarity index 100%
rename from v7/mediarouter/tests/src/android/support/v7/app/MediaRouteChooserDialogTest.java
rename to v7/mediarouter/src/androidTest/java/android/support/v7/app/MediaRouteChooserDialogTest.java
diff --git a/v7/mediarouter/tests/src/android/support/v7/app/MediaRouteChooserDialogTestActivity.java b/v7/mediarouter/src/androidTest/java/android/support/v7/app/MediaRouteChooserDialogTestActivity.java
similarity index 100%
rename from v7/mediarouter/tests/src/android/support/v7/app/MediaRouteChooserDialogTestActivity.java
rename to v7/mediarouter/src/androidTest/java/android/support/v7/app/MediaRouteChooserDialogTestActivity.java
diff --git a/v7/mediarouter/tests/src/android/support/v7/media/MediaRouteProviderTest.java b/v7/mediarouter/src/androidTest/java/android/support/v7/media/MediaRouteProviderTest.java
similarity index 100%
rename from v7/mediarouter/tests/src/android/support/v7/media/MediaRouteProviderTest.java
rename to v7/mediarouter/src/androidTest/java/android/support/v7/media/MediaRouteProviderTest.java
diff --git a/v7/mediarouter/tests/src/android/support/v7/media/MediaRouterTest.java b/v7/mediarouter/src/androidTest/java/android/support/v7/media/MediaRouterTest.java
similarity index 100%
rename from v7/mediarouter/tests/src/android/support/v7/media/MediaRouterTest.java
rename to v7/mediarouter/src/androidTest/java/android/support/v7/media/MediaRouterTest.java
diff --git a/v7/mediarouter/tests/src/android/support/v7/media/TestUtils.java b/v7/mediarouter/src/androidTest/java/android/support/v7/media/TestUtils.java
similarity index 100%
rename from v7/mediarouter/tests/src/android/support/v7/media/TestUtils.java
rename to v7/mediarouter/src/androidTest/java/android/support/v7/media/TestUtils.java
diff --git a/v7/mediarouter/tests/res/layout/mr_chooser_dialog_activity.xml b/v7/mediarouter/src/androidTest/res/layout/mr_chooser_dialog_activity.xml
similarity index 100%
rename from v7/mediarouter/tests/res/layout/mr_chooser_dialog_activity.xml
rename to v7/mediarouter/src/androidTest/res/layout/mr_chooser_dialog_activity.xml
diff --git a/v7/mediarouter/tests/res/values/themes.xml b/v7/mediarouter/src/androidTest/res/values/themes.xml
similarity index 100%
rename from v7/mediarouter/tests/res/values/themes.xml
rename to v7/mediarouter/src/androidTest/res/values/themes.xml
diff --git a/v7/mediarouter/tests/NO_DOCS b/v7/mediarouter/tests/NO_DOCS
deleted file mode 100644
index 092a39c..0000000
--- a/v7/mediarouter/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/v7/palette/src/androidTest/NO_DOCS b/v7/palette/src/androidTest/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/v7/palette/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/v7/preference/build.gradle b/v7/preference/build.gradle
index 860679c..7707883 100644
--- a/v7/preference/build.gradle
+++ b/v7/preference/build.gradle
@@ -53,5 +53,4 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2015"
     description = "Android Support Preference v7"
-    legacySourceLocation = true
 }
diff --git a/v7/preference/tests/AndroidManifest.xml b/v7/preference/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from v7/preference/tests/AndroidManifest.xml
rename to v7/preference/src/androidTest/AndroidManifest.xml
diff --git a/v7/preference/tests/src/android/support/v7/preference/PreferenceGroupInitialExpandedChildrenCountTest.java b/v7/preference/src/androidTest/java/android/support/v7/preference/PreferenceGroupInitialExpandedChildrenCountTest.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/PreferenceGroupInitialExpandedChildrenCountTest.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/PreferenceGroupInitialExpandedChildrenCountTest.java
diff --git a/v7/preference/tests/src/android/support/v7/preference/tests/PreferenceDataStoreTest.java b/v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceDataStoreTest.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/tests/PreferenceDataStoreTest.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceDataStoreTest.java
diff --git a/v7/preference/tests/src/android/support/v7/preference/tests/PreferenceIconSpaceTest.java b/v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceIconSpaceTest.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/tests/PreferenceIconSpaceTest.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceIconSpaceTest.java
diff --git a/v7/preference/tests/src/android/support/v7/preference/tests/PreferenceParentGroupTest.java b/v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceParentGroupTest.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/tests/PreferenceParentGroupTest.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceParentGroupTest.java
diff --git a/v7/preference/tests/src/android/support/v7/preference/tests/PreferencePersistTest.java b/v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferencePersistTest.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/tests/PreferencePersistTest.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferencePersistTest.java
diff --git a/v7/preference/tests/src/android/support/v7/preference/tests/PreferenceSingleLineTitleTest.java b/v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceSingleLineTitleTest.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/tests/PreferenceSingleLineTitleTest.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/tests/PreferenceSingleLineTitleTest.java
diff --git a/v7/preference/tests/src/android/support/v7/preference/tests/SimplePreferenceComparisonCallbackTest.java b/v7/preference/src/androidTest/java/android/support/v7/preference/tests/SimplePreferenceComparisonCallbackTest.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/tests/SimplePreferenceComparisonCallbackTest.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/tests/SimplePreferenceComparisonCallbackTest.java
diff --git a/v7/preference/tests/src/android/support/v7/preference/tests/helpers/PreferenceWrapper.java b/v7/preference/src/androidTest/java/android/support/v7/preference/tests/helpers/PreferenceWrapper.java
similarity index 100%
rename from v7/preference/tests/src/android/support/v7/preference/tests/helpers/PreferenceWrapper.java
rename to v7/preference/src/androidTest/java/android/support/v7/preference/tests/helpers/PreferenceWrapper.java
diff --git a/v7/preference/tests/NO_DOCS b/v7/preference/tests/NO_DOCS
deleted file mode 100644
index db956bc..0000000
--- a/v7/preference/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
\ No newline at end of file
diff --git a/v7/recyclerview/build.gradle b/v7/recyclerview/build.gradle
index b172a01..e58e5b1 100644
--- a/v7/recyclerview/build.gradle
+++ b/v7/recyclerview/build.gradle
@@ -42,5 +42,4 @@
     mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2014"
     description = "Android Support RecyclerView v7"
-    legacySourceLocation = true
 }
diff --git a/v7/recyclerview/tests/AndroidManifest.xml b/v7/recyclerview/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from v7/recyclerview/tests/AndroidManifest.xml
rename to v7/recyclerview/src/androidTest/AndroidManifest.xml
diff --git a/v7/recyclerview/tests/src/android/support/v7/recyclerview/extensions/AsyncListDifferTest.kt b/v7/recyclerview/src/androidTest/java/android/support/v7/recyclerview/extensions/AsyncListDifferTest.kt
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/recyclerview/extensions/AsyncListDifferTest.kt
rename to v7/recyclerview/src/androidTest/java/android/support/v7/recyclerview/extensions/AsyncListDifferTest.kt
diff --git a/v7/recyclerview/tests/src/android/support/v7/recyclerview/test/CustomLayoutManager.java b/v7/recyclerview/src/androidTest/java/android/support/v7/recyclerview/test/CustomLayoutManager.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/recyclerview/test/CustomLayoutManager.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/recyclerview/test/CustomLayoutManager.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/recyclerview/test/PrivateLayoutManager.java b/v7/recyclerview/src/androidTest/java/android/support/v7/recyclerview/test/PrivateLayoutManager.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/recyclerview/test/PrivateLayoutManager.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/recyclerview/test/PrivateLayoutManager.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/util/AsyncListUtilTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/util/AsyncListUtilTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/util/AsyncListUtilTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/util/AsyncListUtilTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/util/MessageQueueTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/util/MessageQueueTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/util/MessageQueueTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/util/MessageQueueTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/util/ThreadUtilTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/util/ThreadUtilTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/util/ThreadUtilTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/util/ThreadUtilTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/util/TileListTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/util/TileListTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/util/TileListTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/util/TileListTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/util/TouchUtils.java b/v7/recyclerview/src/androidTest/java/android/support/v7/util/TouchUtils.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/util/TouchUtils.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/util/TouchUtils.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/AsyncListUtilLayoutTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/AsyncListUtilLayoutTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/AsyncListUtilLayoutTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/AsyncListUtilLayoutTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/AttachDetachCollector.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/AttachDetachCollector.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/AttachDetachCollector.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/AttachDetachCollector.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseGridLayoutManagerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseGridLayoutManagerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BaseGridLayoutManagerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseGridLayoutManagerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseLinearLayoutManagerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseLinearLayoutManagerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BaseLinearLayoutManagerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseLinearLayoutManagerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewAnimationsTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseRecyclerViewAnimationsTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewAnimationsTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseRecyclerViewAnimationsTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseRecyclerViewInstrumentationTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseStaggeredGridLayoutManagerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseStaggeredGridLayoutManagerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BaseStaggeredGridLayoutManagerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseStaggeredGridLayoutManagerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseWrapContentTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseWrapContentTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentWithAspectRatioTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseWrapContentWithAspectRatioTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BaseWrapContentWithAspectRatioTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BaseWrapContentWithAspectRatioTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/BucketTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/BucketTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/BucketTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/BucketTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/CacheUtils.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/CacheUtils.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/CacheUtils.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/CacheUtils.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/ChildHelperTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/ChildHelperTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/ChildHelperTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/ChildHelperTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/CustomEdgeEffectTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/CustomEdgeEffectTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/CustomEdgeEffectTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/CustomEdgeEffectTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/DefaultItemAnimatorTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/DefaultItemAnimatorTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/DefaultItemAnimatorTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/DefaultItemAnimatorTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/DefaultMeasureSpecTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/DefaultMeasureSpecTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/DefaultMeasureSpecTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/DefaultMeasureSpecTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/DividerItemDecorationTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/DividerItemDecorationTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/DividerItemDecorationTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/DividerItemDecorationTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/DummyItemAnimator.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/DummyItemAnimator.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/DummyItemAnimator.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/DummyItemAnimator.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/FocusSearchNavigationTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/FocusSearchNavigationTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/FocusSearchNavigationTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/FocusSearchNavigationTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GapWorkerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GapWorkerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GapWorkerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GapWorkerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerBaseConfigSetTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerBaseConfigSetTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerBaseConfigSetTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerBaseConfigSetTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCacheTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerCacheTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCacheTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerCacheTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCachedBordersTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerCachedBordersTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCachedBordersTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerCachedBordersTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCustomSizeInScrollDirectionTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerCustomSizeInScrollDirectionTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerCustomSizeInScrollDirectionTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerCustomSizeInScrollDirectionTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerNoOpUpdateTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerNoOpUpdateTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerNoOpUpdateTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerNoOpUpdateTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerRtlTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerRtlTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerRtlTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerRtlTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerSnappingTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerSnappingTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerSnappingTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerSnappingTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerWrapContentTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerWrapContentTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerWrapContentTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerWrapContentTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerWrapContentWithAspectRatioTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerWrapContentWithAspectRatioTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerWrapContentWithAspectRatioTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/GridLayoutManagerWrapContentWithAspectRatioTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/InfoStoreTrojan.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/InfoStoreTrojan.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/InfoStoreTrojan.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/InfoStoreTrojan.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/ItemAnimatorV2ApiTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/ItemAnimatorV2ApiTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/ItemAnimatorV2ApiTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/ItemAnimatorV2ApiTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerBaseConfigSetTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerBaseConfigSetTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerBaseConfigSetTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerBaseConfigSetTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerCacheTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerCacheTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerCacheTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerCacheTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerPrepareForDropTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerPrepareForDropTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerPrepareForDropTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerPrepareForDropTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerResizeTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerResizeTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerResizeTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerResizeTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerSavedStateTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerSavedStateTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerSavedStateTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerSavedStateTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerSnappingTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerSnappingTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerSnappingTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerSnappingTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerWrapContentTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerWrapContentTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerWrapContentTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerWrapContentTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerWrapContentWithAspectRatioTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerWrapContentWithAspectRatioTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LinearLayoutManagerWrapContentWithAspectRatioTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LinearLayoutManagerWrapContentWithAspectRatioTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/LoggingItemAnimator.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/LoggingItemAnimator.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/LoggingItemAnimator.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/LoggingItemAnimator.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/MultiRecyclerViewPrefetchTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/MultiRecyclerViewPrefetchTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/MultiRecyclerViewPrefetchTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/MultiRecyclerViewPrefetchTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/PagerSnapHelperTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/PagerSnapHelperTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/PagerSnapHelperTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/PagerSnapHelperTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecycledViewPoolTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecycledViewPoolTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecycledViewPoolTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecycledViewPoolTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAccessibilityLifecycleTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewAccessibilityLifecycleTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAccessibilityLifecycleTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewAccessibilityLifecycleTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAccessibilityTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewAccessibilityTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAccessibilityTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewAccessibilityTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewAnimationsTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewAnimationsTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewBasicTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewBasicTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewBasicTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewCacheTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewCacheTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewCacheTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewCacheTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewFastScrollerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewFastScrollerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFocusRecoveryTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewFocusRecoveryTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFocusRecoveryTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewFocusRecoveryTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewLayoutTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewLayoutTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewOnGenericMotionEventTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewOnGenericMotionEventTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewOnGenericMotionEventTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewOnGenericMotionEventTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewPrefetchTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewPrefetchTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewPrefetchTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/RecyclerViewPrefetchTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/ScrollToPositionWithAutoMeasure.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/ScrollToPositionWithAutoMeasure.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/ScrollToPositionWithAutoMeasure.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/ScrollToPositionWithAutoMeasure.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerCacheTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerCacheTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerCacheTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerCacheTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerGapTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerGapTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerGapTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerGapTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerSavedStateTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerSavedStateTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerSavedStateTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerSavedStateTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerSnappingTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerSnappingTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerSnappingTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerSnappingTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerWrapContentTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerWrapContentTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerWrapContentTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/StaggeredGridLayoutManagerWrapContentTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/TestActivity.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/TestActivity.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/TestActivity.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/TestActivity.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/TestResizingRelayoutWithAutoMeasure.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/TestResizingRelayoutWithAutoMeasure.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/TestResizingRelayoutWithAutoMeasure.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/TestResizingRelayoutWithAutoMeasure.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/TestedFrameLayout.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/TestedFrameLayout.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/TestedFrameLayout.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/TestedFrameLayout.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/ViewBoundsCheckTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/ViewBoundsCheckTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/ViewBoundsCheckTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/ViewBoundsCheckTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/WrapContentBasicTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/WrapContentBasicTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/WrapContentBasicTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/WrapContentBasicTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/WrappedRecyclerView.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/WrappedRecyclerView.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/WrappedRecyclerView.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/WrappedRecyclerView.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/helper/ItemTouchHelperTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/helper/ItemTouchHelperTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/helper/ItemTouchHelperTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/helper/ItemTouchHelperTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/test/NestedScrollingParent2Adapter.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/test/NestedScrollingParent2Adapter.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/test/NestedScrollingParent2Adapter.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/test/NestedScrollingParent2Adapter.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/test/RecyclerViewTest.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/test/RecyclerViewTest.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/test/RecyclerViewTest.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/test/RecyclerViewTest.java
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/test/RecyclerViewTestActivity.java b/v7/recyclerview/src/androidTest/java/android/support/v7/widget/test/RecyclerViewTestActivity.java
similarity index 100%
rename from v7/recyclerview/tests/src/android/support/v7/widget/test/RecyclerViewTestActivity.java
rename to v7/recyclerview/src/androidTest/java/android/support/v7/widget/test/RecyclerViewTestActivity.java
diff --git a/v7/recyclerview/tests/res/drawable/fast_scroll_thumb_drawable.xml b/v7/recyclerview/src/androidTest/res/drawable/fast_scroll_thumb_drawable.xml
similarity index 100%
rename from v7/recyclerview/tests/res/drawable/fast_scroll_thumb_drawable.xml
rename to v7/recyclerview/src/androidTest/res/drawable/fast_scroll_thumb_drawable.xml
diff --git a/v7/recyclerview/tests/res/drawable/fast_scroll_track_drawable.xml b/v7/recyclerview/src/androidTest/res/drawable/fast_scroll_track_drawable.xml
similarity index 100%
rename from v7/recyclerview/tests/res/drawable/fast_scroll_track_drawable.xml
rename to v7/recyclerview/src/androidTest/res/drawable/fast_scroll_track_drawable.xml
diff --git a/v7/recyclerview/tests/res/drawable/item_bg.xml b/v7/recyclerview/src/androidTest/res/drawable/item_bg.xml
similarity index 100%
rename from v7/recyclerview/tests/res/drawable/item_bg.xml
rename to v7/recyclerview/src/androidTest/res/drawable/item_bg.xml
diff --git a/v7/recyclerview/tests/res/layout/fast_scrollbar_test_rv.xml b/v7/recyclerview/src/androidTest/res/layout/fast_scrollbar_test_rv.xml
similarity index 100%
rename from v7/recyclerview/tests/res/layout/fast_scrollbar_test_rv.xml
rename to v7/recyclerview/src/androidTest/res/layout/fast_scrollbar_test_rv.xml
diff --git a/v7/recyclerview/tests/res/layout/focus_search_activity.xml b/v7/recyclerview/src/androidTest/res/layout/focus_search_activity.xml
similarity index 100%
rename from v7/recyclerview/tests/res/layout/focus_search_activity.xml
rename to v7/recyclerview/src/androidTest/res/layout/focus_search_activity.xml
diff --git a/v7/recyclerview/tests/res/layout/focus_test_item_view.xml b/v7/recyclerview/src/androidTest/res/layout/focus_test_item_view.xml
similarity index 100%
rename from v7/recyclerview/tests/res/layout/focus_test_item_view.xml
rename to v7/recyclerview/src/androidTest/res/layout/focus_test_item_view.xml
diff --git a/v7/recyclerview/tests/res/layout/inflation_test.xml b/v7/recyclerview/src/androidTest/res/layout/inflation_test.xml
similarity index 100%
rename from v7/recyclerview/tests/res/layout/inflation_test.xml
rename to v7/recyclerview/src/androidTest/res/layout/inflation_test.xml
diff --git a/v7/recyclerview/tests/res/layout/item_view.xml b/v7/recyclerview/src/androidTest/res/layout/item_view.xml
similarity index 100%
rename from v7/recyclerview/tests/res/layout/item_view.xml
rename to v7/recyclerview/src/androidTest/res/layout/item_view.xml
diff --git a/v7/recyclerview/tests/res/layout/wrapped_test_rv.xml b/v7/recyclerview/src/androidTest/res/layout/wrapped_test_rv.xml
similarity index 100%
rename from v7/recyclerview/tests/res/layout/wrapped_test_rv.xml
rename to v7/recyclerview/src/androidTest/res/layout/wrapped_test_rv.xml
diff --git a/v7/recyclerview/tests/res/values/styles.xml b/v7/recyclerview/src/androidTest/res/values/styles.xml
similarity index 100%
rename from v7/recyclerview/tests/res/values/styles.xml
rename to v7/recyclerview/src/androidTest/res/values/styles.xml
diff --git a/v7/recyclerview/src/test/NO_DOCS b/v7/recyclerview/src/test/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/v7/recyclerview/src/test/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/v7/recyclerview/tests/NO_DOCS b/v7/recyclerview/tests/NO_DOCS
deleted file mode 100644
index 0c81e4a..0000000
--- a/v7/recyclerview/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/viewpager/api/current.txt b/viewpager/api/current.txt
new file mode 100644
index 0000000..31baf49
--- /dev/null
+++ b/viewpager/api/current.txt
@@ -0,0 +1,125 @@
+package android.support.v4.view {
+
+  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 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 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);
+  }
+
+}
+
diff --git a/viewpager/build.gradle b/viewpager/build.gradle
new file mode 100644
index 0000000..fdf3b29
--- /dev/null
+++ b/viewpager/build.gradle
@@ -0,0 +1,27 @@
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    api(project(":support-annotations"))
+    api(project(":support-compat"))
+    api(project(":customview"))
+
+    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+}
+
+supportLibrary {
+    name = "Android Support Library View Pager"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
+    inceptionYear = "2018"
+    description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
+}
diff --git a/core-ui/tests/AndroidManifest.xml b/viewpager/src/androidTest/AndroidManifest.xml
similarity index 70%
copy from core-ui/tests/AndroidManifest.xml
copy to viewpager/src/androidTest/AndroidManifest.xml
index 4ea7691..d7fd2e6 100644
--- a/core-ui/tests/AndroidManifest.xml
+++ b/viewpager/src/androidTest/AndroidManifest.xml
@@ -15,7 +15,7 @@
   ~ limitations under the License.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="android.support.coreui.test">
+          package="android.support.viewpager.test">
     <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
 
     <uses-permission android:name="android.permission.VIBRATE"/>
@@ -26,13 +26,6 @@
     <application
         android:supportsRtl="true"
         android:theme="@style/TestActivityTheme">
-        <activity android:name="android.support.v4.widget.ExploreByTouchHelperTestActivity"/>
-
-        <activity android:name="android.support.v4.widget.CircularProgressDrawableActivity"/>
-
-        <activity android:name="android.support.v4.widget.SwipeRefreshLayoutActivity"/>
-
-        <activity android:name="android.support.v4.widget.ContentLoadingProgressBarActivity"/>
 
         <activity android:name="android.support.v4.view.ViewPagerWithTitleStripActivity"/>
 
@@ -40,10 +33,6 @@
 
         <activity android:name="android.support.v4.view.ViewPagerTest$ViewPagerActivity"/>
 
-        <activity android:name="android.support.design.widget.CoordinatorLayoutActivity"/>
-
-        <activity android:name="android.support.design.widget.DynamicCoordinatorLayoutActivity"/>
-
     </application>
 
 </manifest>
diff --git a/compat/tests/java/android/support/v4/BaseInstrumentationTestCase.java b/viewpager/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java
similarity index 100%
copy from compat/tests/java/android/support/v4/BaseInstrumentationTestCase.java
copy to viewpager/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java
diff --git a/compat/tests/java/android/support/v4/BaseTestActivity.java b/viewpager/src/androidTest/java/android/support/v4/BaseTestActivity.java
similarity index 100%
copy from compat/tests/java/android/support/v4/BaseTestActivity.java
copy to viewpager/src/androidTest/java/android/support/v4/BaseTestActivity.java
diff --git a/compat/tests/java/android/support/v4/testutils/TestUtils.java b/viewpager/src/androidTest/java/android/support/v4/testutils/TestUtils.java
similarity index 100%
copy from compat/tests/java/android/support/v4/testutils/TestUtils.java
copy to viewpager/src/androidTest/java/android/support/v4/testutils/TestUtils.java
diff --git a/core-ui/tests/java/android/support/v4/testutils/TestUtilsAssertions.java b/viewpager/src/androidTest/java/android/support/v4/testutils/TestUtilsAssertions.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/testutils/TestUtilsAssertions.java
rename to viewpager/src/androidTest/java/android/support/v4/testutils/TestUtilsAssertions.java
diff --git a/core-ui/tests/java/android/support/v4/testutils/TestUtilsMatchers.java b/viewpager/src/androidTest/java/android/support/v4/testutils/TestUtilsMatchers.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/testutils/TestUtilsMatchers.java
rename to viewpager/src/androidTest/java/android/support/v4/testutils/TestUtilsMatchers.java
diff --git a/core-ui/tests/java/android/support/v4/view/BaseViewPagerTest.java b/viewpager/src/androidTest/java/android/support/v4/view/BaseViewPagerTest.java
similarity index 99%
rename from core-ui/tests/java/android/support/v4/view/BaseViewPagerTest.java
rename to viewpager/src/androidTest/java/android/support/v4/view/BaseViewPagerTest.java
index f26942b..7803ea2 100644
--- a/core-ui/tests/java/android/support/v4/view/BaseViewPagerTest.java
+++ b/viewpager/src/androidTest/java/android/support/v4/view/BaseViewPagerTest.java
@@ -61,7 +61,7 @@
 
 import android.app.Activity;
 import android.graphics.Color;
-import android.support.coreui.test.R;
+import android.support.viewpager.test.R;
 import android.support.test.espresso.ViewAction;
 import android.support.test.espresso.action.EspressoKey;
 import android.support.test.filters.FlakyTest;
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerActions.java b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerActions.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/view/ViewPagerActions.java
rename to viewpager/src/androidTest/java/android/support/v4/view/ViewPagerActions.java
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerTest.java b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerTest.java
similarity index 100%
rename from core-ui/tests/java/android/support/v4/view/ViewPagerTest.java
rename to viewpager/src/androidTest/java/android/support/v4/view/ViewPagerTest.java
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
similarity index 95%
rename from core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
rename to viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
index 55fd51e..487a1af 100644
--- a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
+++ b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
@@ -18,7 +18,7 @@
 
 import android.app.Activity;
 import android.os.Bundle;
-import android.support.coreui.test.R;
+import android.support.viewpager.test.R;
 import android.view.WindowManager;
 
 public class ViewPagerWithTabStripActivity extends Activity {
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTabStripTest.java
similarity index 98%
rename from core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java
rename to viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTabStripTest.java
index cd26461..b7ca014 100644
--- a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java
+++ b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTabStripTest.java
@@ -15,7 +15,7 @@
  */
 package android.support.v4.view;
 
-import android.support.coreui.test.R;
+import android.support.viewpager.test.R;
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.action.ViewActions.click;
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
similarity index 95%
rename from core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
rename to viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
index e5a62a1..8aa295f 100644
--- a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
+++ b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
@@ -18,7 +18,7 @@
 
 import android.app.Activity;
 import android.os.Bundle;
-import android.support.coreui.test.R;
+import android.support.viewpager.test.R;
 import android.view.WindowManager;
 
 public class ViewPagerWithTitleStripActivity extends Activity {
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
similarity index 98%
rename from core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
rename to viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
index d54992c..044d9cd 100644
--- a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
+++ b/viewpager/src/androidTest/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
@@ -15,7 +15,7 @@
  */
 package android.support.v4.view;
 
-import android.support.coreui.test.R;
+import android.support.viewpager.test.R;
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.action.ViewActions.click;
diff --git a/core-ui/tests/res/layout/view_pager_with_tab_strip.xml b/viewpager/src/androidTest/res/layout/view_pager_with_tab_strip.xml
similarity index 100%
rename from core-ui/tests/res/layout/view_pager_with_tab_strip.xml
rename to viewpager/src/androidTest/res/layout/view_pager_with_tab_strip.xml
diff --git a/core-ui/tests/res/layout/view_pager_with_title_strip.xml b/viewpager/src/androidTest/res/layout/view_pager_with_title_strip.xml
similarity index 100%
rename from core-ui/tests/res/layout/view_pager_with_title_strip.xml
rename to viewpager/src/androidTest/res/layout/view_pager_with_title_strip.xml
diff --git a/core-ui/tests/res/values/ids.xml b/viewpager/src/androidTest/res/values/ids.xml
similarity index 96%
rename from core-ui/tests/res/values/ids.xml
rename to viewpager/src/androidTest/res/values/ids.xml
index f3ac9b4..e5fcf63 100644
--- a/core-ui/tests/res/values/ids.xml
+++ b/viewpager/src/androidTest/res/values/ids.xml
@@ -24,5 +24,4 @@
     <item name="page_7" type="id"/>
     <item name="page_8" type="id"/>
     <item name="page_9" type="id"/>
-    <item name="anchor" type="id"/>
 </resources>
\ No newline at end of file
diff --git a/core-ui/tests/res/values/styles.xml b/viewpager/src/androidTest/res/values/styles.xml
similarity index 100%
copy from core-ui/tests/res/values/styles.xml
copy to viewpager/src/androidTest/res/values/styles.xml
diff --git a/viewpager/src/main/AndroidManifest.xml b/viewpager/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..feb8a03
--- /dev/null
+++ b/viewpager/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest package="android.support.viewpager" />
diff --git a/core-ui/src/main/java/android/support/v4/view/PagerAdapter.java b/viewpager/src/main/java/android/support/v4/view/PagerAdapter.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/PagerAdapter.java
rename to viewpager/src/main/java/android/support/v4/view/PagerAdapter.java
diff --git a/core-ui/src/main/java/android/support/v4/view/PagerTabStrip.java b/viewpager/src/main/java/android/support/v4/view/PagerTabStrip.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/PagerTabStrip.java
rename to viewpager/src/main/java/android/support/v4/view/PagerTabStrip.java
diff --git a/core-ui/src/main/java/android/support/v4/view/PagerTitleStrip.java b/viewpager/src/main/java/android/support/v4/view/PagerTitleStrip.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/PagerTitleStrip.java
rename to viewpager/src/main/java/android/support/v4/view/PagerTitleStrip.java
diff --git a/core-ui/src/main/java/android/support/v4/view/ViewPager.java b/viewpager/src/main/java/android/support/v4/view/ViewPager.java
similarity index 100%
rename from core-ui/src/main/java/android/support/v4/view/ViewPager.java
rename to viewpager/src/main/java/android/support/v4/view/ViewPager.java
diff --git a/wear/src/androidTest/NO_DOCS b/wear/src/androidTest/NO_DOCS
deleted file mode 100644
index 092a39c..0000000
--- a/wear/src/androidTest/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.
diff --git a/webkit/api/current.txt b/webkit/api/current.txt
new file mode 100644
index 0000000..b0d66d6
--- /dev/null
+++ b/webkit/api/current.txt
@@ -0,0 +1,12 @@
+package androidx.webkit {
+
+  public class WebViewCompat {
+    method public static void postVisualStateCallback(android.webkit.WebView, long, androidx.webkit.WebViewCompat.VisualStateCallback);
+  }
+
+  public static abstract interface WebViewCompat.VisualStateCallback {
+    method public abstract void onComplete(long);
+  }
+
+}
+
diff --git a/webkit/build.gradle b/webkit/build.gradle
index e4fff11..7975fc8 100644
--- a/webkit/build.gradle
+++ b/webkit/build.gradle
@@ -13,20 +13,39 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-apply plugin: android.support.SupportAndroidLibraryPlugin
+
+import static android.support.dependencies.DependenciesKt.*
+import android.support.LibraryGroups
+import android.support.LibraryVersions
+
+plugins {
+    id("SupportAndroidLibraryPlugin")
+}
+
+dependencies {
+    api(project(":support-annotations"))
+    api(project(':support-compat'))
+
+    androidTestImplementation(TEST_RUNNER)
+}
+
+ext {
+    webviewBoundaryInterfacesDir = project(':webview-support-interfaces').projectDir
+}
 
 android {
-    defaultConfig {
-        minSdkVersion 21
-    }
-
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
+        // Allow compiling the WebView support library boundary interfaces from this project.
+        main.java.srcDirs += new File(webviewBoundaryInterfacesDir, "src").getAbsolutePath()
     }
 }
 
 supportLibrary {
     name = "WebView Support Library"
+    publish = true
+    mavenVersion = LibraryVersions.SUPPORT_LIBRARY
+    mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2017"
     description = "The WebView Support Library is a static library you can add to your Android application in order to use android.webkit APIs that are not available for older platform versions."
+    minSdkVersion = 21
 }
diff --git a/webkit/src/androidTest/AndroidManifest.xml b/webkit/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..6448148
--- /dev/null
+++ b/webkit/src/androidTest/AndroidManifest.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.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="androidx.webkit">
+    <uses-sdk android:targetSdkVersion="${target-sdk-version}"/>
+</manifest>
diff --git a/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java b/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java
new file mode 100644
index 0000000..8b38d99
--- /dev/null
+++ b/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.webkit;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.os.BuildCompat;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+@RunWith(AndroidJUnit4.class)
+public class WebViewCompatTest {
+    WebViewOnUiThread mWebViewOnUiThread;
+
+    private static final long TEST_TIMEOUT = 20000L;
+
+    @Before
+    public void setUp() {
+        mWebViewOnUiThread = new androidx.webkit.WebViewOnUiThread();
+    }
+
+    @MediumTest
+    @Test
+    public void testVisualStateCallbackCalled() throws Exception {
+        // TODO(gsennton) activate this test for pre-P devices when we can pre-install a WebView APK
+        // containing support for the WebView Support Library, see b/73454652.
+        if (!BuildCompat.isAtLeastP()) return;
+
+        final CountDownLatch callbackLatch = new CountDownLatch(1);
+        final long kRequest = 100;
+
+        mWebViewOnUiThread.loadUrl("about:blank");
+
+        mWebViewOnUiThread.postVisualStateCallbackCompat(kRequest,
+                new WebViewCompat.VisualStateCallback() {
+                        public void onComplete(long requestId) {
+                            assertEquals(kRequest, requestId);
+                            callbackLatch.countDown();
+                        }
+                });
+
+        assertTrue(callbackLatch.await(TEST_TIMEOUT, TimeUnit.MILLISECONDS));
+    }
+
+    @MediumTest
+    @Test
+    public void testCheckThread() {
+        try {
+            WebViewCompat.postVisualStateCallback(mWebViewOnUiThread.getWebViewOnCurrentThread(), 5,
+                    new WebViewCompat.VisualStateCallback() {
+                        @Override
+                        public void onComplete(long requestId) {
+                        }
+                    });
+        } catch (RuntimeException e) {
+            return;
+        }
+        fail("Calling a WebViewCompat method on the wrong thread must cause a run-time exception");
+    }
+}
diff --git a/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java b/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
new file mode 100644
index 0000000..6219bd3
--- /dev/null
+++ b/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.webkit;
+
+import android.support.test.InstrumentationRegistry;
+import android.webkit.WebView;
+
+public class WebViewOnUiThread {
+    private WebView mWebView;
+
+    public WebViewOnUiThread() {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mWebView = new WebView(InstrumentationRegistry.getTargetContext());
+            }
+        });
+    }
+
+    public void loadUrl(final String url) {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadUrl(url);
+            }
+        });
+    }
+
+    public void postVisualStateCallbackCompat(final long requestId,
+            final WebViewCompat.VisualStateCallback callback) {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                WebViewCompat.postVisualStateCallback(mWebView, requestId, callback);
+            }
+        });
+    }
+
+    public WebView getWebViewOnCurrentThread() {
+        return mWebView;
+    }
+}
diff --git a/webkit/AndroidManifest.xml b/webkit/src/main/AndroidManifest.xml
similarity index 100%
rename from webkit/AndroidManifest.xml
rename to webkit/src/main/AndroidManifest.xml
diff --git a/webkit/src/main/java/androidx/webkit/WebViewCompat.java b/webkit/src/main/java/androidx/webkit/WebViewCompat.java
new file mode 100644
index 0000000..3141918
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/WebViewCompat.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.webkit;
+
+import android.os.Build;
+import android.os.Looper;
+import android.support.annotation.NonNull;
+import android.support.v4.os.BuildCompat;
+import android.webkit.WebView;
+
+import org.chromium.support_lib_boundary.WebViewProviderBoundaryInterface;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import androidx.webkit.internal.WebViewGlueCommunicator;
+import androidx.webkit.internal.WebViewProviderAdapter;
+import androidx.webkit.internal.WebViewProviderFactoryAdapter;
+
+/**
+ * Compatibility version of {@link android.webkit.WebView}
+ */
+public class WebViewCompat {
+    private WebViewCompat() {} // Don't allow instances of this class to be constructed.
+
+    /**
+     * Callback interface supplied to {@link #postVisualStateCallback} for receiving
+     * notifications about the visual state.
+     */
+    public interface VisualStateCallback {
+        /**
+         * Invoked when the visual state is ready to be drawn in the next {@link WebView#onDraw}.
+         *
+         * @param requestId The identifier passed to {@link #postVisualStateCallback} when this
+         *                  callback was posted.
+         */
+        void onComplete(long requestId);
+    }
+
+    /**
+     * Posts a {@link VisualStateCallback}, which will be called when
+     * the current state of the WebView is ready to be drawn.
+     *
+     * <p>Because updates to the DOM are processed asynchronously, updates to the DOM may not
+     * immediately be reflected visually by subsequent {@link WebView#onDraw} invocations. The
+     * {@link VisualStateCallback} provides a mechanism to notify the caller when the contents
+     * of the DOM at the current time are ready to be drawn the next time the {@link WebView} draws.
+     *
+     * <p>The next draw after the callback completes is guaranteed to reflect all the updates to the
+     * DOM up to the point at which the {@link VisualStateCallback} was posted, but it may
+     * also contain updates applied after the callback was posted.
+     *
+     * <p>The state of the DOM covered by this API includes the following:
+     * <ul>
+     * <li>primitive HTML elements (div, img, span, etc..)</li>
+     * <li>images</li>
+     * <li>CSS animations</li>
+     * <li>WebGL</li>
+     * <li>canvas</li>
+     * </ul>
+     * It does not include the state of:
+     * <ul>
+     * <li>the video tag</li>
+     * </ul>
+     *
+     * <p>To guarantee that the {@link WebView} will successfully render the first frame
+     * after the {@link VisualStateCallback#onComplete} method has been called a set of
+     * conditions must be met:
+     * <ul>
+     * <li>If the {@link WebView}'s visibility is set to {@link android.view.View#VISIBLE VISIBLE}
+     * then * the {@link WebView} must be attached to the view hierarchy.</li>
+     * <li>If the {@link WebView}'s visibility is set to
+     * {@link android.view.View#INVISIBLE INVISIBLE} then the {@link WebView} must be attached to
+     * the view hierarchy and must be made {@link android.view.View#VISIBLE VISIBLE} from the
+     * {@link VisualStateCallback#onComplete} method.</li>
+     * <li>If the {@link WebView}'s visibility is set to {@link android.view.View#GONE GONE} then
+     * the {@link WebView} must be attached to the view hierarchy and its
+     * {@link android.widget.AbsoluteLayout.LayoutParams LayoutParams}'s width and height need to be
+     * set to fixed values and must be made {@link android.view.View#VISIBLE VISIBLE} from the
+     * {@link VisualStateCallback#onComplete} method.</li>
+     * </ul>
+     *
+     * <p>When using this API it is also recommended to enable pre-rasterization if the {@link
+     * WebView} is off screen to avoid flickering. See
+     * {@link android.webkit.WebSettings#setOffscreenPreRaster} for more details and do consider its
+     * caveats.
+     *
+     * @param requestId An id that will be returned in the callback to allow callers to match
+     *                  requests with callbacks.
+     * @param callback  The callback to be invoked.
+     */
+    public static void postVisualStateCallback(@NonNull WebView webview, long requestId,
+            @NonNull final VisualStateCallback callback) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            webview.postVisualStateCallback(requestId,
+                    new android.webkit.WebView.VisualStateCallback() {
+                        @Override
+                        public void onComplete(long l) {
+                            callback.onComplete(l);
+                        }
+                    });
+        } else {
+            // TODO(gsennton): guard with if WebViewApk.hasFeature(POSTVISUALSTATECALLBACK)
+            checkThread(webview);
+            getProvider(webview).insertVisualStateCallback(requestId, callback);
+        }
+    }
+
+    private static WebViewProviderAdapter getProvider(WebView webview) {
+        return new WebViewProviderAdapter(createProvider(webview));
+    }
+
+    private static WebViewProviderFactoryAdapter getFactory() {
+        return WebViewGlueCommunicator.getFactory();
+    }
+
+    private static WebViewProviderBoundaryInterface createProvider(WebView webview) {
+        return getFactory().createWebView(webview);
+    }
+
+    @SuppressWarnings("NewApi")
+    private static void checkThread(WebView webview) {
+        if (BuildCompat.isAtLeastP()) {
+            if (webview.getLooper() != Looper.myLooper()) {
+                throw new RuntimeException("A WebView method was called on thread '"
+                        + Thread.currentThread().getName() + "'. "
+                        + "All WebView methods must be called on the same thread. "
+                        + "(Expected Looper " + webview.getLooper() + " called on "
+                        + Looper.myLooper() + ", FYI main Looper is " + Looper.getMainLooper()
+                        + ")");
+            }
+        } else {
+            try {
+                Method checkThreadMethod = WebView.class.getDeclaredMethod("checkThread");
+                checkThreadMethod.setAccessible(true);
+                // WebView.checkThread() performs some logging and potentially throws an exception
+                // if WebView is used on the wrong thread.
+                checkThreadMethod.invoke(webview);
+            } catch (NoSuchMethodException e) {
+                throw new RuntimeException(e);
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException(e);
+            } catch (InvocationTargetException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/VisualStateCallbackAdapter.java b/webkit/src/main/java/androidx/webkit/internal/VisualStateCallbackAdapter.java
new file mode 100644
index 0000000..c6917d8
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/VisualStateCallbackAdapter.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.webkit.internal;
+
+import org.chromium.support_lib_boundary.VisualStateCallbackBoundaryInterface;
+
+import androidx.webkit.WebViewCompat;
+
+/**
+ * Adapter between WebViewCompat.VisualStateCallback and VisualStateCallbackBoundaryInterface (the
+ * corresponding interface shared with the support library glue in the WebView APK).
+ */
+public class VisualStateCallbackAdapter implements VisualStateCallbackBoundaryInterface {
+    private WebViewCompat.VisualStateCallback mVisualStateCallback;
+
+    public VisualStateCallbackAdapter(WebViewCompat.VisualStateCallback visualStateCallback) {
+        mVisualStateCallback = visualStateCallback;
+    }
+
+    @Override
+    public void onComplete(long requestId) {
+        mVisualStateCallback.onComplete(requestId);
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/WebViewGlueCommunicator.java b/webkit/src/main/java/androidx/webkit/internal/WebViewGlueCommunicator.java
new file mode 100644
index 0000000..f97b2d8
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/WebViewGlueCommunicator.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.webkit.internal;
+
+import android.support.v4.os.BuildCompat;
+import android.webkit.WebView;
+
+import org.chromium.support_lib_boundary.BoundaryInterfaceReflectionUtil;
+import org.chromium.support_lib_boundary.WebViewProviderFactoryBoundaryInterface;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Utility class for calling into the WebView APK.
+ */
+public class WebViewGlueCommunicator {
+    private static final String GLUE_FACTORY_PROVIDER_FETCHER_CLASS =
+            "org.chromium.support_lib_glue.SupportLibReflectionUtil";
+    private static final String GLUE_FACTORY_PROVIDER_FETCHER_METHOD =
+            "createWebViewProviderFactory";
+
+    /**
+     * Fetch the one global support library WebViewProviderFactory from the WebView glue layer.
+     */
+    public static WebViewProviderFactoryAdapter getFactory() {
+        return LAZY_FACTORY_HOLDER.INSTANCE;
+    }
+
+    private static class LAZY_FACTORY_HOLDER {
+        static final WebViewProviderFactoryAdapter INSTANCE =
+                new WebViewProviderFactoryAdapter(
+                        WebViewGlueCommunicator.createGlueProviderFactory());
+    }
+
+    private static InvocationHandler fetchGlueProviderFactoryImpl() {
+        try {
+            Class<?> glueFactoryProviderFetcherClass = Class.forName(
+                    GLUE_FACTORY_PROVIDER_FETCHER_CLASS, false, getWebViewClassLoader());
+            Method createProviderFactoryMethod = glueFactoryProviderFetcherClass.getDeclaredMethod(
+                    GLUE_FACTORY_PROVIDER_FETCHER_METHOD);
+            return (InvocationHandler) createProviderFactoryMethod.invoke(null);
+        } catch (IllegalAccessException | InvocationTargetException | ClassNotFoundException
+                | NoSuchMethodException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static WebViewProviderFactoryBoundaryInterface createGlueProviderFactory() {
+        InvocationHandler invocationHandler = fetchGlueProviderFactoryImpl();
+        return BoundaryInterfaceReflectionUtil.castToSuppLibClass(
+                WebViewProviderFactoryBoundaryInterface.class, invocationHandler);
+    }
+
+    /**
+     * Load the WebView code from the WebView APK and return the classloader containing that code.
+     */
+    @SuppressWarnings("NewApi")
+    public static ClassLoader getWebViewClassLoader() {
+        if (BuildCompat.isAtLeastP()) {
+            return WebView.getWebViewClassLoader();
+        } else {
+            return getWebViewProviderFactory().getClass().getClassLoader();
+        }
+    }
+
+    private static Object getWebViewProviderFactory() {
+        try {
+            Method getFactoryMethod = WebView.class.getDeclaredMethod("getFactory");
+            getFactoryMethod.setAccessible(true);
+            return getFactoryMethod.invoke(null);
+        } catch (NoSuchMethodException e) {
+            throw new RuntimeException(e);
+        } catch (InvocationTargetException e) {
+            throw new RuntimeException(e);
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/WebViewProviderAdapter.java b/webkit/src/main/java/androidx/webkit/internal/WebViewProviderAdapter.java
new file mode 100644
index 0000000..249d367
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/WebViewProviderAdapter.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.webkit.internal;
+
+import org.chromium.support_lib_boundary.BoundaryInterfaceReflectionUtil;
+import org.chromium.support_lib_boundary.WebViewProviderBoundaryInterface;
+
+import androidx.webkit.WebViewCompat;
+
+/**
+ * Adapter for WebViewProviderBoundaryInterface providing the functionality expected of
+ * WebViewCompat, this adapter is the support library version of
+ * {@link android.webkit.WebViewProvider}.
+ */
+public class WebViewProviderAdapter {
+    WebViewProviderBoundaryInterface mImpl;
+
+    public WebViewProviderAdapter(WebViewProviderBoundaryInterface impl) {
+        mImpl = impl;
+    }
+
+    /**
+     * Adapter method WebViewCompat.insertVisualStateCallback().
+     */
+    public void insertVisualStateCallback(long requestId,
+            WebViewCompat.VisualStateCallback callback) {
+        mImpl.insertVisualStateCallback(requestId,
+                BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
+                        new VisualStateCallbackAdapter(callback)));
+    }
+}
diff --git a/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java b/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java
new file mode 100644
index 0000000..d961c09
--- /dev/null
+++ b/webkit/src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.webkit.internal;
+
+import android.webkit.WebView;
+
+import org.chromium.support_lib_boundary.BoundaryInterfaceReflectionUtil;
+import org.chromium.support_lib_boundary.WebViewProviderBoundaryInterface;
+import org.chromium.support_lib_boundary.WebViewProviderFactoryBoundaryInterface;
+
+/**
+ * Adapter for WebViewProviderFactoryBoundaryInterface providing static WebView functionality
+ * similar to that provided by {@link android.webkit.WebViewFactoryProvider}.
+ */
+public class WebViewProviderFactoryAdapter {
+    WebViewProviderFactoryBoundaryInterface mImpl;
+
+    public WebViewProviderFactoryAdapter(WebViewProviderFactoryBoundaryInterface impl) {
+        mImpl = impl;
+    }
+
+    /**
+     * Adapter method for creating a new support library version of
+     * {@link android.webkit.WebViewProvider} - the class used to implement
+     * {@link androidx.webkit.WebViewCompat}.
+     */
+    public WebViewProviderBoundaryInterface createWebView(WebView webview) {
+        return BoundaryInterfaceReflectionUtil.castToSuppLibClass(
+                WebViewProviderBoundaryInterface.class, mImpl.createWebView(webview));
+    }
+}
diff --git a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java b/webkit/src/main/java/androidx/webkit/internal/package-info.java
similarity index 60%
rename from core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java
rename to webkit/src/main/java/androidx/webkit/internal/package-info.java
index f9245bc..61a92c9 100644
--- a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java
+++ b/webkit/src/main/java/androidx/webkit/internal/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2018 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,14 +14,12 @@
  * limitations under the License.
  */
 
-package android.support.v4.widget;
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY_GROUP)
+package androidx.webkit.internal;
 
-import android.support.coreui.test.R;
-import android.support.v4.BaseTestActivity;
+import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
-public class SwipeRefreshLayoutActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.swipe_refresh_layout_activity;
-    }
-}
+import android.support.annotation.RestrictTo;
diff --git a/webkit/tests/NO_DOCS b/webkit/tests/NO_DOCS
deleted file mode 100644
index 4dad694..0000000
--- a/webkit/tests/NO_DOCS
+++ /dev/null
@@ -1,17 +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.
-
-Having this file, named NO_DOCS, in a directory will prevent
-Android javadocs from being generated for java files under
-the directory. This is especially useful for test projects.