Merge changes Ie7240225,I4af676b5 into pi-preview1-androidx-dev

* changes:
  Filter out anything HINT_KEY_WORDS when extracting content from Slice
  Add method for ‘add keywords’ to list builder
diff --git a/app-toolkit/core-testing/build.gradle b/app-toolkit/core-testing/build.gradle
index e4c2e17..946b18d 100644
--- a/app-toolkit/core-testing/build.gradle
+++ b/app-toolkit/core-testing/build.gradle
@@ -44,4 +44,4 @@
     inceptionYear = "2017"
     description = "Android Core-Testing"
     url = SupportLibraryExtension.ARCHITECTURE_URL
-}
\ No newline at end of file
+}
diff --git a/customtabs/OWNERS b/browser/OWNERS
similarity index 100%
rename from customtabs/OWNERS
rename to browser/OWNERS
diff --git a/customtabs/api/current.txt b/browser/api/current.txt
similarity index 100%
rename from customtabs/api/current.txt
rename to browser/api/current.txt
diff --git a/customtabs/api_legacy/26.0.0.txt b/browser/api_legacy/26.0.0.txt
similarity index 100%
rename from customtabs/api_legacy/26.0.0.txt
rename to browser/api_legacy/26.0.0.txt
diff --git a/customtabs/api_legacy/26.1.0.txt b/browser/api_legacy/26.1.0.txt
similarity index 100%
rename from customtabs/api_legacy/26.1.0.txt
rename to browser/api_legacy/26.1.0.txt
diff --git a/customtabs/api_legacy/27.0.0.txt b/browser/api_legacy/27.0.0.txt
similarity index 100%
rename from customtabs/api_legacy/27.0.0.txt
rename to browser/api_legacy/27.0.0.txt
diff --git a/customtabs/api_legacy/27.1.0.txt b/browser/api_legacy/27.1.0.txt
similarity index 100%
rename from customtabs/api_legacy/27.1.0.txt
rename to browser/api_legacy/27.1.0.txt
diff --git a/customtabs/api_legacy/28.0.0-alpha1.txt b/browser/api_legacy/28.0.0-alpha1.txt
similarity index 100%
rename from customtabs/api_legacy/28.0.0-alpha1.txt
rename to browser/api_legacy/28.0.0-alpha1.txt
diff --git a/customtabs/api_legacy/current.txt b/browser/api_legacy/current.txt
similarity index 100%
rename from customtabs/api_legacy/current.txt
rename to browser/api_legacy/current.txt
diff --git a/customtabs/build.gradle b/browser/build.gradle
similarity index 82%
rename from customtabs/build.gradle
rename to browser/build.gradle
index 582e1ea..9930bbd 100644
--- a/customtabs/build.gradle
+++ b/browser/build.gradle
@@ -14,8 +14,8 @@
     api(project(":legacy-support-core-ui"))
     api(project(":appcompat"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     androidTestImplementation(project(":internal-testutils"))
 }
 
diff --git a/customtabs/src/androidTest/AndroidManifest.xml b/browser/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from customtabs/src/androidTest/AndroidManifest.xml
rename to browser/src/androidTest/AndroidManifest.xml
diff --git a/customtabs/src/androidTest/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java b/browser/src/androidTest/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java
similarity index 100%
rename from customtabs/src/androidTest/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java
rename to browser/src/androidTest/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUiTest.java
diff --git a/customtabs/src/androidTest/java/androidx/browser/browseractions/BrowserActionsIntentTest.java b/browser/src/androidTest/java/androidx/browser/browseractions/BrowserActionsIntentTest.java
similarity index 100%
rename from customtabs/src/androidTest/java/androidx/browser/browseractions/BrowserActionsIntentTest.java
rename to browser/src/androidTest/java/androidx/browser/browseractions/BrowserActionsIntentTest.java
diff --git a/customtabs/src/androidTest/java/androidx/browser/customtabs/CustomTabsIntentTest.java b/browser/src/androidTest/java/androidx/browser/customtabs/CustomTabsIntentTest.java
similarity index 100%
rename from customtabs/src/androidTest/java/androidx/browser/customtabs/CustomTabsIntentTest.java
rename to browser/src/androidTest/java/androidx/browser/customtabs/CustomTabsIntentTest.java
diff --git a/customtabs/src/androidTest/java/androidx/browser/customtabs/PostMessageServiceConnectionTest.java b/browser/src/androidTest/java/androidx/browser/customtabs/PostMessageServiceConnectionTest.java
similarity index 100%
rename from customtabs/src/androidTest/java/androidx/browser/customtabs/PostMessageServiceConnectionTest.java
rename to browser/src/androidTest/java/androidx/browser/customtabs/PostMessageServiceConnectionTest.java
diff --git a/customtabs/src/androidTest/java/androidx/browser/customtabs/PostMessageTest.java b/browser/src/androidTest/java/androidx/browser/customtabs/PostMessageTest.java
similarity index 100%
rename from customtabs/src/androidTest/java/androidx/browser/customtabs/PostMessageTest.java
rename to browser/src/androidTest/java/androidx/browser/customtabs/PostMessageTest.java
diff --git a/customtabs/src/androidTest/java/androidx/browser/customtabs/TestActivity.java b/browser/src/androidTest/java/androidx/browser/customtabs/TestActivity.java
similarity index 100%
rename from customtabs/src/androidTest/java/androidx/browser/customtabs/TestActivity.java
rename to browser/src/androidTest/java/androidx/browser/customtabs/TestActivity.java
diff --git a/customtabs/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsCallback.java b/browser/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsCallback.java
similarity index 100%
rename from customtabs/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsCallback.java
rename to browser/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsCallback.java
diff --git a/customtabs/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsService.java b/browser/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsService.java
similarity index 100%
rename from customtabs/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsService.java
rename to browser/src/androidTest/java/androidx/browser/customtabs/TestCustomTabsService.java
diff --git a/customtabs/src/androidTest/java/androidx/browser/customtabs/TrustedWebUtilsTest.java b/browser/src/androidTest/java/androidx/browser/customtabs/TrustedWebUtilsTest.java
similarity index 100%
rename from customtabs/src/androidTest/java/androidx/browser/customtabs/TrustedWebUtilsTest.java
rename to browser/src/androidTest/java/androidx/browser/customtabs/TrustedWebUtilsTest.java
diff --git a/customtabs/src/main/AndroidManifest.xml b/browser/src/main/AndroidManifest.xml
similarity index 100%
rename from customtabs/src/main/AndroidManifest.xml
rename to browser/src/main/AndroidManifest.xml
diff --git a/customtabs/src/main/aidl/android/support/customtabs/ICustomTabsCallback.aidl b/browser/src/main/aidl/android/support/customtabs/ICustomTabsCallback.aidl
similarity index 100%
rename from customtabs/src/main/aidl/android/support/customtabs/ICustomTabsCallback.aidl
rename to browser/src/main/aidl/android/support/customtabs/ICustomTabsCallback.aidl
diff --git a/customtabs/src/main/aidl/android/support/customtabs/ICustomTabsService.aidl b/browser/src/main/aidl/android/support/customtabs/ICustomTabsService.aidl
similarity index 100%
rename from customtabs/src/main/aidl/android/support/customtabs/ICustomTabsService.aidl
rename to browser/src/main/aidl/android/support/customtabs/ICustomTabsService.aidl
diff --git a/customtabs/src/main/aidl/android/support/customtabs/IPostMessageService.aidl b/browser/src/main/aidl/android/support/customtabs/IPostMessageService.aidl
similarity index 100%
rename from customtabs/src/main/aidl/android/support/customtabs/IPostMessageService.aidl
rename to browser/src/main/aidl/android/support/customtabs/IPostMessageService.aidl
diff --git a/customtabs/src/main/java/androidx/browser/browseractions/BrowserActionItem.java b/browser/src/main/java/androidx/browser/browseractions/BrowserActionItem.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/browseractions/BrowserActionItem.java
rename to browser/src/main/java/androidx/browser/browseractions/BrowserActionItem.java
diff --git a/customtabs/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuAdapter.java b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuAdapter.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuAdapter.java
rename to browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuAdapter.java
diff --git a/customtabs/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuDialog.java b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuDialog.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuDialog.java
rename to browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuDialog.java
diff --git a/customtabs/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUi.java b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUi.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUi.java
rename to browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuUi.java
diff --git a/customtabs/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuView.java b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuView.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuView.java
rename to browser/src/main/java/androidx/browser/browseractions/BrowserActionsFallbackMenuView.java
diff --git a/customtabs/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java b/browser/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java
rename to browser/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java
diff --git a/customtabs/src/main/java/androidx/browser/customtabs/CustomTabsCallback.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsCallback.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/customtabs/CustomTabsCallback.java
rename to browser/src/main/java/androidx/browser/customtabs/CustomTabsCallback.java
diff --git a/customtabs/src/main/java/androidx/browser/customtabs/CustomTabsClient.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsClient.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/customtabs/CustomTabsClient.java
rename to browser/src/main/java/androidx/browser/customtabs/CustomTabsClient.java
diff --git a/customtabs/src/main/java/androidx/browser/customtabs/CustomTabsIntent.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsIntent.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/customtabs/CustomTabsIntent.java
rename to browser/src/main/java/androidx/browser/customtabs/CustomTabsIntent.java
diff --git a/customtabs/src/main/java/androidx/browser/customtabs/CustomTabsService.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/customtabs/CustomTabsService.java
rename to browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
diff --git a/customtabs/src/main/java/androidx/browser/customtabs/CustomTabsServiceConnection.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsServiceConnection.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/customtabs/CustomTabsServiceConnection.java
rename to browser/src/main/java/androidx/browser/customtabs/CustomTabsServiceConnection.java
diff --git a/customtabs/src/main/java/androidx/browser/customtabs/CustomTabsSession.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsSession.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/customtabs/CustomTabsSession.java
rename to browser/src/main/java/androidx/browser/customtabs/CustomTabsSession.java
diff --git a/customtabs/src/main/java/androidx/browser/customtabs/CustomTabsSessionToken.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsSessionToken.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/customtabs/CustomTabsSessionToken.java
rename to browser/src/main/java/androidx/browser/customtabs/CustomTabsSessionToken.java
diff --git a/customtabs/src/main/java/androidx/browser/customtabs/PostMessageService.java b/browser/src/main/java/androidx/browser/customtabs/PostMessageService.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/customtabs/PostMessageService.java
rename to browser/src/main/java/androidx/browser/customtabs/PostMessageService.java
diff --git a/customtabs/src/main/java/androidx/browser/customtabs/PostMessageServiceConnection.java b/browser/src/main/java/androidx/browser/customtabs/PostMessageServiceConnection.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/customtabs/PostMessageServiceConnection.java
rename to browser/src/main/java/androidx/browser/customtabs/PostMessageServiceConnection.java
diff --git a/customtabs/src/main/java/androidx/browser/customtabs/TrustedWebUtils.java b/browser/src/main/java/androidx/browser/customtabs/TrustedWebUtils.java
similarity index 100%
rename from customtabs/src/main/java/androidx/browser/customtabs/TrustedWebUtils.java
rename to browser/src/main/java/androidx/browser/customtabs/TrustedWebUtils.java
diff --git a/customtabs/src/main/res/layout/browser_actions_context_menu_page.xml b/browser/src/main/res/layout/browser_actions_context_menu_page.xml
similarity index 100%
rename from customtabs/src/main/res/layout/browser_actions_context_menu_page.xml
rename to browser/src/main/res/layout/browser_actions_context_menu_page.xml
diff --git a/customtabs/src/main/res/layout/browser_actions_context_menu_row.xml b/browser/src/main/res/layout/browser_actions_context_menu_row.xml
similarity index 100%
rename from customtabs/src/main/res/layout/browser_actions_context_menu_row.xml
rename to browser/src/main/res/layout/browser_actions_context_menu_row.xml
diff --git a/customtabs/src/main/res/values/colors.xml b/browser/src/main/res/values/colors.xml
similarity index 100%
rename from customtabs/src/main/res/values/colors.xml
rename to browser/src/main/res/values/colors.xml
diff --git a/customtabs/src/main/res/values/dimens.xml b/browser/src/main/res/values/dimens.xml
similarity index 100%
rename from customtabs/src/main/res/values/dimens.xml
rename to browser/src/main/res/values/dimens.xml
diff --git a/buildSrc/dependencies.gradle b/buildSrc/dependencies.gradle
index 007e069..50b31a6 100644
--- a/buildSrc/dependencies.gradle
+++ b/buildSrc/dependencies.gradle
@@ -30,6 +30,13 @@
     exclude group: 'androidx.annotation'
 }
 
+libs.exclude_for_espresso = {
+    exclude group: 'androidx.annotation'
+    exclude group: 'androidx.appcompat'
+    exclude group: 'androidx.recyclerview'
+    exclude group: 'androidx.legacy'
+}
+
 libs.support_exclude_config = {
     exclude group: 'android.arch.core'
     exclude group: 'android.arch.lifecycle'
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
index f55db68..3c4ae5c 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
@@ -41,6 +41,13 @@
 const val RX_JAVA = "io.reactivex.rxjava2:rxjava:2.0.6"
 const val TEST_RUNNER = "com.android.support.test:runner:1.0.1"
 const val TEST_RULES = "com.android.support.test:rules:1.0.1"
+
+const val ESPRESSO_CONTRIB_TMP = "com.android.temp.support.test.espresso:espresso-contrib:3.0.1"
+const val ESPRESSO_CORE_TMP = "com.android.temp.support.test.espresso:espresso-core:3.0.1"
+const val TEST_RUNNER_TMP = "com.android.temp.support.test:runner:1.0.1"
+const val TEST_RULES_TMP = "com.android.temp.support.test:rules:1.0.1"
+
+
 /**
  * this Xerial version is newer than we want but we need it to fix
  * https://github.com/xerial/sqlite-jdbc/issues/97
diff --git a/car/build.gradle b/car/build.gradle
index c96840b..23a6577 100644
--- a/car/build.gradle
+++ b/car/build.gradle
@@ -24,14 +24,14 @@
     api project(':legacy-support-v4')
     api project(':recyclerview')
 
-    androidTestImplementation jetifier.process(TEST_RUNNER, libs.exclude_support)
-    androidTestImplementation jetifier.process(ESPRESSO_CORE, libs.exclude_support)
-    androidTestImplementation jetifier.process(ESPRESSO_CONTRIB, libs.exclude_support)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CONTRIB_TMP, libs.exclude_for_espresso)
     androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
 
     testImplementation(JUNIT)
-    testImplementation(TEST_RUNNER)
+    testImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
     testImplementation(MOCKITO_CORE)
 
     compileOnly fileTree(dir: 'car-stubs', include: ['android.car.jar'])
diff --git a/compat/build.gradle b/compat/build.gradle
index 3ad30d6..940819b 100644
--- a/compat/build.gradle
+++ b/compat/build.gradle
@@ -11,8 +11,8 @@
     api(project(":collection"))
     api(ARCH_LIFECYCLE_RUNTIME, libs.exclude_annotations_transitive)
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     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(':internal-testutils'), {
diff --git a/content/build.gradle b/content/build.gradle
index efc8bd1..25b01e5 100644
--- a/content/build.gradle
+++ b/content/build.gradle
@@ -27,8 +27,8 @@
     api(project(":core"))
 
     androidTestImplementation(JUNIT)
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
 }
 
 supportLibrary {
diff --git a/coordinatorlayout/build.gradle b/coordinatorlayout/build.gradle
index cc3802f..8e72580 100644
--- a/coordinatorlayout/build.gradle
+++ b/coordinatorlayout/build.gradle
@@ -11,9 +11,9 @@
     api(project(":core"))
     api(project(":customview"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(ESPRESSO_CONTRIB, libs.exclude_support)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CONTRIB_TMP, libs.exclude_for_espresso)
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation project(':internal-testutils'), {
         exclude group: 'androidx.coordinatorlayout', module: 'coordinatorlayout'
diff --git a/customview/build.gradle b/customview/build.gradle
index 23db514..37cfc2f 100644
--- a/customview/build.gradle
+++ b/customview/build.gradle
@@ -11,8 +11,8 @@
     api(project(":core"))
 
     androidTestImplementation(JUNIT)
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(TEST_RULES)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(TEST_RULES_TMP, libs.exclude_for_espresso)
 }
 
 supportLibrary {
diff --git a/dynamic-animation/build.gradle b/dynamic-animation/build.gradle
index bbdc3bb..637abb4 100644
--- a/dynamic-animation/build.gradle
+++ b/dynamic-animation/build.gradle
@@ -11,8 +11,8 @@
     api(project(":collection"))
     api(project(":legacy-support-core-utils"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
 }
diff --git a/emoji/core/build.gradle b/emoji/core/build.gradle
index bfb7a07..2f66813 100644
--- a/emoji/core/build.gradle
+++ b/emoji/core/build.gradle
@@ -24,8 +24,8 @@
 
     api(project(":core"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     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(':internal-testutils')
diff --git a/exifinterface/build.gradle b/exifinterface/build.gradle
index ffe28d3..c3e56ff 100644
--- a/exifinterface/build.gradle
+++ b/exifinterface/build.gradle
@@ -9,7 +9,7 @@
 dependencies {
     api(project(":annotation"))
 
-    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
 }
 
 supportLibrary {
diff --git a/fragment/build.gradle b/fragment/build.gradle
index 4302fff..5f8954f 100644
--- a/fragment/build.gradle
+++ b/fragment/build.gradle
@@ -14,8 +14,8 @@
     api(project(":loader"))
     api(ARCH_LIFECYCLE_VIEWMODEL, libs.exclude_annotations_transitive)
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     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(':internal-testutils'), {
diff --git a/graphics/drawable/animated/build.gradle b/graphics/drawable/animated/build.gradle
index e0fa2a7..139dee2 100644
--- a/graphics/drawable/animated/build.gradle
+++ b/graphics/drawable/animated/build.gradle
@@ -10,8 +10,8 @@
     api(project(":vectordrawable"))
     api(project(":legacy-support-core-ui"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
 }
 
 android {
diff --git a/graphics/drawable/static/build.gradle b/graphics/drawable/static/build.gradle
index e38e82e..19a0366 100644
--- a/graphics/drawable/static/build.gradle
+++ b/graphics/drawable/static/build.gradle
@@ -10,7 +10,7 @@
     api(project(":annotation"))
     api(project(":core"))
 
-    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
 }
 
 android {
diff --git a/gridlayout/build.gradle b/gridlayout/build.gradle
index b562f21..fb4dd10 100644
--- a/gridlayout/build.gradle
+++ b/gridlayout/build.gradle
@@ -10,8 +10,8 @@
     api(project(":core"))
     api(project(":legacy-support-core-ui"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
 }
 
 supportLibrary {
diff --git a/heifwriter/build.gradle b/heifwriter/build.gradle
index a703110..63e55ca 100644
--- a/heifwriter/build.gradle
+++ b/heifwriter/build.gradle
@@ -15,7 +15,7 @@
 dependencies {
     api(project(":annotation"))
 
-    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
 }
 
 supportLibrary {
diff --git a/preference-leanback/OWNERS b/leanback-preference/OWNERS
similarity index 100%
rename from preference-leanback/OWNERS
rename to leanback-preference/OWNERS
diff --git a/preference-leanback/api/current.txt b/leanback-preference/api/current.txt
similarity index 100%
rename from preference-leanback/api/current.txt
rename to leanback-preference/api/current.txt
diff --git a/preference-leanback/api21/androidx/leanback/preference/LeanbackPreferenceFragmentTransitionHelperApi21.java b/leanback-preference/api21/androidx/leanback/preference/LeanbackPreferenceFragmentTransitionHelperApi21.java
similarity index 100%
rename from preference-leanback/api21/androidx/leanback/preference/LeanbackPreferenceFragmentTransitionHelperApi21.java
rename to leanback-preference/api21/androidx/leanback/preference/LeanbackPreferenceFragmentTransitionHelperApi21.java
diff --git a/preference-leanback/api21/androidx/leanback/preference/internal/OutlineOnlyWithChildrenFrameLayout.java b/leanback-preference/api21/androidx/leanback/preference/internal/OutlineOnlyWithChildrenFrameLayout.java
similarity index 100%
rename from preference-leanback/api21/androidx/leanback/preference/internal/OutlineOnlyWithChildrenFrameLayout.java
rename to leanback-preference/api21/androidx/leanback/preference/internal/OutlineOnlyWithChildrenFrameLayout.java
diff --git a/preference-leanback/api_legacy/26.0.0.txt b/leanback-preference/api_legacy/26.0.0.txt
similarity index 100%
rename from preference-leanback/api_legacy/26.0.0.txt
rename to leanback-preference/api_legacy/26.0.0.txt
diff --git a/preference-leanback/api_legacy/26.1.0.txt b/leanback-preference/api_legacy/26.1.0.txt
similarity index 100%
rename from preference-leanback/api_legacy/26.1.0.txt
rename to leanback-preference/api_legacy/26.1.0.txt
diff --git a/preference-leanback/api_legacy/27.0.0.txt b/leanback-preference/api_legacy/27.0.0.txt
similarity index 100%
rename from preference-leanback/api_legacy/27.0.0.txt
rename to leanback-preference/api_legacy/27.0.0.txt
diff --git a/preference-leanback/api_legacy/27.1.0.txt b/leanback-preference/api_legacy/27.1.0.txt
similarity index 100%
rename from preference-leanback/api_legacy/27.1.0.txt
rename to leanback-preference/api_legacy/27.1.0.txt
diff --git a/preference-leanback/api_legacy/28.0.0-alpha1.txt b/leanback-preference/api_legacy/28.0.0-alpha1.txt
similarity index 100%
rename from preference-leanback/api_legacy/28.0.0-alpha1.txt
rename to leanback-preference/api_legacy/28.0.0-alpha1.txt
diff --git a/preference-leanback/api_legacy/current.txt b/leanback-preference/api_legacy/current.txt
similarity index 100%
rename from preference-leanback/api_legacy/current.txt
rename to leanback-preference/api_legacy/current.txt
diff --git a/preference-leanback/build.gradle b/leanback-preference/build.gradle
similarity index 100%
rename from preference-leanback/build.gradle
rename to leanback-preference/build.gradle
diff --git a/preference-leanback/lint-baseline.xml b/leanback-preference/lint-baseline.xml
similarity index 100%
rename from preference-leanback/lint-baseline.xml
rename to leanback-preference/lint-baseline.xml
diff --git a/preference-leanback/src/main/AndroidManifest.xml b/leanback-preference/src/main/AndroidManifest.xml
similarity index 100%
rename from preference-leanback/src/main/AndroidManifest.xml
rename to leanback-preference/src/main/AndroidManifest.xml
diff --git a/preference-leanback/src/main/java/androidx/leanback/preference/BaseLeanbackPreferenceFragment.java b/leanback-preference/src/main/java/androidx/leanback/preference/BaseLeanbackPreferenceFragment.java
similarity index 100%
rename from preference-leanback/src/main/java/androidx/leanback/preference/BaseLeanbackPreferenceFragment.java
rename to leanback-preference/src/main/java/androidx/leanback/preference/BaseLeanbackPreferenceFragment.java
diff --git a/preference-leanback/src/main/java/androidx/leanback/preference/LeanbackListPreferenceDialogFragment.java b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackListPreferenceDialogFragment.java
similarity index 100%
rename from preference-leanback/src/main/java/androidx/leanback/preference/LeanbackListPreferenceDialogFragment.java
rename to leanback-preference/src/main/java/androidx/leanback/preference/LeanbackListPreferenceDialogFragment.java
diff --git a/preference-leanback/src/main/java/androidx/leanback/preference/LeanbackPreferenceDialogFragment.java b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackPreferenceDialogFragment.java
similarity index 100%
rename from preference-leanback/src/main/java/androidx/leanback/preference/LeanbackPreferenceDialogFragment.java
rename to leanback-preference/src/main/java/androidx/leanback/preference/LeanbackPreferenceDialogFragment.java
diff --git a/preference-leanback/src/main/java/androidx/leanback/preference/LeanbackPreferenceFragment.java b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackPreferenceFragment.java
similarity index 100%
rename from preference-leanback/src/main/java/androidx/leanback/preference/LeanbackPreferenceFragment.java
rename to leanback-preference/src/main/java/androidx/leanback/preference/LeanbackPreferenceFragment.java
diff --git a/preference-leanback/src/main/java/androidx/leanback/preference/LeanbackSettingsFragment.java b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsFragment.java
similarity index 100%
rename from preference-leanback/src/main/java/androidx/leanback/preference/LeanbackSettingsFragment.java
rename to leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsFragment.java
diff --git a/preference-leanback/src/main/java/androidx/leanback/preference/LeanbackSettingsRootView.java b/leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsRootView.java
similarity index 100%
rename from preference-leanback/src/main/java/androidx/leanback/preference/LeanbackSettingsRootView.java
rename to leanback-preference/src/main/java/androidx/leanback/preference/LeanbackSettingsRootView.java
diff --git a/preference-leanback/src/main/res/color/lb_preference_item_primary_text_color.xml b/leanback-preference/src/main/res/color/lb_preference_item_primary_text_color.xml
similarity index 100%
rename from preference-leanback/src/main/res/color/lb_preference_item_primary_text_color.xml
rename to leanback-preference/src/main/res/color/lb_preference_item_primary_text_color.xml
diff --git a/preference-leanback/src/main/res/color/lb_preference_item_secondary_text_color.xml b/leanback-preference/src/main/res/color/lb_preference_item_secondary_text_color.xml
similarity index 100%
rename from preference-leanback/src/main/res/color/lb_preference_item_secondary_text_color.xml
rename to leanback-preference/src/main/res/color/lb_preference_item_secondary_text_color.xml
diff --git a/preference-leanback/src/main/res/layout-v21/leanback_preference_category.xml b/leanback-preference/src/main/res/layout-v21/leanback_preference_category.xml
similarity index 100%
rename from preference-leanback/src/main/res/layout-v21/leanback_preference_category.xml
rename to leanback-preference/src/main/res/layout-v21/leanback_preference_category.xml
diff --git a/preference-leanback/src/main/res/layout-v21/leanback_settings_fragment.xml b/leanback-preference/src/main/res/layout-v21/leanback_settings_fragment.xml
similarity index 100%
rename from preference-leanback/src/main/res/layout-v21/leanback_settings_fragment.xml
rename to leanback-preference/src/main/res/layout-v21/leanback_settings_fragment.xml
diff --git a/preference-leanback/src/main/res/layout/leanback_list_preference_fragment.xml b/leanback-preference/src/main/res/layout/leanback_list_preference_fragment.xml
similarity index 100%
rename from preference-leanback/src/main/res/layout/leanback_list_preference_fragment.xml
rename to leanback-preference/src/main/res/layout/leanback_list_preference_fragment.xml
diff --git a/preference-leanback/src/main/res/layout/leanback_list_preference_item_multi.xml b/leanback-preference/src/main/res/layout/leanback_list_preference_item_multi.xml
similarity index 100%
rename from preference-leanback/src/main/res/layout/leanback_list_preference_item_multi.xml
rename to leanback-preference/src/main/res/layout/leanback_list_preference_item_multi.xml
diff --git a/preference-leanback/src/main/res/layout/leanback_list_preference_item_single.xml b/leanback-preference/src/main/res/layout/leanback_list_preference_item_single.xml
similarity index 100%
rename from preference-leanback/src/main/res/layout/leanback_list_preference_item_single.xml
rename to leanback-preference/src/main/res/layout/leanback_list_preference_item_single.xml
diff --git a/preference-leanback/src/main/res/layout/leanback_preference.xml b/leanback-preference/src/main/res/layout/leanback_preference.xml
similarity index 100%
rename from preference-leanback/src/main/res/layout/leanback_preference.xml
rename to leanback-preference/src/main/res/layout/leanback_preference.xml
diff --git a/preference-leanback/src/main/res/layout/leanback_preference_category.xml b/leanback-preference/src/main/res/layout/leanback_preference_category.xml
similarity index 100%
rename from preference-leanback/src/main/res/layout/leanback_preference_category.xml
rename to leanback-preference/src/main/res/layout/leanback_preference_category.xml
diff --git a/preference-leanback/src/main/res/layout/leanback_preference_fragment.xml b/leanback-preference/src/main/res/layout/leanback_preference_fragment.xml
similarity index 100%
rename from preference-leanback/src/main/res/layout/leanback_preference_fragment.xml
rename to leanback-preference/src/main/res/layout/leanback_preference_fragment.xml
diff --git a/preference-leanback/src/main/res/layout/leanback_preference_information.xml b/leanback-preference/src/main/res/layout/leanback_preference_information.xml
similarity index 100%
rename from preference-leanback/src/main/res/layout/leanback_preference_information.xml
rename to leanback-preference/src/main/res/layout/leanback_preference_information.xml
diff --git a/preference-leanback/src/main/res/layout/leanback_preference_widget_seekbar.xml b/leanback-preference/src/main/res/layout/leanback_preference_widget_seekbar.xml
similarity index 100%
rename from preference-leanback/src/main/res/layout/leanback_preference_widget_seekbar.xml
rename to leanback-preference/src/main/res/layout/leanback_preference_widget_seekbar.xml
diff --git a/preference-leanback/src/main/res/layout/leanback_preferences_list.xml b/leanback-preference/src/main/res/layout/leanback_preferences_list.xml
similarity index 100%
rename from preference-leanback/src/main/res/layout/leanback_preferences_list.xml
rename to leanback-preference/src/main/res/layout/leanback_preferences_list.xml
diff --git a/preference-leanback/src/main/res/layout/leanback_settings_fragment.xml b/leanback-preference/src/main/res/layout/leanback_settings_fragment.xml
similarity index 100%
rename from preference-leanback/src/main/res/layout/leanback_settings_fragment.xml
rename to leanback-preference/src/main/res/layout/leanback_settings_fragment.xml
diff --git a/preference-leanback/src/main/res/values/colors.xml b/leanback-preference/src/main/res/values/colors.xml
similarity index 100%
rename from preference-leanback/src/main/res/values/colors.xml
rename to leanback-preference/src/main/res/values/colors.xml
diff --git a/preference-leanback/src/main/res/values/dimens.xml b/leanback-preference/src/main/res/values/dimens.xml
similarity index 100%
rename from preference-leanback/src/main/res/values/dimens.xml
rename to leanback-preference/src/main/res/values/dimens.xml
diff --git a/preference-leanback/src/main/res/values/styles.xml b/leanback-preference/src/main/res/values/styles.xml
similarity index 100%
rename from preference-leanback/src/main/res/values/styles.xml
rename to leanback-preference/src/main/res/values/styles.xml
diff --git a/preference-leanback/src/main/res/values/themes.xml b/leanback-preference/src/main/res/values/themes.xml
similarity index 100%
rename from preference-leanback/src/main/res/values/themes.xml
rename to leanback-preference/src/main/res/values/themes.xml
diff --git a/leanback/build.gradle b/leanback/build.gradle
index 007d089..fe04a8a 100644
--- a/leanback/build.gradle
+++ b/leanback/build.gradle
@@ -13,8 +13,8 @@
     api(project(":fragment"))
     api(project(":recyclerview"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
 }
diff --git a/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java b/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java
index e8336bf..d310ded 100644
--- a/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java
+++ b/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java
@@ -4502,6 +4502,41 @@
         assertEquals(1, mGridView.getSelectedPosition());
     }
 
+    @Test
+    public void testAccessibilityWhenScrollDisabled() throws Throwable {
+        Intent intent = new Intent();
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.item_button_at_bottom);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS,  1000);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        initActivity(intent);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        setSelectedPosition(0);
+
+        final RecyclerViewAccessibilityDelegate delegateCompat = mGridView
+                .getCompatAccessibilityDelegate();
+        final AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain();
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                delegateCompat.onInitializeAccessibilityNodeInfo(mGridView, info);
+            }
+        });
+        mGridView.setScrollEnabled(false);
+        mActivityTestRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                for (int i  = 0; i < 100; i++) {
+                    delegateCompat.performAccessibilityAction(mGridView,
+                            AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD, null);
+                }
+            }
+        });
+        assertEquals(RecyclerView.SCROLL_STATE_IDLE, mGridView.getScrollState());
+    }
+
     private boolean hasAction(AccessibilityNodeInfoCompat info, Object action) {
         if (Build.VERSION.SDK_INT >= 21) {
             AccessibilityNodeInfoCompat.AccessibilityActionCompat convertedAction =
diff --git a/leanback/src/main/java/androidx/leanback/widget/GridLayoutManager.java b/leanback/src/main/java/androidx/leanback/widget/GridLayoutManager.java
index 7797eef..4d4155f 100644
--- a/leanback/src/main/java/androidx/leanback/widget/GridLayoutManager.java
+++ b/leanback/src/main/java/androidx/leanback/widget/GridLayoutManager.java
@@ -3687,6 +3687,9 @@
     @Override
     public boolean performAccessibilityAction(Recycler recycler, State state, int action,
             Bundle args) {
+        if (!isScrollEnabled()) {
+            return false;
+        }
         saveContext(recycler, state);
         int translatedAction = action;
         boolean reverseFlowPrimary = (mFlag & PF_REVERSE_FLOW_PRIMARY) != 0;
diff --git a/legacy/core-ui/build.gradle b/legacy/core-ui/build.gradle
index 61f6051..bc8e865 100644
--- a/legacy/core-ui/build.gradle
+++ b/legacy/core-ui/build.gradle
@@ -20,9 +20,9 @@
     api(project(":asynclayoutinflater"))
     api(project(":cursoradapter"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(ESPRESSO_CONTRIB, libs.exclude_support)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CONTRIB_TMP, libs.exclude_for_espresso)
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation project(':internal-testutils'), {
         exclude group: 'androidx.legacy', module: 'legacy-support-core-ui'
diff --git a/legacy/core-utils/build.gradle b/legacy/core-utils/build.gradle
index 8cb8efe..c90d349 100644
--- a/legacy/core-utils/build.gradle
+++ b/legacy/core-utils/build.gradle
@@ -14,8 +14,8 @@
     api(project(":localbroadcastmanager"))
     api(project(":print"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
 }
diff --git a/lifecycle/extensions/build.gradle b/lifecycle/extensions/build.gradle
index 2875ab4..80b7fc8 100644
--- a/lifecycle/extensions/build.gradle
+++ b/lifecycle/extensions/build.gradle
@@ -55,4 +55,4 @@
     inceptionYear = "2017"
     description = "Android Lifecycle Extensions"
     url = SupportLibraryExtension.ARCHITECTURE_URL
-}
\ No newline at end of file
+}
diff --git a/loader/build.gradle b/loader/build.gradle
index b441801..8c99ea5 100644
--- a/loader/build.gradle
+++ b/loader/build.gradle
@@ -12,8 +12,8 @@
     api(ARCH_LIFECYCLE_LIVEDATA_CORE, libs.exclude_annotations_transitive)
     api(ARCH_LIFECYCLE_VIEWMODEL, libs.exclude_annotations_transitive)
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
 }
diff --git a/loader/src/androidTest/java/androidx/loader/app/LoaderInfoTest.java b/loader/src/androidTest/java/androidx/loader/app/LoaderInfoTest.java
index ed888bb..7c508ec 100644
--- a/loader/src/androidTest/java/androidx/loader/app/LoaderInfoTest.java
+++ b/loader/src/androidTest/java/androidx/loader/app/LoaderInfoTest.java
@@ -25,16 +25,10 @@
 import android.arch.lifecycle.LifecycleOwner;
 import android.arch.lifecycle.LifecycleRegistry;
 import android.content.Context;
-import android.os.SystemClock;
-import androidx.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 androidx.loader.app.test.DummyLoaderCallbacks;
-import androidx.loader.app.test.EmptyActivity;
-import androidx.loader.content.AsyncTaskLoader;
-import androidx.loader.content.Loader;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -44,6 +38,11 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
+import androidx.loader.app.test.DelayLoader;
+import androidx.loader.app.test.DummyLoaderCallbacks;
+import androidx.loader.app.test.EmptyActivity;
+import androidx.loader.content.Loader;
+
 @RunWith(AndroidJUnit4.class)
 @SmallTest
 public class LoaderInfoTest {
@@ -68,26 +67,10 @@
     public void testIsCallbackWaitingForData() throws Throwable {
         final DummyLoaderCallbacks loaderCallback = new DummyLoaderCallbacks(mock(Context.class));
         final CountDownLatch deliverResultLatch = new CountDownLatch(1);
-        Loader<Boolean> delayLoader = new AsyncTaskLoader<Boolean>(mock(Context.class)) {
-            @Override
-            public Boolean loadInBackground() {
-                SystemClock.sleep(50);
-                return true;
-            }
-
-            @Override
-            protected void onStartLoading() {
-                forceLoad();
-            }
-
-            @Override
-            public void deliverResult(@Nullable Boolean data) {
-                super.deliverResult(data);
-                deliverResultLatch.countDown();
-            }
-        };
+        Loader<Boolean> delayLoader = new DelayLoader(mActivityRule.getActivity(),
+                deliverResultLatch);
         final LoaderManagerImpl.LoaderInfo<Boolean> loaderInfo = new LoaderManagerImpl.LoaderInfo<>(
-                0, null, delayLoader);
+                0, null, delayLoader, null);
         assertFalse("isCallbackWaitingForData should be false before setCallback",
                 loaderInfo.isCallbackWaitingForData());
 
@@ -115,7 +98,7 @@
         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);
+                0, null, loader, null);
         assertFalse("onLoadFinished shouldn't be called before setCallback",
                 loaderCallback.mOnLoadFinished);
 
@@ -130,7 +113,7 @@
         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);
+                0, null, loader, null);
         assertFalse("onLoadFinished for initial shouldn't be called before setCallback initial",
                 initialCallback.mOnLoadFinished);
 
@@ -158,7 +141,7 @@
                 new DummyLoaderCallbacks(mock(Context.class));
         Loader<Boolean> loader = loaderCallback.onCreateLoader(0, null);
         LoaderManagerImpl.LoaderInfo<Boolean> loaderInfo = new LoaderManagerImpl.LoaderInfo<>(
-                0, null, loader);
+                0, null, loader, null);
         loaderInfo.setCallback(mOwner, loaderCallback);
         assertTrue("onLoadFinished should be called after setCallback",
                 loaderCallback.mOnLoadFinished);
@@ -181,7 +164,7 @@
                 new DummyLoaderCallbacks(mock(Context.class));
         Loader<Boolean> loader = initialCallback.onCreateLoader(0, null);
         LoaderManagerImpl.LoaderInfo<Boolean> loaderInfo = new LoaderManagerImpl.LoaderInfo<>(
-                0, null, loader);
+                0, null, loader, null);
         loaderInfo.setCallback(mOwner, initialCallback);
         assertTrue("onLoadFinished for initial should be called after setCallback initial",
                 initialCallback.mOnLoadFinished);
@@ -212,11 +195,11 @@
         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);
+                0, null, loader, null);
 
         loaderInfo.setCallback(mActivityRule.getActivity(), loaderCallback);
         assertTrue("Loader should be started after setCallback", loader.isStarted());
-        loaderInfo.destroy();
+        loaderInfo.destroy(true);
         assertFalse("Loader should not be started after destroy", loader.isStarted());
     }
 }
diff --git a/loader/src/androidTest/java/androidx/loader/app/LoaderManagerTest.java b/loader/src/androidTest/java/androidx/loader/app/LoaderManagerTest.java
index 9063c2e..fb22c68 100644
--- a/loader/src/androidTest/java/androidx/loader/app/LoaderManagerTest.java
+++ b/loader/src/androidTest/java/androidx/loader/app/LoaderManagerTest.java
@@ -16,6 +16,8 @@
 
 package androidx.loader.app;
 
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.mock;
 
@@ -26,13 +28,9 @@
 import android.arch.lifecycle.ViewModelStoreOwner;
 import android.content.Context;
 import android.os.Bundle;
-import androidx.annotation.NonNull;
 import android.support.test.filters.SmallTest;
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
-import androidx.loader.app.test.DummyLoaderCallbacks;
-import androidx.loader.app.test.EmptyActivity;
-import androidx.loader.content.Loader;
 
 import org.junit.Rule;
 import org.junit.Test;
@@ -41,6 +39,12 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
+import androidx.annotation.NonNull;
+import androidx.loader.app.test.DelayLoaderCallbacks;
+import androidx.loader.app.test.DummyLoaderCallbacks;
+import androidx.loader.app.test.EmptyActivity;
+import androidx.loader.content.Loader;
+
 @RunWith(AndroidJUnit4.class)
 @SmallTest
 public class LoaderManagerTest {
@@ -102,6 +106,150 @@
         onLoadFinishedLatch.await(1, TimeUnit.SECONDS);
     }
 
+    @Test
+    public void testDestroyLoaderBeforeDeliverData() throws Throwable {
+        final LoaderOwner loaderOwner = new LoaderOwner();
+        final LoaderManager loaderManager = LoaderManager.getInstance(loaderOwner);
+        final DelayLoaderCallbacks callback =
+                new DelayLoaderCallbacks(mock(Context.class), new CountDownLatch(1));
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                loaderManager.initLoader(37, null, callback);
+                // Immediately destroy it before it has a chance to deliver data
+                loaderManager.destroyLoader(37);
+            }
+        });
+        assertFalse("LoaderCallbacks should not be reset if they never received data",
+                callback.mOnLoaderReset);
+        assertTrue("Loader should be reset after destroyLoader()",
+                callback.mLoader.isReset());
+    }
+
+    @Test
+    public void testDestroyLoaderAfterDeliverData() throws Throwable {
+        final LoaderOwner loaderOwner = new LoaderOwner();
+        final LoaderManager loaderManager = LoaderManager.getInstance(loaderOwner);
+        CountDownLatch countDownLatch = new CountDownLatch(1);
+        final DelayLoaderCallbacks callback =
+                new DelayLoaderCallbacks(mock(Context.class), countDownLatch);
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                loaderManager.initLoader(38, null, callback);
+            }
+        });
+        // Wait for the Loader to return data
+        countDownLatch.await(1, TimeUnit.SECONDS);
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                loaderManager.destroyLoader(38);
+            }
+        });
+        assertTrue("LoaderCallbacks should be reset after destroyLoader()",
+                callback.mOnLoaderReset);
+        assertTrue("Loader should be reset after destroyLoader()",
+                callback.mLoader.isReset());
+    }
+
+
+    @Test
+    public void testRestartLoaderBeforeDeliverData() throws Throwable {
+        final LoaderOwner loaderOwner = new LoaderOwner();
+        final LoaderManager loaderManager = LoaderManager.getInstance(loaderOwner);
+        final DelayLoaderCallbacks initialCallback =
+                new DelayLoaderCallbacks(mock(Context.class), new CountDownLatch(1));
+        CountDownLatch restartCountDownLatch = new CountDownLatch(1);
+        final DelayLoaderCallbacks restartCallback =
+                new DelayLoaderCallbacks(mock(Context.class), restartCountDownLatch);
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                loaderManager.initLoader(44, null, initialCallback);
+                // Immediately restart it before it has a chance to deliver data
+                loaderManager.restartLoader(44, null, restartCallback);
+            }
+        });
+        assertFalse("Initial LoaderCallbacks should not be reset after restartLoader()",
+                initialCallback.mOnLoaderReset);
+        assertTrue("Initial Loader should be reset if it is restarted before delivering data",
+                initialCallback.mLoader.isReset());
+        restartCountDownLatch.await(1, TimeUnit.SECONDS);
+    }
+
+    @Test
+    public void testRestartLoaderAfterDeliverData() throws Throwable {
+        final LoaderOwner loaderOwner = new LoaderOwner();
+        final LoaderManager loaderManager = LoaderManager.getInstance(loaderOwner);
+        CountDownLatch initialCountDownLatch = new CountDownLatch(1);
+        final DelayLoaderCallbacks initialCallback =
+                new DelayLoaderCallbacks(mock(Context.class), initialCountDownLatch);
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                loaderManager.initLoader(45, null, initialCallback);
+            }
+        });
+        // Wait for the first Loader to return data
+        initialCountDownLatch.await(1, TimeUnit.SECONDS);
+        CountDownLatch restartCountDownLatch = new CountDownLatch(1);
+        final DelayLoaderCallbacks restartCallback =
+                new DelayLoaderCallbacks(mock(Context.class), restartCountDownLatch);
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                loaderManager.restartLoader(45, null, restartCallback);
+            }
+        });
+        assertFalse("Initial LoaderCallbacks should not be reset after restartLoader()",
+                initialCallback.mOnLoaderReset);
+        assertFalse("Initial Loader should not be reset if it is restarted after delivering data",
+                initialCallback.mLoader.isReset());
+        restartCountDownLatch.await(1, TimeUnit.SECONDS);
+        assertTrue("Initial Loader should be reset after its replacement Loader delivers data",
+                initialCallback.mLoader.isReset());
+    }
+
+    @Test
+    public void testRestartLoaderMultiple() throws Throwable {
+        final LoaderOwner loaderOwner = new LoaderOwner();
+        final LoaderManager loaderManager = LoaderManager.getInstance(loaderOwner);
+        CountDownLatch initialCountDownLatch = new CountDownLatch(1);
+        final DelayLoaderCallbacks initialCallback =
+                new DelayLoaderCallbacks(mock(Context.class), initialCountDownLatch);
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                loaderManager.initLoader(46, null, initialCallback);
+            }
+        });
+        // Wait for the first Loader to return data
+        initialCountDownLatch.await(1, TimeUnit.SECONDS);
+        final DelayLoaderCallbacks intermediateCallback =
+                new DelayLoaderCallbacks(mock(Context.class), new CountDownLatch(1));
+        CountDownLatch restartCountDownLatch = new CountDownLatch(1);
+        final DelayLoaderCallbacks restartCallback =
+                new DelayLoaderCallbacks(mock(Context.class), restartCountDownLatch);
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                loaderManager.restartLoader(46, null, intermediateCallback);
+                // Immediately replace the restarted Loader with yet another Loader
+                loaderManager.restartLoader(46, null, restartCallback);
+            }
+        });
+        assertFalse("Initial LoaderCallbacks should not be reset after restartLoader()",
+                initialCallback.mOnLoaderReset);
+        assertFalse("Initial Loader should not be reset if it is restarted after delivering data",
+                initialCallback.mLoader.isReset());
+        assertTrue("Intermediate Loader should be reset if it is restarted before delivering data",
+                intermediateCallback.mLoader.isReset());
+        restartCountDownLatch.await(1, TimeUnit.SECONDS);
+        assertTrue("Initial Loader should be reset after its replacement Loader delivers data",
+                initialCallback.mLoader.isReset());
+    }
+
     @Test(expected = IllegalStateException.class)
     public void enforceOnMainThread_initLoader() {
         LoaderOwner loaderOwner = new LoaderOwner();
diff --git a/loader/src/androidTest/java/androidx/loader/app/LoaderViewModelTest.java b/loader/src/androidTest/java/androidx/loader/app/LoaderViewModelTest.java
index 075edb6..3fb191e 100644
--- a/loader/src/androidTest/java/androidx/loader/app/LoaderViewModelTest.java
+++ b/loader/src/androidTest/java/androidx/loader/app/LoaderViewModelTest.java
@@ -23,12 +23,14 @@
 
 import android.content.Context;
 import android.support.test.filters.SmallTest;
-import androidx.loader.app.test.DummyLoader;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
+import androidx.loader.app.test.DummyLoader;
+import androidx.loader.content.Loader;
+
 @RunWith(JUnit4.class)
 @SmallTest
 public class LoaderViewModelTest {
@@ -66,7 +68,7 @@
         boolean mDestroyed = false;
 
         AlwaysRunningLoaderInfo(Context context) {
-            super(0, null, new DummyLoader(context));
+            super(0, null, new DummyLoader(context), null);
         }
 
         @Override
@@ -75,8 +77,9 @@
         }
 
         @Override
-        void destroy() {
+        Loader<Boolean> destroy(boolean reset) {
             mDestroyed = true;
+            return super.destroy(reset);
         }
     }
 }
diff --git a/loader/src/androidTest/java/androidx/loader/app/test/DelayLoader.java b/loader/src/androidTest/java/androidx/loader/app/test/DelayLoader.java
new file mode 100644
index 0000000..c7c1326
--- /dev/null
+++ b/loader/src/androidTest/java/androidx/loader/app/test/DelayLoader.java
@@ -0,0 +1,51 @@
+/*
+ * 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.loader.app.test;
+
+import android.content.Context;
+import android.os.SystemClock;
+
+import java.util.concurrent.CountDownLatch;
+
+import androidx.annotation.Nullable;
+import androidx.loader.content.AsyncTaskLoader;
+
+public class DelayLoader extends AsyncTaskLoader<Boolean> {
+    private final CountDownLatch mDeliverResultLatch;
+
+    public DelayLoader(Context context, CountDownLatch deliverResultLatch) {
+        super(context);
+        mDeliverResultLatch = deliverResultLatch;
+    }
+
+    @Override
+    public Boolean loadInBackground() {
+        SystemClock.sleep(50);
+        return true;
+    }
+
+    @Override
+    protected void onStartLoading() {
+        forceLoad();
+    }
+
+    @Override
+    public void deliverResult(@Nullable Boolean data) {
+        super.deliverResult(data);
+        mDeliverResultLatch.countDown();
+    }
+}
diff --git a/loader/src/androidTest/java/androidx/loader/app/test/DelayLoaderCallbacks.java b/loader/src/androidTest/java/androidx/loader/app/test/DelayLoaderCallbacks.java
new file mode 100644
index 0000000..4f01d55
--- /dev/null
+++ b/loader/src/androidTest/java/androidx/loader/app/test/DelayLoaderCallbacks.java
@@ -0,0 +1,57 @@
+/*
+ * 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.loader.app.test;
+
+import android.content.Context;
+import android.os.Bundle;
+
+import java.util.concurrent.CountDownLatch;
+
+import androidx.annotation.NonNull;
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.Loader;
+
+public class DelayLoaderCallbacks implements LoaderManager.LoaderCallbacks<Boolean> {
+    private final Context mContext;
+    private final CountDownLatch mDeliverResultLatch;
+
+    public Loader<Boolean> mLoader;
+    public boolean mOnLoadFinished;
+    public boolean mOnLoaderReset;
+
+    public DelayLoaderCallbacks(Context context, CountDownLatch deliverResultLatch) {
+        mContext = context;
+        mDeliverResultLatch = deliverResultLatch;
+    }
+
+    @NonNull
+    @Override
+    public Loader<Boolean> onCreateLoader(int id, Bundle args) {
+        mLoader = new DelayLoader(mContext, mDeliverResultLatch);
+        return mLoader;
+    }
+
+    @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/loader/src/main/java/androidx/loader/app/LoaderManagerImpl.java b/loader/src/main/java/androidx/loader/app/LoaderManagerImpl.java
index 25bdff1..0f89cc1 100644
--- a/loader/src/main/java/androidx/loader/app/LoaderManagerImpl.java
+++ b/loader/src/main/java/androidx/loader/app/LoaderManagerImpl.java
@@ -24,18 +24,19 @@
 import android.arch.lifecycle.ViewModelStore;
 import android.os.Bundle;
 import android.os.Looper;
-import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.loader.content.Loader;
-import androidx.core.util.DebugUtils;
-import androidx.collection.SparseArrayCompat;
 import android.util.Log;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.lang.reflect.Modifier;
 
+import androidx.annotation.MainThread;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.collection.SparseArrayCompat;
+import androidx.core.util.DebugUtils;
+import androidx.loader.content.Loader;
+
 class LoaderManagerImpl extends LoaderManager {
     static final String TAG = "LoaderManager";
     static boolean DEBUG = false;
@@ -54,11 +55,14 @@
         private final @NonNull Loader<D> mLoader;
         private LifecycleOwner mLifecycleOwner;
         private LoaderObserver<D> mObserver;
+        private Loader<D> mPriorLoader;
 
-        LoaderInfo(int id, @Nullable Bundle args, @NonNull Loader<D> loader) {
+        LoaderInfo(int id, @Nullable Bundle args, @NonNull Loader<D> loader,
+                @Nullable Loader<D> priorLoader) {
             mId = id;
             mArgs = args;
             mLoader = loader;
+            mPriorLoader = priorLoader;
             mLoader.registerListener(id, this);
         }
 
@@ -133,8 +137,15 @@
             mObserver = null;
         }
 
+        /**
+         * Destroys this LoaderInfo, its underlying {@link #getLoader() Loader}, and removes any
+         * existing {@link androidx.loader.app.LoaderManager.LoaderCallbacks}.
+         *
+         * @param reset Whether the LoaderCallbacks and Loader should be reset.
+         * @return When reset is false, returns any Loader that still needs to be reset
+         */
         @MainThread
-        void destroy() {
+        Loader<D> destroy(boolean reset) {
             if (DEBUG) Log.v(TAG, "  Destroying: " + this);
             // First tell the Loader that we don't need it anymore
             mLoader.cancelLoad();
@@ -143,11 +154,17 @@
             LoaderObserver<D> observer = mObserver;
             if (observer != null) {
                 removeObserver(observer);
-                observer.reset();
+                if (reset) {
+                    observer.reset();
+                }
             }
-            // Finally, send the reset to the Loader
+            // Finally, clean up the Loader
             mLoader.unregisterListener(this);
-            mLoader.reset();
+            if ((observer != null && !observer.hasDeliveredData()) || reset) {
+                mLoader.reset();
+                return mPriorLoader;
+            }
+            return mLoader;
         }
 
         @Override
@@ -168,6 +185,16 @@
         }
 
         @Override
+        public void setValue(D value) {
+            super.setValue(value);
+            // Now that the new data has arrived, we can reset any prior Loader
+            if (mPriorLoader != null) {
+                mPriorLoader.reset();
+                mPriorLoader = null;
+            }
+        }
+
+        @Override
         public String toString() {
             StringBuilder sb = new StringBuilder(64);
             sb.append("LoaderInfo{");
@@ -317,7 +344,7 @@
             int size = mLoaders.size();
             for (int index = 0; index < size; index++) {
                 LoaderInfo info = mLoaders.valueAt(index);
-                info.destroy();
+                info.destroy(true);
             }
             mLoaders.clear();
         }
@@ -348,7 +375,7 @@
     @MainThread
     @NonNull
     private <D> Loader<D> createAndInstallLoader(int id, @Nullable Bundle args,
-            @NonNull LoaderCallbacks<D> callback) {
+            @NonNull LoaderCallbacks<D> callback, @Nullable Loader<D> priorLoader) {
         LoaderInfo<D> info;
         try {
             mLoaderViewModel.startCreatingLoader();
@@ -359,7 +386,7 @@
                         + "must not be a non-static inner member class: "
                         + loader);
             }
-            info = new LoaderInfo<>(id, args, loader);
+            info = new LoaderInfo<>(id, args, loader, priorLoader);
             if (DEBUG) Log.v(TAG, "  Created new loader " + info);
             mLoaderViewModel.putLoader(id, info);
         } finally {
@@ -386,7 +413,7 @@
 
         if (info == null) {
             // Loader doesn't already exist; create.
-            return createAndInstallLoader(id, args, callback);
+            return createAndInstallLoader(id, args, callback, null);
         } else {
             if (DEBUG) Log.v(TAG, "  Re-using existing loader " + info);
             return info.setCallback(mLifecycleOwner, callback);
@@ -406,10 +433,13 @@
         }
 
         if (DEBUG) Log.v(TAG, "restartLoader in " + this + ": args=" + args);
-        // Destroy any existing Loader
-        destroyLoader(id);
+        LoaderInfo<D> info = mLoaderViewModel.getLoader(id);
+        Loader<D> priorLoader = null;
+        if (info != null) {
+            priorLoader = info.destroy(false);
+        }
         // And create a new Loader
-        return createAndInstallLoader(id, args, callback);
+        return createAndInstallLoader(id, args, callback, priorLoader);
     }
 
     @MainThread
@@ -425,7 +455,7 @@
         if (DEBUG) Log.v(TAG, "destroyLoader in " + this + " of " + id);
         LoaderInfo info = mLoaderViewModel.getLoader(id);
         if (info != null) {
-            info.destroy();
+            info.destroy(true);
             mLoaderViewModel.removeLoader(id);
         }
     }
diff --git a/media-compat/version-compat-tests/current/service/build.gradle b/media-compat/version-compat-tests/current/service/build.gradle
deleted file mode 100644
index bdc129d..0000000
--- a/media-compat/version-compat-tests/current/service/build.gradle
+++ /dev/null
@@ -1,28 +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.
- */
-
-import static androidx.build.dependencies.DependenciesKt.*
-
-plugins {
-    id("SupportAndroidLibraryPlugin")
-}
-
-dependencies {
-    androidTestImplementation(project(":media"))
-    androidTestImplementation(project(":support-media-compat-test-lib"))
-
-    androidTestImplementation(TEST_RUNNER)
-}
diff --git a/media-compat/OWNERS b/media/OWNERS
similarity index 100%
rename from media-compat/OWNERS
rename to media/OWNERS
diff --git a/media-compat/api/current.txt b/media/api/current.txt
similarity index 100%
rename from media-compat/api/current.txt
rename to media/api/current.txt
diff --git a/media-compat/api21/android/support/v4/media/MediaDescriptionCompatApi21.java b/media/api21/android/support/v4/media/MediaDescriptionCompatApi21.java
similarity index 100%
rename from media-compat/api21/android/support/v4/media/MediaDescriptionCompatApi21.java
rename to media/api21/android/support/v4/media/MediaDescriptionCompatApi21.java
diff --git a/media-compat/api21/android/support/v4/media/MediaMetadataCompatApi21.java b/media/api21/android/support/v4/media/MediaMetadataCompatApi21.java
similarity index 100%
rename from media-compat/api21/android/support/v4/media/MediaMetadataCompatApi21.java
rename to media/api21/android/support/v4/media/MediaMetadataCompatApi21.java
diff --git a/media-compat/api21/android/support/v4/media/ParceledListSliceAdapterApi21.java b/media/api21/android/support/v4/media/ParceledListSliceAdapterApi21.java
similarity index 100%
rename from media-compat/api21/android/support/v4/media/ParceledListSliceAdapterApi21.java
rename to media/api21/android/support/v4/media/ParceledListSliceAdapterApi21.java
diff --git a/media-compat/api21/android/support/v4/media/session/MediaSessionCompatApi21.java b/media/api21/android/support/v4/media/session/MediaSessionCompatApi21.java
similarity index 100%
rename from media-compat/api21/android/support/v4/media/session/MediaSessionCompatApi21.java
rename to media/api21/android/support/v4/media/session/MediaSessionCompatApi21.java
diff --git a/media-compat/api21/android/support/v4/media/session/PlaybackStateCompatApi21.java b/media/api21/android/support/v4/media/session/PlaybackStateCompatApi21.java
similarity index 100%
rename from media-compat/api21/android/support/v4/media/session/PlaybackStateCompatApi21.java
rename to media/api21/android/support/v4/media/session/PlaybackStateCompatApi21.java
diff --git a/media-compat/api21/androidx/media/AudioAttributesCompatApi21.java b/media/api21/androidx/media/AudioAttributesCompatApi21.java
similarity index 100%
rename from media-compat/api21/androidx/media/AudioAttributesCompatApi21.java
rename to media/api21/androidx/media/AudioAttributesCompatApi21.java
diff --git a/media-compat/api21/androidx/media/MediaBrowserCompatApi21.java b/media/api21/androidx/media/MediaBrowserCompatApi21.java
similarity index 100%
rename from media-compat/api21/androidx/media/MediaBrowserCompatApi21.java
rename to media/api21/androidx/media/MediaBrowserCompatApi21.java
diff --git a/media-compat/api21/androidx/media/MediaBrowserServiceCompatApi21.java b/media/api21/androidx/media/MediaBrowserServiceCompatApi21.java
similarity index 100%
rename from media-compat/api21/androidx/media/MediaBrowserServiceCompatApi21.java
rename to media/api21/androidx/media/MediaBrowserServiceCompatApi21.java
diff --git a/media-compat/api21/androidx/media/VolumeProviderCompatApi21.java b/media/api21/androidx/media/VolumeProviderCompatApi21.java
similarity index 100%
rename from media-compat/api21/androidx/media/VolumeProviderCompatApi21.java
rename to media/api21/androidx/media/VolumeProviderCompatApi21.java
diff --git a/media-compat/api21/androidx/media/session/MediaControllerCompatApi21.java b/media/api21/androidx/media/session/MediaControllerCompatApi21.java
similarity index 100%
rename from media-compat/api21/androidx/media/session/MediaControllerCompatApi21.java
rename to media/api21/androidx/media/session/MediaControllerCompatApi21.java
diff --git a/media-compat/api22/android/support/v4/media/session/MediaSessionCompatApi22.java b/media/api22/android/support/v4/media/session/MediaSessionCompatApi22.java
similarity index 100%
rename from media-compat/api22/android/support/v4/media/session/MediaSessionCompatApi22.java
rename to media/api22/android/support/v4/media/session/MediaSessionCompatApi22.java
diff --git a/media-compat/api22/android/support/v4/media/session/PlaybackStateCompatApi22.java b/media/api22/android/support/v4/media/session/PlaybackStateCompatApi22.java
similarity index 100%
rename from media-compat/api22/android/support/v4/media/session/PlaybackStateCompatApi22.java
rename to media/api22/android/support/v4/media/session/PlaybackStateCompatApi22.java
diff --git a/media-compat/api23/android/support/v4/media/MediaDescriptionCompatApi23.java b/media/api23/android/support/v4/media/MediaDescriptionCompatApi23.java
similarity index 100%
rename from media-compat/api23/android/support/v4/media/MediaDescriptionCompatApi23.java
rename to media/api23/android/support/v4/media/MediaDescriptionCompatApi23.java
diff --git a/media-compat/api23/android/support/v4/media/session/MediaSessionCompatApi23.java b/media/api23/android/support/v4/media/session/MediaSessionCompatApi23.java
similarity index 100%
rename from media-compat/api23/android/support/v4/media/session/MediaSessionCompatApi23.java
rename to media/api23/android/support/v4/media/session/MediaSessionCompatApi23.java
diff --git a/media-compat/api23/androidx/media/MediaBrowserCompatApi23.java b/media/api23/androidx/media/MediaBrowserCompatApi23.java
similarity index 100%
rename from media-compat/api23/androidx/media/MediaBrowserCompatApi23.java
rename to media/api23/androidx/media/MediaBrowserCompatApi23.java
diff --git a/media-compat/api23/androidx/media/MediaBrowserServiceCompatApi23.java b/media/api23/androidx/media/MediaBrowserServiceCompatApi23.java
similarity index 100%
rename from media-compat/api23/androidx/media/MediaBrowserServiceCompatApi23.java
rename to media/api23/androidx/media/MediaBrowserServiceCompatApi23.java
diff --git a/media-compat/api23/androidx/media/session/MediaControllerCompatApi23.java b/media/api23/androidx/media/session/MediaControllerCompatApi23.java
similarity index 100%
rename from media-compat/api23/androidx/media/session/MediaControllerCompatApi23.java
rename to media/api23/androidx/media/session/MediaControllerCompatApi23.java
diff --git a/media-compat/api24/android/support/v4/media/session/MediaSessionCompatApi24.java b/media/api24/android/support/v4/media/session/MediaSessionCompatApi24.java
similarity index 100%
rename from media-compat/api24/android/support/v4/media/session/MediaSessionCompatApi24.java
rename to media/api24/android/support/v4/media/session/MediaSessionCompatApi24.java
diff --git a/media-compat/api24/androidx/media/session/MediaControllerCompatApi24.java b/media/api24/androidx/media/session/MediaControllerCompatApi24.java
similarity index 100%
rename from media-compat/api24/androidx/media/session/MediaControllerCompatApi24.java
rename to media/api24/androidx/media/session/MediaControllerCompatApi24.java
diff --git a/media-compat/api26/androidx/media/MediaBrowserCompatApi26.java b/media/api26/androidx/media/MediaBrowserCompatApi26.java
similarity index 100%
rename from media-compat/api26/androidx/media/MediaBrowserCompatApi26.java
rename to media/api26/androidx/media/MediaBrowserCompatApi26.java
diff --git a/media-compat/api26/androidx/media/MediaBrowserServiceCompatApi26.java b/media/api26/androidx/media/MediaBrowserServiceCompatApi26.java
similarity index 100%
rename from media-compat/api26/androidx/media/MediaBrowserServiceCompatApi26.java
rename to media/api26/androidx/media/MediaBrowserServiceCompatApi26.java
diff --git a/media-compat/api_legacy/26.0.0.txt b/media/api_legacy/26.0.0.txt
similarity index 100%
rename from media-compat/api_legacy/26.0.0.txt
rename to media/api_legacy/26.0.0.txt
diff --git a/media-compat/api_legacy/26.1.0.txt b/media/api_legacy/26.1.0.txt
similarity index 100%
rename from media-compat/api_legacy/26.1.0.txt
rename to media/api_legacy/26.1.0.txt
diff --git a/media-compat/api_legacy/27.0.0.txt b/media/api_legacy/27.0.0.txt
similarity index 100%
rename from media-compat/api_legacy/27.0.0.txt
rename to media/api_legacy/27.0.0.txt
diff --git a/media-compat/api_legacy/27.1.0.txt b/media/api_legacy/27.1.0.txt
similarity index 100%
rename from media-compat/api_legacy/27.1.0.txt
rename to media/api_legacy/27.1.0.txt
diff --git a/media-compat/api_legacy/28.0.0-alpha1.txt b/media/api_legacy/28.0.0-alpha1.txt
similarity index 100%
rename from media-compat/api_legacy/28.0.0-alpha1.txt
rename to media/api_legacy/28.0.0-alpha1.txt
diff --git a/media-compat/api_legacy/current.txt b/media/api_legacy/current.txt
similarity index 100%
rename from media-compat/api_legacy/current.txt
rename to media/api_legacy/current.txt
diff --git a/media-compat/build.gradle b/media/build.gradle
similarity index 89%
rename from media-compat/build.gradle
rename to media/build.gradle
index 87e1b23..eda587d 100644
--- a/media-compat/build.gradle
+++ b/media/build.gradle
@@ -10,8 +10,8 @@
     api(project(":annotation"))
     api(project(":core"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     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(':internal-testutils')
diff --git a/media-compat/proguard-rules.pro b/media/proguard-rules.pro
similarity index 100%
rename from media-compat/proguard-rules.pro
rename to media/proguard-rules.pro
diff --git a/media-compat/src/main/AndroidManifest.xml b/media/src/main/AndroidManifest.xml
similarity index 100%
rename from media-compat/src/main/AndroidManifest.xml
rename to media/src/main/AndroidManifest.xml
diff --git a/media-compat/src/main/aidl/android/support/v4/media/MediaDescriptionCompat.aidl b/media/src/main/aidl/android/support/v4/media/MediaDescriptionCompat.aidl
similarity index 100%
rename from media-compat/src/main/aidl/android/support/v4/media/MediaDescriptionCompat.aidl
rename to media/src/main/aidl/android/support/v4/media/MediaDescriptionCompat.aidl
diff --git a/media-compat/src/main/aidl/android/support/v4/media/MediaMetadataCompat.aidl b/media/src/main/aidl/android/support/v4/media/MediaMetadataCompat.aidl
similarity index 100%
rename from media-compat/src/main/aidl/android/support/v4/media/MediaMetadataCompat.aidl
rename to media/src/main/aidl/android/support/v4/media/MediaMetadataCompat.aidl
diff --git a/media-compat/src/main/aidl/android/support/v4/media/RatingCompat.aidl b/media/src/main/aidl/android/support/v4/media/RatingCompat.aidl
similarity index 100%
rename from media-compat/src/main/aidl/android/support/v4/media/RatingCompat.aidl
rename to media/src/main/aidl/android/support/v4/media/RatingCompat.aidl
diff --git a/media-compat/src/main/aidl/android/support/v4/media/session/IMediaControllerCallback.aidl b/media/src/main/aidl/android/support/v4/media/session/IMediaControllerCallback.aidl
similarity index 100%
rename from media-compat/src/main/aidl/android/support/v4/media/session/IMediaControllerCallback.aidl
rename to media/src/main/aidl/android/support/v4/media/session/IMediaControllerCallback.aidl
diff --git a/media-compat/src/main/aidl/android/support/v4/media/session/IMediaSession.aidl b/media/src/main/aidl/android/support/v4/media/session/IMediaSession.aidl
similarity index 100%
rename from media-compat/src/main/aidl/android/support/v4/media/session/IMediaSession.aidl
rename to media/src/main/aidl/android/support/v4/media/session/IMediaSession.aidl
diff --git a/media-compat/src/main/aidl/android/support/v4/media/session/MediaSessionCompat.aidl b/media/src/main/aidl/android/support/v4/media/session/MediaSessionCompat.aidl
similarity index 100%
rename from media-compat/src/main/aidl/android/support/v4/media/session/MediaSessionCompat.aidl
rename to media/src/main/aidl/android/support/v4/media/session/MediaSessionCompat.aidl
diff --git a/media-compat/src/main/aidl/android/support/v4/media/session/ParcelableVolumeInfo.aidl b/media/src/main/aidl/android/support/v4/media/session/ParcelableVolumeInfo.aidl
similarity index 100%
rename from media-compat/src/main/aidl/android/support/v4/media/session/ParcelableVolumeInfo.aidl
rename to media/src/main/aidl/android/support/v4/media/session/ParcelableVolumeInfo.aidl
diff --git a/media-compat/src/main/aidl/android/support/v4/media/session/PlaybackStateCompat.aidl b/media/src/main/aidl/android/support/v4/media/session/PlaybackStateCompat.aidl
similarity index 100%
rename from media-compat/src/main/aidl/android/support/v4/media/session/PlaybackStateCompat.aidl
rename to media/src/main/aidl/android/support/v4/media/session/PlaybackStateCompat.aidl
diff --git a/media-compat/src/main/java/android/support/v4/media/MediaDescriptionCompat.java b/media/src/main/java/android/support/v4/media/MediaDescriptionCompat.java
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/MediaDescriptionCompat.java
rename to media/src/main/java/android/support/v4/media/MediaDescriptionCompat.java
diff --git a/media-compat/src/main/java/android/support/v4/media/MediaMetadataCompat.java b/media/src/main/java/android/support/v4/media/MediaMetadataCompat.java
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/MediaMetadataCompat.java
rename to media/src/main/java/android/support/v4/media/MediaMetadataCompat.java
diff --git a/media-compat/src/main/java/android/support/v4/media/RatingCompat.java b/media/src/main/java/android/support/v4/media/RatingCompat.java
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/RatingCompat.java
rename to media/src/main/java/android/support/v4/media/RatingCompat.java
diff --git a/media-compat/src/main/java/android/support/v4/media/session/MediaSessionCompat.java b/media/src/main/java/android/support/v4/media/session/MediaSessionCompat.java
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/session/MediaSessionCompat.java
rename to media/src/main/java/android/support/v4/media/session/MediaSessionCompat.java
diff --git a/media-compat/src/main/java/android/support/v4/media/session/ParcelableVolumeInfo.java b/media/src/main/java/android/support/v4/media/session/ParcelableVolumeInfo.java
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/session/ParcelableVolumeInfo.java
rename to media/src/main/java/android/support/v4/media/session/ParcelableVolumeInfo.java
diff --git a/media-compat/src/main/java/android/support/v4/media/session/PlaybackStateCompat.java b/media/src/main/java/android/support/v4/media/session/PlaybackStateCompat.java
similarity index 100%
rename from media-compat/src/main/java/android/support/v4/media/session/PlaybackStateCompat.java
rename to media/src/main/java/android/support/v4/media/session/PlaybackStateCompat.java
diff --git a/media-compat/src/main/java/androidx/media/AudioAttributesCompat.java b/media/src/main/java/androidx/media/AudioAttributesCompat.java
similarity index 100%
rename from media-compat/src/main/java/androidx/media/AudioAttributesCompat.java
rename to media/src/main/java/androidx/media/AudioAttributesCompat.java
diff --git a/media-compat/src/main/java/androidx/media/MediaBrowserCompat.java b/media/src/main/java/androidx/media/MediaBrowserCompat.java
similarity index 100%
rename from media-compat/src/main/java/androidx/media/MediaBrowserCompat.java
rename to media/src/main/java/androidx/media/MediaBrowserCompat.java
diff --git a/media-compat/src/main/java/androidx/media/MediaBrowserCompatUtils.java b/media/src/main/java/androidx/media/MediaBrowserCompatUtils.java
similarity index 100%
rename from media-compat/src/main/java/androidx/media/MediaBrowserCompatUtils.java
rename to media/src/main/java/androidx/media/MediaBrowserCompatUtils.java
diff --git a/media-compat/src/main/java/androidx/media/MediaBrowserProtocol.java b/media/src/main/java/androidx/media/MediaBrowserProtocol.java
similarity index 100%
rename from media-compat/src/main/java/androidx/media/MediaBrowserProtocol.java
rename to media/src/main/java/androidx/media/MediaBrowserProtocol.java
diff --git a/media-compat/src/main/java/androidx/media/MediaBrowserServiceCompat.java b/media/src/main/java/androidx/media/MediaBrowserServiceCompat.java
similarity index 100%
rename from media-compat/src/main/java/androidx/media/MediaBrowserServiceCompat.java
rename to media/src/main/java/androidx/media/MediaBrowserServiceCompat.java
diff --git a/media-compat/src/main/java/androidx/media/VolumeProviderCompat.java b/media/src/main/java/androidx/media/VolumeProviderCompat.java
similarity index 100%
rename from media-compat/src/main/java/androidx/media/VolumeProviderCompat.java
rename to media/src/main/java/androidx/media/VolumeProviderCompat.java
diff --git a/media-compat/src/main/java/androidx/media/app/NotificationCompat.java b/media/src/main/java/androidx/media/app/NotificationCompat.java
similarity index 100%
rename from media-compat/src/main/java/androidx/media/app/NotificationCompat.java
rename to media/src/main/java/androidx/media/app/NotificationCompat.java
diff --git a/media-compat/src/main/java/androidx/media/session/MediaButtonReceiver.java b/media/src/main/java/androidx/media/session/MediaButtonReceiver.java
similarity index 100%
rename from media-compat/src/main/java/androidx/media/session/MediaButtonReceiver.java
rename to media/src/main/java/androidx/media/session/MediaButtonReceiver.java
diff --git a/media-compat/src/main/java/androidx/media/session/MediaControllerCompat.java b/media/src/main/java/androidx/media/session/MediaControllerCompat.java
similarity index 100%
rename from media-compat/src/main/java/androidx/media/session/MediaControllerCompat.java
rename to media/src/main/java/androidx/media/session/MediaControllerCompat.java
diff --git a/media-compat/src/main/res-public/values/public_styles.xml b/media/src/main/res-public/values/public_styles.xml
similarity index 100%
rename from media-compat/src/main/res-public/values/public_styles.xml
rename to media/src/main/res-public/values/public_styles.xml
diff --git a/media-compat/src/main/res/layout/notification_media_action.xml b/media/src/main/res/layout/notification_media_action.xml
similarity index 100%
rename from media-compat/src/main/res/layout/notification_media_action.xml
rename to media/src/main/res/layout/notification_media_action.xml
diff --git a/media-compat/src/main/res/layout/notification_media_cancel_action.xml b/media/src/main/res/layout/notification_media_cancel_action.xml
similarity index 100%
rename from media-compat/src/main/res/layout/notification_media_cancel_action.xml
rename to media/src/main/res/layout/notification_media_cancel_action.xml
diff --git a/media-compat/src/main/res/layout/notification_template_big_media.xml b/media/src/main/res/layout/notification_template_big_media.xml
similarity index 100%
rename from media-compat/src/main/res/layout/notification_template_big_media.xml
rename to media/src/main/res/layout/notification_template_big_media.xml
diff --git a/media-compat/src/main/res/layout/notification_template_big_media_custom.xml b/media/src/main/res/layout/notification_template_big_media_custom.xml
similarity index 100%
rename from media-compat/src/main/res/layout/notification_template_big_media_custom.xml
rename to media/src/main/res/layout/notification_template_big_media_custom.xml
diff --git a/media-compat/src/main/res/layout/notification_template_big_media_narrow.xml b/media/src/main/res/layout/notification_template_big_media_narrow.xml
similarity index 100%
rename from media-compat/src/main/res/layout/notification_template_big_media_narrow.xml
rename to media/src/main/res/layout/notification_template_big_media_narrow.xml
diff --git a/media-compat/src/main/res/layout/notification_template_big_media_narrow_custom.xml b/media/src/main/res/layout/notification_template_big_media_narrow_custom.xml
similarity index 100%
rename from media-compat/src/main/res/layout/notification_template_big_media_narrow_custom.xml
rename to media/src/main/res/layout/notification_template_big_media_narrow_custom.xml
diff --git a/media-compat/src/main/res/layout/notification_template_lines_media.xml b/media/src/main/res/layout/notification_template_lines_media.xml
similarity index 100%
rename from media-compat/src/main/res/layout/notification_template_lines_media.xml
rename to media/src/main/res/layout/notification_template_lines_media.xml
diff --git a/media-compat/src/main/res/layout/notification_template_media.xml b/media/src/main/res/layout/notification_template_media.xml
similarity index 100%
rename from media-compat/src/main/res/layout/notification_template_media.xml
rename to media/src/main/res/layout/notification_template_media.xml
diff --git a/media-compat/src/main/res/layout/notification_template_media_custom.xml b/media/src/main/res/layout/notification_template_media_custom.xml
similarity index 100%
rename from media-compat/src/main/res/layout/notification_template_media_custom.xml
rename to media/src/main/res/layout/notification_template_media_custom.xml
diff --git a/media-compat/src/main/res/values-v21/styles.xml b/media/src/main/res/values-v21/styles.xml
similarity index 100%
rename from media-compat/src/main/res/values-v21/styles.xml
rename to media/src/main/res/values-v21/styles.xml
diff --git a/media-compat/src/main/res/values-v24/styles.xml b/media/src/main/res/values-v24/styles.xml
similarity index 100%
rename from media-compat/src/main/res/values-v24/styles.xml
rename to media/src/main/res/values-v24/styles.xml
diff --git a/media-compat/src/main/res/values/colors.xml b/media/src/main/res/values/colors.xml
similarity index 100%
rename from media-compat/src/main/res/values/colors.xml
rename to media/src/main/res/values/colors.xml
diff --git a/media-compat/src/main/res/values/colors_material.xml b/media/src/main/res/values/colors_material.xml
similarity index 100%
rename from media-compat/src/main/res/values/colors_material.xml
rename to media/src/main/res/values/colors_material.xml
diff --git a/media-compat/src/main/res/values/config.xml b/media/src/main/res/values/config.xml
similarity index 100%
rename from media-compat/src/main/res/values/config.xml
rename to media/src/main/res/values/config.xml
diff --git a/media-compat/src/main/res/values/styles.xml b/media/src/main/res/values/styles.xml
similarity index 100%
rename from media-compat/src/main/res/values/styles.xml
rename to media/src/main/res/values/styles.xml
diff --git a/media-compat/version-compat-tests/OWNERS b/media/version-compat-tests/OWNERS
similarity index 100%
rename from media-compat/version-compat-tests/OWNERS
rename to media/version-compat-tests/OWNERS
diff --git a/media-compat/version-compat-tests/current/client/build.gradle b/media/version-compat-tests/current/client/build.gradle
similarity index 91%
rename from media-compat/version-compat-tests/current/client/build.gradle
rename to media/version-compat-tests/current/client/build.gradle
index bdc129d..650cd6a 100644
--- a/media-compat/version-compat-tests/current/client/build.gradle
+++ b/media/version-compat-tests/current/client/build.gradle
@@ -24,5 +24,5 @@
     androidTestImplementation(project(":media"))
     androidTestImplementation(project(":support-media-compat-test-lib"))
 
-    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
 }
diff --git a/media-compat/version-compat-tests/current/client/src/androidTest/AndroidManifest.xml b/media/version-compat-tests/current/client/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/current/client/src/androidTest/AndroidManifest.xml
rename to media/version-compat-tests/current/client/src/androidTest/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/AudioAttributesCompatTest.java b/media/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/src/androidTest/java/android/support/mediacompat/client/AudioAttributesCompatTest.java
rename to media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/AudioAttributesCompatTest.java
diff --git a/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/ClientBroadcastReceiver.java b/media/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/src/androidTest/java/android/support/mediacompat/client/ClientBroadcastReceiver.java
rename to media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/ClientBroadcastReceiver.java
diff --git a/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserCompatTest.java b/media/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/src/androidTest/java/android/support/mediacompat/client/MediaBrowserCompatTest.java
rename to media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserCompatTest.java
diff --git a/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java b/media/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/src/androidTest/java/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
rename to media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
diff --git a/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaItemTest.java b/media/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/src/androidTest/java/android/support/mediacompat/client/MediaItemTest.java
rename to media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/MediaItemTest.java
diff --git a/media-compat/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/PlaybackStateCompatTest.java b/media/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/src/androidTest/java/android/support/mediacompat/client/PlaybackStateCompatTest.java
rename to media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/PlaybackStateCompatTest.java
diff --git a/media-compat/version-compat-tests/current/client/src/main/AndroidManifest.xml b/media/version-compat-tests/current/client/src/main/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/current/client/src/main/AndroidManifest.xml
rename to media/version-compat-tests/current/client/src/main/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/current/client/build.gradle b/media/version-compat-tests/current/service/build.gradle
similarity index 91%
copy from media-compat/version-compat-tests/current/client/build.gradle
copy to media/version-compat-tests/current/service/build.gradle
index bdc129d..650cd6a 100644
--- a/media-compat/version-compat-tests/current/client/build.gradle
+++ b/media/version-compat-tests/current/service/build.gradle
@@ -24,5 +24,5 @@
     androidTestImplementation(project(":media"))
     androidTestImplementation(project(":support-media-compat-test-lib"))
 
-    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
 }
diff --git a/media-compat/version-compat-tests/current/service/src/androidTest/AndroidManifest.xml b/media/version-compat-tests/current/service/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/current/service/src/androidTest/AndroidManifest.xml
rename to media/version-compat-tests/current/service/src/androidTest/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/current/service/src/androidTest/NO_DOCS b/media/version-compat-tests/current/service/src/androidTest/NO_DOCS
similarity index 100%
rename from media-compat/version-compat-tests/current/service/src/androidTest/NO_DOCS
rename to media/version-compat-tests/current/service/src/androidTest/NO_DOCS
diff --git a/media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java b/media/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/src/androidTest/java/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
rename to media/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
diff --git a/media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/ServiceBroadcastReceiver.java b/media/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/src/androidTest/java/android/support/mediacompat/service/ServiceBroadcastReceiver.java
rename to media/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/ServiceBroadcastReceiver.java
diff --git a/media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java b/media/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/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
rename to media/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
diff --git a/media-compat/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java b/media/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/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
rename to media/version-compat-tests/current/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
diff --git a/media-compat/version-compat-tests/current/service/src/main/AndroidManifest.xml b/media/version-compat-tests/current/service/src/main/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/current/service/src/main/AndroidManifest.xml
rename to media/version-compat-tests/current/service/src/main/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/lib/build.gradle b/media/version-compat-tests/lib/build.gradle
similarity index 100%
rename from media-compat/version-compat-tests/lib/build.gradle
rename to media/version-compat-tests/lib/build.gradle
diff --git a/media-compat/version-compat-tests/lib/lint-baseline.xml b/media/version-compat-tests/lib/lint-baseline.xml
similarity index 100%
rename from media-compat/version-compat-tests/lib/lint-baseline.xml
rename to media/version-compat-tests/lib/lint-baseline.xml
diff --git a/media-compat/version-compat-tests/lib/src/main/AndroidManifest.xml b/media/version-compat-tests/lib/src/main/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/lib/src/main/AndroidManifest.xml
rename to media/version-compat-tests/lib/src/main/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/MediaBrowserConstants.java b/media/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/MediaBrowserConstants.java
similarity index 100%
rename from media-compat/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/MediaBrowserConstants.java
rename to media/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/MediaBrowserConstants.java
diff --git a/media-compat/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/MediaControllerConstants.java b/media/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/MediaControllerConstants.java
similarity index 100%
rename from media-compat/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/MediaControllerConstants.java
rename to media/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/MediaControllerConstants.java
diff --git a/media-compat/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/MediaSessionConstants.java b/media/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/MediaSessionConstants.java
similarity index 100%
rename from media-compat/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/MediaSessionConstants.java
rename to media/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/MediaSessionConstants.java
diff --git a/media-compat/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/VersionConstants.java b/media/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/VersionConstants.java
similarity index 100%
rename from media-compat/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/VersionConstants.java
rename to media/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/VersionConstants.java
diff --git a/media-compat/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/util/IntentUtil.java b/media/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/util/IntentUtil.java
similarity index 100%
rename from media-compat/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/util/IntentUtil.java
rename to media/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/util/IntentUtil.java
diff --git a/media-compat/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/util/PollingCheck.java b/media/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/util/PollingCheck.java
similarity index 100%
rename from media-compat/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/util/PollingCheck.java
rename to media/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/util/PollingCheck.java
diff --git a/media-compat/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/util/TestUtil.java b/media/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/util/TestUtil.java
similarity index 100%
rename from media-compat/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/util/TestUtil.java
rename to media/version-compat-tests/lib/src/main/java/android/support/mediacompat/testlib/util/TestUtil.java
diff --git a/media-compat/version-compat-tests/previous/client/build.gradle b/media/version-compat-tests/previous/client/build.gradle
similarity index 92%
rename from media-compat/version-compat-tests/previous/client/build.gradle
rename to media/version-compat-tests/previous/client/build.gradle
index 4319f69..8b0866e 100644
--- a/media-compat/version-compat-tests/previous/client/build.gradle
+++ b/media/version-compat-tests/previous/client/build.gradle
@@ -24,5 +24,5 @@
     androidTestImplementation project(':support-media-compat-test-lib')
     androidTestImplementation "com.android.support:support-media-compat:27.0.1"
 
-    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
 }
diff --git a/media-compat/version-compat-tests/previous/client/src/androidTest/AndroidManifest.xml b/media/version-compat-tests/previous/client/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/src/androidTest/AndroidManifest.xml
rename to media/version-compat-tests/previous/client/src/androidTest/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/AudioAttributesCompatTest.java b/media/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/src/androidTest/java/android/support/mediacompat/client/AudioAttributesCompatTest.java
rename to media/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/AudioAttributesCompatTest.java
diff --git a/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/ClientBroadcastReceiver.java b/media/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/src/androidTest/java/android/support/mediacompat/client/ClientBroadcastReceiver.java
rename to media/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/ClientBroadcastReceiver.java
diff --git a/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserCompatTest.java b/media/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/src/androidTest/java/android/support/mediacompat/client/MediaBrowserCompatTest.java
rename to media/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaBrowserCompatTest.java
diff --git a/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java b/media/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/src/androidTest/java/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
rename to media/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaControllerCompatCallbackTest.java
diff --git a/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaItemTest.java b/media/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/src/androidTest/java/android/support/mediacompat/client/MediaItemTest.java
rename to media/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/MediaItemTest.java
diff --git a/media-compat/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/PlaybackStateCompatTest.java b/media/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/src/androidTest/java/android/support/mediacompat/client/PlaybackStateCompatTest.java
rename to media/version-compat-tests/previous/client/src/androidTest/java/android/support/mediacompat/client/PlaybackStateCompatTest.java
diff --git a/media-compat/version-compat-tests/previous/client/src/main/AndroidManifest.xml b/media/version-compat-tests/previous/client/src/main/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/previous/client/src/main/AndroidManifest.xml
rename to media/version-compat-tests/previous/client/src/main/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/previous/service/build.gradle b/media/version-compat-tests/previous/service/build.gradle
similarity index 92%
rename from media-compat/version-compat-tests/previous/service/build.gradle
rename to media/version-compat-tests/previous/service/build.gradle
index 28c88c3..3e1d9b9 100644
--- a/media-compat/version-compat-tests/previous/service/build.gradle
+++ b/media/version-compat-tests/previous/service/build.gradle
@@ -24,5 +24,5 @@
     androidTestImplementation(project(":support-media-compat-test-lib"))
     androidTestImplementation "com.android.support:support-media-compat:27.0.1"
 
-    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
 }
diff --git a/media-compat/version-compat-tests/previous/service/src/androidTest/AndroidManifest.xml b/media/version-compat-tests/previous/service/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/src/androidTest/AndroidManifest.xml
rename to media/version-compat-tests/previous/service/src/androidTest/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/previous/service/src/androidTest/NO_DOCS b/media/version-compat-tests/previous/service/src/androidTest/NO_DOCS
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/src/androidTest/NO_DOCS
rename to media/version-compat-tests/previous/service/src/androidTest/NO_DOCS
diff --git a/media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java b/media/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/src/androidTest/java/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
rename to media/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/MediaSessionCompatCallbackTest.java
diff --git a/media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/ServiceBroadcastReceiver.java b/media/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/src/androidTest/java/android/support/mediacompat/service/ServiceBroadcastReceiver.java
rename to media/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/ServiceBroadcastReceiver.java
diff --git a/media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java b/media/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/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
rename to media/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompat.java
diff --git a/media-compat/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java b/media/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/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
rename to media/version-compat-tests/previous/service/src/androidTest/java/android/support/mediacompat/service/StubMediaBrowserServiceCompatWithDelayedMediaSession.java
diff --git a/media-compat/version-compat-tests/previous/service/src/main/AndroidManifest.xml b/media/version-compat-tests/previous/service/src/main/AndroidManifest.xml
similarity index 100%
rename from media-compat/version-compat-tests/previous/service/src/main/AndroidManifest.xml
rename to media/version-compat-tests/previous/service/src/main/AndroidManifest.xml
diff --git a/media-compat/version-compat-tests/runtest.sh b/media/version-compat-tests/runtest.sh
similarity index 100%
rename from media-compat/version-compat-tests/runtest.sh
rename to media/version-compat-tests/runtest.sh
diff --git a/mediarouter/build.gradle b/mediarouter/build.gradle
index c25a3e7..a2463a4 100644
--- a/mediarouter/build.gradle
+++ b/mediarouter/build.gradle
@@ -11,9 +11,9 @@
     api(project(":appcompat"))
     api(project(":palette"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(TEST_RULES)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(TEST_RULES_TMP, libs.exclude_for_espresso)
 }
 
 android {
diff --git a/palette/build.gradle b/palette/build.gradle
index f92d672..b1ab9e7 100644
--- a/palette/build.gradle
+++ b/palette/build.gradle
@@ -10,7 +10,7 @@
     api(project(":core"))
     api(project(":legacy-support-core-utils"))
 
-    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
 }
 
 supportLibrary {
diff --git a/percent/build.gradle b/percent/build.gradle
index d195356..f80350e 100644
--- a/percent/build.gradle
+++ b/percent/build.gradle
@@ -9,8 +9,8 @@
 dependencies {
     api(project(":core"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
 }
 
 android {
diff --git a/preference/build.gradle b/preference/build.gradle
index 8a55ea0..b7c6872 100644
--- a/preference/build.gradle
+++ b/preference/build.gradle
@@ -29,8 +29,8 @@
     api(project(":appcompat"))
     api(project(":recyclerview"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
 }
diff --git a/preference/res/values/attrs.xml b/preference/res/values/attrs.xml
index 332a3df..7a5b8d7 100644
--- a/preference/res/values/attrs.xml
+++ b/preference/res/values/attrs.xml
@@ -98,7 +98,9 @@
              preference category) will not be counted towards the limit. But instead the children of
              such group will be counted.
              By default, all children will be shown, so the default value of this attribute is equal
-             to Integer.MAX_VALUE. -->
+             to Integer.MAX_VALUE.
+             The group should have a key defined if an expandable preference is present to correctly
+             persist state. -->
         <attr name="initialExpandedChildrenCount" format="integer" />
     </declare-styleable>
 
diff --git a/preference/src/androidTest/java/androidx/preference/PreferenceGroupInitialExpandedChildrenCountTest.java b/preference/src/androidTest/java/androidx/preference/PreferenceGroupInitialExpandedChildrenCountTest.java
index b818584..53458d3 100644
--- a/preference/src/androidTest/java/androidx/preference/PreferenceGroupInitialExpandedChildrenCountTest.java
+++ b/preference/src/androidTest/java/androidx/preference/PreferenceGroupInitialExpandedChildrenCountTest.java
@@ -17,7 +17,6 @@
 package androidx.preference;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.anyLong;
 import static org.mockito.Mockito.doAnswer;
@@ -45,6 +44,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
+/**
+ * Test for InitialExpandedChildrenCount in {@link androidx.preference.PreferenceGroup}.
+ */
 @RunWith(AndroidJUnit4.class)
 @SmallTest
 public class PreferenceGroupInitialExpandedChildrenCountTest {
@@ -52,6 +54,7 @@
     private static final int INITIAL_EXPANDED_COUNT = 5;
     private static final int TOTAL_PREFERENCE = 10;
     private static final String PREFERENCE_TITLE_PREFIX = "Preference_";
+    private static final String PREFERENCE_KEY = "testing";
 
     private Context mContext;
     private PreferenceManager mPreferenceManager;
@@ -61,11 +64,12 @@
 
     @Before
     @UiThreadTest
-    public void setup() throws Exception {
+    public void setup() {
         MockitoAnnotations.initMocks(this);
         mContext = InstrumentationRegistry.getTargetContext();
         mPreferenceManager = new PreferenceManager(mContext);
         mScreen = mPreferenceManager.createPreferenceScreen(mContext);
+        mScreen.setKey(PREFERENCE_KEY);
 
         // Add 10 preferences to the screen and to the cache
         mPreferenceList = new ArrayList<>();
@@ -75,7 +79,7 @@
         mHandler = spy(new Handler());
         doAnswer(new Answer<Void>() {
             @Override
-            public Void answer(InvocationOnMock invocation) throws Throwable {
+            public Void answer(InvocationOnMock invocation) {
                 Object[] args = invocation.getArguments();
                 Message message = (Message) args[0];
                 mHandler.dispatchMessage(message);
@@ -85,17 +89,6 @@
     }
 
     /**
-     * Verifies that when PreferenceGroupAdapter is created, the PreferenceInstanceStateCallback
-     * is set on the PreferenceGroup.
-     */
-    @Test
-    @UiThreadTest
-    public void createPreferenceGroupAdapter_setPreferenceInstanceStateCallback() {
-        PreferenceGroupAdapter preferenceGroupAdapter = new PreferenceGroupAdapter(mScreen);
-        assertNotNull(mScreen.getPreferenceInstanceStateCallback());
-    }
-
-    /**
      * Verifies that PreferenceGroupAdapter is showing the preferences on the screen correctly with
      * and without the collapsed child count set.
      */
@@ -135,6 +128,7 @@
     @UiThreadTest
     public void createPreferenceGroupAdapter_displayNestedPreferences() {
         final PreferenceScreen screen = mPreferenceManager.createPreferenceScreen(mContext);
+        screen.setKey(PREFERENCE_KEY);
         final List<Preference> preferenceList = new ArrayList<>();
 
         // Add 2 preferences and 2 categories to screen
@@ -261,27 +255,17 @@
     @UiThreadTest
     public void saveInstanceState_shouldSaveMaxNumberOfChildrenToShow() {
         // No limit set, should save max value
-        PreferenceGroupAdapter preferenceGroupAdapter = new PreferenceGroupAdapter(mScreen);
         Parcelable state = mScreen.onSaveInstanceState();
-        assertEquals(CollapsiblePreferenceGroupController.SavedState.class, state.getClass());
+        assertEquals(PreferenceGroup.SavedState.class, state.getClass());
         assertEquals(Integer.MAX_VALUE,
-                ((CollapsiblePreferenceGroupController.SavedState) state).mMaxPreferenceToShow);
+                ((PreferenceGroup.SavedState) state).mInitialExpandedChildrenCount);
 
         // Has limit set, should save limit
         mScreen.setInitialExpandedChildrenCount(INITIAL_EXPANDED_COUNT);
-        preferenceGroupAdapter = new PreferenceGroupAdapter(mScreen);
         state = mScreen.onSaveInstanceState();
-        assertEquals(CollapsiblePreferenceGroupController.SavedState.class, state.getClass());
+        assertEquals(PreferenceGroup.SavedState.class, state.getClass());
         assertEquals(INITIAL_EXPANDED_COUNT,
-                ((CollapsiblePreferenceGroupController.SavedState) state).mMaxPreferenceToShow);
-
-        // Preferences expanded already, should save max value
-        final Preference expandButton = preferenceGroupAdapter.getItem(INITIAL_EXPANDED_COUNT);
-        expandButton.performClick();
-        state = mScreen.onSaveInstanceState();
-        assertEquals(CollapsiblePreferenceGroupController.SavedState.class, state.getClass());
-        assertEquals(Integer.MAX_VALUE,
-                ((CollapsiblePreferenceGroupController.SavedState) state).mMaxPreferenceToShow);
+                ((PreferenceGroup.SavedState) state).mInitialExpandedChildrenCount);
     }
 
     /**
@@ -291,36 +275,21 @@
     @Test
     @UiThreadTest
     public void restoreInstanceState_noChange_shouldDoNothing() {
-        Parcelable baseState = Preference.BaseSavedState.EMPTY_STATE;
-        // Initialized as expanded, restore with no saved data, should remain expanded
-        PreferenceGroupAdapter preferenceGroupAdapter =
-                PreferenceGroupAdapter.createInstanceWithCustomHandler(mScreen, mHandler);
-        mScreen.onRestoreInstanceState(baseState);
-        assertPreferencesAreExpanded(preferenceGroupAdapter);
-        verify(mHandler, never()).sendMessageDelayed(any(Message.class), anyLong());
+        PreferenceGroup.SavedState state;
 
-        // Initialized as collapsed, restore with no saved data, should remain collapsed
-        mScreen.setInitialExpandedChildrenCount(INITIAL_EXPANDED_COUNT);
-        preferenceGroupAdapter =
-                PreferenceGroupAdapter.createInstanceWithCustomHandler(mScreen, mHandler);
-        mScreen.onRestoreInstanceState(baseState);
-        assertPreferencesAreCollapsed(preferenceGroupAdapter);
-        verify(mHandler, never()).sendMessageDelayed(any(Message.class), anyLong());
-
-        CollapsiblePreferenceGroupController.SavedState state =
-                new CollapsiblePreferenceGroupController.SavedState(baseState);
         // Initialized as expanded, restore as expanded, should remain expanded
-        state.mMaxPreferenceToShow = Integer.MAX_VALUE;
-        mScreen.setInitialExpandedChildrenCount(Integer.MAX_VALUE);
-        preferenceGroupAdapter =
+        state = new PreferenceGroup.SavedState(
+                Preference.BaseSavedState.EMPTY_STATE, Integer.MAX_VALUE);
+        PreferenceGroupAdapter preferenceGroupAdapter =
                 PreferenceGroupAdapter.createInstanceWithCustomHandler(mScreen, mHandler);
         mScreen.onRestoreInstanceState(state);
         assertPreferencesAreExpanded(preferenceGroupAdapter);
         verify(mHandler, never()).sendMessageDelayed(any(Message.class), anyLong());
 
         // Initialized as collapsed, restore as collapsed, should remain collapsed
-        state.mMaxPreferenceToShow = INITIAL_EXPANDED_COUNT;
         mScreen.setInitialExpandedChildrenCount(INITIAL_EXPANDED_COUNT);
+        state = new PreferenceGroup.SavedState(
+                Preference.BaseSavedState.EMPTY_STATE, INITIAL_EXPANDED_COUNT);
         preferenceGroupAdapter =
                 PreferenceGroupAdapter.createInstanceWithCustomHandler(mScreen, mHandler);
         mScreen.onRestoreInstanceState(state);
@@ -335,11 +304,11 @@
     @Test
     @UiThreadTest
     public void restoreHierarchyState_previouslyCollapsed_shouldRestoreToCollapsedState() {
-        CollapsiblePreferenceGroupController.SavedState state =
-                new CollapsiblePreferenceGroupController.SavedState(
-                        Preference.BaseSavedState.EMPTY_STATE);
+        PreferenceGroup.SavedState state =
+                new PreferenceGroup.SavedState(
+                        Preference.BaseSavedState.EMPTY_STATE, Integer.MAX_VALUE);
         // Initialized as expanded, restore as collapsed, should collapse
-        state.mMaxPreferenceToShow = INITIAL_EXPANDED_COUNT;
+        state.mInitialExpandedChildrenCount = INITIAL_EXPANDED_COUNT;
         mScreen.setInitialExpandedChildrenCount(Integer.MAX_VALUE);
         PreferenceGroupAdapter preferenceGroupAdapter =
                 PreferenceGroupAdapter.createInstanceWithCustomHandler(mScreen, mHandler);
@@ -355,11 +324,11 @@
     @Test
     @UiThreadTest
     public void restoreHierarchyState_previouslyExpanded_shouldRestoreToExpandedState() {
-        CollapsiblePreferenceGroupController.SavedState state =
-                new CollapsiblePreferenceGroupController.SavedState(
-                        Preference.BaseSavedState.EMPTY_STATE);
+        PreferenceGroup.SavedState state =
+                new PreferenceGroup.SavedState(
+                        Preference.BaseSavedState.EMPTY_STATE, Integer.MAX_VALUE);
         // Initialized as collapsed, restore as expanded, should expand
-        state.mMaxPreferenceToShow = Integer.MAX_VALUE;
+        state.mInitialExpandedChildrenCount = Integer.MAX_VALUE;
         mScreen.setInitialExpandedChildrenCount(INITIAL_EXPANDED_COUNT);
         PreferenceGroupAdapter preferenceGroupAdapter =
                 PreferenceGroupAdapter.createInstanceWithCustomHandler(mScreen, mHandler);
diff --git a/preference/src/androidTest/java/androidx/preference/tests/ExpandablePreferenceTest.java b/preference/src/androidTest/java/androidx/preference/tests/ExpandablePreferenceTest.java
new file mode 100644
index 0000000..69b9c33
--- /dev/null
+++ b/preference/src/androidTest/java/androidx/preference/tests/ExpandablePreferenceTest.java
@@ -0,0 +1,195 @@
+/*
+ * 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.preference.tests;
+
+import static org.junit.Assert.assertEquals;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceGroupAdapter;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+
+/**
+ * Test for expandable preferences in various contexts..
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class ExpandablePreferenceTest {
+
+    private Context mContext;
+    private Preference mPreference1;
+    private Preference mPreference2;
+    private Preference mPreference3;
+    private PreferenceScreen mScreen;
+
+    @Before
+    @UiThreadTest
+    public void setUp() {
+        mContext = InstrumentationRegistry.getTargetContext();
+        PreferenceManager preferenceManager = new PreferenceManager(mContext);
+        mScreen = preferenceManager.createPreferenceScreen(mContext);
+
+        mPreference1 = new Preference(mContext);
+        mPreference1.setTitle("Preference 1");
+
+        mPreference2 = new Preference(mContext);
+        mPreference2.setTitle("Preference 2");
+
+        mPreference3 = new Preference(mContext);
+        mPreference3.setTitle("Preference 3");
+    }
+
+    @Test
+    @UiThreadTest
+    public void expandablePreference_inPreferenceScreen_collapsesCorrectly() {
+
+        mScreen.setKey("screen");
+        mScreen.setInitialExpandedChildrenCount(1);
+
+        mScreen.addPreference(mPreference1);
+        mScreen.addPreference(mPreference2);
+        mScreen.addPreference(mPreference3);
+
+        PreferenceGroupAdapter preferenceGroupAdapter = new PreferenceGroupAdapter(mScreen);
+
+        assertEquals(2, preferenceGroupAdapter.getItemCount());
+
+        assertEquals(mPreference1, preferenceGroupAdapter.getItem(0));
+        assertEquals("Advanced", preferenceGroupAdapter.getItem(1).getTitle());
+        assertEquals("Preference 2, Preference 3", preferenceGroupAdapter.getItem(1).getSummary());
+    }
+
+    @Test
+    @UiThreadTest
+    public void expandablePreference_inCategory_collapsesCorrectly() {
+        PreferenceCategory category = new PreferenceCategory(mContext);
+
+        mScreen.addPreference(category);
+
+        category.setKey("category");
+        category.setInitialExpandedChildrenCount(1);
+
+        category.addPreference(mPreference1);
+        category.addPreference(mPreference2);
+        category.addPreference(mPreference3);
+
+        PreferenceGroupAdapter preferenceGroupAdapter = new PreferenceGroupAdapter(mScreen);
+
+        assertEquals(3, preferenceGroupAdapter.getItemCount());
+
+        assertEquals(category, preferenceGroupAdapter.getItem(0));
+        assertEquals(mPreference1, preferenceGroupAdapter.getItem(1));
+        assertEquals("Advanced", preferenceGroupAdapter.getItem(2).getTitle());
+        assertEquals("Preference 2, Preference 3", preferenceGroupAdapter.getItem(2).getSummary());
+    }
+
+    @Test
+    @UiThreadTest
+    public void expandablePreference_inNestedCategory_collapsesCorrectly() {
+        PreferenceCategory category = new PreferenceCategory(mContext);
+        PreferenceCategory nestedCategory = new PreferenceCategory(mContext);
+
+        mScreen.addPreference(category);
+        category.addPreference(nestedCategory);
+
+        nestedCategory.setKey("nested_category");
+        nestedCategory.setInitialExpandedChildrenCount(1);
+
+        nestedCategory.addPreference(mPreference1);
+        nestedCategory.addPreference(mPreference2);
+        nestedCategory.addPreference(mPreference3);
+
+        PreferenceGroupAdapter preferenceGroupAdapter = new PreferenceGroupAdapter(mScreen);
+
+        assertEquals(4, preferenceGroupAdapter.getItemCount());
+
+        assertEquals(category, preferenceGroupAdapter.getItem(0));
+        assertEquals(nestedCategory, preferenceGroupAdapter.getItem(1));
+        assertEquals(mPreference1, preferenceGroupAdapter.getItem(2));
+        assertEquals("Advanced", preferenceGroupAdapter.getItem(3).getTitle());
+        assertEquals("Preference 2, Preference 3", preferenceGroupAdapter.getItem(3).getSummary());
+    }
+
+    @Test
+    @UiThreadTest
+    public void expandablePreference_inCategoryContainingAnotherCategory_collapsesCorrectly() {
+        PreferenceCategory category = new PreferenceCategory(mContext);
+        PreferenceCategory nestedCategory = new PreferenceCategory(mContext);
+
+        mScreen.addPreference(category);
+
+        category.setKey("nested_category");
+        category.setInitialExpandedChildrenCount(1);
+
+        category.addPreference(mPreference1);
+        category.addPreference(nestedCategory);
+        nestedCategory.addPreference(mPreference2);
+        nestedCategory.addPreference(mPreference3);
+
+        PreferenceGroupAdapter preferenceGroupAdapter = new PreferenceGroupAdapter(mScreen);
+
+        assertEquals(3, preferenceGroupAdapter.getItemCount());
+
+        assertEquals(category, preferenceGroupAdapter.getItem(0));
+        assertEquals(mPreference1, preferenceGroupAdapter.getItem(1));
+        assertEquals("Advanced", preferenceGroupAdapter.getItem(2).getTitle());
+        assertEquals("Preference 2, Preference 3", preferenceGroupAdapter.getItem(2).getSummary());
+
+        // If the nested category has a title, display that in the summary instead of the children
+        final String title = "Category";
+        nestedCategory.setTitle(title);
+
+        preferenceGroupAdapter = new PreferenceGroupAdapter(mScreen);
+
+        assertEquals(3, preferenceGroupAdapter.getItemCount());
+
+        assertEquals(category, preferenceGroupAdapter.getItem(0));
+        assertEquals(mPreference1, preferenceGroupAdapter.getItem(1));
+        assertEquals("Advanced", preferenceGroupAdapter.getItem(2).getTitle());
+        assertEquals(title, preferenceGroupAdapter.getItem(2).getSummary());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    @UiThreadTest
+    public void nestedExpandablePreferences_notAllowed_shouldThrowAnException() {
+        PreferenceCategory category = new PreferenceCategory(mContext);
+        PreferenceCategory nestedCategory = new PreferenceCategory(mContext);
+
+        mScreen.addPreference(category);
+        category.addPreference(nestedCategory);
+
+        category.setKey("category");
+        category.setInitialExpandedChildrenCount(1);
+
+        nestedCategory.setKey("nested_category");
+        nestedCategory.setInitialExpandedChildrenCount(1);
+
+        // Trying to nest expandable preferences should throw an exception
+        new PreferenceGroupAdapter(mScreen);
+    }
+}
diff --git a/preference/src/main/java/androidx/preference/CollapsiblePreferenceGroupController.java b/preference/src/main/java/androidx/preference/CollapsiblePreferenceGroupController.java
index b315bb7..bcc71ce 100644
--- a/preference/src/main/java/androidx/preference/CollapsiblePreferenceGroupController.java
+++ b/preference/src/main/java/androidx/preference/CollapsiblePreferenceGroupController.java
@@ -17,8 +17,6 @@
 package androidx.preference;
 
 import android.content.Context;
-import android.os.Parcel;
-import android.os.Parcelable;
 import android.text.TextUtils;
 
 import java.util.ArrayList;
@@ -27,53 +25,93 @@
 /**
  * A controller to handle advanced children display logic with collapsible functionality.
  */
-final class CollapsiblePreferenceGroupController
-        implements PreferenceGroup.PreferenceInstanceStateCallback {
+final class CollapsiblePreferenceGroupController {
 
     private final PreferenceGroupAdapter mPreferenceGroupAdapter;
-    private int mMaxPreferenceToShow;
     private final Context mContext;
 
+    /**
+     * Whether there is a child PreferenceGroup that has an expandable preference. This is used to
+     * avoid unnecessary preference tree rebuilds when no such group exists.
+     */
+    private boolean mHasExpandablePreference = false;
+
     CollapsiblePreferenceGroupController(PreferenceGroup preferenceGroup,
             PreferenceGroupAdapter preferenceGroupAdapter) {
         mPreferenceGroupAdapter = preferenceGroupAdapter;
-        mMaxPreferenceToShow = preferenceGroup.getInitialExpandedChildrenCount();
         mContext = preferenceGroup.getContext();
-        preferenceGroup.setPreferenceInstanceStateCallback(this);
     }
 
     /**
-     * Creates the visible portion of the flattened preferences.
+     * Generates the visible section of the PreferenceGroup.
      *
-     * @param flattenedPreferenceList the flattened children of the preference group
-     * @return the visible portion of the flattened preferences
+     * @param group the root preference group to be processed
+     * @return the flattened and visible section of the PreferenceGroup
      */
-    public List<Preference> createVisiblePreferencesList(List<Preference> flattenedPreferenceList) {
+    public List<Preference> createVisiblePreferencesList(PreferenceGroup group) {
+        return createInnerVisiblePreferencesList(group);
+    }
+
+    private List<Preference> createInnerVisiblePreferencesList(PreferenceGroup group) {
+        mHasExpandablePreference = false;
         int visiblePreferenceCount = 0;
-        final List<Preference> visiblePreferenceList =
-                new ArrayList<>(flattenedPreferenceList.size());
-        // Copy only the visible preferences to the active list up to the maximum specified
-        for (final Preference preference : flattenedPreferenceList) {
-            if (preference.isVisible()) {
-                if (visiblePreferenceCount < mMaxPreferenceToShow) {
-                    visiblePreferenceList.add(preference);
+        final boolean hasExpandablePreference =
+                group.getInitialExpandedChildrenCount() != Integer.MAX_VALUE;
+        final List<Preference> visiblePreferences = new ArrayList<>();
+        final List<Preference> collapsedPreferences = new ArrayList<>();
+
+        final int groupSize = group.getPreferenceCount();
+        for (int i = 0; i < groupSize; i++) {
+            final Preference preference = group.getPreference(i);
+
+            if (!preference.isVisible()) {
+                continue;
+            }
+
+            if (!hasExpandablePreference
+                    || visiblePreferenceCount < group.getInitialExpandedChildrenCount()) {
+                visiblePreferences.add(preference);
+            } else {
+                collapsedPreferences.add(preference);
+            }
+
+            // PreferenceGroups do not count towards the maximal number of preferences to show
+            if (!(preference instanceof PreferenceGroup)) {
+                visiblePreferenceCount++;
+                continue;
+            }
+
+            PreferenceGroup innerGroup = (PreferenceGroup) preference;
+            if (!innerGroup.isOnSameScreenAsChildren()) {
+                continue;
+            }
+
+            // Recursively generate nested list of visible preferences
+            final List<Preference> innerList = createInnerVisiblePreferencesList(innerGroup);
+            if (hasExpandablePreference && mHasExpandablePreference) {
+                throw new IllegalArgumentException("Nested expand buttons are not supported!");
+            }
+
+            for (Preference inner : innerList) {
+                if (!hasExpandablePreference
+                        || visiblePreferenceCount < group.getInitialExpandedChildrenCount()) {
+                    visiblePreferences.add(inner);
+                } else {
+                    collapsedPreferences.add(inner);
                 }
-                // Do no count PreferenceGroup as expanded preference because the list of its child
-                // is already contained in the flattenedPreferenceList
-                if (!(preference instanceof PreferenceGroup)) {
-                    visiblePreferenceCount++;
-                }
+                visiblePreferenceCount++;
             }
         }
+
         // If there are any visible preferences being hidden, add an expand button to show the rest
-        // of the preferences. Clicking the expand button will show all the visible preferences and
-        // reset mMaxPreferenceToShow
-        if (showLimitedChildren() && visiblePreferenceCount > mMaxPreferenceToShow) {
-            final ExpandButton expandButton  = createExpandButton(visiblePreferenceList,
-                    flattenedPreferenceList);
-            visiblePreferenceList.add(expandButton);
+        // of the preferences. Clicking the expand button will show all the visible preferences.
+        if (hasExpandablePreference
+                && visiblePreferenceCount > group.getInitialExpandedChildrenCount()) {
+            final ExpandButton expandButton = createExpandButton(group, collapsedPreferences);
+            visiblePreferences.add(expandButton);
         }
-        return visiblePreferenceList;
+        mHasExpandablePreference |= hasExpandablePreference;
+        return visiblePreferences;
     }
 
     /**
@@ -83,46 +121,23 @@
      * @return {@code true} if view update has been handled by this controller.
      */
     public boolean onPreferenceVisibilityChange(Preference preference) {
-        if (showLimitedChildren()) {
-            // We only want to show up to the max number of preferences. Preference visibility
-            // change can result in the expand button being added/removed, as well as expand button
-            // summary change. Rebulid the data to ensure the correct data is shown.
+        if (mHasExpandablePreference) {
+            // We only want to show up to the maximal number of preferences. Preference visibility
+            // change can result in the expand button being added/removed, as well as changes to
+            // its summary. Rebuild to ensure that the correct data is shown.
             mPreferenceGroupAdapter.onPreferenceHierarchyChange(preference);
             return true;
         }
         return false;
     }
 
-    @Override
-    public Parcelable saveInstanceState(Parcelable state) {
-        final SavedState myState = new SavedState(state);
-        myState.mMaxPreferenceToShow = mMaxPreferenceToShow;
-        return myState;
-    }
-
-    @Override
-    public Parcelable restoreInstanceState(Parcelable state) {
-        if (state == null || !state.getClass().equals(SavedState.class)) {
-            // Didn't save state for us in saveInstanceState
-            return state;
-        }
-        SavedState myState = (SavedState) state;
-        final int restoredMaxToShow = myState.mMaxPreferenceToShow;
-        if (mMaxPreferenceToShow != restoredMaxToShow) {
-            mMaxPreferenceToShow = restoredMaxToShow;
-            mPreferenceGroupAdapter.onPreferenceHierarchyChange(null);
-        }
-        return myState.getSuperState();
-    }
-
-    private ExpandButton createExpandButton(List<Preference> visiblePreferenceList,
-            List<Preference> flattenedPreferenceList) {
-        final ExpandButton preference = new ExpandButton(mContext, visiblePreferenceList,
-                flattenedPreferenceList);
+    private ExpandButton createExpandButton(final PreferenceGroup group,
+            List<Preference> collapsedPreferences) {
+        final ExpandButton preference = new ExpandButton(mContext, collapsedPreferences);
         preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
             @Override
             public boolean onPreferenceClick(Preference preference) {
-                mMaxPreferenceToShow = Integer.MAX_VALUE;
+                group.setInitialExpandedChildrenCount(Integer.MAX_VALUE);
                 mPreferenceGroupAdapter.onPreferenceHierarchyChange(preference);
                 return true;
             }
@@ -130,20 +145,15 @@
         return preference;
     }
 
-    private boolean showLimitedChildren() {
-        return mMaxPreferenceToShow != Integer.MAX_VALUE;
-    }
-
     /**
      * A {@link Preference} that provides capability to expand the collapsed items in the
      * {@link PreferenceGroup}.
      */
     static class ExpandButton extends Preference {
-        ExpandButton(Context context, List<Preference> visiblePreferenceList,
-                List<Preference> flattenedPreferenceList) {
+        ExpandButton(Context context, List<Preference> collapsedPreferences) {
             super(context);
             initLayout();
-            setSummary(visiblePreferenceList, flattenedPreferenceList);
+            setSummary(collapsedPreferences);
         }
 
         private void initLayout() {
@@ -156,20 +166,24 @@
 
         /*
          * The summary of this will be the list of title for collapsed preferences. Iterate through
-         * the preferences not in the visible list and add its title to the summary text.
+         * the preferences not in the visible list and add its title to the summary text. If
+         * there are any nested groups with titles, ignore their children.
          */
-        private void setSummary(List<Preference> visiblePreferenceList,
-                List<Preference> flattenedPreferenceList) {
-            final Preference lastVisiblePreference =
-                    visiblePreferenceList.get(visiblePreferenceList.size() - 1);
-            final int collapsedIndex = flattenedPreferenceList.indexOf(lastVisiblePreference) + 1;
+        private void setSummary(List<Preference> collapsedPreferences) {
             CharSequence summary = null;
-            for (int i = collapsedIndex; i < flattenedPreferenceList.size(); i++) {
-                final Preference preference = flattenedPreferenceList.get(i);
-                if (preference instanceof PreferenceGroup || !preference.isVisible()) {
+            final List<PreferenceGroup> parents = new ArrayList<>();
+
+            for (Preference preference : collapsedPreferences) {
+                final CharSequence title = preference.getTitle();
+                if (preference instanceof PreferenceGroup && !TextUtils.isEmpty(title)) {
+                    parents.add((PreferenceGroup) preference);
+                }
+                if (parents.contains(preference.getParent())) {
+                    if (preference instanceof PreferenceGroup) {
+                        parents.add((PreferenceGroup) preference);
+                    }
                     continue;
                 }
-                final CharSequence title = preference.getTitle();
                 if (!TextUtils.isEmpty(title)) {
                     if (summary == null) {
                         summary = title;
@@ -189,38 +203,4 @@
         }
     }
 
-    /**
-     * A class for managing the instance state of a {@link PreferenceGroup}.
-     */
-    static class SavedState extends Preference.BaseSavedState {
-        int mMaxPreferenceToShow;
-
-        SavedState(Parcel source) {
-            super(source);
-            mMaxPreferenceToShow = source.readInt();
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            super.writeToParcel(dest, flags);
-            dest.writeInt(mMaxPreferenceToShow);
-        }
-
-        SavedState(Parcelable superState) {
-            super(superState);
-        }
-
-        public static final Parcelable.Creator<SavedState> CREATOR =
-                new Parcelable.Creator<SavedState>() {
-                    @Override
-                    public SavedState createFromParcel(Parcel in) {
-                        return new SavedState(in);
-                    }
-
-                    @Override
-                    public SavedState[] newArray(int size) {
-                        return new SavedState[size];
-                    }
-                };
-    }
-}
+}
\ No newline at end of file
diff --git a/preference/src/main/java/androidx/preference/PreferenceCategory.java b/preference/src/main/java/androidx/preference/PreferenceCategory.java
index 81c214a..3585bd9 100644
--- a/preference/src/main/java/androidx/preference/PreferenceCategory.java
+++ b/preference/src/main/java/androidx/preference/PreferenceCategory.java
@@ -17,10 +17,11 @@
 package androidx.preference;
 
 import android.content.Context;
+import android.util.AttributeSet;
+
 import androidx.core.content.res.TypedArrayUtils;
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat;
-import android.util.AttributeSet;
 
 /**
  * Used to group {@link Preference} objects and provide a disabled title above
@@ -55,16 +56,6 @@
     }
 
     @Override
-    protected boolean onPrepareAddPreference(Preference preference) {
-        if (preference instanceof PreferenceCategory) {
-            throw new IllegalArgumentException(
-                    "Cannot add a " + TAG + " directly to a " + TAG);
-        }
-
-        return super.onPrepareAddPreference(preference);
-    }
-
-    @Override
     public boolean isEnabled() {
         return false;
     }
diff --git a/preference/src/main/java/androidx/preference/PreferenceGroup.java b/preference/src/main/java/androidx/preference/PreferenceGroup.java
index 81b316b..88c5433 100644
--- a/preference/src/main/java/androidx/preference/PreferenceGroup.java
+++ b/preference/src/main/java/androidx/preference/PreferenceGroup.java
@@ -22,18 +22,19 @@
 import android.content.res.TypedArray;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Parcel;
 import android.os.Parcelable;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.VisibleForTesting;
-import androidx.core.content.res.TypedArrayUtils;
-import androidx.collection.SimpleArrayMap;
 import android.text.TextUtils;
 import android.util.AttributeSet;
+import android.util.Log;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import androidx.annotation.RestrictTo;
+import androidx.collection.SimpleArrayMap;
+import androidx.core.content.res.TypedArrayUtils;
 import androidx.recyclerview.widget.RecyclerView;
 
 /**
@@ -52,6 +53,8 @@
  * @attr name initialExpandedChildrenCount
  */
 public abstract class PreferenceGroup extends Preference {
+    private static final String TAG = "PreferenceGroup";
+
     /**
      * The container for child {@link Preference}s. This is sorted based on the
      * ordering, please use {@link #addPreference(Preference)} instead of adding
@@ -66,7 +69,6 @@
     private boolean mAttachedToHierarchy = false;
 
     private int mInitialExpandedChildrenCount = Integer.MAX_VALUE;
-    private PreferenceInstanceStateCallback mPreferenceInstanceStateCallback;
 
     private final SimpleArrayMap<String, Long> mIdRecycleCache = new SimpleArrayMap<>();
     private final Handler mHandler = new Handler();
@@ -92,9 +94,9 @@
                         R.styleable.PreferenceGroup_orderingFromXml, true);
 
         if (a.hasValue(R.styleable.PreferenceGroup_initialExpandedChildrenCount)) {
-            mInitialExpandedChildrenCount = TypedArrayUtils.getInt(
+            setInitialExpandedChildrenCount((TypedArrayUtils.getInt(
                     a, R.styleable.PreferenceGroup_initialExpandedChildrenCount,
-                            R.styleable.PreferenceGroup_initialExpandedChildrenCount, -1);
+                    R.styleable.PreferenceGroup_initialExpandedChildrenCount, Integer.MAX_VALUE)));
         }
         a.recycle();
     }
@@ -141,19 +143,26 @@
      * group will be counted.
      * By default, all children will be shown, so the default value of this attribute is equal to
      * Integer.MAX_VALUE.
+     * <p>
+     * Note: The group should have a key defined if an expandable preference is present to
+     * correctly persist state.
      *
      * @param expandedCount the number of children that is initially shown.
      *
      * @attr ref R.styleable#PreferenceGroup_initialExpandedChildrenCount
      */
     public void setInitialExpandedChildrenCount(int expandedCount) {
+        if (expandedCount != Integer.MAX_VALUE && !hasKey()) {
+            Log.e(TAG, this.getClass().getSimpleName()
+                    + " should have a key defined if it contains an expandable preference");
+        }
         mInitialExpandedChildrenCount = expandedCount;
     }
 
     /**
-     * Gets the maximal number of children that is initially shown.
+     * Gets the maximal number of children that are initially shown.
      *
-     * @return the maximal number of children that is initially shown.
+     * @return the maximal number of children that are initially shown.
      *
      * @attr ref R.styleable#PreferenceGroup_initialExpandedChildrenCount
      */
@@ -195,9 +204,20 @@
      */
     public boolean addPreference(Preference preference) {
         if (mPreferenceList.contains(preference)) {
-            // Exists
             return true;
         }
+        if (preference.getKey() != null) {
+            PreferenceGroup root = this;
+            while (root.getParent() != null) {
+                root = root.getParent();
+            }
+            final String key = preference.getKey();
+            if (root.findPreference(key) != null) {
+                Log.e(TAG, "Found duplicated key: \"" + key
+                        + "\". This can cause unintended behaviour,"
+                        + " please use unique keys for every preference.");
+            }
+        }
 
         if (preference.getOrder() == DEFAULT_ORDER) {
             if (mOrderingAsAdded) {
@@ -445,39 +465,22 @@
     @Override
     protected Parcelable onSaveInstanceState() {
         final Parcelable superState = super.onSaveInstanceState();
-        if (mPreferenceInstanceStateCallback != null) {
-            return mPreferenceInstanceStateCallback.saveInstanceState(superState);
-        }
-        return superState;
+        return new SavedState(superState, mInitialExpandedChildrenCount);
     }
 
     @Override
     protected void onRestoreInstanceState(Parcelable state) {
-        if (mPreferenceInstanceStateCallback != null) {
-            state = mPreferenceInstanceStateCallback.restoreInstanceState(state);
+        if (state == null || !state.getClass().equals(SavedState.class)) {
+            // Didn't save state for us in saveInstanceState
+            super.onRestoreInstanceState(state);
+            return;
         }
-        super.onRestoreInstanceState(state);
-    }
-
-    /**
-     * Sets the instance state callback.
-     *
-     * @param callback The callback.
-     * @see #onSaveInstanceState()
-     * @see #onRestoreInstanceState()
-     */
-    final void setPreferenceInstanceStateCallback(PreferenceInstanceStateCallback callback) {
-        mPreferenceInstanceStateCallback = callback;
-    }
-
-    /**
-     * Gets the instance state callback.
-     *
-     * @return the instance state callback.
-     */
-    @VisibleForTesting
-    final PreferenceInstanceStateCallback getPreferenceInstanceStateCallback() {
-        return mPreferenceInstanceStateCallback;
+        SavedState groupState = (SavedState) state;
+        if (mInitialExpandedChildrenCount != groupState.mInitialExpandedChildrenCount) {
+            mInitialExpandedChildrenCount = groupState.mInitialExpandedChildrenCount;
+            notifyHierarchyChanged();
+        }
+        super.onRestoreInstanceState(groupState.getSuperState());
     }
 
     /**
@@ -508,27 +511,39 @@
     }
 
     /**
-     * Interface for callback to implement so that they can save and restore the preference group's
-     * instance state.
+     * A class for managing the instance state of a {@link PreferenceGroup}.
      */
-    interface PreferenceInstanceStateCallback {
+    static class SavedState extends Preference.BaseSavedState {
 
-        /**
-         * Save the internal state that can later be used to create a new instance with that
-         * same state.
-         *
-         * @param state The Parcelable to save the current dynamic state.
-         */
-        Parcelable saveInstanceState(Parcelable state);
+        int mInitialExpandedChildrenCount;
 
-        /**
-         * Restore the previously saved state from the given parcelable.
-         *
-         * @param state The Parcelable that holds the previously saved state.
-         * @return the super state if data has been saved in the state in {@link saveInstanceState}
-         *         or state otherwise
-         */
-        Parcelable restoreInstanceState(Parcelable state);
+        SavedState(Parcel source) {
+            super(source);
+            mInitialExpandedChildrenCount = source.readInt();
+        }
+
+        SavedState(Parcelable superState, int initialExpandedChildrenCount) {
+            super(superState);
+            mInitialExpandedChildrenCount = initialExpandedChildrenCount;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            super.writeToParcel(dest, flags);
+            dest.writeInt(mInitialExpandedChildrenCount);
+        }
+
+        public static final Parcelable.Creator<SavedState> CREATOR =
+                new Parcelable.Creator<SavedState>() {
+                    @Override
+                    public SavedState createFromParcel(Parcel in) {
+                        return new SavedState(in);
+                    }
+
+                    @Override
+                    public SavedState[] newArray(int size) {
+                        return new SavedState[size];
+                    }
+                };
     }
-
 }
diff --git a/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java b/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java
index ad1e579..923558d 100644
--- a/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java
+++ b/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java
@@ -21,12 +21,6 @@
 import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.VisibleForTesting;
-import androidx.core.content.ContextCompat;
-import androidx.core.view.ViewCompat;
-import androidx.recyclerview.widget.DiffUtil;
-import androidx.recyclerview.widget.RecyclerView;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -35,6 +29,13 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.annotation.RestrictTo;
+import androidx.annotation.VisibleForTesting;
+import androidx.core.content.ContextCompat;
+import androidx.core.view.ViewCompat;
+import androidx.recyclerview.widget.DiffUtil;
+import androidx.recyclerview.widget.RecyclerView;
+
 /**
  * An adapter that connects a RecyclerView to the {@link Preference} objects contained in the
  * associated {@link PreferenceGroup}.
@@ -46,8 +47,6 @@
         implements Preference.OnPreferenceChangeInternalListener,
         PreferenceGroup.PreferencePositionCallback {
 
-    private static final String TAG = "PreferenceGroupAdapter";
-
     /**
      * The group that we are providing data from.
      */
@@ -86,16 +85,16 @@
     };
 
     private static class PreferenceLayout {
-        private int resId;
-        private int widgetResId;
-        private String name;
+        private int mResId;
+        private int mWidgetResId;
+        private String mName;
 
-        public PreferenceLayout() {}
+        PreferenceLayout() {}
 
-        public PreferenceLayout(PreferenceLayout other) {
-            resId = other.resId;
-            widgetResId = other.widgetResId;
-            name = other.name;
+        PreferenceLayout(PreferenceLayout other) {
+            mResId = other.mResId;
+            mWidgetResId = other.mWidgetResId;
+            mName = other.mName;
         }
 
         @Override
@@ -104,17 +103,17 @@
                 return false;
             }
             final PreferenceLayout other = (PreferenceLayout) o;
-            return resId == other.resId
-                    && widgetResId == other.widgetResId
-                    && TextUtils.equals(name, other.name);
+            return mResId == other.mResId
+                    && mWidgetResId == other.mWidgetResId
+                    && TextUtils.equals(mName, other.mName);
         }
 
         @Override
         public int hashCode() {
             int result = 17;
-            result = 31 * result + resId;
-            result = 31 * result + widgetResId;
-            result = 31 * result + name.hashCode();
+            result = 31 * result + mResId;
+            result = 31 * result + mWidgetResId;
+            result = 31 * result + mName.hashCode();
             return result;
         }
     }
@@ -160,7 +159,7 @@
         flattenPreferenceGroup(fullPreferenceList, mPreferenceGroup);
 
         final List<Preference> visiblePreferenceList =
-                mPreferenceGroupController.createVisiblePreferencesList(fullPreferenceList);
+                mPreferenceGroupController.createVisiblePreferencesList(mPreferenceGroup);
 
         final List<Preference> oldVisibleList = mPreferenceList;
         mPreferenceList = visiblePreferenceList;
@@ -235,10 +234,10 @@
      * different view types.
      */
     private PreferenceLayout createPreferenceLayout(Preference preference, PreferenceLayout in) {
-        PreferenceLayout pl = in != null? in : new PreferenceLayout();
-        pl.name = preference.getClass().getName();
-        pl.resId = preference.getLayoutResource();
-        pl.widgetResId = preference.getWidgetLayoutResource();
+        PreferenceLayout pl = in != null ? in : new PreferenceLayout();
+        pl.mName = preference.getClass().getName();
+        pl.mResId = preference.getLayoutResource();
+        pl.mWidgetResId = preference.getWidgetLayoutResource();
         return pl;
     }
 
@@ -353,15 +352,15 @@
         }
         a.recycle();
 
-        final View view = inflater.inflate(pl.resId, parent, false);
+        final View view = inflater.inflate(pl.mResId, parent, false);
         if (view.getBackground() == null) {
             ViewCompat.setBackground(view, background);
         }
 
         final ViewGroup widgetFrame = (ViewGroup) view.findViewById(android.R.id.widget_frame);
         if (widgetFrame != null) {
-            if (pl.widgetResId != 0) {
-                inflater.inflate(pl.widgetResId, widgetFrame);
+            if (pl.mWidgetResId != 0) {
+                inflater.inflate(pl.mWidgetResId, widgetFrame);
             } else {
                 widgetFrame.setVisibility(View.GONE);
             }
diff --git a/recyclerview-selection/build.gradle b/recyclerview-selection/build.gradle
index 5a314f6..e043acb 100644
--- a/recyclerview-selection/build.gradle
+++ b/recyclerview-selection/build.gradle
@@ -27,8 +27,8 @@
     api(project(":annotation"))
     api(project(":core"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     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(JUNIT)
diff --git a/settings.gradle b/settings.gradle
index e085cb9..c402bf3 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -41,7 +41,7 @@
 includeProject(":collection", "collection")
 includeProject(":coordinatorlayout", "coordinatorlayout")
 includeProject(":cursoradapter", "cursoradapter")
-includeProject(":browser", "customtabs")
+includeProject(":browser", "browser")
 includeProject(":customview", "customview")
 includeProject(":documentfile", "documentfile")
 includeProject(":drawerlayout", "drawerlayout")
@@ -60,7 +60,7 @@
 includeProject(":palette", "palette")
 includeProject(":percentlayout", "percent")
 includeProject(":preference", "preference")
-includeProject(":leanback-preference", "preference-leanback")
+includeProject(":leanback-preference", "leanback-preference")
 includeProject(":print", "print")
 includeProject(":recommendation", "recommendation")
 includeProject(":recyclerview", "v7/recyclerview")
@@ -77,7 +77,7 @@
 includeProject(":emoji-bundled", "emoji/bundled")
 includeProject(":emoji-appcompat", "emoji/appcompat")
 includeProject(":fragment", "fragment")
-includeProject(":media", "media-compat")
+includeProject(":media", "media")
 includeProject(":tvprovider", "tv-provider")
 includeProject(":vectordrawable", "graphics/drawable/static")
 includeProject(":swiperefreshlayout", "swiperefreshlayout")
@@ -142,11 +142,11 @@
 //
 /////////////////////////////
 
-includeProject(":support-media-compat-test-client", "media-compat/version-compat-tests/current/client")
-includeProject(":support-media-compat-test-client-previous", "media-compat/version-compat-tests/previous/client")
-includeProject(":support-media-compat-test-service", "media-compat/version-compat-tests/current/service")
-includeProject(":support-media-compat-test-service-previous", "media-compat/version-compat-tests/previous/service")
-includeProject(":support-media-compat-test-lib", "media-compat/version-compat-tests/lib")
+includeProject(":support-media-compat-test-client", "media/version-compat-tests/current/client")
+includeProject(":support-media-compat-test-client-previous", "media/version-compat-tests/previous/client")
+includeProject(":support-media-compat-test-service", "media/version-compat-tests/current/service")
+includeProject(":support-media-compat-test-service-previous", "media/version-compat-tests/previous/service")
+includeProject(":support-media-compat-test-lib", "media/version-compat-tests/lib")
 
 /////////////////////////////
 //
diff --git a/slices/core/build.gradle b/slices/core/build.gradle
index c01d7c3..7be7400 100644
--- a/slices/core/build.gradle
+++ b/slices/core/build.gradle
@@ -27,7 +27,7 @@
     implementation project(":annotation")
     implementation project(":appcompat")
 
-    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
     androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
 }
diff --git a/slices/view/build.gradle b/slices/view/build.gradle
index bc1f9f1..8653955 100644
--- a/slices/view/build.gradle
+++ b/slices/view/build.gradle
@@ -28,8 +28,8 @@
     implementation(project(":recyclerview"))
     api(ARCH_LIFECYCLE_LIVEDATA_CORE, libs.exclude_annotations_transitive)
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
 }
diff --git a/slices/view/src/main/java/androidx/slice/widget/GridRowView.java b/slices/view/src/main/java/androidx/slice/widget/GridRowView.java
index a0f7898..54302ba 100644
--- a/slices/view/src/main/java/androidx/slice/widget/GridRowView.java
+++ b/slices/view/src/main/java/androidx/slice/widget/GridRowView.java
@@ -215,7 +215,7 @@
         extraText.setText(getResources().getString(R.string.abc_slice_more_content, numExtra));
 
         // Make it clickable
-        EventInfo info = new EventInfo(getMode(), EventInfo.ACTION_TYPE_BUTTON,
+        EventInfo info = new EventInfo(getMode(), EventInfo.ACTION_TYPE_SEE_MORE,
                 EventInfo.ROW_TYPE_GRID, mRowIndex);
         info.setPosition(EventInfo.POSITION_CELL, index, total);
         Pair<SliceItem, EventInfo> tagItem = new Pair<>(seeMoreItem, info);
diff --git a/swiperefreshlayout/build.gradle b/swiperefreshlayout/build.gradle
index 58586a4..ab713e3 100644
--- a/swiperefreshlayout/build.gradle
+++ b/swiperefreshlayout/build.gradle
@@ -12,10 +12,10 @@
     api(project(":interpolator"))
 
     androidTestImplementation(JUNIT)
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(ESPRESSO_CONTRIB, libs.exclude_support)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(TEST_RULES_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CONTRIB_TMP, libs.exclude_for_espresso)
     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(':internal-testutils'), {
diff --git a/testutils/build.gradle b/testutils/build.gradle
index af0aa8b..e0c4139 100644
--- a/testutils/build.gradle
+++ b/testutils/build.gradle
@@ -24,8 +24,8 @@
     api(project(":fragment"))
     api(project(":appcompat"))
 
-    implementation(TEST_RUNNER)
-    implementation(ESPRESSO_CORE)
+    implementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    implementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     implementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     implementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     implementation(JUNIT)
diff --git a/textclassifier/build.gradle b/textclassifier/build.gradle
index f3d9a0f..fd654ee 100644
--- a/textclassifier/build.gradle
+++ b/textclassifier/build.gradle
@@ -12,8 +12,8 @@
     api(project(":collection"))
     api(project(":core"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
 }
 
 supportLibrary {
diff --git a/transition/build.gradle b/transition/build.gradle
index 9b67ad2..3e4e7d1 100644
--- a/transition/build.gradle
+++ b/transition/build.gradle
@@ -11,8 +11,8 @@
     api(project(":core"))
     compileOnly project(':fragment')
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     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(":legacy-support-v4"))
diff --git a/tv-provider/build.gradle b/tv-provider/build.gradle
index 955eacd..9fe5f93 100644
--- a/tv-provider/build.gradle
+++ b/tv-provider/build.gradle
@@ -10,8 +10,8 @@
     api(project(":annotation"))
     api(project(":core"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(TEST_RULES)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(TEST_RULES_TMP, libs.exclude_for_espresso)
     androidTestImplementation(MOCKITO_CORE)
 }
 
diff --git a/v7/appcompat/build.gradle b/v7/appcompat/build.gradle
index 37c9656..a2ca59a 100644
--- a/v7/appcompat/build.gradle
+++ b/v7/appcompat/build.gradle
@@ -17,8 +17,8 @@
     api(project(":vectordrawable"))
     api(project(":vectordrawable-animated"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     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(':internal-testutils'), {
diff --git a/v7/recyclerview/build.gradle b/v7/recyclerview/build.gradle
index a0e9f99..3e93b4e 100644
--- a/v7/recyclerview/build.gradle
+++ b/v7/recyclerview/build.gradle
@@ -12,8 +12,8 @@
     api(project(":core"))
     api(project(":legacy-support-core-ui"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     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(JUNIT)
@@ -22,7 +22,7 @@
 
     testImplementation(JUNIT)
     testImplementation(MOCKITO_CORE)
-    testImplementation(TEST_RUNNER)
+    testImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
 }
 
 android {
diff --git a/viewpager/build.gradle b/viewpager/build.gradle
index c30b168..02b45ba 100644
--- a/viewpager/build.gradle
+++ b/viewpager/build.gradle
@@ -11,8 +11,8 @@
     api(project(":core"))
     api(project(":customview"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
 }
diff --git a/viewpager2/build.gradle b/viewpager2/build.gradle
index a484619..42ea0c2 100644
--- a/viewpager2/build.gradle
+++ b/viewpager2/build.gradle
@@ -26,8 +26,8 @@
     api(project(":fragment"))
     api(project(":recyclerview"))
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
 }
 
 android {
diff --git a/wear/build.gradle b/wear/build.gradle
index 67adc0d..c70ebef 100644
--- a/wear/build.gradle
+++ b/wear/build.gradle
@@ -13,8 +13,8 @@
     api(project(":recyclerview"))
     api(CONSTRAINT_LAYOUT, { transitive = true })
 
-    androidTestImplementation(TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE_TMP, libs.exclude_for_espresso)
     androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
 
diff --git a/webkit/build.gradle b/webkit/build.gradle
index 0c0e9d1..06f3801 100644
--- a/webkit/build.gradle
+++ b/webkit/build.gradle
@@ -26,7 +26,7 @@
     api(project(":annotation"))
     api(project(':core'))
 
-    androidTestImplementation(TEST_RUNNER)
+    androidTestImplementation(TEST_RUNNER_TMP, libs.exclude_for_espresso)
 }
 
 ext {