Merge "Setup room-paging artifact" into androidx-main
diff --git a/.github/workflows/presubmit.yml b/.github/workflows/presubmit.yml
index 2bd8dca..b081506a 100644
--- a/.github/workflows/presubmit.yml
+++ b/.github/workflows/presubmit.yml
@@ -557,27 +557,6 @@
           wrapper-directory: ${{ env.project-root }}/gradle/wrapper
           wrapper-cache-enabled: true
 
-      - name: Set up Cloud SDK
-        uses: google-github-actions/setup-gcloud@master
-        if: ${{ github.repository == 'androidX/androidx' }}
-        with:
-          project_id: ${{ secrets.GCP_PROJECT_ID }}
-          service_account_key: ${{ secrets.GCP_SA_KEY }}
-          export_default_credentials: true
-      - name: "Run application tests on Firebase Test Lab"
-        uses: eskatos/gradle-command-action@v1
-        if: ${{ github.repository == 'androidX/androidx' }}
-        env:
-          JAVA_HOME: ${{ steps.setup-java.outputs.path }}
-        with:
-          arguments: firebaseTestLabTests ${{ needs.setup.outputs.gradlew_flags }}
-          build-root-directory: ${{ env.project-root }}
-          configuration-cache-enabled: true
-          dependencies-cache-enabled: true
-          gradle-executable: ${{ env.project-root }}/gradlew
-          wrapper-directory: ${{ env.project-root }}/gradle/wrapper
-          wrapper-cache-enabled: true
-
       - name: "upload build artifacts"
         continue-on-error: true
         if: always()
diff --git a/activity/activity-compose/build.gradle b/activity/activity-compose/build.gradle
index 20451ba..5b3d1b8 100644
--- a/activity/activity-compose/build.gradle
+++ b/activity/activity-compose/build.gradle
@@ -15,12 +15,8 @@
  */
 
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.Publish
 import androidx.build.RunApiTasks
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-import static androidx.build.dependencies.DependenciesKt.*
 
 plugins {
     id("AndroidXPlugin")
@@ -32,7 +28,7 @@
 dependencies {
     kotlinPlugin projectOrArtifact(":compose:compiler:compiler")
 
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
     api projectOrArtifact(":compose:runtime:runtime")
     api projectOrArtifact(":compose:runtime:runtime-saveable")
     api(projectOrArtifact(":activity:activity-ktx"))
@@ -42,10 +38,10 @@
     androidTestImplementation projectOrArtifact(":compose:material:material")
     androidTestImplementation projectOrArtifact(":compose:test-utils")
     androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.3.1")
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_EXT_KTX)
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(TRUTH)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testExtJunitKtx)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.truth)
 }
 
 androidx {
diff --git a/activity/activity-compose/integration-tests/activity-demos/build.gradle b/activity/activity-compose/integration-tests/activity-demos/build.gradle
index 82d727e..2928e80 100644
--- a/activity/activity-compose/integration-tests/activity-demos/build.gradle
+++ b/activity/activity-compose/integration-tests/activity-demos/build.gradle
@@ -14,11 +14,7 @@
  * limitations under the License.
  */
 
-
 import androidx.build.Publish
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-import static androidx.build.dependencies.DependenciesKt.getKOTLIN_STDLIB
 
 plugins {
     id("AndroidXPlugin")
@@ -29,7 +25,7 @@
 
 dependencies {
     kotlinPlugin projectOrArtifact(":compose:compiler:compiler")
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
     implementation projectOrArtifact(":activity:activity-compose")
     implementation projectOrArtifact(":activity:activity-compose:activity-compose-samples")
 }
diff --git a/activity/activity-compose/samples/build.gradle b/activity/activity-compose/samples/build.gradle
index 9c9f8ee..a02eac6 100644
--- a/activity/activity-compose/samples/build.gradle
+++ b/activity/activity-compose/samples/build.gradle
@@ -14,13 +14,8 @@
  * limitations under the License.
  */
 
-
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.LibraryType
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-import static androidx.build.dependencies.DependenciesKt.*
 
 plugins {
     id("AndroidXPlugin")
@@ -31,7 +26,7 @@
 
 dependencies {
     kotlinPlugin projectOrArtifact(":compose:compiler:compiler")
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
 
     compileOnly projectOrArtifact(":annotation:annotation-sampled")
     implementation projectOrArtifact(":compose:foundation:foundation")
diff --git a/activity/activity-ktx/build.gradle b/activity/activity-ktx/build.gradle
index 33394d1..a422909 100644
--- a/activity/activity-ktx/build.gradle
+++ b/activity/activity-ktx/build.gradle
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.Publish
 
 plugins {
@@ -37,15 +35,15 @@
     api("androidx.savedstate:savedstate-ktx:1.1.0") {
         because 'Mirror activity dependency graph for -ktx artifacts'
     }
-    api(KOTLIN_STDLIB)
+    api(libs.kotlinStdlib)
 
     androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.3.1")
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
     androidTestImplementation(project(":internal-testutils-runtime"), {
         exclude group: "androidx.activity", module: "activity"
     })
diff --git a/activity/activity-lint/build.gradle b/activity/activity-lint/build.gradle
index 7e37c76..5e00727 100644
--- a/activity/activity-lint/build.gradle
+++ b/activity/activity-lint/build.gradle
@@ -17,22 +17,20 @@
 import androidx.build.LibraryGroups
 import androidx.build.LibraryType
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("kotlin")
 }
 
 dependencies {
-    compileOnly(LINT_API_MIN)
-    compileOnly(KOTLIN_STDLIB)
+    compileOnly(libs.androidLintMinApi)
+    compileOnly(libs.kotlinStdlib)
 
-    testImplementation(KOTLIN_STDLIB)
-    testImplementation(LINT_CORE)
-    testImplementation(LINT_TESTS)
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
+    testImplementation(libs.kotlinStdlib)
+    testImplementation(libs.androidLint)
+    testImplementation(libs.androidLintTests)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
 }
 
 androidx {
diff --git a/activity/activity/build.gradle b/activity/activity/build.gradle
index fd9d259..a9d5187 100644
--- a/activity/activity/build.gradle
+++ b/activity/activity/build.gradle
@@ -1,8 +1,6 @@
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -26,14 +24,14 @@
     implementation("androidx.tracing:tracing:1.0.0")
 
     androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.3.1")
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(LEAKCANARY)
-    androidTestImplementation(LEAKCANARY_INSTRUMENTATION)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(TRUTH)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.leakcanary)
+    androidTestImplementation(libs.leakcanaryInstrumentation)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.truth)
     androidTestImplementation(project(":internal-testutils-runtime"), {
         exclude group: "androidx.activity", module: "activity"
     })
diff --git a/activity/integration-tests/testapp/build.gradle b/activity/integration-tests/testapp/build.gradle
index 11e5101..780dd7f 100644
--- a/activity/integration-tests/testapp/build.gradle
+++ b/activity/integration-tests/testapp/build.gradle
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.application")
@@ -33,12 +31,12 @@
 dependencies {
     implementation(project(":activity:activity-ktx"))
     implementation(projectOrArtifact(":lifecycle:lifecycle-runtime-ktx"))
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.espressoCore)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it's own MockMaker
 }
diff --git a/activity/integration-tests/testapp/lint-baseline.xml b/activity/integration-tests/testapp/lint-baseline.xml
index 6309299..42a176b 100644
--- a/activity/integration-tests/testapp/lint-baseline.xml
+++ b/activity/integration-tests/testapp/lint-baseline.xml
@@ -1,70 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
-    <issue
-        id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.Activity#enterPictureInPictureMode`"
-        errorLine1="            activity.enterPictureInPictureMode(PictureInPictureParams.Builder().build())"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/integration/testapp/PipActivity.kt"
-            line="92"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.PictureInPictureParams.Builder#build`"
-        errorLine1="            activity.enterPictureInPictureMode(PictureInPictureParams.Builder().build())"
-        errorLine2="                                                                                ~~~~~">
-        <location
-            file="src/main/java/androidx/activity/integration/testapp/PipActivity.kt"
-            line="92"
-            column="81"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 26 (current min is 14): `android.app.PictureInPictureParams.Builder()`"
-        errorLine1="            activity.enterPictureInPictureMode(PictureInPictureParams.Builder().build())"
-        errorLine2="                                                                      ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/integration/testapp/PipActivity.kt"
-            line="92"
-            column="71"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.activity.integration.testapp.PipActivity.Api26Impl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            activity.enterPictureInPictureMode(PictureInPictureParams.Builder().build())"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/integration/testapp/PipActivity.kt"
-            line="92"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.activity.integration.testapp.PipActivity.Api26Impl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            activity.enterPictureInPictureMode(PictureInPictureParams.Builder().build())"
-        errorLine2="                                                                      ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/integration/testapp/PipActivity.kt"
-            line="92"
-            column="71"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.activity.integration.testapp.PipActivity.Api26Impl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            activity.enterPictureInPictureMode(PictureInPictureParams.Builder().build())"
-        errorLine2="                                                                                ~~~~~">
-        <location
-            file="src/main/java/androidx/activity/integration/testapp/PipActivity.kt"
-            line="92"
-            column="81"/>
-    </issue>
-
 </issues>
diff --git a/ads/ads-identifier-benchmark/build.gradle b/ads/ads-identifier-benchmark/build.gradle
index 95e55d2..57fdb60a 100644
--- a/ads/ads-identifier-benchmark/build.gradle
+++ b/ads/ads-identifier-benchmark/build.gradle
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -29,11 +27,11 @@
     androidTestImplementation(project(":ads-identifier-provider"))
     androidTestImplementation(project(":ads-identifier-testing"))
     androidTestImplementation("androidx.work:work-runtime:2.2.0")
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy)
 }
diff --git a/ads/ads-identifier-common/build.gradle b/ads/ads-identifier-common/build.gradle
index 264dff2..e238beb 100644
--- a/ads/ads-identifier-common/build.gradle
+++ b/ads/ads-identifier-common/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
@@ -28,11 +27,11 @@
     api("androidx.annotation:annotation:1.1.0")
 
     testImplementation(project(":ads-identifier-testing"))
-    testImplementation(ANDROIDX_TEST_RUNNER)
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
-    testImplementation(MOCKITO_CORE)
-    testImplementation(ROBOLECTRIC)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
+    testImplementation(libs.mockitoCore)
+    testImplementation(libs.robolectric)
 }
 
 android {
diff --git a/ads/ads-identifier-common/lint-baseline.xml b/ads/ads-identifier-common/lint-baseline.xml
index 36b631b..fde8d29 100644
--- a/ads/ads-identifier-common/lint-baseline.xml
+++ b/ads/ads-identifier-common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="PrivateConstructorForUtilityClass"
diff --git a/ads/ads-identifier-provider/build.gradle b/ads/ads-identifier-provider/build.gradle
index f1039b5..bcba6a9 100644
--- a/ads/ads-identifier-provider/build.gradle
+++ b/ads/ads-identifier-provider/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
@@ -27,19 +26,19 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
     implementation("androidx.core:core:1.1.0")
-    implementation(AUTO_VALUE_ANNOTATIONS)
-    annotationProcessor(AUTO_VALUE)
+    implementation(libs.autoValueAnnotations)
+    annotationProcessor(libs.autoValue)
 
     implementation(project(":ads-identifier-common"))
 
     androidTestImplementation(project(":ads-identifier-testing"))
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy)
 }
 
 androidx {
diff --git a/ads/ads-identifier-provider/integration-tests/testapp/build.gradle b/ads/ads-identifier-provider/integration-tests/testapp/build.gradle
index fa4e4a6..c5bd590ca 100644
--- a/ads/ads-identifier-provider/integration-tests/testapp/build.gradle
+++ b/ads/ads-identifier-provider/integration-tests/testapp/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.application")
diff --git a/ads/ads-identifier-provider/integration-tests/testapp/lint-baseline.xml b/ads/ads-identifier-provider/integration-tests/testapp/lint-baseline.xml
index 5830381..6afbeb5 100644
--- a/ads/ads-identifier-provider/integration-tests/testapp/lint-baseline.xml
+++ b/ads/ads-identifier-provider/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/ads/ads-identifier-testing/build.gradle b/ads/ads-identifier-testing/build.gradle
index c54af2d..21e10e8 100644
--- a/ads/ads-identifier-testing/build.gradle
+++ b/ads/ads-identifier-testing/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -24,7 +21,7 @@
 dependencies {
     implementation(project(":ads-identifier-common"))
     api("androidx.annotation:annotation:1.1.0")
-    api(MOCKITO_CORE, excludes.bytebuddy)
+    api(libs.mockitoCore, excludes.bytebuddy)
 }
 
 android {
diff --git a/ads/ads-identifier/build.gradle b/ads/ads-identifier/build.gradle
index c844d83..b89c7f9 100644
--- a/ads/ads-identifier/build.gradle
+++ b/ads/ads-identifier/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
@@ -27,21 +26,21 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
     implementation("androidx.core:core:1.1.0")
-    implementation(AUTO_VALUE_ANNOTATIONS)
-    annotationProcessor(AUTO_VALUE)
-    api(GUAVA_LISTENABLE_FUTURE)
+    implementation(libs.autoValueAnnotations)
+    annotationProcessor(libs.autoValue)
+    api(libs.guavaListenableFuture)
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
 
     implementation(project(":ads-identifier-common"))
 
     androidTestImplementation(project(":ads-identifier-testing"))
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy)
 }
 
 androidx {
diff --git a/ads/ads-identifier/integration-tests/testapp/build.gradle b/ads/ads-identifier/integration-tests/testapp/build.gradle
index c0fd225..13723ea 100644
--- a/ads/ads-identifier/integration-tests/testapp/build.gradle
+++ b/ads/ads-identifier/integration-tests/testapp/build.gradle
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.application")
@@ -31,5 +29,5 @@
 dependencies {
     implementation(project(":ads-identifier"))
     implementation(project(":ads-identifier-common"))
-    implementation(GUAVA_ANDROID)
+    implementation(libs.guavaAndroid)
 }
diff --git a/ads/ads-identifier/integration-tests/testapp/lint-baseline.xml b/ads/ads-identifier/integration-tests/testapp/lint-baseline.xml
index 09c1c25..c90d548 100644
--- a/ads/ads-identifier/integration-tests/testapp/lint-baseline.xml
+++ b/ads/ads-identifier/integration-tests/testapp/lint-baseline.xml
@@ -1,16 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="RestrictedApi"
-        message="AdvertisingIdUtils can only be called from within the same library group (groupId=androidx.ads)"
-        errorLine1="                AdvertisingIdUtils.getAdvertisingIdProviderServices(getPackageManager());"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/ads/identifier/testapp/AdsIdentifierActivity.java"
-            line="110"
-            column="17"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/androidx-plugin/build.gradle b/androidx-plugin/build.gradle
index 8dafbe6..3b6650b 100644
--- a/androidx-plugin/build.gradle
+++ b/androidx-plugin/build.gradle
@@ -16,7 +16,6 @@
     dependencies {
         classpath(libs.androidGradlePlugin)
         classpath(libs.kotlinGradlePlugin)
-        classpath(libs.kgpLeakPatcher)
         classpath(libs.dokkaGradlePlugin)
     }
 }
diff --git a/androidx-plugin/gradle-plugin/build.gradle b/androidx-plugin/gradle-plugin/build.gradle
index b98e295..bdc1739 100644
--- a/androidx-plugin/gradle-plugin/build.gradle
+++ b/androidx-plugin/gradle-plugin/build.gradle
@@ -20,7 +20,6 @@
     implementation(libs.androidGradlePlugin)
     implementation(libs.dexMemberList)
     implementation(libs.kotlinGradlePlugin)
-    implementation(libs.kgpLeakPatcher)
     implementation(libs.kotlinPoet)
 
     implementation(libs.dokkaGradlePlugin)
diff --git a/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml b/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml
index 061025b..d8f1c56 100644
--- a/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml
+++ b/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ExperimentalAnnotationRetention"
diff --git a/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalDetector.kt b/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalDetector.kt
index faed43e..4f1e2fb 100644
--- a/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalDetector.kt
+++ b/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalDetector.kt
@@ -20,7 +20,6 @@
 
 import com.android.tools.lint.detector.api.AnnotationUsageType
 import com.android.tools.lint.detector.api.Category
-import com.android.tools.lint.detector.api.ConstantEvaluator
 import com.android.tools.lint.detector.api.Detector
 import com.android.tools.lint.detector.api.Implementation
 import com.android.tools.lint.detector.api.Issue
@@ -139,8 +138,10 @@
 
     @Suppress("SameParameterValue")
     private fun extractAttribute(annotation: UAnnotation, name: String): String? {
-        val expression = annotation.findAttributeValue(name) as? UReferenceExpression
-        return (ConstantEvaluator().evaluate(expression) as? PsiField)?.name
+        // Using findAttributeValue instead of findDeclaredAttributeValue allows default values.
+        return annotation.findAttributeValue(name)?.let { expression ->
+            ((expression as? UReferenceExpression)?.resolve() as? PsiField)?.name
+        }
     }
 
     /**
@@ -274,7 +275,7 @@
     attributeName: String,
     className: String
 ): Boolean {
-    val attributeValue = findAttributeValue(attributeName)
+    val attributeValue = findDeclaredAttributeValue(attributeName)
     if (attributeValue.getFullyQualifiedName(context) == className) {
         return true
     }
diff --git a/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/ExperimentalDetectorTest.kt b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/ExperimentalDetectorTest.kt
index a6a34fc..5d9ddcf 100644
--- a/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/ExperimentalDetectorTest.kt
+++ b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/ExperimentalDetectorTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("UnstableApiUsage")
+
 package androidx.annotation.experimental.lint
 
 import com.android.tools.lint.checks.infrastructure.TestFile
@@ -22,13 +24,10 @@
 import com.android.tools.lint.checks.infrastructure.TestFiles.kotlin
 import com.android.tools.lint.checks.infrastructure.TestLintResult
 import com.android.tools.lint.checks.infrastructure.TestLintTask.lint
-import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 
-@Suppress("UnstableApiUsage")
-@Ignore("b/187526328")
 @RunWith(JUnit4::class)
 class ExperimentalDetectorTest {
 
diff --git a/appcompat/appcompat-benchmark/build.gradle b/appcompat/appcompat-benchmark/build.gradle
index 1153708..341c82a 100644
--- a/appcompat/appcompat-benchmark/build.gradle
+++ b/appcompat/appcompat-benchmark/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import static androidx.build.dependencies.DependenciesKt.*
-import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 
 plugins {
     id("AndroidXPlugin")
@@ -27,9 +24,9 @@
 dependencies {
     androidTestImplementation(project(":appcompat:appcompat"))
     androidTestImplementation(project(":benchmark:benchmark-junit4"))
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(KOTLIN_STDLIB)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.kotlinStdlib)
 }
diff --git a/appcompat/appcompat-lint/build.gradle b/appcompat/appcompat-lint/build.gradle
index ca3e41d4..0a2edc8 100644
--- a/appcompat/appcompat-lint/build.gradle
+++ b/appcompat/appcompat-lint/build.gradle
@@ -18,8 +18,6 @@
 import androidx.build.LibraryType
 import androidx.build.LibraryVersions
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("kotlin")
@@ -27,13 +25,13 @@
 
 dependencies {
     // These checks are only compatible with the latest lint.
-    compileOnly(LINT_API_LATEST)
-    compileOnly(KOTLIN_STDLIB)
+    compileOnly(libs.androidLintApi)
+    compileOnly(libs.kotlinStdlib)
 
-    testImplementation(KOTLIN_STDLIB)
-    testImplementation(LINT_CORE)
-    testImplementation(LINT_TESTS)
-    testImplementation(JUNIT)
+    testImplementation(libs.kotlinStdlib)
+    testImplementation(libs.androidLint)
+    testImplementation(libs.androidLintTests)
+    testImplementation(libs.junit)
 }
 
 androidx {
diff --git a/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/BaseMethodDeprecationDetector.kt b/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/BaseMethodDeprecationDetector.kt
index 7b0bdca..0da98c8 100644
--- a/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/BaseMethodDeprecationDetector.kt
+++ b/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/BaseMethodDeprecationDetector.kt
@@ -16,8 +16,9 @@
 
 package androidx.appcompat
 
-import com.android.tools.lint.detector.api.Context
+import com.android.tools.lint.detector.api.Constraint
 import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Incident
 import com.android.tools.lint.detector.api.Issue
 import com.android.tools.lint.detector.api.JavaContext
 import com.android.tools.lint.detector.api.SourceCodeScanner
@@ -33,53 +34,13 @@
     vararg val conditions: DeprecationCondition
 ) : Detector(), SourceCodeScanner {
 
-    // Collect unique method names from all deprecation conditions defined in this detector
+    // Collect unique method names from all deprecation conditions defined in this detector.
     private val applicableMethods = conditions.map { it.methodLocation.methodName }.distinct()
 
     interface Predicate {
         fun matches(context: JavaContext, node: UCallExpression, method: PsiMethod): Boolean
     }
 
-    class ApiAtOrAbove(private val sdkLevel: Int) : Predicate {
-        override fun matches(
-            context: JavaContext,
-            node: UCallExpression,
-            method: PsiMethod
-        ): Boolean {
-            return context.getMinSdk() >= sdkLevel
-        }
-    }
-
-    class ApiAbove(private val sdkLevel: Int) : Predicate {
-        override fun matches(
-            context: JavaContext,
-            node: UCallExpression,
-            method: PsiMethod
-        ): Boolean {
-            return context.getMinSdk() > sdkLevel
-        }
-    }
-
-    class ApiAtOrBelow(private val sdkLevel: Int) : Predicate {
-        override fun matches(
-            context: JavaContext,
-            node: UCallExpression,
-            method: PsiMethod
-        ): Boolean {
-            return context.getMinSdk() <= sdkLevel
-        }
-    }
-
-    class ApiBelow(private val sdkLevel: Int) : Predicate {
-        override fun matches(
-            context: JavaContext,
-            node: UCallExpression,
-            method: PsiMethod
-        ): Boolean {
-            return context.getMinSdk() < sdkLevel
-        }
-    }
-
     class SubClassOf(private val superClass: String) : Predicate {
         override fun matches(
             context: JavaContext,
@@ -103,15 +64,15 @@
             method: PsiMethod
         ): Boolean {
             if (!context.evaluator.isMemberInClass(method, className)) {
-                // Method is not in the right class
+                // Method is not in the right class.
                 return false
             }
             if (method.name != methodName) {
-                // Method name does not match
+                // Method name does not match.
                 return false
             }
             if (!context.evaluator.methodMatches(method, className, true, *params)) {
-                // Method signature does not match
+                // Method signature does not match.
                 return false
             }
             return true
@@ -121,7 +82,8 @@
     class DeprecationCondition(
         val methodLocation: MethodLocation,
         val message: String,
-        private vararg val predicates: Predicate
+        private vararg val predicates: Predicate,
+        val constraint: Constraint? = null,
     ) : Predicate {
         override fun matches(
             context: JavaContext,
@@ -129,13 +91,13 @@
             method: PsiMethod
         ): Boolean {
             if (!methodLocation.matches(context, node, method)) {
-                // Method location does not match. The whole condition is not applicable
+                // Method location does not match. The whole condition is not applicable.
                 return false
             }
 
             for (predicate in predicates) {
                 if (!predicate.matches(context, node, method)) {
-                    // The predicate does not match. The whole condition is not applicable
+                    // The predicate does not match. The whole condition is not applicable.
                     return false
                 }
             }
@@ -145,33 +107,32 @@
 
     // Mark final so that extending classes are forced to only use the constructor-level
     // configuration APIs
-    final override fun getApplicableMethodNames(): List<String>? = applicableMethods
+    final override fun getApplicableMethodNames(): List<String> = applicableMethods
 
     // Mark final so that extending classes are forced to only use the constructor-level
-    // configuration APIs
+    // configuration APIs.
     final override fun visitMethodCall(
         context: JavaContext,
         node: UCallExpression,
         method: PsiMethod
     ) {
-        // Find the first condition that matches and report the issue
-        for (condition in conditions) {
+        // Find the first condition that matches and report the issue.
+        conditions.find { condition ->
             if (condition.matches(context, node, method)) {
-                context.report(issue, context.getLocation(node), condition.message)
-                return
-            }
-        }
-    }
-}
+                val incident = Incident(context)
+                    .issue(issue)
+                    .at(node)
+                    .message(condition.message)
+                condition.constraint?.let { constraint ->
+                    context.report(incident, constraint)
+                } ?: context.report(incident)
 
-// Copied from ApiDetector.kt
-@Suppress("UnstableApiUsage")
-fun Context.getMinSdk(): Int {
-    val useProject = if (isGlobalAnalysis()) mainProject else project
-    return if (!useProject.isAndroidProject) {
-        // Don't flag API checks in non-Android projects
-        Integer.MAX_VALUE
-    } else {
-        useProject.minSdkVersion.featureLevel
+                // We matched and we're not waiting on any constraints.
+                if (condition.constraint == null) {
+                    return@find true
+                }
+            }
+            return@find false
+        }
     }
 }
diff --git a/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/res/ColorStateListLoadingDetector.kt b/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/res/ColorStateListLoadingDetector.kt
index 2a5e4b0..35a4b49 100644
--- a/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/res/ColorStateListLoadingDetector.kt
+++ b/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/res/ColorStateListLoadingDetector.kt
@@ -23,6 +23,8 @@
 import com.android.tools.lint.detector.api.Issue
 import com.android.tools.lint.detector.api.Scope
 import com.android.tools.lint.detector.api.Severity
+import com.android.tools.lint.detector.api.minSdkAtLeast
+import com.android.tools.lint.detector.api.minSdkLessThan
 
 // Flags usage of Resources.getColorStateList and suggests converting it to either
 // ContextCompat.getColorStateList or AppCompatResources.getColorStateList based
@@ -30,17 +32,17 @@
 @Suppress("UnstableApiUsage")
 class ColorStateListLoadingDetector : BaseMethodDeprecationDetector(
     NOT_USING_COMPAT_LOADING,
-    // Suggest using ContextCompat.getColorStateList at API > 23
+    // Suggest using ContextCompat.getColorStateList at API >= 24
     DeprecationCondition(
         MethodLocation("android.content.res.Resources", "getColorStateList", TYPE_INT),
         "Use `ContextCompat.getColorStateList()`",
-        ApiAbove(23)
+        constraint = minSdkAtLeast(24),
     ),
-    // Suggest using AppCompatResources.getColorStateList at API <= 23
+    // Suggest using AppCompatResources.getColorStateList at API < 24
     DeprecationCondition(
         MethodLocation("android.content.res.Resources", "getColorStateList", TYPE_INT),
         "Use `AppCompatResources.getColorStateList()`",
-        ApiAtOrBelow(23)
+        constraint = minSdkLessThan(24),
     )
 ) {
     companion object {
diff --git a/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/view/OnClickXmlDetector.kt b/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/view/OnClickXmlDetector.kt
index c38c216..124c84f 100644
--- a/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/view/OnClickXmlDetector.kt
+++ b/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/view/OnClickXmlDetector.kt
@@ -16,14 +16,15 @@
 
 package androidx.appcompat.view
 
-import androidx.appcompat.getMinSdk
 import com.android.tools.lint.detector.api.Category
 import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Incident
 import com.android.tools.lint.detector.api.Issue
 import com.android.tools.lint.detector.api.LayoutDetector
 import com.android.tools.lint.detector.api.Scope
 import com.android.tools.lint.detector.api.Severity
 import com.android.tools.lint.detector.api.XmlContext
+import com.android.tools.lint.detector.api.minSdkLessThan
 import org.w3c.dom.Attr
 
 @Suppress("UnstableApiUsage")
@@ -40,7 +41,7 @@
         )
     }
 
-    override fun getApplicableAttributes(): Collection<String>? = listOf("onClick")
+    override fun getApplicableAttributes(): Collection<String> = listOf("onClick")
 
     override fun visitAttribute(context: XmlContext, attribute: Attr) {
         val onClickValue = attribute.value ?: return
@@ -49,14 +50,12 @@
             // versions
             return
         }
-        if (context.getMinSdk() < 23) {
-            // The resolution is not guaranteed to work on pre-23 versions of the platform
-            context.report(
-                USING_ON_CLICK_IN_XML,
-                attribute,
-                context.getLocation(attribute),
-                "Use databinding or explicit wiring of click listener in code"
-            )
-        }
+
+        // The resolution is not guaranteed to work on pre-23 versions of the platform
+        val incident = Incident(context)
+            .issue(USING_ON_CLICK_IN_XML)
+            .at(attribute)
+            .message("Use databinding or explicit wiring of click listener in code")
+        context.report(incident, minSdkLessThan(23))
     }
 }
diff --git a/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/res/ColorStateListLoadingDetectorTest.kt b/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/res/ColorStateListLoadingDetectorTest.kt
index e0057e7..d0d23c3 100644
--- a/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/res/ColorStateListLoadingDetectorTest.kt
+++ b/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/res/ColorStateListLoadingDetectorTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("UnstableApiUsage")
+
 package androidx.appcompat.lint.res
 
 import androidx.appcompat.lint.Stubs
@@ -21,7 +23,7 @@
 import com.android.tools.lint.checks.infrastructure.LintDetectorTest.kotlin
 import com.android.tools.lint.checks.infrastructure.LintDetectorTest.manifest
 import com.android.tools.lint.checks.infrastructure.TestLintTask.lint
-import org.junit.Ignore
+import com.android.tools.lint.checks.infrastructure.TestMode
 import org.junit.Test
 
 class ColorStateListLoadingDetectorTest {
@@ -59,11 +61,11 @@
             Stubs.COLOR_STATE_LIST,
             customActivity
         ).issues(ColorStateListLoadingDetector.NOT_USING_COMPAT_LOADING)
+            .addTestModes(TestMode.DEFAULT, TestMode.PARTIAL)
             .run()
             .expectClean()
     }
 
-    @Ignore("b/187524984")
     @Test
     fun testCoreGetColorStateListApi24() {
         val customActivity = kotlin(
@@ -111,6 +113,7 @@
             manifest,
             customActivity
         ).issues(ColorStateListLoadingDetector.NOT_USING_COMPAT_LOADING)
+            .addTestModes(TestMode.DEFAULT, TestMode.PARTIAL)
             .run()
             .expect(
                 """
@@ -123,7 +126,6 @@
         /* ktlint-enable max-line-length */
     }
 
-    @Ignore("b/187524984")
     @Test
     fun testCoreGetColorStateListApi14() {
         val customActivity = kotlin(
@@ -171,6 +173,7 @@
             manifest,
             customActivity
         ).issues(ColorStateListLoadingDetector.NOT_USING_COMPAT_LOADING)
+            .addTestModes(TestMode.DEFAULT, TestMode.PARTIAL)
             .run()
             .expect(
                 """
diff --git a/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/view/OnClickXmlDetectorTest.kt b/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/view/OnClickXmlDetectorTest.kt
index 844a48d..f6aadac 100644
--- a/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/view/OnClickXmlDetectorTest.kt
+++ b/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/view/OnClickXmlDetectorTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("UnstableApiUsage")
+
 package androidx.appcompat.lint.view
 
 import androidx.appcompat.lint.Stubs
@@ -22,7 +24,7 @@
 import com.android.tools.lint.checks.infrastructure.LintDetectorTest.kotlin
 import com.android.tools.lint.checks.infrastructure.LintDetectorTest.manifest
 import com.android.tools.lint.checks.infrastructure.TestLintTask.lint
-import org.junit.Ignore
+import com.android.tools.lint.checks.infrastructure.TestMode
 import org.junit.Test
 
 class OnClickXmlDetectorTest {
@@ -63,6 +65,7 @@
         """
         ).indented().within("res")
 
+        @Suppress("RedundantVisibilityModifier")
         val activityWithClick = kotlin(
             "com/example/CustomActivity.kt",
             """
@@ -86,7 +89,6 @@
         ).indented().within("src")
     }
 
-    @Ignore("b/187524984")
     @Test
     fun testCoreOnClickApi14() {
         // Manifest that sets min sdk to 14
@@ -118,6 +120,7 @@
             layoutWithCoreClick,
             activityWithClick
         ).issues(OnClickXmlDetector.USING_ON_CLICK_IN_XML)
+            .addTestModes(TestMode.DEFAULT, TestMode.PARTIAL)
             .run()
             .expect(
                 """
@@ -130,7 +133,6 @@
         /* ktlint-enable max-line-length */
     }
 
-    @Ignore("b/187524984")
     @Test
     fun testCoreOnClickApi23() {
         // Manifest that sets min sdk to 23
@@ -161,6 +163,7 @@
             layoutWithCoreClick,
             activityWithClick
         ).issues(OnClickXmlDetector.USING_ON_CLICK_IN_XML)
+            .addTestModes(TestMode.DEFAULT, TestMode.PARTIAL)
             .run()
             .expectClean()
     }
@@ -196,6 +199,7 @@
             layoutWithDataBindingClick,
             activityWithClick
         ).issues(OnClickXmlDetector.USING_ON_CLICK_IN_XML)
+            .addTestModes(TestMode.DEFAULT, TestMode.PARTIAL)
             .run()
             .expectClean()
     }
diff --git a/appcompat/appcompat-resources/build.gradle b/appcompat/appcompat-resources/build.gradle
index 7cc3642..01ba76b 100644
--- a/appcompat/appcompat-resources/build.gradle
+++ b/appcompat/appcompat-resources/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
@@ -31,14 +30,14 @@
     api("androidx.vectordrawable:vectordrawable:1.1.0")
     api("androidx.vectordrawable:vectordrawable-animated:1.1.0")
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.espressoCore, excludes.espresso)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(project(":internal-testutils-runtime"), {
         exclude group: "androidx.appcompat", module: "appcompat-resources"
     })
diff --git a/appcompat/appcompat-resources/lint-baseline.xml b/appcompat/appcompat-resources/lint-baseline.xml
index a543025..4982402 100644
--- a/appcompat/appcompat-resources/lint-baseline.xml
+++ b/appcompat/appcompat-resources/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
@@ -211,7 +211,8 @@
         <location
             file="src/main/java/androidx/appcompat/widget/TintContextWrapper.java"
             line="112"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
diff --git a/appcompat/appcompat/api/current.txt b/appcompat/appcompat/api/current.txt
index ad6a1ec..e1847bb 100644
--- a/appcompat/appcompat/api/current.txt
+++ b/appcompat/appcompat/api/current.txt
@@ -660,20 +660,20 @@
     method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
     method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
     method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
-    method public int getBaselineAlignedChildIndex();
-    method public android.graphics.drawable.Drawable! getDividerDrawable();
-    method public int getDividerPadding();
-    method public int getGravity();
-    method public int getOrientation();
-    method public int getShowDividers();
-    method public float getWeightSum();
-    method public boolean isBaselineAligned();
-    method public boolean isMeasureWithLargestChildEnabled();
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
+    method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+    method @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+    method @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+    method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
     method public void setBaselineAligned(boolean);
     method public void setBaselineAlignedChildIndex(int);
     method public void setDividerDrawable(android.graphics.drawable.Drawable!);
     method public void setDividerPadding(int);
-    method public void setGravity(int);
+    method public void setGravity(@GravityInt int);
     method public void setHorizontalGravity(int);
     method public void setMeasureWithLargestChildEnabled(boolean);
     method public void setOrientation(int);
@@ -788,13 +788,13 @@
     ctor public SearchView(android.content.Context);
     ctor public SearchView(android.content.Context, android.util.AttributeSet?);
     ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
-    method public int getImeOptions();
+    method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
     method public int getInputType();
-    method public int getMaxWidth();
+    method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
     method public CharSequence! getQuery();
-    method public CharSequence? getQueryHint();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
     method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
-    method public boolean isIconfiedByDefault();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
     method public boolean isIconified();
     method public boolean isQueryRefinementEnabled();
     method public boolean isSubmitButtonEnabled();
@@ -849,19 +849,19 @@
     ctor public SwitchCompat(android.content.Context);
     ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
     ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
-    method public boolean getShowText();
-    method public boolean getSplitTrack();
-    method public int getSwitchMinWidth();
-    method public int getSwitchPadding();
-    method public CharSequence! getTextOff();
-    method public CharSequence! getTextOn();
-    method public android.graphics.drawable.Drawable! getThumbDrawable();
-    method public int getThumbTextPadding();
-    method public android.content.res.ColorStateList? getThumbTintList();
-    method public android.graphics.PorterDuff.Mode? getThumbTintMode();
-    method public android.graphics.drawable.Drawable! getTrackDrawable();
-    method public android.content.res.ColorStateList? getTrackTintList();
-    method public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+    method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
     method public boolean isEmojiCompatEnabled();
     method public void onMeasure(int, int);
     method public void setEmojiCompatEnabled(boolean);
@@ -906,31 +906,31 @@
     method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
     method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
     method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
-    method public CharSequence? getCollapseContentDescription();
-    method public android.graphics.drawable.Drawable? getCollapseIcon();
-    method public int getContentInsetEnd();
-    method public int getContentInsetEndWithActions();
-    method public int getContentInsetLeft();
-    method public int getContentInsetRight();
-    method public int getContentInsetStart();
-    method public int getContentInsetStartWithNavigation();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
     method public int getCurrentContentInsetEnd();
     method public int getCurrentContentInsetLeft();
     method public int getCurrentContentInsetRight();
     method public int getCurrentContentInsetStart();
-    method public android.graphics.drawable.Drawable! getLogo();
-    method public CharSequence! getLogoDescription();
-    method public android.view.Menu! getMenu();
-    method public CharSequence? getNavigationContentDescription();
-    method public android.graphics.drawable.Drawable? getNavigationIcon();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
     method public android.graphics.drawable.Drawable? getOverflowIcon();
-    method public int getPopupTheme();
-    method public CharSequence! getSubtitle();
-    method public CharSequence! getTitle();
-    method public int getTitleMarginBottom();
-    method public int getTitleMarginEnd();
-    method public int getTitleMarginStart();
-    method public int getTitleMarginTop();
+    method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
     method public boolean hasExpandedActionView();
     method public boolean hideOverflowMenu();
     method public void inflateMenu(@MenuRes int);
diff --git a/appcompat/appcompat/api/public_plus_experimental_current.txt b/appcompat/appcompat/api/public_plus_experimental_current.txt
index 83b6b2f..cc92740d 100644
--- a/appcompat/appcompat/api/public_plus_experimental_current.txt
+++ b/appcompat/appcompat/api/public_plus_experimental_current.txt
@@ -460,7 +460,7 @@
     method public boolean onMenuItemClick(android.view.MenuItem!);
   }
 
-  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
     ctor public AppCompatAutoCompleteTextView(android.content.Context);
     ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
@@ -472,7 +472,7 @@
     method public void setTextAppearance(android.content.Context!, int);
   }
 
-  public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
     ctor public AppCompatButton(android.content.Context);
     ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
@@ -493,7 +493,7 @@
     method public void setTextAppearance(android.content.Context!, int);
   }
 
-  public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
     ctor public AppCompatCheckBox(android.content.Context);
     ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
@@ -508,7 +508,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
   }
 
-  public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCheckedTextView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCheckedTextView {
     ctor public AppCompatCheckedTextView(android.content.Context);
     ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
@@ -526,7 +526,7 @@
     method public void setTextAppearance(android.content.Context, int);
   }
 
-  public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView {
     ctor public AppCompatEditText(android.content.Context);
     ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
@@ -541,7 +541,7 @@
     method public void setTextAppearance(android.content.Context!, int);
   }
 
-  public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
     ctor public AppCompatImageButton(android.content.Context);
     ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
@@ -556,7 +556,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
   }
 
-  public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
     ctor public AppCompatImageView(android.content.Context);
     ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
@@ -571,7 +571,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
   }
 
-  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
     ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
     ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
@@ -583,7 +583,7 @@
     method public void setTextAppearance(android.content.Context!, int);
   }
 
-  public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
     ctor public AppCompatRadioButton(android.content.Context!);
     ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
     ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
@@ -610,7 +610,7 @@
     ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
   }
 
-  public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
     ctor public AppCompatSpinner(android.content.Context);
     ctor public AppCompatSpinner(android.content.Context, int);
     ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
@@ -624,7 +624,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
   }
 
-  public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
     ctor public AppCompatTextView(android.content.Context);
     ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
@@ -648,7 +648,7 @@
     method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
   }
 
-  public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
     ctor public AppCompatToggleButton(android.content.Context);
     ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
@@ -672,20 +672,20 @@
     method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
     method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
     method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
-    method public int getBaselineAlignedChildIndex();
-    method public android.graphics.drawable.Drawable! getDividerDrawable();
-    method public int getDividerPadding();
-    method public int getGravity();
-    method public int getOrientation();
-    method public int getShowDividers();
-    method public float getWeightSum();
-    method public boolean isBaselineAligned();
-    method public boolean isMeasureWithLargestChildEnabled();
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
+    method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+    method @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+    method @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+    method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
     method public void setBaselineAligned(boolean);
     method public void setBaselineAlignedChildIndex(int);
     method public void setDividerDrawable(android.graphics.drawable.Drawable!);
     method public void setDividerPadding(int);
-    method public void setGravity(int);
+    method public void setGravity(@GravityInt int);
     method public void setHorizontalGravity(int);
     method public void setMeasureWithLargestChildEnabled(boolean);
     method public void setOrientation(int);
@@ -800,13 +800,13 @@
     ctor public SearchView(android.content.Context);
     ctor public SearchView(android.content.Context, android.util.AttributeSet?);
     ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
-    method public int getImeOptions();
+    method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
     method public int getInputType();
-    method public int getMaxWidth();
+    method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
     method public CharSequence! getQuery();
-    method public CharSequence? getQueryHint();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
     method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
-    method public boolean isIconfiedByDefault();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
     method public boolean isIconified();
     method public boolean isQueryRefinementEnabled();
     method public boolean isSubmitButtonEnabled();
@@ -861,19 +861,19 @@
     ctor public SwitchCompat(android.content.Context);
     ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
     ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
-    method public boolean getShowText();
-    method public boolean getSplitTrack();
-    method public int getSwitchMinWidth();
-    method public int getSwitchPadding();
-    method public CharSequence! getTextOff();
-    method public CharSequence! getTextOn();
-    method public android.graphics.drawable.Drawable! getThumbDrawable();
-    method public int getThumbTextPadding();
-    method public android.content.res.ColorStateList? getThumbTintList();
-    method public android.graphics.PorterDuff.Mode? getThumbTintMode();
-    method public android.graphics.drawable.Drawable! getTrackDrawable();
-    method public android.content.res.ColorStateList? getTrackTintList();
-    method public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+    method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
     method public boolean isEmojiCompatEnabled();
     method public void onMeasure(int, int);
     method public void setEmojiCompatEnabled(boolean);
@@ -918,31 +918,31 @@
     method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
     method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
     method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
-    method public CharSequence? getCollapseContentDescription();
-    method public android.graphics.drawable.Drawable? getCollapseIcon();
-    method public int getContentInsetEnd();
-    method public int getContentInsetEndWithActions();
-    method public int getContentInsetLeft();
-    method public int getContentInsetRight();
-    method public int getContentInsetStart();
-    method public int getContentInsetStartWithNavigation();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
     method public int getCurrentContentInsetEnd();
     method public int getCurrentContentInsetLeft();
     method public int getCurrentContentInsetRight();
     method public int getCurrentContentInsetStart();
-    method public android.graphics.drawable.Drawable! getLogo();
-    method public CharSequence! getLogoDescription();
-    method public android.view.Menu! getMenu();
-    method public CharSequence? getNavigationContentDescription();
-    method public android.graphics.drawable.Drawable? getNavigationIcon();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
     method public android.graphics.drawable.Drawable? getOverflowIcon();
-    method public int getPopupTheme();
-    method public CharSequence! getSubtitle();
-    method public CharSequence! getTitle();
-    method public int getTitleMarginBottom();
-    method public int getTitleMarginEnd();
-    method public int getTitleMarginStart();
-    method public int getTitleMarginTop();
+    method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
     method public boolean hasExpandedActionView();
     method public boolean hideOverflowMenu();
     method public void inflateMenu(@MenuRes int);
diff --git a/appcompat/appcompat/api/restricted_current.txt b/appcompat/appcompat/api/restricted_current.txt
index 82d0cda..7fa4fdb 100644
--- a/appcompat/appcompat/api/restricted_current.txt
+++ b/appcompat/appcompat/api/restricted_current.txt
@@ -1328,7 +1328,7 @@
     ctor public AlertDialogLayout(android.content.Context?, android.util.AttributeSet?);
   }
 
-  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
     ctor public AppCompatAutoCompleteTextView(android.content.Context);
     ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
@@ -1340,7 +1340,7 @@
     method public void setTextAppearance(android.content.Context!, int);
   }
 
-  public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
     ctor public AppCompatButton(android.content.Context);
     ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
@@ -1361,7 +1361,7 @@
     method public void setTextAppearance(android.content.Context!, int);
   }
 
-  public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
     ctor public AppCompatCheckBox(android.content.Context);
     ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
@@ -1376,7 +1376,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
   }
 
-  public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCheckedTextView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCheckedTextView {
     ctor public AppCompatCheckedTextView(android.content.Context);
     ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
@@ -1403,7 +1403,7 @@
     method public static void preload();
   }
 
-  public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView {
     ctor public AppCompatEditText(android.content.Context);
     ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
@@ -1418,7 +1418,7 @@
     method public void setTextAppearance(android.content.Context!, int);
   }
 
-  public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
     ctor public AppCompatImageButton(android.content.Context);
     ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
@@ -1439,7 +1439,7 @@
     method public void setImageResource(int);
   }
 
-  public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
     ctor public AppCompatImageView(android.content.Context);
     ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
@@ -1454,7 +1454,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
   }
 
-  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
     ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
     ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
@@ -1466,7 +1466,7 @@
     method public void setTextAppearance(android.content.Context!, int);
   }
 
-  public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
     ctor public AppCompatRadioButton(android.content.Context!);
     ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
     ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
@@ -1493,7 +1493,7 @@
     ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
   }
 
-  public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
     ctor public AppCompatSpinner(android.content.Context);
     ctor public AppCompatSpinner(android.content.Context, int);
     ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
@@ -1507,7 +1507,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
   }
 
-  public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
     ctor public AppCompatTextView(android.content.Context);
     ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
@@ -1531,7 +1531,7 @@
     method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
   }
 
-  public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
     ctor public AppCompatToggleButton(android.content.Context);
     ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
@@ -1681,21 +1681,21 @@
     method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
     method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
     method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
-    method public int getBaselineAlignedChildIndex();
-    method public android.graphics.drawable.Drawable! getDividerDrawable();
-    method public int getDividerPadding();
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getDividerWidth();
-    method public int getGravity();
-    method @androidx.appcompat.widget.LinearLayoutCompat.OrientationMode public int getOrientation();
-    method @androidx.appcompat.widget.LinearLayoutCompat.DividerMode public int getShowDividers();
-    method public float getWeightSum();
-    method public boolean isBaselineAligned();
-    method public boolean isMeasureWithLargestChildEnabled();
+    method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+    method @androidx.appcompat.widget.LinearLayoutCompat.OrientationMode @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+    method @androidx.appcompat.widget.LinearLayoutCompat.DividerMode @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+    method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
     method public void setBaselineAligned(boolean);
     method public void setBaselineAlignedChildIndex(int);
     method public void setDividerDrawable(android.graphics.drawable.Drawable!);
     method public void setDividerPadding(int);
-    method public void setGravity(int);
+    method public void setGravity(@GravityInt int);
     method public void setHorizontalGravity(int);
     method public void setMeasureWithLargestChildEnabled(boolean);
     method public void setOrientation(@androidx.appcompat.widget.LinearLayoutCompat.OrientationMode int);
@@ -1872,13 +1872,13 @@
     ctor public SearchView(android.content.Context);
     ctor public SearchView(android.content.Context, android.util.AttributeSet?);
     ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
-    method public int getImeOptions();
+    method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
     method public int getInputType();
-    method public int getMaxWidth();
+    method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
     method public CharSequence! getQuery();
-    method public CharSequence? getQueryHint();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
     method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
-    method public boolean isIconfiedByDefault();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
     method public boolean isIconified();
     method public boolean isQueryRefinementEnabled();
     method public boolean isSubmitButtonEnabled();
@@ -1940,19 +1940,19 @@
     ctor public SwitchCompat(android.content.Context);
     ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
     ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
-    method public boolean getShowText();
-    method public boolean getSplitTrack();
-    method public int getSwitchMinWidth();
-    method public int getSwitchPadding();
-    method public CharSequence! getTextOff();
-    method public CharSequence! getTextOn();
-    method public android.graphics.drawable.Drawable! getThumbDrawable();
-    method public int getThumbTextPadding();
-    method public android.content.res.ColorStateList? getThumbTintList();
-    method public android.graphics.PorterDuff.Mode? getThumbTintMode();
-    method public android.graphics.drawable.Drawable! getTrackDrawable();
-    method public android.content.res.ColorStateList? getTrackTintList();
-    method public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+    method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
     method public boolean isEmojiCompatEnabled();
     method public void onMeasure(int, int);
     method public void setEmojiCompatEnabled(boolean);
@@ -2036,31 +2036,31 @@
     method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
     method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
     method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
-    method public CharSequence? getCollapseContentDescription();
-    method public android.graphics.drawable.Drawable? getCollapseIcon();
-    method public int getContentInsetEnd();
-    method public int getContentInsetEndWithActions();
-    method public int getContentInsetLeft();
-    method public int getContentInsetRight();
-    method public int getContentInsetStart();
-    method public int getContentInsetStartWithNavigation();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
     method public int getCurrentContentInsetEnd();
     method public int getCurrentContentInsetLeft();
     method public int getCurrentContentInsetRight();
     method public int getCurrentContentInsetStart();
-    method public android.graphics.drawable.Drawable! getLogo();
-    method public CharSequence! getLogoDescription();
-    method public android.view.Menu! getMenu();
-    method public CharSequence? getNavigationContentDescription();
-    method public android.graphics.drawable.Drawable? getNavigationIcon();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
     method public android.graphics.drawable.Drawable? getOverflowIcon();
-    method public int getPopupTheme();
-    method public CharSequence! getSubtitle();
-    method public CharSequence! getTitle();
-    method public int getTitleMarginBottom();
-    method public int getTitleMarginEnd();
-    method public int getTitleMarginStart();
-    method public int getTitleMarginTop();
+    method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.widget.DecorToolbar! getWrapper();
     method public boolean hasExpandedActionView();
     method public boolean hideOverflowMenu();
diff --git a/appcompat/appcompat/build.gradle b/appcompat/appcompat/build.gradle
index 546496f..cc71ddc 100644
--- a/appcompat/appcompat/build.gradle
+++ b/appcompat/appcompat/build.gradle
@@ -1,4 +1,3 @@
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
@@ -7,10 +6,11 @@
     id("AndroidXPlugin")
     id("com.android.library")
     id("kotlin-android")
+    id("kotlin-kapt")
 }
 
 dependencies {
-    api("androidx.annotation:annotation:1.1.0")
+    api("androidx.annotation:annotation:1.3.0-alpha01")
 
     api(project(":core:core"))
     implementation(project(":emoji2:emoji2"))
@@ -23,30 +23,32 @@
     api("androidx.drawerlayout:drawerlayout:1.0.0")
     implementation("androidx.lifecycle:lifecycle-runtime:2.3.1")
     implementation("androidx.lifecycle:lifecycle-viewmodel:2.3.1")
+    implementation(project(":resourceinspection:resourceinspection-annotation"))
     api("androidx.savedstate:savedstate:1.1.0")
 
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    kapt(project(":resourceinspection:resourceinspection-processor"))
+
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testUiautomator)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.espressoCore, excludes.espresso)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation(project(":internal-testutils-appcompat"), {
         exclude group: "androidx.appcompat", module: "appcompat"
         exclude group: "androidx.core", module: "core"
     })
-    androidTestImplementation(MULTIDEX)
+    androidTestImplementation(libs.multidex)
 
-    testImplementation(KOTLIN_STDLIB)
-    testImplementation(ANDROIDX_TEST_CORE)
-    testImplementation(JUNIT)
-    testImplementation(ROBOLECTRIC)
+    testImplementation(libs.kotlinStdlib)
+    testImplementation(libs.testCore)
+    testImplementation(libs.junit)
+    testImplementation(libs.robolectric)
 
-    // Uncomment once we want to start publishing the lint rules.
     lintPublish project(":appcompat:appcompat-lint")
 }
 
diff --git a/appcompat/appcompat/lint-baseline.xml b/appcompat/appcompat/lint-baseline.xml
index 797bc33..9775b50 100644
--- a/appcompat/appcompat/lint-baseline.xml
+++ b/appcompat/appcompat/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
@@ -1009,7 +1009,7 @@
         errorLine2="                              ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="1063"
+            line="1116"
             column="31"/>
     </issue>
 
@@ -1102,7 +1102,8 @@
         <location
             file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
             line="228"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -1128,7 +1129,8 @@
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
             line="182"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -1143,7 +1145,8 @@
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
             line="296"
-            column="26"/>
+            column="26"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -1158,7 +1161,8 @@
         <location
             file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
             line="130"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -1217,7 +1221,8 @@
         <location
             file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
             line="427"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -5425,17 +5430,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public &lt;T extends View> T findViewById(@IdRes int id) {"
-        errorLine2="                            ~">
-        <location
-            file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
-            line="258"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    protected void onTitleChanged(CharSequence title, int color) {"
         errorLine2="                                  ~~~~~~~~~~~~">
         <location
@@ -5528,7 +5522,7 @@
         errorLine2="                                  ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatButton.java"
-            line="171"
+            line="177"
             column="35"/>
     </issue>
 
@@ -5539,7 +5533,7 @@
         errorLine2="                                               ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatButton.java"
-            line="179"
+            line="185"
             column="48"/>
     </issue>
 
@@ -5550,7 +5544,7 @@
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatButton.java"
-            line="185"
+            line="191"
             column="51"/>
     </issue>
 
@@ -5561,7 +5555,7 @@
         errorLine2="                                 ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatButton.java"
-            line="210"
+            line="216"
             column="34"/>
     </issue>
 
@@ -5572,7 +5566,7 @@
         errorLine2="           ~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatButton.java"
-            line="344"
+            line="350"
             column="12"/>
     </issue>
 
@@ -6001,29 +5995,18 @@
         errorLine2="                                  ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatEditText.java"
-            line="207"
+            line="213"
             column="35"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {"
-        errorLine2="                                                   ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/widget/AppCompatEditText.java"
-            line="222"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public boolean onDragEvent(@SuppressWarnings(&quot;MissingNullability&quot;) DragEvent event) {"
         errorLine2="                                                                       ~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatEditText.java"
-            line="285"
+            line="291"
             column="72"/>
     </issue>
 
@@ -6276,7 +6259,7 @@
         errorLine2="                                 ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"
-            line="286"
+            line="267"
             column="34"/>
     </issue>
 
@@ -6287,7 +6270,7 @@
         errorLine2="           ~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"
-            line="447"
+            line="428"
             column="12"/>
     </issue>
 
@@ -6298,7 +6281,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"
-            line="459"
+            line="440"
             column="12"/>
     </issue>
 
@@ -6309,7 +6292,7 @@
         errorLine2="                                                   ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"
-            line="459"
+            line="440"
             column="52"/>
     </issue>
 
@@ -6320,7 +6303,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"
-            line="567"
+            line="548"
             column="12"/>
     </issue>
 
@@ -11919,7 +11902,7 @@
         errorLine2="                                        ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="324"
+            line="339"
             column="41"/>
     </issue>
 
@@ -11930,7 +11913,7 @@
         errorLine2="                                  ~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="388"
+            line="406"
             column="35"/>
     </issue>
 
@@ -11941,7 +11924,7 @@
         errorLine2="                                  ~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="416"
+            line="434"
             column="35"/>
     </issue>
 
@@ -11952,7 +11935,7 @@
         errorLine2="                                 ~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="504"
+            line="522"
             column="34"/>
     </issue>
 
@@ -11963,7 +11946,7 @@
         errorLine2="           ~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="533"
+            line="551"
             column="12"/>
     </issue>
 
@@ -11974,7 +11957,7 @@
         errorLine2="                                 ~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="623"
+            line="641"
             column="34"/>
     </issue>
 
@@ -11985,7 +11968,7 @@
         errorLine2="           ~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="654"
+            line="672"
             column="12"/>
     </issue>
 
@@ -11996,7 +11979,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="766"
+            line="784"
             column="12"/>
     </issue>
 
@@ -12007,7 +11990,7 @@
         errorLine2="                          ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="775"
+            line="807"
             column="27"/>
     </issue>
 
@@ -12018,7 +12001,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="790"
+            line="822"
             column="12"/>
     </issue>
 
@@ -12029,7 +12012,7 @@
         errorLine2="                           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="799"
+            line="844"
             column="28"/>
     </issue>
 
@@ -12040,7 +12023,7 @@
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="899"
+            line="956"
             column="46"/>
     </issue>
 
@@ -12051,7 +12034,7 @@
         errorLine2="                                ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="940"
+            line="993"
             column="33"/>
     </issue>
 
@@ -12062,7 +12045,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="1173"
+            line="1226"
             column="22"/>
     </issue>
 
@@ -12073,7 +12056,7 @@
         errorLine2="                          ~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="1238"
+            line="1291"
             column="27"/>
     </issue>
 
@@ -12084,7 +12067,7 @@
         errorLine2="              ~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="1362"
+            line="1415"
             column="15"/>
     </issue>
 
@@ -12095,7 +12078,7 @@
         errorLine2="                                     ~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="1408"
+            line="1461"
             column="38"/>
     </issue>
 
@@ -12106,7 +12089,7 @@
         errorLine2="                                               ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="1431"
+            line="1484"
             column="48"/>
     </issue>
 
@@ -12117,7 +12100,7 @@
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="1437"
+            line="1490"
             column="51"/>
     </issue>
 
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/Orientation.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/Orientation.kt
new file mode 100644
index 0000000..c9461c5
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/Orientation.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.appcompat
+
+import androidx.test.uiautomator.UiDevice
+
+public enum class Orientation { LEFT, RIGHT }
+
+public fun UiDevice.withOrientation(orientation: Orientation, doThis: () -> Unit) {
+    when (orientation) {
+        Orientation.LEFT -> setOrientationLeft()
+        Orientation.RIGHT -> setOrientationRight()
+    }
+
+    try {
+        doThis()
+    } finally {
+        setOrientationNatural()
+    }
+}
\ No newline at end of file
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LayoutInflaterFactoryTestCase.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LayoutInflaterFactoryTestCase.java
index 15d4194..8b17ada 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LayoutInflaterFactoryTestCase.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LayoutInflaterFactoryTestCase.java
@@ -43,7 +43,6 @@
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
-import androidx.test.rule.ActivityTestRule;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -52,9 +51,11 @@
 
 @RunWith(AndroidJUnit4.class)
 public class LayoutInflaterFactoryTestCase {
+
+    @SuppressWarnings("deprecation")
     @Rule
-    public final ActivityTestRule<LayoutInflaterFactoryTestActivity> mActivityTestRule =
-            new ActivityTestRule<>(LayoutInflaterFactoryTestActivity.class);
+    public final androidx.test.rule.ActivityTestRule<LayoutInflaterFactoryTestActivity> mTestRule =
+            new androidx.test.rule.ActivityTestRule<>(LayoutInflaterFactoryTestActivity.class);
 
     @Before
     public void setup() {
@@ -66,7 +67,7 @@
     @Test
     @SmallTest
     public void testAndroidThemeInflation() {
-        final LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
+        final LayoutInflater inflater = LayoutInflater.from(mTestRule.getActivity());
         assertThemedContext(inflater.inflate(R.layout.layout_android_theme, null));
     }
 
@@ -74,7 +75,7 @@
     @Test
     @SmallTest
     public void testAppThemeInflation() {
-        final LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
+        final LayoutInflater inflater = LayoutInflater.from(mTestRule.getActivity());
         assertThemedContext(inflater.inflate(R.layout.layout_app_theme, null));
     }
 
@@ -83,7 +84,7 @@
     @Test
     @SmallTest
     public void testAndroidThemeWithChildrenInflation() {
-        LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
+        LayoutInflater inflater = LayoutInflater.from(mTestRule.getActivity());
         final ViewGroup root = (ViewGroup) inflater.inflate(
                 R.layout.layout_android_theme_children, null);
         assertThemedContext(root);
@@ -93,7 +94,7 @@
     @Test
     @SmallTest
     public void testAndroidThemeWithIncludeInflation() {
-        LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
+        LayoutInflater inflater = LayoutInflater.from(mTestRule.getActivity());
         final ViewGroup root = (ViewGroup) inflater.inflate(
                 R.layout.layout_android_theme_with_include, null);
         assertThemedContext(root.findViewById(R.id.included_view));
@@ -102,8 +103,19 @@
     @UiThreadTest
     @Test
     @SmallTest
+    public void testAndroidThemeWithMergeInflation() {
+        LayoutInflater inflater = LayoutInflater.from(mTestRule.getActivity());
+        final ViewGroup root = (ViewGroup) inflater.inflate(
+                R.layout.layout_android_theme_with_merge, null);
+        assertThemedContext(root.findViewById(R.id.merged_view));
+        assertThemedContext(root.findViewById(R.id.merged_view_2));
+    }
+
+    @UiThreadTest
+    @Test
+    @SmallTest
     public void testThemedInflationWithUnattachedParent() {
-        final Context activity = mActivityTestRule.getActivity();
+        final Context activity = mTestRule.getActivity();
 
         // Create a parent but not attached
         final LinearLayout parent = new LinearLayout(activity);
@@ -205,15 +217,15 @@
     @Test
     @SmallTest
     public void testDeclarativeOnClickWithContextWrapper() {
-        LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
+        LayoutInflater inflater = LayoutInflater.from(mTestRule.getActivity());
         View view = inflater.inflate(R.layout.layout_button_themed_onclick, null);
 
         assertTrue(view.performClick());
-        assertTrue(mActivityTestRule.getActivity().wasDeclarativeOnClickCalled());
+        assertTrue(mTestRule.getActivity().wasDeclarativeOnClickCalled());
     }
 
     private void verifyAppCompatWidgetInflation(final int layout, final Class<?> expectedClass) {
-        LayoutInflater inflater = LayoutInflater.from(mActivityTestRule.getActivity());
+        LayoutInflater inflater = LayoutInflater.from(mTestRule.getActivity());
         View view = inflater.inflate(layout, null);
         assertSame("View is " + expectedClass.getSimpleName(), expectedClass,
                 view.getClass());
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt
index dbeb17c..8ba7f09 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt
@@ -18,12 +18,14 @@
 
 import android.content.res.Configuration
 import android.os.Build
+import androidx.appcompat.Orientation
 import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
 import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
 import androidx.appcompat.testutils.NightModeActivityTestRule
 import androidx.appcompat.testutils.NightModeUtils.NightSetMode
 import androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals
 import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForRecreate
+import androidx.appcompat.withOrientation
 import androidx.lifecycle.Lifecycle
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
@@ -33,7 +35,6 @@
 import org.junit.After
 import org.junit.Assert.assertNotSame
 import org.junit.Assert.assertSame
-import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -56,15 +57,10 @@
             launchActivity = false
         )
 
-    @Before
-    public fun setup() {
-        device.setOrientationNatural()
-    }
-
     @After
     public fun teardown() {
-        device.unfreezeRotation()
-        device.waitForIdle()
+        device.setOrientationNatural()
+        device.waitForIdle(5000)
 
         // Clean up after the default mode test.
         if (setMode == NightSetMode.DEFAULT) {
@@ -94,19 +90,20 @@
         // Now rotate the device. This should NOT result in a lifecycle event, just a call to
         // onConfigurationChanged.
         nightModeActivity.resetOnConfigurationChange()
-        device.setOrientationLeft()
-        instrumentation.waitForIdleSync()
-        nightModeActivity.expectOnConfigurationChange(5000)
+        device.withOrientation(Orientation.LEFT) {
+            instrumentation.waitForIdleSync()
+            nightModeActivity.expectOnConfigurationChange(5000)
 
-        // Assert that we got the same activity and thus it was not recreated.
-        val rotatedNightModeActivity = activityRule.activity
-        val rotatedConfig = rotatedNightModeActivity.resources.configuration
-        assertSame(nightModeActivity, rotatedNightModeActivity)
-        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rotatedConfig)
+            // Assert that we got the same activity and thus it was not recreated.
+            val rotatedNightModeActivity = activityRule.activity
+            val rotatedConfig = rotatedNightModeActivity.resources.configuration
+            assertSame(nightModeActivity, rotatedNightModeActivity)
+            assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rotatedConfig)
 
-        // On API level 26 and below, the configuration object is going to be identical
-        // across configuration changes, so we need to compare against the cached value.
-        assertNotSame(orientation, rotatedConfig.orientation)
+            // On API level 26 and below, the configuration object is going to be identical
+            // across configuration changes, so we need to compare against the cached value.
+            assertNotSame(orientation, rotatedConfig.orientation)
+        }
     }
 
     public companion object {
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt
index f5d18166..bd23f03 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt
@@ -20,14 +20,15 @@
 import android.app.Instrumentation
 import android.content.res.Configuration
 import android.os.Build
+import androidx.appcompat.Orientation
 import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
 import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
 import androidx.appcompat.testutils.NightModeActivityTestRule
 import androidx.appcompat.testutils.NightModeUtils.NightSetMode
 import androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals
 import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForRecreate
+import androidx.appcompat.withOrientation
 import androidx.lifecycle.Lifecycle
-import androidx.test.filters.FlakyTest
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
@@ -35,8 +36,8 @@
 import androidx.testutils.LifecycleOwnerUtils
 import org.junit.After
 import org.junit.Assert.assertNotEquals
+import org.junit.Assert.assertNotNull
 import org.junit.Assert.assertNotSame
-import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -59,12 +60,6 @@
             launchActivity = false
         )
 
-    @Before
-    public fun setup() {
-        device.setOrientationNatural()
-        device.waitForIdle(5000)
-    }
-
     @After
     public fun teardown() {
         device.setOrientationNatural()
@@ -78,7 +73,6 @@
         }
     }
 
-    @FlakyTest // b/188599568
     @Test
     public fun testRotateRecreatesActivityWithConfig() {
         // Set local night mode to MODE_NIGHT_YES and wait for state RESUMED.
@@ -98,38 +92,41 @@
 
         // Now rotate the device. This should result in an onDestroy lifecycle event.
         nightModeActivity.resetOnDestroy()
-        rotateDeviceAndWaitForRecreate(nightModeActivity)
-        nightModeActivity.expectOnDestroy(5000)
+        rotateDeviceAndWaitForRecreate(nightModeActivity) {
+            nightModeActivity.expectOnDestroy(5000)
 
-        // Assert that we got a different activity and thus it was recreated.
-        val rotatedNightModeActivity = activityRule.activity
-        val rotatedConfig = rotatedNightModeActivity.resources.configuration
-        assertNotSame(nightModeActivity, rotatedNightModeActivity)
-        assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rotatedConfig)
+            // Assert that we got a different activity and thus it was recreated.
+            val rotatedNightModeActivity = activityRule.activity
+            val rotatedConfig = rotatedNightModeActivity.resources.configuration
+            assertNotSame(nightModeActivity, rotatedNightModeActivity)
+            assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rotatedConfig)
 
-        // On API level 26 and below, the configuration object is going to be identical
-        // across configuration changes, so we need to compare against the cached value.
-        assertNotSame(orientation, rotatedConfig.orientation)
+            // On API level 26 and below, the configuration object is going to be identical
+            // across configuration changes, so we need to compare against the cached value.
+            assertNotSame(orientation, rotatedConfig.orientation)
+        }
     }
 
-    private fun rotateDeviceAndWaitForRecreate(activity: Activity) {
+    private fun rotateDeviceAndWaitForRecreate(activity: Activity, doThis: () -> Unit) {
         val monitor = Instrumentation.ActivityMonitor(activity::class.java.name, null, false)
         instrumentation.addMonitor(monitor)
 
-        // Rotate
-        device.setOrientationLeft()
+        device.withOrientation(Orientation.LEFT) {
+            // Wait for the activity to be recreated after rotation
+            var count = 0
+            var lastActivity: Activity? = activity
+            while ((lastActivity == null || activity == lastActivity) && count < 5) {
+                // If this times out, it will return null.
+                lastActivity = monitor.waitForActivityWithTimeout(1000L)
+                count++
+            }
+            instrumentation.waitForIdleSync()
 
-        // Wait for the activity to be recreated after rotation
-        var count = 0
-        var lastActivity = activity
-        while (activity == lastActivity && count < 5) {
-            lastActivity = monitor.waitForActivityWithTimeout(1000L)
-            count++
+            // Ensure that we didn't time out
+            assertNotNull("Activity was not recreated within 5000ms", lastActivity)
+            assertNotEquals("Activity was not recreated within 5000ms", activity, lastActivity)
+            doThis()
         }
-        instrumentation.waitForIdleSync()
-
-        // Ensure that we didn't time out
-        assertNotEquals("Activity was not recreated within 5000ms", activity, lastActivity)
     }
 
     public companion object {
diff --git a/appcompat/appcompat/src/androidTest/res/layout/layout_android_theme_merged_views.xml b/appcompat/appcompat/src/androidTest/res/layout/layout_android_theme_merged_views.xml
new file mode 100644
index 0000000..37c5c1e
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/res/layout/layout_android_theme_merged_views.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<merge xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <TextView
+        android:id="@+id/merged_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Test" />
+
+    <TextView
+        android:id="@+id/merged_view_2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Test 2" />
+
+</merge>
\ No newline at end of file
diff --git a/appcompat/appcompat/src/androidTest/res/layout/layout_android_theme_with_merge.xml b/appcompat/appcompat/src/androidTest/res/layout/layout_android_theme_with_merge.xml
new file mode 100644
index 0000000..c9d3511
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/res/layout/layout_android_theme_with_merge.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:theme="@style/MagentaThemeOverlay">
+
+    <include layout="@layout/layout_android_theme_merged_views"
+        android:id="@+id/included_view" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java
index 5fbc731..27a34d8 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java
@@ -37,6 +37,7 @@
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.core.view.TintableBackgroundView;
 import androidx.core.widget.TextViewCompat;
+import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
 /**
  * A {@link AutoCompleteTextView} which supports compatible features on older versions of the
@@ -53,6 +54,7 @@
  * <a href="{@docRoot}topic/libraries/support-library/packages.html#v7-appcompat">appcompat</a>.
  * You should only need to manually use this class when writing custom views.</p>
  */
+@AppCompatShadowedAttributes
 public class AppCompatAutoCompleteTextView extends AutoCompleteTextView implements
         TintableBackgroundView {
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java
index 977a74b..61e92ca 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java
@@ -40,6 +40,7 @@
 import androidx.core.widget.AutoSizeableTextView;
 import androidx.core.widget.TextViewCompat;
 import androidx.core.widget.TintableCompoundDrawablesView;
+import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
 /**
  * A {@link Button} which supports compatible features on older versions of the platform,
@@ -57,6 +58,7 @@
  * <a href="{@docRoot}topic/libraries/support-library/packages.html#v7-appcompat">appcompat</a>.
  * You should only need to manually use this class when writing custom views.</p>
  */
+@AppCompatShadowedAttributes
 public class AppCompatButton extends Button implements TintableBackgroundView,
         AutoSizeableTextView, TintableCompoundDrawablesView, EmojiCompatConfigurationView {
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckBox.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckBox.java
index 1adf364..14e910be 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckBox.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckBox.java
@@ -35,6 +35,7 @@
 import androidx.core.view.TintableBackgroundView;
 import androidx.core.view.ViewCompat;
 import androidx.core.widget.TintableCompoundButton;
+import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
 /**
  * A {@link CheckBox} which supports compatible features on older versions of the platform,
@@ -51,6 +52,7 @@
  * <a href="{@docRoot}topic/libraries/support-library/packages.html#v7-appcompat">appcompat</a>.
  * You should only need to manually use this class when writing custom views.</p>
  */
+@AppCompatShadowedAttributes
 public class AppCompatCheckBox extends CheckBox implements TintableCompoundButton,
         TintableBackgroundView {
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java
index 7755d6c..fe03def3 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java
@@ -40,6 +40,7 @@
 import androidx.core.view.ViewCompat;
 import androidx.core.widget.TextViewCompat;
 import androidx.core.widget.TintableCheckedTextView;
+import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
 /**
  * A {@link CheckedTextView} which supports compatible features on older versions of the platform,
@@ -61,6 +62,7 @@
  * <a href="{@docRoot}topic/libraries/support-library/packages.html#v7-appcompat">appcompat</a>.
  * You should only need to manually use this class when writing custom views.</p>
  */
+@AppCompatShadowedAttributes
 public class AppCompatCheckedTextView extends CheckedTextView implements TintableCheckedTextView,
         TintableBackgroundView, EmojiCompatConfigurationView {
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java
index 07cf3df..30e7abd 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java
@@ -53,6 +53,7 @@
 import androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener;
 import androidx.core.widget.TextViewCompat;
 import androidx.core.widget.TextViewOnReceiveContentListener;
+import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
 /**
  * A {@link EditText} which supports compatible features on older versions of the platform,
@@ -73,6 +74,7 @@
  * <a href="{@docRoot}topic/libraries/support-library/packages.html#v7-appcompat">appcompat</a>.
  * You should only need to manually use this class when writing custom views.</p>
  */
+@AppCompatShadowedAttributes
 public class AppCompatEditText extends EditText implements TintableBackgroundView,
         OnReceiveContentViewBehavior, EmojiCompatConfigurationView {
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageButton.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageButton.java
index fe65b79..1ea6667 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageButton.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageButton.java
@@ -36,6 +36,7 @@
 import androidx.core.view.TintableBackgroundView;
 import androidx.core.widget.ImageViewCompat;
 import androidx.core.widget.TintableImageSourceView;
+import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
 /**
  * A {@link ImageButton} which supports compatible features on older versions of the platform,
@@ -56,6 +57,7 @@
  * <a href="{@docRoot}topic/libraries/support-library/packages.html#v7-appcompat">appcompat</a>.
  * You should only need to manually use this class when writing custom views.</p>
  */
+@AppCompatShadowedAttributes
 public class AppCompatImageButton extends ImageButton implements TintableBackgroundView,
         TintableImageSourceView {
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java
index ba964d9..c5bf0f8 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java
@@ -34,6 +34,7 @@
 import androidx.core.view.TintableBackgroundView;
 import androidx.core.widget.ImageViewCompat;
 import androidx.core.widget.TintableImageSourceView;
+import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
 /**
  * A {@link ImageView} which supports compatible features on older versions of the platform,
@@ -55,6 +56,7 @@
  * <a href="{@docRoot}topic/libraries/support-library/packages.html#v7-appcompat">appcompat</a>.
  * You should only need to manually use this class when writing custom views.</p>
  */
+@AppCompatShadowedAttributes
 public class AppCompatImageView extends ImageView implements TintableBackgroundView,
         TintableImageSourceView {
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java
index 3910f28..5dc5c98 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java
@@ -34,6 +34,7 @@
 import androidx.appcompat.R;
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.core.view.TintableBackgroundView;
+import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
 /**
  * A {@link MultiAutoCompleteTextView} which supports compatible features on older version of the
@@ -50,6 +51,7 @@
  * <p>This will automatically be used when you use {@link MultiAutoCompleteTextView} in your layouts.
  * You should only need to manually use this class when writing custom views.</p>
  */
+@AppCompatShadowedAttributes
 public class AppCompatMultiAutoCompleteTextView extends MultiAutoCompleteTextView
         implements TintableBackgroundView {
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java
index 2550334..652fd7b 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java
@@ -34,6 +34,7 @@
 import androidx.core.view.TintableBackgroundView;
 import androidx.core.view.ViewCompat;
 import androidx.core.widget.TintableCompoundButton;
+import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
 /**
  * A {@link RadioButton} which supports compatible features on older versions of the platform,
@@ -50,6 +51,7 @@
  * <a href="{@docRoot}topic/libraries/support-library/packages.html#v7-appcompat">appcompat</a>.
  * You should only need to manually use this class when writing custom views.</p>
  */
+@AppCompatShadowedAttributes
 public class AppCompatRadioButton extends RadioButton implements TintableCompoundButton,
         TintableBackgroundView {
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java
index a7751b1..4d8bd10 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java
@@ -58,6 +58,7 @@
 import androidx.appcompat.view.menu.ShowableListMenu;
 import androidx.core.view.TintableBackgroundView;
 import androidx.core.view.ViewCompat;
+import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
 
 /**
@@ -74,6 +75,7 @@
  * <p>This will automatically be used when you use {@link Spinner} in your layouts.
  * You should only need to manually use this class when writing custom views.</p>
  */
+@AppCompatShadowedAttributes
 public class AppCompatSpinner extends Spinner implements TintableBackgroundView {
 
     private static final int[] ATTRS_ANDROID_SPINNERMODE = {android.R.attr.spinnerMode};
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java
index e9e0794..6984591 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java
@@ -48,6 +48,7 @@
 import androidx.core.widget.AutoSizeableTextView;
 import androidx.core.widget.TextViewCompat;
 import androidx.core.widget.TintableCompoundDrawablesView;
+import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
@@ -78,6 +79,7 @@
  * <a href="{@docRoot}topic/libraries/support-library/packages.html#v7-appcompat">appcompat</a>.
  * You should only need to manually use this class when writing custom views.</p>
  */
+@AppCompatShadowedAttributes
 public class AppCompatTextView extends TextView implements TintableBackgroundView,
         TintableCompoundDrawablesView, AutoSizeableTextView, EmojiCompatConfigurationView {
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatToggleButton.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatToggleButton.java
index 5cfb037..443e9a6 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatToggleButton.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatToggleButton.java
@@ -32,6 +32,7 @@
 import androidx.annotation.RestrictTo;
 import androidx.core.view.TintableBackgroundView;
 import androidx.core.view.ViewCompat;
+import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
 /**
  * A {@link ToggleButton} which supports compatible features on older versions of the platform,
@@ -48,6 +49,7 @@
  * <p>This will automatically be used when you use {@link ToggleButton} in your layouts.
  * You should only need to manually use this class when writing custom views.</p>
  */
+@AppCompatShadowedAttributes
 public class AppCompatToggleButton extends ToggleButton implements TintableBackgroundView,
         EmojiCompatConfigurationView {
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java
index f345b51..b9e02da 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java
@@ -30,6 +30,7 @@
 import android.view.accessibility.AccessibilityNodeInfo;
 import android.widget.LinearLayout;
 
+import androidx.annotation.GravityInt;
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -37,6 +38,7 @@
 import androidx.appcompat.R;
 import androidx.core.view.GravityCompat;
 import androidx.core.view.ViewCompat;
+import androidx.resourceinspection.annotation.Attribute;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -217,6 +219,12 @@
      * @return A flag set indicating how dividers should be shown around items.
      * @see #setShowDividers(int)
      */
+    @Attribute(value = "androidx.appcompat:showDividers", intMapping = {
+            @Attribute.IntMap(name = "none", value = 0),
+            @Attribute.IntMap(name = "beginning", value = 1, mask = 1),
+            @Attribute.IntMap(name = "middle", value = 2, mask = 2),
+            @Attribute.IntMap(name = "end", value = 4, mask = 4)
+    })
     @DividerMode
     public int getShowDividers() {
         return mShowDividers;
@@ -227,6 +235,7 @@
      *
      * @see #setDividerDrawable(Drawable)
      */
+    @Attribute("androidx.appcompat:divider")
     public Drawable getDividerDrawable() {
         return mDivider;
     }
@@ -274,6 +283,7 @@
      * @see #setDividerDrawable(Drawable)
      * @see #setDividerPadding(int)
      */
+    @Attribute("androidx.appcompat:dividerPadding")
     public int getDividerPadding() {
         return mDividerPadding;
     }
@@ -387,6 +397,7 @@
      *
      * @return true when widgets are baseline-aligned, false otherwise
      */
+    @Attribute("android:baselineAligned")
     public boolean isBaselineAligned() {
         return mBaselineAligned;
     }
@@ -410,6 +421,7 @@
      * @return True to measure children with a weight using the minimum
      *         size of the largest child, false otherwise.
      */
+    @Attribute("androidx.appcompat:measureWithLargestChild")
     public boolean isMeasureWithLargestChildEnabled() {
         return mUseLargestChild;
     }
@@ -486,6 +498,7 @@
      *   part of a larger layout that is baseline aligned, or -1 if none has
      *   been set.
      */
+    @Attribute("android:baselineAlignedChildIndex")
     public int getBaselineAlignedChildIndex() {
         return mBaselineAlignedChildIndex;
     }
@@ -535,6 +548,7 @@
      *         a number lower than or equals to 0.0f if not weight sum is
      *         to be used.
      */
+    @Attribute("android:weightSum")
     public float getWeightSum() {
         return mWeightSum;
     }
@@ -1672,6 +1686,10 @@
      *
      * @return either {@link #HORIZONTAL} or {@link #VERTICAL}
      */
+    @Attribute(value = "android:orientation", intMapping = {
+            @Attribute.IntMap(name = "horizontal", value = 0),
+            @Attribute.IntMap(name = "vertical", value = 1)
+    })
     @OrientationMode
     public int getOrientation() {
         return mOrientation;
@@ -1685,7 +1703,7 @@
      *
      * @param gravity See {@link android.view.Gravity}
      */
-    public void setGravity(int gravity) {
+    public void setGravity(@GravityInt int gravity) {
         if (mGravity != gravity) {
             if ((gravity & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK) == 0) {
                 gravity |= GravityCompat.START;
@@ -1706,6 +1724,8 @@
      * @return the current gravity.
      * @see #setGravity
      */
+    @Attribute("android:gravity")
+    @GravityInt
     public int getGravity() {
         return mGravity;
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java
index c6a86bd..4cd49e1 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java
@@ -79,6 +79,7 @@
 import androidx.core.view.ViewCompat;
 import androidx.cursoradapter.widget.CursorAdapter;
 import androidx.customview.view.AbsSavedState;
+import androidx.resourceinspection.annotation.Attribute;
 
 import java.lang.reflect.Method;
 import java.util.WeakHashMap;
@@ -276,6 +277,8 @@
 
         final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context,
                 attrs, R.styleable.SearchView, defStyleAttr, 0);
+        ViewCompat.saveAttributeDataForStyleable(this, context, R.styleable.SearchView, attrs,
+                a.getWrappedTypeArray(), defStyleAttr, 0);
 
         final LayoutInflater inflater = LayoutInflater.from(context);
         final int layoutResId = a.getResourceId(
@@ -448,6 +451,7 @@
      *
      * {@link android.R.attr#imeOptions}
      */
+    @Attribute("android:imeOptions")
     public int getImeOptions() {
         return mSearchSrcTextView.getImeOptions();
     }
@@ -613,6 +617,7 @@
      * @return the displayed query hint text, or {@code null} if none set
      * {@link androidx.appcompat.R.attr#queryHint}
      */
+    @Attribute("androidx.appcompat:queryHint")
     @Nullable
     public CharSequence getQueryHint() {
         final CharSequence hint;
@@ -651,6 +656,7 @@
      *
      * {@link androidx.appcompat.R.attr#iconifiedByDefault}
      */
+    @Attribute("androidx.appcompat:iconifiedByDefault")
     public boolean isIconfiedByDefault() {
         return mIconifiedByDefault;
     }
@@ -773,6 +779,7 @@
      *
      * {@link android.R.attr#maxWidth}
      */
+    @Attribute("android:maxWidth")
     public int getMaxWidth() {
         return mMaxWidth;
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
index 19acd49..01e2a78 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
@@ -56,6 +56,7 @@
 import androidx.core.view.ViewCompat;
 import androidx.core.widget.TextViewCompat;
 import androidx.emoji2.text.EmojiCompat;
+import androidx.resourceinspection.annotation.Attribute;
 
 import java.lang.ref.Reference;
 import java.lang.ref.WeakReference;
@@ -460,6 +461,7 @@
      *
      * {@link androidx.appcompat.R.attr#switchPadding}
      */
+    @Attribute("androidx.appcompat:switchPadding")
     public int getSwitchPadding() {
         return mSwitchPadding;
     }
@@ -485,6 +487,7 @@
      *
      * {@link androidx.appcompat.R.attr#switchMinWidth}
      */
+    @Attribute("androidx.appcompat:switchMinWidth")
     public int getSwitchMinWidth() {
         return mSwitchMinWidth;
     }
@@ -508,6 +511,7 @@
      *
      * {@link androidx.appcompat.R.attr#thumbTextPadding}
      */
+    @Attribute("androidx.appcompat:thumbTextPadding")
     public int getThumbTextPadding() {
         return mThumbTextPadding;
     }
@@ -548,6 +552,7 @@
      *
      * {@link androidx.appcompat.R.attr#track}
      */
+    @Attribute("androidx.appcompat:track")
     public Drawable getTrackDrawable() {
         return mTrackDrawable;
     }
@@ -577,6 +582,7 @@
      * {@link androidx.appcompat.R.attr#trackTint}
      * @see #setTrackTintList(ColorStateList)
      */
+    @Attribute("androidx.appcompat:trackTint")
     @Nullable
     public ColorStateList getTrackTintList() {
         return mTrackTintList;
@@ -605,6 +611,7 @@
      * {@link androidx.appcompat.R.attr#trackTintMode}
      * @see #setTrackTintMode(PorterDuff.Mode)
      */
+    @Attribute("androidx.appcompat:trackTintMode")
     @Nullable
     public PorterDuff.Mode getTrackTintMode() {
         return mTrackTintMode;
@@ -669,6 +676,7 @@
      *
      * {@link android.R.attr#thumb}
      */
+    @Attribute("android:thumb")
     public Drawable getThumbDrawable() {
         return mThumbDrawable;
     }
@@ -699,6 +707,7 @@
      * {@link androidx.appcompat.R.attr#thumbTint}
      * @see #setThumbTintList(ColorStateList)
      */
+    @Attribute("androidx.appcompat:thumbTint")
     @Nullable
     public ColorStateList getThumbTintList() {
         return mThumbTintList;
@@ -728,6 +737,7 @@
      * {@link androidx.appcompat.R.attr#thumbTintMode}
      * @see #setThumbTintMode(PorterDuff.Mode)
      */
+    @Attribute("androidx.appcompat:thumbTintMode")
     @Nullable
     public PorterDuff.Mode getThumbTintMode() {
         return mThumbTintMode;
@@ -772,6 +782,7 @@
      *
      * {@link androidx.appcompat.R.attr#splitTrack}
      */
+    @Attribute("androidx.appcompat:splitTrack")
     public boolean getSplitTrack() {
         return mSplitTrack;
     }
@@ -781,6 +792,7 @@
      *
      * {@link android.R.attr#textOn}
      */
+    @Attribute("android:textOn")
     public CharSequence getTextOn() {
         return mTextOn;
     }
@@ -819,6 +831,7 @@
      *
      * {@link android.R.attr#textOff}
      */
+    @Attribute("android:textOff")
     public CharSequence getTextOff() {
         return mTextOff;
     }
@@ -880,6 +893,7 @@
      * @return whether the on/off text should be displayed
      * {@link androidx.appcompat.R.attr#showText}
      */
+    @Attribute("androidx.appcompat:showText")
     public boolean getShowText() {
         return mShowText;
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
index 2da6793..05ba0c2 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
@@ -64,6 +64,7 @@
 import androidx.core.view.MarginLayoutParamsCompat;
 import androidx.core.view.ViewCompat;
 import androidx.customview.view.AbsSavedState;
+import androidx.resourceinspection.annotation.Attribute;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -376,6 +377,8 @@
      *         0 if menus are inflated against the toolbar theme
      * @see #setPopupTheme(int)
      */
+    @Attribute("androidx.appcompat:popupTheme")
+    @StyleRes
     public int getPopupTheme() {
         return mPopupTheme;
     }
@@ -407,6 +410,7 @@
      * @see #setTitleMarginStart(int)
      * {@link androidx.appcompat.R.attr#titleMarginStart}
      */
+    @Attribute("androidx.appcompat:titleMarginStart")
     public int getTitleMarginStart() {
         return mTitleMarginStart;
     }
@@ -429,6 +433,7 @@
      * @see #setTitleMarginTop(int)
      * {@link androidx.appcompat.R.attr#titleMarginTop}
      */
+    @Attribute("androidx.appcompat:titleMarginTop")
     public int getTitleMarginTop() {
         return mTitleMarginTop;
     }
@@ -451,6 +456,7 @@
      * @see #setTitleMarginEnd(int)
      * {@link androidx.appcompat.R.attr#titleMarginEnd}
      */
+    @Attribute("androidx.appcompat:titleMarginEnd")
     public int getTitleMarginEnd() {
         return mTitleMarginEnd;
     }
@@ -473,6 +479,7 @@
      * @see #setTitleMarginBottom(int)
      * {@link androidx.appcompat.R.attr#titleMarginBottom}
      */
+    @Attribute("androidx.appcompat:titleMarginBottom")
     public int getTitleMarginBottom() {
         return mTitleMarginBottom;
     }
@@ -650,6 +657,7 @@
      * @see #setLogo(int)
      * @see #setLogo(android.graphics.drawable.Drawable)
      */
+    @Attribute("androidx.appcompat:logo")
     public Drawable getLogo() {
         return mLogoView != null ? mLogoView.getDrawable() : null;
     }
@@ -688,6 +696,7 @@
      *
      * @return A description of the logo
      */
+    @Attribute("androidx.appcompat:logoDescription")
     public CharSequence getLogoDescription() {
         return mLogoView != null ? mLogoView.getContentDescription() : null;
     }
@@ -735,6 +744,7 @@
      *
      * @return The current title.
      */
+    @Attribute("androidx.appcompat:title")
     public CharSequence getTitle() {
         return mTitleText;
     }
@@ -791,6 +801,7 @@
      *
      * @return The current subtitle
      */
+    @Attribute("androidx.appcompat:subtitle")
     public CharSequence getSubtitle() {
         return mSubtitleText;
     }
@@ -913,6 +924,7 @@
      *
      * {@link androidx.appcompat.R.attr#navigationContentDescription}
      */
+    @Attribute("androidx.appcompat:navigationContentDescription")
     @Nullable
     public CharSequence getNavigationContentDescription() {
         return mNavButtonView != null ? mNavButtonView.getContentDescription() : null;
@@ -1005,6 +1017,7 @@
      *
      * {@link androidx.appcompat.R.attr#navigationIcon}
      */
+    @Attribute("androidx.appcompat:navigationIcon")
     @Nullable
     public Drawable getNavigationIcon() {
         return mNavButtonView != null ? mNavButtonView.getDrawable() : null;
@@ -1033,6 +1046,7 @@
      *
      * {@link androidx.appcompat.R.attr#collapseContentDescription}
      */
+    @Attribute("androidx.appcompat:collapseContentDescription")
     @Nullable
     public CharSequence getCollapseContentDescription() {
         return mCollapseButtonView != null ? mCollapseButtonView.getContentDescription() : null;
@@ -1078,6 +1092,7 @@
      *
      * {@link androidx.appcompat.R.attr#collapseIcon}
      */
+    @Attribute("androidx.appcompat:collapseIcon")
     @Nullable
     public Drawable getCollapseIcon() {
         return mCollapseButtonView != null ? mCollapseButtonView.getDrawable() : null;
@@ -1125,6 +1140,7 @@
      * @return The toolbar's Menu
      * {@link androidx.appcompat.R.attr#menu}
      */
+    @Attribute("androidx.appcompat:menu")
     public Menu getMenu() {
         ensureMenu();
         return mMenuView.getMenu();
@@ -1245,6 +1261,7 @@
      * @see #getContentInsetRight()
      * {@link androidx.appcompat.R.attr#contentInsetStart}
      */
+    @Attribute("androidx.appcompat:contentInsetStart")
     public int getContentInsetStart() {
         return mContentInsets != null ? mContentInsets.getStart() : 0;
     }
@@ -1265,6 +1282,7 @@
      * @see #getContentInsetRight()
      * {@link androidx.appcompat.R.attr#contentInsetEnd}
      */
+    @Attribute("androidx.appcompat:contentInsetEnd")
     public int getContentInsetEnd() {
         return mContentInsets != null ? mContentInsets.getEnd() : 0;
     }
@@ -1308,6 +1326,7 @@
      * @see #getContentInsetRight()
      * {@link androidx.appcompat.R.attr#contentInsetLeft}
      */
+    @Attribute("androidx.appcompat:contentInsetLeft")
     public int getContentInsetLeft() {
         return mContentInsets != null ? mContentInsets.getLeft() : 0;
     }
@@ -1328,6 +1347,7 @@
      * @see #getContentInsetLeft()
      * {@link androidx.appcompat.R.attr#contentInsetRight}
      */
+    @Attribute("androidx.appcompat:contentInsetRight")
     public int getContentInsetRight() {
         return mContentInsets != null ? mContentInsets.getRight() : 0;
     }
@@ -1344,6 +1364,7 @@
      * @see #setContentInsetStartWithNavigation(int)
      * {@link androidx.appcompat.R.attr#contentInsetStartWithNavigation}
      */
+    @Attribute("androidx.appcompat:contentInsetStartWithNavigation")
     public int getContentInsetStartWithNavigation() {
         return mContentInsetStartWithNavigation != RtlSpacingHelper.UNDEFINED
                 ? mContentInsetStartWithNavigation
@@ -1387,6 +1408,7 @@
      * @see #setContentInsetEndWithActions(int)
      * {@link androidx.appcompat.R.attr#contentInsetEndWithActions}
      */
+    @Attribute("androidx.appcompat:contentInsetEndWithActions")
     public int getContentInsetEndWithActions() {
         return mContentInsetEndWithActions != RtlSpacingHelper.UNDEFINED
                 ? mContentInsetEndWithActions
diff --git a/appcompat/integration-tests/receive-content-testapp/build.gradle b/appcompat/integration-tests/receive-content-testapp/build.gradle
index 5b887ff..6e9dbe7 100644
--- a/appcompat/integration-tests/receive-content-testapp/build.gradle
+++ b/appcompat/integration-tests/receive-content-testapp/build.gradle
@@ -31,15 +31,15 @@
     api("androidx.annotation:annotation:1.1.0")
     implementation(project(":appcompat:appcompat"))
     implementation(CONSTRAINT_LAYOUT, { transitive = true })
-    implementation(GUAVA_ANDROID)
+    implementation(libs.guavaAndroid)
     implementation(project(":recyclerview:recyclerview"))
-    implementation(MATERIAL)
+    implementation(libs.material)
 
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
-    implementation(ESPRESSO_IDLING_RESOURCE)
-    implementation(TRUTH)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.espressoCore)
+    implementation(libs.espressoIdlingResource)
+    implementation(libs.truth)
 }
diff --git a/appsearch/compiler/lint-baseline.xml b/appsearch/compiler/lint-baseline.xml
index dcbc206..0df44a3 100644
--- a/appsearch/compiler/lint-baseline.xml
+++ b/appsearch/compiler/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/arch/core/core-common/lint-baseline.xml b/arch/core/core-common/lint-baseline.xml
index 510c0dd..6798d30 100644
--- a/arch/core/core-common/lint-baseline.xml
+++ b/arch/core/core-common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
@@ -15,50 +15,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected Entry&lt;K, V> get(K k) {"
-        errorLine2="                              ~">
-        <location
-            file="src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java"
-            line="41"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V putIfAbsent(@NonNull K key, @NonNull V v) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java"
-            line="46"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V remove(@NonNull K key) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java"
-            line="56"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public boolean contains(K key) {"
-        errorLine2="                            ~">
-        <location
-            file="src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java"
-            line="66"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public Map.Entry&lt;K, V> ceil(K k) {"
         errorLine2="           ~~~~~~~~~~~~~~~">
         <location
@@ -70,39 +26,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public Map.Entry&lt;K, V> ceil(K k) {"
-        errorLine2="                                ~">
-        <location
-            file="src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java"
-            line="75"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    O apply(I input);"
-        errorLine2="    ~">
-        <location
-            file="src/main/java/androidx/arch/core/util/Function.java"
-            line="32"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    O apply(I input);"
-        errorLine2="            ~">
-        <location
-            file="src/main/java/androidx/arch/core/util/Function.java"
-            line="32"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    protected Entry&lt;K, V> get(K k) {"
         errorLine2="              ~~~~~~~~~~~">
         <location
@@ -114,39 +37,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected Entry&lt;K, V> get(K k) {"
-        errorLine2="                              ~">
-        <location
-            file="src/main/java/androidx/arch/core/internal/SafeIterableMap.java"
-            line="46"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V putIfAbsent(@NonNull K key, @NonNull V v) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/arch/core/internal/SafeIterableMap.java"
-            line="66"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V remove(@NonNull K key) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/arch/core/internal/SafeIterableMap.java"
-            line="98"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public Iterator&lt;Map.Entry&lt;K, V>> descendingIterator() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/arch/core/core-runtime/lint-baseline.xml b/arch/core/core-runtime/lint-baseline.xml
index 74d03e4..c49c3ba 100644
--- a/arch/core/core-runtime/lint-baseline.xml
+++ b/arch/core/core-runtime/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/arch/core/core-testing/lint-baseline.xml b/arch/core/core-testing/lint-baseline.xml
index b7a7d84..a4d298c 100644
--- a/arch/core/core-testing/lint-baseline.xml
+++ b/arch/core/core-testing/lint-baseline.xml
@@ -2,20 +2,6 @@
 <issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
-        id="InvalidPackage"
-        message="Invalid package reference in org.mockito:mockito-core; not included in Android: `java.lang.instrument`. Referenced from `org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/org/mockito/mockito-core/2.25.0/mockito-core-2.25.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in org.mockito:mockito-core; not included in Android: `javax.tools`. Referenced from `org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/org/mockito/mockito-core/2.25.0/mockito-core-2.25.0.jar"/>
-    </issue>
-
-    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    protected void starting(Description description) {"
diff --git a/autofill/autofill/lint-baseline.xml b/autofill/autofill/lint-baseline.xml
index 2cd1fdc..06ac3e7 100644
--- a/autofill/autofill/lint-baseline.xml
+++ b/autofill/autofill/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/benchmark/benchmark/build.gradle b/benchmark/benchmark/build.gradle
index 5af72d9..09799ac 100644
--- a/benchmark/benchmark/build.gradle
+++ b/benchmark/benchmark/build.gradle
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import static androidx.build.dependencies.DependenciesKt.*
 
 plugins {
     id("AndroidXPlugin")
@@ -33,9 +32,9 @@
     androidTestImplementation(project(":benchmark:benchmark-junit4"))
     androidTestImplementation(project(":benchmark:benchmark-macro-junit4"))
     androidTestImplementation(project(":tracing:tracing-ktx"))
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(KOTLIN_STDLIB)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.kotlinStdlib)
 }
diff --git a/benchmark/common/build.gradle b/benchmark/common/build.gradle
index ebeeee7..6d47166 100644
--- a/benchmark/common/build.gradle
+++ b/benchmark/common/build.gradle
@@ -15,12 +15,9 @@
  */
 
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.Publish
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -28,15 +25,15 @@
 }
 
 dependencies {
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
     api("androidx.annotation:annotation:1.1.0")
     api("androidx.annotation:annotation-experimental:1.0.0")
     implementation("androidx.tracing:tracing-ktx:1.0.0")
-    implementation(ANDROIDX_TEST_MONITOR)
+    implementation(libs.testMonitor)
 
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(KOTLIN_TEST)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.kotlinTest)
 }
 
 androidx {
diff --git a/benchmark/common/lint-baseline.xml b/benchmark/common/lint-baseline.xml
index 9408bc3..7edd276 100644
--- a/benchmark/common/lint-baseline.xml
+++ b/benchmark/common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/benchmark/docs/app_audit.md b/benchmark/docs/app_audit.md
index 58916b8..126687b 100644
--- a/benchmark/docs/app_audit.md
+++ b/benchmark/docs/app_audit.md
@@ -1,423 +1,3 @@
 # Android App Audit Runbook
 
-This runbook is intended to give developers the skills to identify and fix key
-performance issues in your app independently.
-
-[TOC]
-
-## Key Performance Issues {#key-performance-issues}
-
-*   [Scroll Jank](https://developer.android.com/topic/performance/vitals/render?hl=en#fixing_jank)
-    *   "Jank" is the term used to describe the visual hiccup that occurs when
-        the system is not able to build and provide frames in time for them to
-        be drawn to the screen at the requested cadence (60hz, or higher). Jank
-        is most apparent when scrolling, when what should be a smoothly animated
-        flow has "catches".
-    *   Apps should target 90Hz refresh rates. Many newer devices such as Pixel
-        4 operate in 90Hz mode during user interactions like scrolling.
-        *   If you're curious what refresh rate your device is using at a given
-            time, you can enable an overlay via Developer Options > Show refresh
-            rate (under Debugging)
-*   Transitions that are not smooth
-    *   These concerns arise during interactions such as switching between tabs,
-        or loading a new activity. These types of transitions should have smooth
-        animations and not include delays or visual flicker.
-*   Power Inefficiency
-    *   Doing work costs battery, and doing unnecessary work reduces battery
-        life.
-    *   One common cause of unnecessary work can be related to the GC (garbage
-        collector). This can happen when an app is allocating a lot of
-        repetitive variables that it only uses for a short time. Then, the
-        garbage collector needs to run frequently to clean up those variables.
-*   [Startup Latency](https://developer.android.com/topic/performance/vitals/launch-time?hl=en#internals)
-    *   Startup latency is the amount of time it takes between clicking on the
-        app icon, notification, or other entry point and the user's data being
-        shown on the screen.
-    *   We have two startup latency goals:
-        *   For "cold" starts, the starts that require the most work from the
-            app and the system, to start consistently within 500ms.
-        *   For the P95/P99 latencies to be very close to the median latency.
-            When the app sometimes a very long time to start, user trust is
-            eroded. IPCs and unnecessary I/O during the critical path of app
-            startup can experience lock contention and introduce these
-            inconsistencies.
-
-## Identifying These Issues {#identifying-these-issues}
-
-Generally, the recommended workflow to identify and remedy performance issues is
-as follows:
-
-1.  Identify critical user journeys to inspect. These usually include:
-    1.  Common startup flows, including from launcher and notification.
-    1.  Any screens where the user scrolls through data.
-    1.  Transitions between screens.
-    1.  Long-running flows, like navigation or music playback.
-1.  Inspect what is happening during those flows using debugging tools:
-    1.  [Systrace/Perfetto](https://developer.android.com/topic/performance/tracing) -
-        Allows you to see exactly what is happening across the entire device
-        with precise timing data.
-    1.  [Memory Profiler](https://developer.android.com/studio/profile/memory-profiler) -
-        Allows you to see what memory allocations are happening on the heap.
-    1.  [Simpleperf](https://developer.android.com/ndk/guides/simpleperf) - View
-        a flamegraph of what function calls are taking up the most CPU during a
-        certain period of time. When you identify something that's taking a long
-        time in systrace, but you don't know why, simpleperf can fill in the
-        blanks.
-
-Manual debugging of individual test runs is **critical** for understanding and
-debugging these performance issues. The above steps **cannot** be replaced by
-analyzing aggregated data. However, setting up metrics collection in automated
-testing as well as in the field is also important to understand what users are
-actually seeing and identify when regressions may occur:
-
-1.  Collect metrics during those flows
-    1.  Startup Flows
-        1.  Field metrics
-            1.  [Play Console startup time](https://support.google.com/googleplay/android-developer/answer/9844486#zippy=%2Capp-start-up-time)
-        2.  Lab tests
-            1.  [Jetpack Macrobenchmark: Startup](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/benchmark/docs/macrobenchmark.md#startup)
-    2.  Jank
-        1.  Field metrics
-            1.  Play Console frame vitals
-                1.  Note that within the Play Console, it's not possible to
-                    narrow down metrics to a specific user journey, since all
-                    that is reported is overall jank throughout the app.
-            2.  Custom measurement with
-                [FrameMetricsAggregator](https://developer.android.com/reference/kotlin/androidx/core/app/FrameMetricsAggregator)
-                1.  You can utilize FrameMetricsAggregator to record Jank
-                    metrics during a particular workflow.
-        2.  Lab tests
-            1.  [Jetpack Macrobenchmark: Scrolling](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/benchmark/docs/macrobenchmark.md#scrolling-and-animation)
-            2.  Macrobenchmark collects frame timing via `dumpsys gfxinfo`
-                commands that bracket a user journey in question. This is a
-                reasonable way to understand variation in jank over a specific
-                user journey. The RenderTime metrics, which highlight how long
-                frames are taking to draw, are more important than the count of
-                janky frames for identifying regressions or improvements.
-
-## Setting Up Your App for Performance Analysis {#setting-up-your-app-for-performance-analysis}
-
-Proper setup is essential for getting accurate, repeatable, actionable
-benchmarks from an application. In general, you want to test on a system that is
-as close to production as possible, while suppressing sources of noise. Below
-are a number of APK and system specific steps you can take to prepare a test
-setup, some of which are use case specific.
-
-### Tracepoints {#tracepoints}
-
-Applications can instrument their code with the
-[androidx.tracing.Trace](https://developer.android.com/reference/kotlin/androidx/tracing/Trace)
-class. It is strongly recommended to instrument key workloads in your
-application to increase the utility of traces, both for local profiling, and for
-inspecting results from CI. In Kotlin, the `androidx.tracing:tracing-ktx` module
-[makes this very simple](https://developer.android.com/reference/kotlin/androidx/tracing/package-summary?hl=en#trace\(kotlin.String,%20kotlin.Function0\)):
-
-```kotlin
-fun loadItemData(configuration: Config) = trace("loadItemData") {
-    // perform expensive operation here ...
-}
-```
-
-While traces are being captured, tracing does incur a small overhead (roughly
-5us) per section, so don't put it around every method. Just tracing larger
-chunks of work (>0.1ms) can give significant insights into bottlenecks.
-
-### APK Considerations {#apk-considerations}
-
-**Do not measure performance on a
-[debug build](https://developer.android.com/studio/debug).**
-
-Debug variants can be helpful for troubleshooting and symbolizing stack samples,
-but they have severe non-linear impacts on performance. Devices on Q+ can use
-_[profileableFromShell](https://android.googlesource.com/platform/system/extras/+/master/simpleperf/doc/android_application_profiling.md)_
-in their manifest to enable profiling in release builds.
-
-Use your production grade
-[proguard](https://developer.android.com/studio/build/shrink-code)
-configuration. Depending on the resources your application utilizes, this can
-have a substantial impact on performance. Note that some proguard configs strip
-tracepoints, consider removing those rules for the configuration you're running
-tests on
-
-#### Compilation
-
-[Compile](https://source.android.com/devices/tech/dalvik/configure#system_rom)
-your application on-device to a known state (generally speed or speed-profile).
-Background JIT activity can have a significant performance overhead, and you
-will hit it often if you are reinstalling the APK between test runs. The command
-to do this is:
-
-```shell
-adb shell cmd package compile -m speed -f com.google.packagename
-```
-
-The 'speed' compilation mode will compile the app completely; the
-'speed-profile' mode will compile the app according to a profile of the utilized
-code paths that is collected during app usage. It can be a bit tricky to collect
-profiles consistently and correctly, so if you decide to use them, you'll
-probably want to confirm they are what you expect. They're located here:
-
-```shell
-/data/misc/profiles/ref/[package-name]/primary.prof
-```
-
-Note that Macrobenchmark allows you to directly
-[specify compilation mode](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/benchmark/docs/macrobenchmark.md#compilation-mode).
-
-### System Considerations {#system-considerations}
-
-For low-level/high fidelity measurements, **calibrate your devices**. Try to run
-A/B comparisons across the same device and same OS version. There can be
-significant variations in performance, even across the same device type.
-
-On rooted devices, consider using a
-[lockClocks script](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:benchmark/gradle-plugin/src/main/resources/scripts/lockClocks.sh)
-for microbenchmarks. Among other things, these scripts: place CPUs at a fixed
-frequency, disable little cores, configure the GPU, and disable thermal
-throttling. This is not recommended for user-experience focused tests (i.e app
-launch, DoU testing, jank testing, etc.), but can be essential for cutting down
-noise in microbenchmark tests.
-
-On rooted devices, consider killing the application and dropping file caches
-(“echo 3 > /proc/sys/vm/drop\_caches”) between iterations. This will more
-accurately model cold start behavior.
-
-When possible, consider using a testing framework like
-[Macrobenchmark](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/benchmark/docs/macrobenchmark.md),
-which can reduce noise in your measurements, and prevent measurement inaccuracy.
-
-## Common Problems {#common-problems}
-
-### Slow App Startup: Unnecessary Trampoline Activity {#slow-app-startup-unnecessary-trampoline-activity}
-
-A trampoline activity can extend app startup time unnecessarily, and it's
-important to be aware if your app is doing it. As you can see in the example
-trace below, one activityStart is immediately followed by another activityStart
-without any frames being drawn by the first activity.
-
-![alt_text](app_audit_images/trace_startup.png "Trace showing trampoline activity.")
-
-This can happen both in a notification entrypoint and a regular app startup
-entrypoint, and can often be addressed by refactoring -- can you add the check
-you're firing up an activity for as a module that can be shared between
-activities?
-
-### Unnecessary Allocations Triggering Frequent GCs {#unnecessary-allocations-triggering-frequent-gcs}
-
-You may note that GCs are happening more frequently than you expect in a
-systrace.
-
-In this case, every 10 seconds during a long-running operation is an indicator
-that we might be allocating unnecessarily but consistently over time:
-
-![alt_text](app_audit_images/trace_gc.png "Trace showing space between GC events.")
-
-Or, you may notice that a specific callstack is making the vast majority of the
-allocations when using the Memory Profiler. You don't need to eliminate all
-allocations aggressively, as this can make code harder to maintain. Start
-instead by working on hotspots of allocations.
-
-### Janky Frames {#janky-frames}
-
-The graphics pipeline is relatively complicated, and there can be some nuance
-involved in determining whether a user ultimately may have seen a dropped
-frame - in some cases, the platform can "rescue" a frame using buffering.
-However, you can ignore most of that nuance to easily identify problematic
-frames from your app's perspective.
-
-When frames are being drawn with little work required from the app, the
-Choreographer#doFrame tracepoints occur on a 16.7ms cadence (assuming a 60 FPS
-device):
-
-![alt_text](app_audit_images/trace_frames1.png "Trace showing frequent fast frames.")
-
-If you zoom out and navigate through the trace, you'll sometimes see frames take
-a little longer to complete, but that's still okay because they're not taking
-more than their allotted 16.7ms time:
-
-![alt_text](app_audit_images/trace_frames2.png "Trace showing frequent fast frames with periodic bursts of work.")
-
-But when you actually see a disruption to that regular cadence, that will be a
-janky frame:
-
-![alt_text](app_audit_images/trace_frames3.png "Trace showing janky frames.")
-
-With a little practice, you'll be able to see them everywhere!
-
-![alt_text](app_audit_images/trace_frames4.png "Trace showing more janky frames.")
-
-In some cases, you'll just need to zoom into that tracepoint for more
-information about which views are being inflated or what RecyclerView is doing.
-In other cases, you may have to inspect further.
-
-For more information about identifying janky frames and debugging their causes,
-see
-
-[Slow Rendering Vitals Documentation](https://developer.android.com/topic/performance/vitals/render)
-
-### Common RecyclerView mistakes {#common-recyclerview-mistakes}
-
-*   Invalidating the entire RecyclerView's backing data unnecessarily. This can
-    lead to long frame rendering times and hence a jank. Instead, invalidate
-    only the data that has changed, to minimize the number of views that need to
-    update.
-    *   See
-        [Presenting Dynamic Data](https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView#presenting-dynamic-data)
-        for ways to avoid costly notifyDatasetChanged() calls, when content is
-        updated rather than replaced from scratch.
-*   Failing to support nested RecyclerViews properly, causing the internal
-    RecyclerView to be re-created from scratch every time.
-    *   Every nested, inner RecyclerView should have a
-        [RecycledViewPool](https://developer.android.com/reference/kotlin/androidx/recyclerview/widget/RecyclerView.RecycledViewPool)
-        set to ensure Views can be recycled between inner RecyclerViews
-*   Not prefetching enough data, or not prefetching in a timely manner. It can
-    be jarring to quickly hit the bottom of a scrolling list and need to wait
-    for more data from the server. While this isn't technically "jank" as no
-    frame deadlines are being missed, it can be a significant UX improvement
-    just to tweak the timing and quantity of prefetching so that the user
-    doesn't have to wait for data.
-
-## Tools Documentation {#tools-documentation}
-
-### Using Systrace/Perfetto {#using-systrace-perfetto}
-
-In case you like videos,
-[here's a talk](https://www.youtube.com/watch?v=qXVxuLvzKek) summarizing basic
-systrace usage.
-
-#### Debugging App Startup Using Systrace {#debugging-app-startup-using-systrace}
-
-The
-[Android developer documentation on App startup time](https://developer.android.com/topic/performance/vitals/launch-time)
-provides a good overview of the application startup process.
-
-Generally the stages of app startup are:
-
-*   Launch the process
-*   Initialize generic application objects
-*   Create and Initialize activity
-*   Inflate the layout
-*   Draw the first frame
-
-Startup types can be disambiguated by these stages:
-
-*   Cold startup -- Start at creating a new process with no
-    [saved state](https://developer.android.com/reference/android/os/Bundle).
-*   Warm startup -- Either recreates the activity while reusing the process, or
-    recreates the process with saved state. The Macrobenchmark testing library
-    supports consistent warm startup testing utilizing the first option.
-*   Hot startup -- Restarts the activity and starts at inflation.
-
-We recommend capturing systraces
-[using the on-device system tracing app available in Developer Options](https://developer.android.com/topic/performance/tracing/on-device).
-If you'd like to use command-line tools, [Perfetto](http://perfetto.dev/docs) is
-available on Android Q+, while devices on earlier versions should rely on
-[systrace](https://developer.android.com/topic/performance/vitals/launch-time).
-
-Note that “first frame” is a bit of a misnomer, applications can vary
-significantly in how they handle startup after creating the initial activity.
-Some applications will continue inflation for several frames, and others will
-even immediately launch into a secondary activity.
-
-When possible, we recommend that app developers include a
-[reportFullyDrawn](https://developer.android.com/reference/android/app/Activity#reportFullyDrawn\(\))
-(available Q+) call when startup is completed from the application’s
-perspective. RFD-defined start times can be extracted through the
-[Perfetto trace processor](https://perfetto.dev/docs/analysis/trace-processor),
-and a user-visible trace event will be emitted.
-
-Some things that you should look for include:
-
-*   [Monitor contention](app_audit_images/trace_monitor_contention.png) --
-    competition for monitor-protected resources can introduce significant delay
-    in app startup.
-*   [Synchronous binder transactions](app_audit_images/trace_sync_binder.png) --
-    Look for unnecessary transactions in your application’s critical path.
-*   [Common Sources of Jank](https://developer.android.com/topic/performance/vitals/render#common-jank)
-*   [Concurrent garbage collection](app_audit_images/trace_concurrent_gc.png) is
-    common and relatively low impact, but if you’re hitting it often consider
-    looking into it with the Android Studio memory profiler.
-*   Check for [IO](app_audit_images/trace_uninterruptable_sleep.png) performed
-    during startup, and look for long stalls.
-    *   Note that other processes performing IO at the same time can cause IO
-        contention, so ensure that other processes are not running.
-*   Significant activity on other threads can interfere with the UI thread, so
-    watch out for background work during startup. Note that devices can have
-    different CPU configurations, so the number of threads that can run in
-    parallel can vary across devices.
-
-### Using Android Studio Memory Profiler {#using-android-studio-memory-profiler}
-
-[Memory profiler documentation](https://developer.android.com/studio/profile/memory-profiler)
-
-The Android Studio memory profiler is a powerful tool to reduce memory pressure
-that could be caused by memory leaks or bad usage patterns since it provides a
-live view of object allocations
-
-To fix memory problems in your app you can use the memory profiler to track why
-and how often garbage collections happen.
-
-The overall steps taken when profiling app memory can be broken down into the
-following steps:
-
-#### 1. Detect memory problems
-
-Start recording a memory profiling session of the user journey you care about,
-then look for an
-[increasing object count](app_audit_images/studio_increasing_object_count.jpg)
-which will eventually lead to
-[garbage collections](app_audit_images/studio_gc.jpg).
-
-Once you have identified that there is a certain user journey that is adding
-memory pressure start analyzing for root causes of the memory pressure.
-
-#### 2. Diagnose memory pressure hot spots
-
-Select a range in the timeline to
-[visualize both Allocations and Shallow Size](app_audit_images/studio_alloc_and_shallow_size.jpg).
-The are multiple ways to sort this data. Here are some examples of how each view
-can help you analyze problems.
-
-##### Arrange by class
-
-Useful when you want to find classes that are generating objects that should
-otherwise be cached or reused from a memory pool.
-
-For example: Imagine you see an app creating 2000 objects of class called
-“Vertex” every second. This would increase the Allocations count by 2000 every
-second and you would see it when sorting by class. Should we be reusing such
-objects to avoid generating that garbage? If the answer is yes, then likely
-implementing a memory pool will be needed.
-
-##### Arrange by callstack
-
-Useful when there is a hot path where memory is being allocated, maybe inside a
-for loop or inside a specific function doing a lot of allocation work you will
-be able to find it here.
-
-##### Shallow size vs Retained size, which one should I use to find memory issues?
-
-Shallow size only tracks the memory of the object itself, so it will be useful
-for tracking simple classes composed mostly of primitive values only.
-
-Retained Size shows the total memory due to the object and references that are
-solely referenced by the object, so it will be useful for tracking memory
-pressure due to complex objects. To get this value, take a
-[full memory dump](app_audit_images/studio_memory_dump.jpg) and it will be
-[added as a column](app_audit_images/studio_retained_size.jpg).
-
-### 3. Measure impact of an optimization
-
-The more evident and easy to measure impact of memory optimizations are GCs.
-When an optimization reduces the memory pressure, then you should see fewer GCs.
-
-To measure this, in the profiler timeline measure the time between GCs, and you
-should see it taking longer between GCs.
-
-The ultimate impact of memory improvements like this is:
-
-*   OOM kills will likely be reduced if the app does not constantly hit memory
-    pressure
-*   Having less GCs improves jank metrics, especially in the P99. This is
-    because GCs cause CPU contention, which could lead to rendering tasks being
-    deferred while GC is happening.
+This runbook has moved to [d.android.com/studio/profile/measuring-performance](https://developer.android.com/studio/profile/measuring-performance).
diff --git a/benchmark/docs/app_audit_images/studio_alloc_and_shallow_size.jpg b/benchmark/docs/app_audit_images/studio_alloc_and_shallow_size.jpg
deleted file mode 100644
index 49a839d..0000000
--- a/benchmark/docs/app_audit_images/studio_alloc_and_shallow_size.jpg
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/app_audit_images/studio_gc.jpg b/benchmark/docs/app_audit_images/studio_gc.jpg
deleted file mode 100644
index b6d4162..0000000
--- a/benchmark/docs/app_audit_images/studio_gc.jpg
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/app_audit_images/studio_increasing_object_count.jpg b/benchmark/docs/app_audit_images/studio_increasing_object_count.jpg
deleted file mode 100644
index b8da923..0000000
--- a/benchmark/docs/app_audit_images/studio_increasing_object_count.jpg
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/app_audit_images/studio_memory_dump.jpg b/benchmark/docs/app_audit_images/studio_memory_dump.jpg
deleted file mode 100644
index 6c45bcd..0000000
--- a/benchmark/docs/app_audit_images/studio_memory_dump.jpg
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/app_audit_images/studio_retained_size.jpg b/benchmark/docs/app_audit_images/studio_retained_size.jpg
deleted file mode 100644
index d3f4f66..0000000
--- a/benchmark/docs/app_audit_images/studio_retained_size.jpg
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/app_audit_images/trace_concurrent_gc.png b/benchmark/docs/app_audit_images/trace_concurrent_gc.png
deleted file mode 100644
index 9e640db..0000000
--- a/benchmark/docs/app_audit_images/trace_concurrent_gc.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/app_audit_images/trace_frames1.png b/benchmark/docs/app_audit_images/trace_frames1.png
deleted file mode 100644
index b4d6397..0000000
--- a/benchmark/docs/app_audit_images/trace_frames1.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/app_audit_images/trace_frames2.png b/benchmark/docs/app_audit_images/trace_frames2.png
deleted file mode 100644
index 9c1a54d..0000000
--- a/benchmark/docs/app_audit_images/trace_frames2.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/app_audit_images/trace_frames3.png b/benchmark/docs/app_audit_images/trace_frames3.png
deleted file mode 100644
index 0c66bb6..0000000
--- a/benchmark/docs/app_audit_images/trace_frames3.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/app_audit_images/trace_frames4.png b/benchmark/docs/app_audit_images/trace_frames4.png
deleted file mode 100644
index 3d9b145..0000000
--- a/benchmark/docs/app_audit_images/trace_frames4.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/app_audit_images/trace_gc.png b/benchmark/docs/app_audit_images/trace_gc.png
deleted file mode 100644
index 01b254b..0000000
--- a/benchmark/docs/app_audit_images/trace_gc.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/app_audit_images/trace_monitor_contention.png b/benchmark/docs/app_audit_images/trace_monitor_contention.png
deleted file mode 100644
index af66d1e..0000000
--- a/benchmark/docs/app_audit_images/trace_monitor_contention.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/app_audit_images/trace_startup.png b/benchmark/docs/app_audit_images/trace_startup.png
deleted file mode 100644
index 4c75837..0000000
--- a/benchmark/docs/app_audit_images/trace_startup.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/app_audit_images/trace_sync_binder.png b/benchmark/docs/app_audit_images/trace_sync_binder.png
deleted file mode 100644
index 4920f17..0000000
--- a/benchmark/docs/app_audit_images/trace_sync_binder.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/app_audit_images/trace_uninterruptable_sleep.png b/benchmark/docs/app_audit_images/trace_uninterruptable_sleep.png
deleted file mode 100644
index b305a9b..0000000
--- a/benchmark/docs/app_audit_images/trace_uninterruptable_sleep.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/macrobenchmark.md b/benchmark/docs/macrobenchmark.md
index 9b8bde1..fc62cce 100644
--- a/benchmark/docs/macrobenchmark.md
+++ b/benchmark/docs/macrobenchmark.md
@@ -1,483 +1,3 @@
 # Jetpack Macrobenchmark Guide
 
-This documentation for the Jetpack Macrobenchmark library will move to
-[developer.android.com](https://developer.android.com) when the library is ready
-for public release.
-
-NOTE: See [Known Issues](#known-issues) for workarounds for library issues.
-
-[TOC]
-
-## Jetpack Macrobenchmark
-
-Jetpack Macrobenchmark allows you to write startup and scrolling performance
-tests directly against your release app on devices running Android 10 (API 29)
-or greater. This is provided through the MacrobenchmarkRule JUnit4 rule api:
-
-```kotlin
-@get:Rule
-val benchmarkRule = MacrobenchmarkRule()
-
-@Test
-fun startup() = benchmarkRule.measureRepeated(
-    packageName = "mypackage.myapp",
-    metrics = listOf(StartupTimingMetric()),
-    iterations = 5,
-    startupMode = StartupMode.COLD
-) { // this = MacrobenchmarkScope
-    pressHome()
-    val intent = Intent()
-    intent.setPackage("mypackage.myapp")
-    intent.setAction("mypackage.myapp.myaction")
-    startActivityAndWait(intent)
-}
-```
-
-Metrics are displayed directly in Android Studio, and also output for
-[CI usage in a JSON file](#ci-results).
-
-![Sample Studio Results](macrobenchmark_images/studio_results.png "Sample Studio results")
-
-### Macrobenchmark vs Benchmark
-
-While the existing [Jetpack Benchmark](http://d.android.com/benchmark) library
-allows you to benchmark app code directly in a loop, it's
-[designed around](https://developer.android.com/studio/profile/benchmark#what-to-benchmark)
-measuring CPU work which is run frequently, and which will hit best-case
-performance (warmed up JIT, disk accesses cached).
-
-Macrobenchmark instead measures end-user experience by actually starting up, and
-scrolling your app, providing direct control over the performance environment
-you're testing (e.g. you can specify cold, first-time install startup
-performance).
-
-<!-- Below table doesn't work on android.googlesource.com, using image as workaround
-<table>
-    <tr>
-      <td><strong>Macrobenchmark</strong> (new!)</td>
-      <td><strong>Benchmark</strong> (existing!)</td>
-    </tr>
-    <tr>
-        <td>Measure high-level entry points (Activity launch / Scrolling a list)</td>
-        <td>Measure individual functions</td>
-    </tr>
-    <tr>
-        <td>Out-of-process test of full app</td>
-        <td>In-process test of CPU work</td>
-    </tr>
-    <tr>
-        <td>Slow iteration speed (Often several minutes)</td>
-        <td>Fast iteration speed (Often less than 10 seconds)</td>
-    </tr>
-    <tr>
-        <td>Results come with profiling traces</td>
-        <td>Optional method sampling/tracing</td>
-    </tr>
-    <tr>
-        <td>Min API 29</td>
-        <td>Min API 14</td>
-    </tr>
-</table>
--->
-
-![Comparison Table](macrobenchmark_images/comparison_table.png "Comparison of Benchmark libraries")
-
-## Module Setup
-
-
-### Configuration
-
-Macrobenchmark currently is only available as a snapshot, so
-[add the Androidx snapshot maven artifact to your top level `build.gradle` file](https://androidx.dev/).
-
-Macrobenchmarks are defined in a separate `com.android.library` module. Add a
-new library module to your project, and add a dependency on macrobenchmark:
-
-```groovy
-dependencies {
-    def benchmark_version = '1.1.0-SNAPSHOT'
-    androidTestImplementation "androidx.benchmark:benchmark-macro-junit4:$benchmark_version"
-}
-```
-
-See the [sample macrobenchmark module](https://github.com/android/performance-samples/tree/macrobenchmark/MacrobenchmarkSample/macrobenchmark)
-for reference.
-
-### Writing Macrobenchmarks
-
-Unlike microbenchmarks written with `BenchmarkRule`, no gradle plugin is
-required.
-
-Now define a new test class in that module, filling in your app's package name:
-
-```kotlin
-@RunWith(AndroidJUnit4::class)
-class SampleStartupBenchmark {
-    @get:Rule
-    val benchmarkRule = MacrobenchmarkRule()
-
-    @Test
-    fun startup() = benchmarkRule.measureRepeated(
-        packageName = "mypackage.myapp",
-        metrics = listOf(StartupTimingMetric()),
-        iterations = 5,
-        startupMode = StartupMode.COLD
-    ) { // this = MacrobenchmarkScope
-        pressHome()
-        val intent = Intent()
-        intent.setPackage("mypackage.myapp")
-        intent.setAction("mypackage.myapp.myaction")
-        startActivityAndWait(intent)
-    }
-}
-
-```
-
-## App Setup
-
-To macrobenchmark an app (called the *target* of the macrobenchmark), that app
-should be configured as close to user experience as possible - non-debuggable,
-preferably with minification on (which is beneficial for performance). This is
-typically done by installing the `release` variant of the target apk.
-
-As it is necessary to sign your app's `release` variant before building, you can
-sign it locally with `debug` keys:
-
-```groovy
-    buildTypes {
-        release {
-            // You'll be unable to release with this config, but it can
-            // be useful for local performance testing
-            signingConfig signingConfigs.debug
-        }
-    }
-```
-
-Every Activity to be launched by a Macrobenchmark must
-[exported](https://developer.android.com/guide/topics/manifest/activity-element#exported).
-As of Android 11, this must be enabled explicitly in the app's
-AndroidManifest.xml:
-
-```xml
-    <activity
-        android:name=".MyActivity"
-        android:exported="true">
-```
-
-Your app will also need to be profileable, to enable reading detailed trace
-information. This is enabled in the `<application>` tag of the app's
-AndroidManifest.xml:
-
-```xml
-    <application ... >
-        <!-- Profileable to enable macrobenchmark profiling -->
-        <!--suppress AndroidElementNotAllowed -->
-        <profileable android:shell="true"/>
-        ...
-    </application>
-```
-
-If the app is misconfigured (debuggable, or non-profileable), macrobenchmark
-will throw an error, rather than reporting an incorrect or incomplete
-measurement. These configuration errors can be suppressed with the
-[`androidx.benchmark.suppressErrors` argument](https://developer.android.com/studio/profile/benchmark#configuration-errors).
-
-Errors are also thrown when attempting to measure an emulator, or on a
-low-battery device (as this may compromise core availability and clock
-speed).
-
-## Run the Macrobenchmark
-
-Run the test from within Studio to measure the performance of your app on your
-device. Note that you **must run the test on a physical device**, and not an
-emulator, as emulators do not produce performance numbers representative of
-end-user experience.
-
-See the [Benchmarking in CI](#ci) section for information on how to run and
-monitor benchmarks in continuous integration.
-
-## Customizing your Macrobenchmark
-
-#### Compilation Mode
-
-Macrobenchmarks can specify a
-[CompilationMode](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:benchmark/macro/src/main/java/androidx/benchmark/macro/CompilationMode.kt),
-which defines how the app should be compiled, just before the test is run.
-
-By default, benchmarks are run with `SpeedProfile`, which runs a few iterations
-of your benchmark before measurement, using that profiling data for
-profile-driven compilation. This can simulate performance of UI code that has
-launched and run before, or which has been
-[pre-compiled by the store installing it](https://android-developers.googleblog.com/2019/04/improving-app-performance-with-art.html),
-
-To simulate worst-case, just-after-install performance without pre-compilation,
-pass `None`.
-
-This functionality is built on
-[ART compilation commands](https://source.android.com/devices/tech/dalvik/jit-compiler#force-compilation-of-a-specific-package).
-Each benchmark will clear profile data before it starts, to ensure
-non-interference between benchmarks.
-
-#### Startup
-
-To perform an activity start, you can pass a pre-defined startup mode
-([one of COLD, WARM, HOT](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:benchmark/macro/src/main/java/androidx/benchmark/macro/StartupMode.kt))
-to the `measureRepeated` function. This parameter will change how the activity
-will be launched, and the process state at the start of the test.
-
-To learn more about the types of startup, see the
-[Android Vitals startup documentation](https://developer.android.com/topic/performance/vitals/launch-time#internals).
-
-#### Scrolling and Animation
-
-Unlike most Android UI tests, the macrobenchmarks tests run in a separate
-process from the app itself. This is necessary to enable things like killing the
-app process, and compiling it via shell commands.
-
-For this reason, you cannot use APIs like `ActivityScenario` which require the
-test APK to classload from the instrumentation target. Our samples use
-[UI Automator](https://developer.android.com/training/testing/ui-automator) to
-drive the app process (e.g. for scrolling).
-
-Instead, you can drive your app via the
-[UI Automator library](https://developer.android.com/training/testing/ui-automator)
-(or any other means of out-of-process automation). The following example finds a
-RecyclerView via resource id, and scrolls down several times:
-
-```kotlin
-@Test
-fun measureScroll() {
-    benchmarkRule.measureRepeated(
-        packageName = "mypackage.myapp",
-        metrics = listOf(FrameTimingMetric()),
-        compilationMode = compilationMode,
-        iterations = 5,
-        setupBlock = {
-            // before starting to measure, navigate to the UI to be measured
-            val intent = Intent()
-            intent.action = ACTION
-            startActivityAndWait(intent)
-        }
-    ) {
-        val recycler = device.findObject(By.res("mypackage.myapp", "recycler_id"))
-        // Set gesture margin to avoid triggering gesture nav
-        // with input events from automation.
-        recycler.setGestureMargin(device.displayWidth / 5)
-
-        // Scroll down several times
-        for (i in 1..10) {
-            recycler.scroll(Direction.DOWN, 2f)
-            device.waitForIdle()
-        }
-    }
-}
-```
-
-As the test specifies a `FrameTimingMetric`, the timing of frames will be
-recorded and reported as a high level summary of frame timing distribution -
-50th, 90th, 95th, and 99th percentile.
-
-Your benchmark doesn't have to scroll UI, it could for example run an animation.
-It also doesn't need to use UI automator specifically - as long as frames are
-being produced by the View system (which includes frames produced by Compose),
-performance metrics will be collected.
-
-## Inspecting a trace
-
-Each measured iteration captures a separate System trace. These result traces
-can be opened with
-[Studio](https://developer.android.com/studio/profile/cpu-profiler#system-trace)
-(via File > Open) or [ui.perfetto.dev](https://ui.perfetto.dev) (via Open trace
-file).
-
-![Studio Trace](macrobenchmark_images/studio_trace.png "Studio trace UI")
-
-NOTE: Android Studio [does not yet support](#studio-trace-access) automatically
-pulling trace files off of the device, this step must be performed manually for
-now.
-
-Currently, when running tests from Studio, you must manually pull profiling
-traces to inspect them after a benchmark run, e.g.:
-
-```shell
-# the following command will pull all files ending in .trace
-# if you have not overriden the output directory
-adb shell ls '/storage/emulated/0/Android/data/*/*/*.trace' \
-    | tr -d '\r' | xargs -n1 adb pull
-```
-
-Note that your output file path may be different if you customize it with the
-`additionalTestOutputDir` argument. You can look for trace path logs in logcat
-to see where there are written, for example:
-
-```
-I PerfettoCapture: Writing to /storage/emulated/0/Android/data/androidx.benchmark.integration.macrobenchmark.test/cache/TrivialStartupBenchmark_startup[mode=COLD]_iter002.trace.
-```
-
-If you invoke the tests instead via gradle command line (e.g. `./gradlew
-macrobenchmark:connectedCheck`), these files are pulled automatically to a test
-output directory:
-
-```
-build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/<device-name>/<module-name>-benchmarkData.json
-```
-
-For copying files after command-line benchmark invocation through gradle to
-work, you may need to add the following to your `gradle.properties` file:
-`android.enableAdditionalTestOutput=true`
-
-## Measuring changes in your app
-
-NOTE: Android Studio does not yet support depending on an app module from a
-macrobenchmark, this step will not be necessary in a future version.
-
-**Each time** you want app changes to be reflected in your benchmark
-measurements, you must manually update/reinstall the release version of the
-target app, for example:
-
-```shell
-# Can alternately do this in Studio, via Gradle pane
-# on the right, app > Tasks > install > installRelease
-./gradlew :myapp:installRelease
-```
-
-This can also be done in studio via the Gradle pane: `myAppModule > Tasks >
-install > installRelease`
-
-You can avoid the need for this for gradle command line runs by adding the
-following to the end of your macrobenchmark module's `build.gradle`
-
-```
-// Define a task dependency so the app is installed before we run macro benchmarks.
-tasks.getByPath(':macrobenchmark-module:connectedCheck')
-    .dependsOn(
-            tasks.getByPath(
-                    ':myapp:installRelease'
-            )
-    )
-```
-
-## Benchmarking in CI {#ci}
-
-It's common to run test in CI without Gradle, or locally if you're using a
-different build system. This section explains how to configure macrobenchmark
-for CI usage at runtime.
-
-### Result Files - JSON and Traces {#ci-results}
-
-Macrobenchmark outputs a JSON file, and multiple trace files - one per measured
-iteration of each `MacrobenchmarkRule.measureRepeated` loop.
-
-You can define where these files are written by passing in the following
-instrumentation argument at runtime:
-
-```
--e additionalTestOutputDir "device_path_you_can_write_to"
-```
-
-Note that for simplicity you can specify a path on `/sdcard/`, but you will need
-to
-[opt-out](https://developer.android.com/training/data-storage/use-cases#opt-out-scoped-storage)
-of scoped storage by setting `requestLegacyExternalStorage` to `true` in your
-**macrobenchmark** module:
-
-```xml
-<manifest ... >
-  <application android:requestLegacyExternalStorage="true" ... >
-    ...
-  </application>
-</manifest>
-```
-
-Or pass an instrumentation arg to bypass scoped storage for the test:
-
-```shell
--e no-isolated-storage 1
-```
-
-NOTE: The file extension of these trace files is currently `.trace`, but will
-likely change in the future to clarify that these are perfetto traces.
-
-### JSON Sample
-
-Sample JSON output for a single startup benchmark:
-
-```json
-{
-    "context": {
-        "build": {
-            "device": "walleye",
-            "fingerprint": "google/walleye/walleye:10/QQ3A.200805.001/6578210:userdebug/dev-keys",
-            "model": "Pixel 2",
-            "version": {
-                "sdk": 29
-            }
-        },
-        "cpuCoreCount": 8,
-        "cpuLocked": true,
-        "cpuMaxFreqHz": 2457600000,
-        "memTotalBytes": 3834605568,
-        "sustainedPerformanceModeEnabled": false
-    },
-    "benchmarks": [
-        {
-            "name": "startup",
-            "params": {},
-            "className": "androidx.benchmark.integration.macrobenchmark.SampleStartupBenchmark",
-            "totalRunTimeNs": 77969052767,
-            "metrics": {
-                "startupMs": {
-                    "minimum": 228,
-                    "maximum": 283,
-                    "median": 242,
-                    "runs": [
-                        238,
-                        283,
-                        256,
-                        228,
-                        242
-                    ]
-                }
-            },
-            "warmupIterations": 3,
-            "repeatIterations": 5,
-            "thermalThrottleSleepSeconds": 0
-        }
-    ]
-}
-```
-
-## Additional Resources
-
-[A sample project is available](https://github.com/android/performance-samples/tree/macrobenchmark/MacrobenchmarkSample)
-as part of the android/performance-samples repository on GitHub, in the
-macrobenchmark branch.
-
-For guidance in how to detect performance regressions, see the blogpost
-[Fighting Regressions with Benchmarks in CI](https://medium.com/androiddevelopers/fighting-regressions-with-benchmarks-in-ci-6ea9a14b5c71).
-
-
-## Known Issues
-
-### Missing Metrics
-
-If you see exceptions with the text: `Unable to read any metrics during
-benchmark` or `Error, different metrics observed in different iterations.` in a
-startup benchmark, these can be caused by the library failing to wait for
-Activity launch. As a temporary workaround, you can add a
-`Thread.sleep(5000/*ms*/)` at the end of your `measureRepeated {}` block.
-
-### Studio Trace Access {#studio-trace-access}
-
-Support for easy trace access is being added in Android Studio. Once available,
-you'll be able to click a result metric, or iteration index, and open the trace
-directly in Studio:
-
-![Studio Integration Results](macrobenchmark_images/studio_integ_results.png "Studio results with trace links")
-
-![Studio Integration Trace](macrobenchmark_images/studio_integ_trace.png "Studio, displaying macrobenchmark trace")
-
-## Feedback
-
-To report issues or submit feature requests for Jetpack Macrobenchmark, see the
-[public issue tracker](https://issuetracker.google.com/issues/new?component=975669&template=1519452).
+This documentation for the Jetpack Macrobenchmark library has moved to [d.android.com/benchmark](https://developer.android.com/benchmark).
diff --git a/benchmark/docs/macrobenchmark_images/comparison_table.png b/benchmark/docs/macrobenchmark_images/comparison_table.png
deleted file mode 100644
index f2c20c2..0000000
--- a/benchmark/docs/macrobenchmark_images/comparison_table.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/macrobenchmark_images/perfetto_trace.png b/benchmark/docs/macrobenchmark_images/perfetto_trace.png
deleted file mode 100644
index 8e98199..0000000
--- a/benchmark/docs/macrobenchmark_images/perfetto_trace.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/macrobenchmark_images/studio_integ_results.png b/benchmark/docs/macrobenchmark_images/studio_integ_results.png
deleted file mode 100644
index 6e86c28..0000000
--- a/benchmark/docs/macrobenchmark_images/studio_integ_results.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/macrobenchmark_images/studio_integ_trace.png b/benchmark/docs/macrobenchmark_images/studio_integ_trace.png
deleted file mode 100644
index 368ef26..0000000
--- a/benchmark/docs/macrobenchmark_images/studio_integ_trace.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/macrobenchmark_images/studio_results.png b/benchmark/docs/macrobenchmark_images/studio_results.png
deleted file mode 100644
index cf1d000..0000000
--- a/benchmark/docs/macrobenchmark_images/studio_results.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/docs/macrobenchmark_images/studio_trace.png b/benchmark/docs/macrobenchmark_images/studio_trace.png
deleted file mode 100644
index 24db39c..0000000
--- a/benchmark/docs/macrobenchmark_images/studio_trace.png
+++ /dev/null
Binary files differ
diff --git a/benchmark/gradle-plugin/build.gradle b/benchmark/gradle-plugin/build.gradle
index 49db110..55ac348 100644
--- a/benchmark/gradle-plugin/build.gradle
+++ b/benchmark/gradle-plugin/build.gradle
@@ -14,13 +14,7 @@
  * limitations under the License.
  */
 
-import androidx.build.BuildOnServerKt
-import androidx.build.BuildServerConfigurationKt
-import androidx.build.LibraryGroups
-import androidx.build.LibraryType
-import androidx.build.SdkResourceGenerator
-
-import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.*
 
 plugins {
     id("AndroidXPlugin")
@@ -34,13 +28,13 @@
     implementation(findGradleKotlinDsl())
     implementation(gradleApi())
     implementation("com.android.tools.build:gradle:4.0.0-beta04")
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
 
     testImplementation(gradleTestKit())
     testImplementation(project(":internal-testutils-gradle-plugin"))
-    testImplementation(ANDROIDX_TEST_RUNNER)
-    testImplementation(JUNIT)
-    testImplementation(KOTLIN_TEST)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.junit)
+    testImplementation(libs.kotlinTest)
 }
 
 SdkResourceGenerator.generateForHostTest(project)
diff --git a/benchmark/integration-tests/crystalball-experiment/build.gradle b/benchmark/integration-tests/crystalball-experiment/build.gradle
index ed90325..a721908 100644
--- a/benchmark/integration-tests/crystalball-experiment/build.gradle
+++ b/benchmark/integration-tests/crystalball-experiment/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 
@@ -63,11 +62,11 @@
 }
 
 dependencies {
-    api(JUNIT)
-    api(KOTLIN_STDLIB)
+    api(libs.junit)
+    api(libs.kotlinStdlib)
     api("androidx.annotation:annotation:1.1.0")
     // TODO: remove, once we remove the minor usages in CrystalBall
-    implementation(GUAVA_ANDROID)
+    implementation(libs.guavaAndroid)
     androidTestImplementation("com.android:collector-device-lib:0.1.0")
     androidTestImplementation("com.android:collector-device-lib-platform:0.1.0")
     androidTestImplementation("com.android:collector-helper-utilities:0.1.0")
@@ -84,8 +83,8 @@
     androidTestImplementation("com.android:microbenchmark-device-lib:0.1.0")
     androidTestImplementation("androidx.test:rules:1.3.0")
     androidTestImplementation("androidx.test:runner:1.3.0")
-    implementation(ANDROIDX_TEST_EXT_JUNIT)
-    implementation(ANDROIDX_TEST_UIAUTOMATOR)
+    implementation(libs.testExtJunit)
+    implementation(libs.testUiautomator)
 }
 
 androidx {
diff --git a/benchmark/integration-tests/dry-run-benchmark/build.gradle b/benchmark/integration-tests/dry-run-benchmark/build.gradle
index 8a4a70c..37da74aa 100644
--- a/benchmark/integration-tests/dry-run-benchmark/build.gradle
+++ b/benchmark/integration-tests/dry-run-benchmark/build.gradle
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -25,8 +23,8 @@
 
 dependencies {
     androidTestImplementation(project(":benchmark:benchmark-junit4"))
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(KOTLIN_STDLIB)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.kotlinStdlib)
 }
diff --git a/benchmark/integration-tests/macrobenchmark-target/build.gradle b/benchmark/integration-tests/macrobenchmark-target/build.gradle
index 13f9ec5..a9204d8 100644
--- a/benchmark/integration-tests/macrobenchmark-target/build.gradle
+++ b/benchmark/integration-tests/macrobenchmark-target/build.gradle
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
+import static androidx.build.dependencies.DependenciesKt.CONSTRAINT_LAYOUT
 
 plugins {
     id("AndroidXPlugin")
@@ -33,10 +33,10 @@
 }
 
 dependencies {
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
     implementation(CONSTRAINT_LAYOUT, { transitive = true })
     implementation("androidx.arch.core:core-runtime:2.1.0")
     implementation("androidx.appcompat:appcompat:1.2.0")
     implementation("androidx.recyclerview:recyclerview:1.1.0")
-    implementation(MATERIAL)
+    implementation(libs.material)
 }
diff --git a/benchmark/integration-tests/macrobenchmark/build.gradle b/benchmark/integration-tests/macrobenchmark/build.gradle
index 3067b8a..3627a44 100644
--- a/benchmark/integration-tests/macrobenchmark/build.gradle
+++ b/benchmark/integration-tests/macrobenchmark/build.gradle
@@ -14,13 +14,6 @@
  * limitations under the License.
  */
 
-
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-import static androidx.build.dependencies.DependenciesKt.*
-import androidx.build.LibraryGroups
-import androidx.build.Publish
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -38,11 +31,11 @@
     androidTestImplementation(project(":benchmark:benchmark-junit4"))
     androidTestImplementation(project(":benchmark:benchmark-macro-junit4"))
     androidTestImplementation(project(":internal-testutils-macrobenchmark"))
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testUiautomator)
 }
 
 // Define a task dependency so the app is installed before we run macro benchmarks.
diff --git a/benchmark/integration-tests/startup-benchmark/build.gradle b/benchmark/integration-tests/startup-benchmark/build.gradle
index 8a4a70c..37da74aa 100644
--- a/benchmark/integration-tests/startup-benchmark/build.gradle
+++ b/benchmark/integration-tests/startup-benchmark/build.gradle
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -25,8 +23,8 @@
 
 dependencies {
     androidTestImplementation(project(":benchmark:benchmark-junit4"))
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(KOTLIN_STDLIB)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.kotlinStdlib)
 }
diff --git a/benchmark/junit4/build.gradle b/benchmark/junit4/build.gradle
index a3f0f10..425cc63 100644
--- a/benchmark/junit4/build.gradle
+++ b/benchmark/junit4/build.gradle
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.Publish
 
 plugins {
@@ -34,15 +32,15 @@
 dependencies {
     api(project(":benchmark:benchmark-common"))
 
-    api(JUNIT)
-    api(KOTLIN_STDLIB)
+    api(libs.junit)
+    api(libs.kotlinStdlib)
 
     implementation("androidx.test:rules:1.3.0")
     implementation("androidx.test:runner:1.3.0")
     implementation("androidx.tracing:tracing-ktx:1.0.0")
     api("androidx.annotation:annotation:1.1.0")
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
+    androidTestImplementation(libs.testExtJunit)
 }
 
 androidx {
diff --git a/benchmark/macro-junit4/build.gradle b/benchmark/macro-junit4/build.gradle
index d159e9f..8f3927e 100644
--- a/benchmark/macro-junit4/build.gradle
+++ b/benchmark/macro-junit4/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 
@@ -34,8 +33,8 @@
 }
 
 dependencies {
-    api(JUNIT)
-    api(KOTLIN_STDLIB)
+    api(libs.junit)
+    api(libs.kotlinStdlib)
     api("androidx.annotation:annotation:1.1.0")
     api(project(":benchmark:benchmark-macro"))
     implementation(project(":benchmark:benchmark-common"))
@@ -46,13 +45,13 @@
     androidTestImplementation(project(":internal-testutils-ktx"))
     androidTestImplementation(project(":tracing:tracing-ktx"))
     androidTestImplementation("androidx.test:rules:1.3.0")
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.espressoCore)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy)
     // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy)
     // DexMaker has it"s own MockMaker
 }
 
diff --git a/benchmark/macro/build.gradle b/benchmark/macro/build.gradle
index 947bbd9..c5998dd 100644
--- a/benchmark/macro/build.gradle
+++ b/benchmark/macro/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 import androidx.build.SupportConfigKt
@@ -64,21 +63,21 @@
 }
 
 dependencies {
-    api(JUNIT)
-    api(KOTLIN_STDLIB)
+    api(libs.junit)
+    api(libs.kotlinStdlib)
     api("androidx.annotation:annotation:1.1.0")
 
     implementation(project(":benchmark:benchmark-common"))
-    implementation(ANDROIDX_TEST_CORE)
-    implementation(ANDROIDX_TEST_UIAUTOMATOR)
+    implementation(libs.testCore)
+    implementation(libs.testUiautomator)
     implementation(libs.wireRuntime)
 
     androidTestImplementation(project(":internal-testutils-ktx"))
     androidTestImplementation(project(":tracing:tracing-ktx"))
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(KOTLIN_TEST)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.kotlinTest)
 }
 
 androidx {
diff --git a/benchmark/macro/lint-baseline.xml b/benchmark/macro/lint-baseline.xml
index 6a2e95c..916146a 100644
--- a/benchmark/macro/lint-baseline.xml
+++ b/benchmark/macro/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/browser/browser/build.gradle b/browser/browser/build.gradle
index c98ffa8..c900186 100644
--- a/browser/browser/build.gradle
+++ b/browser/browser/build.gradle
@@ -1,6 +1,4 @@
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.Publish
 
 plugins {
@@ -21,28 +19,28 @@
 dependencies {
     api("androidx.core:core:1.1.0")
     api("androidx.annotation:annotation:1.1.0")
-    api(GUAVA_LISTENABLE_FUTURE)
+    api(libs.guavaListenableFuture)
 
     implementation("androidx.collection:collection:1.1.0")
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
     implementation("androidx.interpolator:interpolator:1.0.0")
 
-    annotationProcessor(NULLAWAY)
+    annotationProcessor(libs.nullaway)
 
-    testImplementation(ANDROIDX_TEST_CORE)
-    testImplementation(ANDROIDX_TEST_RUNNER)
-    testImplementation(JUNIT)
-    testImplementation(ROBOLECTRIC)
-    testImplementation(MOCKITO_CORE)
+    testImplementation(libs.testCore)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.junit)
+    testImplementation(libs.robolectric)
+    testImplementation(libs.mockitoCore)
 
     androidTestImplementation("androidx.appcompat:appcompat:1.0.0")
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.espressoCore, excludes.espresso)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(project(":internal-testutils-runtime"))
 }
 
diff --git a/browser/browser/lint-baseline.xml b/browser/browser/lint-baseline.xml
index 97ab8ed..b85e4387 100644
--- a/browser/browser/lint-baseline.xml
+++ b/browser/browser/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index 57adec7..71fdf91 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -10,7 +10,6 @@
 
     dependencies {
         classpath(libs.kotlinGradlePlugin)
-        classpath(libs.kgpLeakPatcher) // KT-46368
     }
 
     configurations.classpath.resolutionStrategy {
@@ -68,7 +67,6 @@
     cacheableApi(libs.androidGradlePlugin)
     cacheableImplementation(libs.dexMemberList)
     cacheableApi(libs.kotlinGradlePlugin)
-    cacheableImplementation(libs.kotlinPoet)
     cacheableImplementation(gradleApi())
     cacheableApi(libs.dokkaGradlePlugin)
     // needed by inspection plugin
@@ -80,14 +78,12 @@
     cacheableRuntimeOnly(libs.hiltAndroidGradlePlugin)
     // room kotlintestapp uses the ksp plugin but it does not publish a plugin marker yet
     cacheableApi(libs.kspGradlePlugin)
-    cacheableApi(libs.kgpLeakPatcher)
     // dependencies whose resolutions we don't need to cache
     compileOnly(findGradleKotlinDsl()) // Only one file in this configuration, no need to cache it
     implementation(project("jetpad-integration")) // Doesn't have a .pom, so not slow to load
 }
 
 apply plugin: "java-gradle-plugin"
-apply plugin: "dev.zacsweers.kgp-150-leak-patcher"
 
 sourceSets {
     main.java.srcDirs += "${supportRootFolder}/benchmark/gradle-plugin/src/main/kotlin"
diff --git a/buildSrc/dependencies.gradle b/buildSrc/dependencies.gradle
index 23c0358..5a1aaae 100644
--- a/buildSrc/dependencies.gradle
+++ b/buildSrc/dependencies.gradle
@@ -31,4 +31,10 @@
     exclude group: "androidx.core"
 }
 
+excludes.mlkit = {
+    exclude group: "androidx.fragment"
+    exclude group: "androidx.core"
+    exclude group: "androidx.exifinterface"
+}
+
 rootProject.ext["excludes"] = excludes
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlaygroundRootPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlaygroundRootPlugin.kt
index e229ac9..b7b0d63 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlaygroundRootPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlaygroundRootPlugin.kt
@@ -17,7 +17,6 @@
 package androidx.build
 
 import androidx.build.AndroidXRootPlugin.Companion.PROJECT_OR_ARTIFACT_EXT_NAME
-import androidx.build.ftl.FirebaseTestLabHelper
 import androidx.build.gradle.getByType
 import androidx.build.gradle.isRoot
 import com.android.build.gradle.LibraryExtension
@@ -71,9 +70,8 @@
         config = PlaygroundProperties.load(rootProject)
         repos = PlaygroundRepositories(config)
         rootProject.repositories.addPlaygroundRepositories()
-        val ftlUtilities = FirebaseTestLabHelper(target)
         rootProject.subprojects {
-            configureSubProject(it, ftlUtilities)
+            configureSubProject(it)
         }
 
         // TODO(b/185539993): Re-enable InvalidFragmentVersionForActivityResult which was
@@ -99,10 +97,7 @@
         }
     }
 
-    private fun configureSubProject(
-        project: Project,
-        firebaseTestLabHelper: FirebaseTestLabHelper
-    ) {
+    private fun configureSubProject(project: Project) {
         project.repositories.addPlaygroundRepositories()
         project.extra.set(PROJECT_OR_ARTIFACT_EXT_NAME, projectOrArtifactClosure)
         project.configurations.all { configuration ->
@@ -110,7 +105,6 @@
                 substitution.replaceIfSnapshot()
             }
         }
-        firebaseTestLabHelper.setupFTL(project)
     }
 
     /**
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
index 2dc4895..eb13252 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
@@ -230,9 +230,6 @@
                 configureAndroidLibraryWithMultiplatformPluginOptions()
             }
         }
-
-        // https://youtrack.jetbrains.com/issue/KT-46368
-        project.apply(plugin = "dev.zacsweers.kgp-150-leak-patcher")
     }
 
     @Suppress("UnstableApiUsage") // AGP DSL APIs
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXRootPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXRootPlugin.kt
index d7eb862..94644fb5 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXRootPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXRootPlugin.kt
@@ -35,10 +35,15 @@
 import org.gradle.api.tasks.bundling.ZipEntryCompression
 import org.gradle.kotlin.dsl.KotlinClosure1
 import org.gradle.kotlin.dsl.extra
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 import java.io.File
 import java.util.concurrent.ConcurrentHashMap
+import org.gradle.build.event.BuildEventsListenerRegistry
 
-class AndroidXRootPlugin : Plugin<Project> {
+abstract class AndroidXRootPlugin : Plugin<Project> {
+    @get:javax.inject.Inject
+    abstract val registry: BuildEventsListenerRegistry
+
     override fun apply(project: Project) {
         if (!project.isRoot) {
             throw Exception("This plugin should only be applied to root project")
@@ -218,12 +223,14 @@
 
         registerStudioTask()
 
-        TaskUpToDateValidator.setup(project)
+        TaskUpToDateValidator.setup(project, registry)
 
         project.tasks.register("listTaskOutputs", ListTaskOutputsTask::class.java) { task ->
             task.setOutput(File(project.getDistributionDirectory(), "task_outputs.txt"))
             task.removePrefix(project.getCheckoutRoot().path)
         }
+
+        project.ensureOneKotlinCompilerRunner()
     }
 
     @Suppress("UnstableApiUsage")
@@ -244,7 +251,23 @@
         androidx.build.dependencies.kspVersion = getVersion("ksp")
         androidx.build.dependencies.agpVersion = getVersion("androidGradlePlugin")
         androidx.build.dependencies.lintVersion = getVersion("androidLint")
-        androidx.build.dependencies.hiltVersion = getVersion("hilt")
+    }
+
+    // Experimental workaround for https://youtrack.jetbrains.com/issue/KT-46820
+    // Creates one kotlin compiler runner as soon as possible, to avoid concurrency issues when
+    // trying to create multiple at once
+    private fun Project.ensureOneKotlinCompilerRunner() {
+        val taskGraph = project.gradle.taskGraph
+        taskGraph.whenReady {
+            for (task in taskGraph.allTasks) {
+                val compile = task as? KotlinCompile
+                if (compile != null) {
+                    @Suppress("invisible_member")
+                    compile.compilerRunner()
+                    break
+                }
+            }
+        }
     }
 
     companion object {
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXUiPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXUiPlugin.kt
index a943bdd..996b451b 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXUiPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXUiPlugin.kt
@@ -128,11 +128,8 @@
                 apply(plugin = "org.jetbrains.kotlin.android")
             }
 
-            // https://youtrack.jetbrains.com/issue/KT-46368
-            apply(plugin = "dev.zacsweers.kgp-150-leak-patcher")
-
             configureManifests()
-            if (isMultiplatformEnabled()) {
+            if (isMultiplatformEnabled) {
                 configureForMultiplatform()
             } else {
                 configureForKotlinMultiplatformSourceStructure()
diff --git a/buildSrc/src/main/kotlin/androidx/build/Ktlint.kt b/buildSrc/src/main/kotlin/androidx/build/Ktlint.kt
index ffa2b12..ca240d4 100644
--- a/buildSrc/src/main/kotlin/androidx/build/Ktlint.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/Ktlint.kt
@@ -42,11 +42,12 @@
     val outputDir = "${project.buildDir}/reports/ktlint/"
     val inputDir = "src"
     val includeFiles = "**/*.kt"
-    val excludeFiles = "**/test-data/**/*.kt"
+    val excludeTestDataFiles = "**/test-data/**/*.kt"
+    val excludeExternalFiles = "**/external/**/*.kt"
     val inputFiles = project.fileTree(
         mutableMapOf(
             "dir" to inputDir, "include" to includeFiles,
-            "exclude" to excludeFiles
+            "exclude" to listOf(excludeTestDataFiles, excludeExternalFiles)
         )
     )
     val outputFile = "${outputDir}ktlint-checkstyle-report.xml"
@@ -65,7 +66,8 @@
             "--reporter=plain",
             "--reporter=checkstyle,output=$outputFile",
             "$inputDir/$includeFiles",
-            "!$inputDir/$excludeFiles"
+            "!$inputDir/$excludeTestDataFiles",
+            "!$inputDir/$excludeExternalFiles"
         )
     }
 
@@ -90,7 +92,8 @@
             "--reporter=plain",
             "--reporter=checkstyle,output=$outputFile",
             "$inputDir/$includeFiles",
-            "!$inputDir/$excludeFiles"
+            "!$inputDir/$excludeTestDataFiles",
+            "!$inputDir/$excludeExternalFiles"
         )
     }
 }
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index a4f8ddc..212a24f 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -48,7 +48,7 @@
     val CONTENTPAGER = Version("1.1.0-alpha01")
     val COMPOSE = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.0.0-beta08")
     val COORDINATORLAYOUT = Version("1.2.0-alpha01")
-    val CORE = Version("1.6.0-beta02")
+    val CORE = Version("1.7.0-alpha01")
     val CORE_ANIMATION = Version("1.0.0-alpha03")
     val CORE_ANIMATION_TESTING = Version("1.0.0-alpha03")
     val CORE_APPDIGEST = Version("1.0.0-alpha01")
@@ -100,11 +100,12 @@
     val RECYCLERVIEW = Version("1.3.0-alpha01")
     val RECYCLERVIEW_SELECTION = Version("1.2.0-alpha02")
     val REMOTECALLBACK = Version("1.0.0-alpha02")
-    val RESOURCEINSPECTION = Version("1.0.0-alpha01")
+    val RESOURCEINSPECTION = Version("1.0.0-alpha02")
     val ROOM = Version("2.4.0-alpha03")
     val SAVEDSTATE = Version("1.2.0-alpha01")
     val SECURITY = Version("1.1.0-alpha04")
     val SECURITY_APP_AUTHENTICATOR = Version("1.0.0-alpha02")
+    val SECURITY_APP_AUTHENTICATOR_TESTING = Version("1.0.0-alpha01")
     val SECURITY_BIOMETRIC = Version("1.0.0-alpha01")
     val SECURITY_IDENTITY_CREDENTIAL = Version("1.0.0-alpha02")
     val SHARETARGET = Version("1.2.0-alpha01")
@@ -113,7 +114,7 @@
     val SLICE_BUILDERS_KTX = Version("1.0.0-alpha08")
     val SLICE_REMOTECALLBACK = Version("1.0.0-alpha01")
     val SLIDINGPANELAYOUT = Version("1.2.0-alpha03")
-    val STARTUP = Version("1.1.0-beta02")
+    val STARTUP = Version("1.1.0-rc01")
     val SQLITE = Version("2.2.0-alpha01")
     val SQLITE_INSPECTOR = Version("2.1.0-alpha01")
     val SWIPEREFRESHLAYOUT = Version("1.2.0-alpha01")
diff --git a/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt b/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt
index 22a7375..bf2bcdd 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt
@@ -19,8 +19,14 @@
 import androidx.build.dependencyTracker.AffectedModuleDetector
 import androidx.build.gradle.getByType
 import com.android.build.gradle.internal.dsl.LintOptions
+import org.gradle.api.DefaultTask
 import org.gradle.api.Project
+import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.tasks.InputFile
+import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.TaskAction
 import java.io.File
+import java.util.Locale
 
 /**
  * Setting this property means that lint will update lint-baseline.xml if it exists.
@@ -85,7 +91,7 @@
     }
     afterEvaluate {
         for (variant in project.agpVariants) {
-            tasks.named("lint${variant.name.capitalize()}").configure { task ->
+            tasks.named("lint${variant.name.capitalize(Locale.US)}").configure { task ->
                 AffectedModuleDetector.configureTaskGuard(task)
             }
         }
@@ -94,12 +100,12 @@
 
 private fun Project.setUpLintDebugIfNeeded() {
     val variants = project.agpVariants
-    val variantNames = variants.map({ v -> v.name })
+    val variantNames = variants.map { v -> v.name }
     if (!variantNames.contains("debug")) {
         tasks.register("lintDebug") {
             for (variantName in variantNames) {
-                if (variantName.toLowerCase().contains("debug")) {
-                    it.dependsOn(tasks.named("lint${variantName.capitalize()}"))
+                if (variantName.toLowerCase(Locale.US).contains("debug")) {
+                    it.dependsOn(tasks.named("lint${variantName.capitalize(Locale.US)}"))
                 }
             }
         }
@@ -227,40 +233,50 @@
             if (updateLintBaseline) {
                 // Continue generating baselines regardless of errors.
                 isAbortOnError = false
+
                 // Avoid printing every single lint error to the terminal.
                 textReport = false
 
+                // Analyze tasks are responsible for reading baselines and detecting issues, but
+                // they won't detect any issues that are already in the baselines. Delete them
+                // before the task evaluates up-to-date-ness.
                 listOf(
                     tasks.named("lintAnalyzeDebug"),
                     tasks.named("lintAnalyze"),
                 ).forEach { task ->
-                    task.configure {
-                        // Delete any existing baseline so that we clear old obsolete entries.
-                        it.doFirst {
-                            lintBaseline.delete()
-                        }
+                    val removeBaselineTask = project.tasks.register(
+                        "removeBaselineOf${task.name.capitalize(Locale.US)}",
+                        RemoveBaselineTask::class.java,
+                    ) { baselineTask ->
+                        baselineTask.baselineFile.set(lintBaseline)
+                    }
 
-                        // Delete empty generated baselines because they are annoying.
-                        it.doLast {
-                            if (lintBaseline.exists()) {
-                                val hasAnyIssues = lintBaseline.reader().useLines { lines ->
-                                    lines.any { line ->
-                                        line.endsWith("<issue")
-                                    }
-                                }
-                                if (!hasAnyIssues) {
-                                    // Using println is consistent with lint's own output.
-                                    println(
-                                        "Removed empty baseline file ${lintBaseline.absolutePath}"
-                                    )
-                                    lintBaseline.delete()
-                                }
-                            }
-                        }
+                    task.configure {
+                        it.dependsOn(removeBaselineTask)
+                    }
+                }
+
+                // Regular lint tasks are responsible for reading the output of analyze tasks and
+                // generating baseline files. They will fail if they generate a new baseline but
+                // there are no issues, so we need to delete the file as a finalization step.
+                listOf(
+                    tasks.named("lintDebug"),
+                    tasks.named("lint"),
+                ).forEach { task ->
+                    val removeEmptyBaselineTask = project.tasks.register(
+                        "removeEmptyBaselineOf${task.name.capitalize(Locale.US)}",
+                        RemoveEmptyBaselineTask::class.java,
+                    ) { baselineTask ->
+                        baselineTask.baselineFile.set(lintBaseline)
+                    }
+
+                    task.configure {
+                        it.finalizedBy(removeEmptyBaselineTask)
                     }
                 }
 
                 // Continue running after errors or after creating a new, blank baseline file.
+                // This doesn't work right now due to b/188545420, but it's technically correct.
                 System.setProperty(LINT_BASELINE_CONTINUE, "true")
             }
 
@@ -271,7 +287,7 @@
                 task.configure {
                     it.doLast {
                         // Workaround for b/187319075 where lint uses the wrong output dir.
-                        var lintBuildDir = File(project.projectDir, "build")
+                        val lintBuildDir = File(project.projectDir, "build")
                         if (lintBuildDir.isDirectory) {
                             lintBuildDir.deleteRecursively()
                         }
@@ -290,3 +306,44 @@
 }
 
 val Project.lintBaseline get() = File(projectDir, "/lint-baseline.xml")
+
+/**
+ * Task that removes the specified `lint-baseline.xml` file if it does not contain any issues.
+ */
+abstract class RemoveEmptyBaselineTask : DefaultTask() {
+    @get:InputFile
+    abstract val baselineFile: RegularFileProperty
+
+    @TaskAction
+    fun removeEmptyBaseline() {
+        val lintBaseline = baselineFile.get().asFile
+        if (lintBaseline.exists()) {
+            // Does the baseline contain any issues?
+            val hasAnyIssues = lintBaseline.reader().useLines { lines ->
+                lines.any { line ->
+                    line.endsWith("<issue")
+                }
+            }
+            if (!hasAnyIssues) {
+                lintBaseline.delete()
+                println("Deleted empty baseline file ${lintBaseline.path}")
+            }
+        }
+    }
+}
+
+/**
+ * Task that removes the specified `lint-baseline.xml` file.
+ */
+abstract class RemoveBaselineTask : DefaultTask() {
+    @get:InputFiles // allows missing files
+    abstract val baselineFile: RegularFileProperty
+
+    @TaskAction
+    fun removeBaseline() {
+        val lintBaseline = baselineFile.get().asFile
+        if (lintBaseline.exists()) {
+            lintBaseline.delete()
+        }
+    }
+}
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
index a31cbd8..fbb8c91 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
@@ -19,14 +19,25 @@
 import androidx.build.OperatingSystem
 import androidx.build.getOperatingSystem
 
-const val ANDROIDX_TEST_CORE = "androidx.test:core:1.3.0"
+const val ANDROIDX_TEST_VERSION = "1.3.0"
+const val ANDROIDX_TEST_CORE = "androidx.test:core:$ANDROIDX_TEST_VERSION"
 const val ANDROIDX_TEST_EXT_JUNIT = "androidx.test.ext:junit:1.1.2"
 const val ANDROIDX_TEST_EXT_KTX = "androidx.test.ext:junit-ktx:1.1.2"
-const val ANDROIDX_TEST_EXT_TRUTH = "androidx.test.ext:truth:1.3.0"
-const val ANDROIDX_TEST_MONITOR = "androidx.test:monitor:1.3.0"
-const val ANDROIDX_TEST_RULES = "androidx.test:rules:1.3.0"
-const val ANDROIDX_TEST_RUNNER = "androidx.test:runner:1.3.0"
+const val ANDROIDX_TEST_EXT_TRUTH = "androidx.test.ext:truth:$ANDROIDX_TEST_VERSION"
+const val ANDROIDX_TEST_MONITOR = "androidx.test:monitor:$ANDROIDX_TEST_VERSION"
+const val ANDROIDX_TEST_RULES = "androidx.test:rules:$ANDROIDX_TEST_VERSION"
+const val ANDROIDX_TEST_RUNNER = "androidx.test:runner:$ANDROIDX_TEST_VERSION"
 const val ANDROIDX_TEST_UIAUTOMATOR = "androidx.test.uiautomator:uiautomator:2.2.0"
+
+// Remove ANDROIDX_TEST_*_LATEST once ANDROIDX_TEST_* upgrades to the next stable release
+// after 1.3.0, and replace all usages of ANDROIDX_TEST_*_LATEST with ANDROIDX_TEST_*
+const val ANDROIDX_TEST_LATEST_VERSION = "1.4.0-alpha06"
+const val ANDROIDX_TEST_CORE_LATEST = "androidx.test:core:$ANDROIDX_TEST_LATEST_VERSION"
+const val ANDROIDX_TEST_EXT_TRUTH_LATEST = "androidx.test.ext:truth:$ANDROIDX_TEST_LATEST_VERSION"
+const val ANDROIDX_TEST_MONITOR_LATEST = "androidx.test:monitor:$ANDROIDX_TEST_LATEST_VERSION"
+const val ANDROIDX_TEST_RULES_LATEST = "androidx.test:rules:$ANDROIDX_TEST_LATEST_VERSION"
+const val ANDROIDX_TEST_RUNNER_LATEST = "androidx.test:runner:$ANDROIDX_TEST_LATEST_VERSION"
+
 const val AUTO_COMMON = "com.google.auto:auto-common:0.11"
 const val AUTO_SERVICE_ANNOTATIONS = "com.google.auto.service:auto-service-annotations:1.0-rc6"
 const val AUTO_SERVICE_PROCESSOR = "com.google.auto.service:auto-service:1.0-rc6"
@@ -61,20 +72,14 @@
 const val GUAVA_LISTENABLE_FUTURE = "com.google.guava:listenablefuture:1.0"
 const val GRADLE_INCAP_HELPER = "net.ltgt.gradle.incap:incap:0.2"
 const val GRADLE_INCAP_HELPER_PROCESSOR = "net.ltgt.gradle.incap:incap-processor:0.2"
-internal lateinit var hiltVersion: String
-val HILT_ANDROID get() = "com.google.dagger:hilt-android:$hiltVersion"
-val HILT_ANDROID_TESTING get() = "com.google.dagger:hilt-android-testing:$hiltVersion"
-val HILT_ANDROID_GRADLE_PLUGIN get() = "com.google.dagger:hilt-android-gradle-plugin:$hiltVersion"
-val HILT_COMPILER get() = "com.google.dagger:hilt-compiler:$hiltVersion"
-val HILT_CORE get() = "com.google.dagger:hilt-core:$hiltVersion"
 const val INTELLIJ_ANNOTATIONS = "com.intellij:annotations:12.0"
 const val JAVAPOET = "com.squareup:javapoet:1.13.0"
 const val JSQLPARSER = "com.github.jsqlparser:jsqlparser:3.1"
 const val JSR250 = "javax.annotation:javax.annotation-api:1.2"
 const val JUNIT = "junit:junit:4.12"
 const val KOTLINPOET = "com.squareup:kotlinpoet:1.8.0"
-const val KOTLIN_COMPILE_TESTING = "com.github.tschuchortdev:kotlin-compile-testing:1.3.6"
-const val KOTLIN_COMPILE_TESTING_KSP = "com.github.tschuchortdev:kotlin-compile-testing-ksp:1.3.6"
+const val KOTLIN_COMPILE_TESTING = "com.github.tschuchortdev:kotlin-compile-testing:1.4.0"
+const val KOTLIN_COMPILE_TESTING_KSP = "com.github.tschuchortdev:kotlin-compile-testing-ksp:1.4.0"
 
 /**
  * KSP is used both as a plugin and runtime dependency, hence its version is declared in the
@@ -82,9 +87,9 @@
  */
 internal lateinit var kspVersion: String
 val KSP_VERSION get() = kspVersion
-const val KOTLIN_GRADLE_PLUGIN = "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.0"
+const val KOTLIN_GRADLE_PLUGIN = "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.10"
 
-const val KOTLIN_METADATA_JVM = "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.2.0"
+const val KOTLIN_METADATA_JVM = "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.3.0"
 
 const val LEAKCANARY = "com.squareup.leakcanary:leakcanary-android:2.2"
 const val LEAKCANARY_INSTRUMENTATION =
@@ -96,7 +101,7 @@
 const val MULTIDEX = "androidx.multidex:multidex:2.0.1"
 const val NULLAWAY = "com.uber.nullaway:nullaway:0.3.7"
 const val PLAY_CORE = "com.google.android.play:core:1.9.1"
-const val PLAY_SERVICES_BASE = "com.google.android.gms:play-services-base:17.0.0"
+const val PLAY_SERVICES_BASEMENT = "com.google.android.gms:play-services-basement:17.0.0"
 const val REACTIVE_STREAMS = "org.reactivestreams:reactive-streams:1.0.0"
 const val RX_JAVA = "io.reactivex.rxjava2:rxjava:2.2.9"
 const val RX_JAVA3 = "io.reactivex.rxjava3:rxjava:3.0.0"
diff --git a/buildSrc/src/main/kotlin/androidx/build/docs/AndroidXDocsPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/docs/AndroidXDocsPlugin.kt
index 0ca085d..da31e71 100644
--- a/buildSrc/src/main/kotlin/androidx/build/docs/AndroidXDocsPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/docs/AndroidXDocsPlugin.kt
@@ -570,8 +570,10 @@
     "androidx/benchmark/**",
     "androidx/collection/**",
     "androidx/compose/**",
+    "androidx/lifecycle/**",
     "androidx/navigation/**",
     "androidx/paging/**",
+    "androidx/room/**",
     "androidx/window/**"
 )
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/ftl/FirebaseTestLabHelper.kt b/buildSrc/src/main/kotlin/androidx/build/ftl/FirebaseTestLabHelper.kt
deleted file mode 100644
index 04ab48b..0000000
--- a/buildSrc/src/main/kotlin/androidx/build/ftl/FirebaseTestLabHelper.kt
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.build.ftl
-
-import androidx.build.gradle.isRoot
-import com.android.build.gradle.TestedExtension
-import org.gradle.api.Project
-
-/**
- * Helper class to setup Firebase Test Lab for instrumentation tests
- */
-internal class FirebaseTestLabHelper(
-    private val rootProject: Project
-) {
-    init {
-        check(rootProject.isRoot) {
-            "FTL Utilities can only be created for root projects"
-        }
-    }
-
-    private val anchorTask by lazy {
-        rootProject.tasks.register(ANCHOR_TASK_NAME) {
-            it.description = "Anchor task that depends on all firebase test lab tests"
-            it.group = "Verification"
-        }
-    }
-
-    fun setupFTL(project: Project) {
-        AGP_PLUGIN_IDS.forEach { agpPluginId ->
-            // using base plugin at this stage does not work as base plugin is applied before the
-            // Android Extension is created.
-            // see the comment on [AGP_PLUGIN_IDS] for details.
-            project.pluginManager.withPlugin(agpPluginId) {
-                project.extensions.findByType(TestedExtension::class.java)?.let {
-                    configure(project, it)
-                }
-            }
-        }
-    }
-
-    private fun configure(project: Project, testedExtension: TestedExtension) {
-        testedExtension.testVariants.all { testVariant ->
-            RunTestOnFTLTask.create(project, testVariant)?.let { ftlTask ->
-                anchorTask.configure { it.dependsOn(ftlTask) }
-            }
-        }
-    }
-
-    companion object {
-        const val ANCHOR_TASK_NAME = "firebaseTestLabTests"
-
-        /**
-         * AGP base plugin is applied before the extension is created so instead we use plugin
-         * ids here.
-         * see: https://github.com/google/ksp/issues/314
-         * see: https://github.com/google/ksp/pull/318
-         */
-        private val AGP_PLUGIN_IDS = listOf(
-            "com.android.application",
-            // TODO enable library and dynamic feature when we can synthesize
-            //  an APK for them
-            //  "com.android.library",
-            //  "com.android.dynamic-feature"
-        )
-    }
-}
\ No newline at end of file
diff --git a/buildSrc/src/main/kotlin/androidx/build/ftl/GCloudCLIWrapper.kt b/buildSrc/src/main/kotlin/androidx/build/ftl/GCloudCLIWrapper.kt
deleted file mode 100644
index 385e271..0000000
--- a/buildSrc/src/main/kotlin/androidx/build/ftl/GCloudCLIWrapper.kt
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.build.ftl
-
-import androidx.build.ftl.GCloudCLIWrapper.RunTestParameters.Companion.TEST_OUTPUT_FILE_NAME
-import com.google.gson.Gson
-import com.google.gson.annotations.SerializedName
-import com.google.gson.reflect.TypeToken
-import org.gradle.api.GradleException
-import org.gradle.process.ExecOperations
-import java.io.ByteArrayOutputStream
-import java.io.File
-import java.util.Locale
-import java.util.UUID
-
-/**
- * Wrapper around GCloud CLI.
- *
- * https://cloud.google.com/sdk/gcloud
- *
- * Note that this wrapper requires gcloud to be available on the host machine.
- *
- * documentation for FTL:
- * https://cloud.google.com/sdk/gcloud/reference/firebase/test/android/run
- */
-@Suppress("UnstableApiUsage") // ExecOperations
-internal class GCloudCLIWrapper(
-    private val execOperations: ExecOperations
-) {
-    private val gson = Gson()
-
-    /**
-     * Path to the gcloud executable, derived from `which gcloud` call.
-     */
-    private val gcloud: String by lazy {
-        findExecutable("gcloud")
-    }
-
-    /**
-     * Path to the gsutil executable, derived from `which gsutil` call.
-     */
-    private val gsutil: String by lazy {
-        findExecutable("gsutil")
-    }
-
-    private inline fun <reified T> executeGcloud(
-        vararg params: String
-    ): T {
-        val output = ByteArrayOutputStream()
-        val errorOutput = ByteArrayOutputStream()
-        val execResult = execOperations.exec {
-            it.executable = gcloud
-            it.args = params.toList() + "--format=json"
-            it.standardOutput = output
-            it.errorOutput = errorOutput
-            it.isIgnoreExitValue = true
-        }
-        if (execResult.exitValue != 0) {
-            System.err.println("GCloud command failed: ${errorOutput.toString(Charsets.UTF_8)}")
-        }
-        // still try to parse the because when it fails (e.g. test failure), it returns a non-0
-        // exit code but still prints the output. We are interested in the output.
-        val commandOutput = output.toString(Charsets.UTF_8)
-        return gson.parse(commandOutput)
-    }
-
-    private fun execGsUtil(
-        vararg params: String
-    ): String {
-        val output = ByteArrayOutputStream()
-        execOperations.exec {
-            it.executable = gsutil
-            it.args = params.toList()
-            it.standardOutput = output
-        }
-        return output.toString(Charsets.UTF_8)
-    }
-
-    /**
-     * https://cloud.google.com/sdk/gcloud/reference/firebase/test/android/run
-     */
-    fun runTest(
-        params: RunTestParameters
-    ): List<TestResult> {
-        val testResults = executeGcloud<List<TestResult>>(
-            "firebase", "test", "android", "run",
-            "--type", "instrumentation",
-            "--test", params.testApk.canonicalPath,
-            "--app", params.testedApk.canonicalPath,
-            "--num-flaky-test-attempts", "2",
-            "--results-bucket=${params.bucketName}",
-            "--results-dir=${params.resultsBucketDir}",
-            "--results-history-name=${params.projectPath}"
-        )
-        // copy the test results from the bucket to the build directory
-        execGsUtil(
-            "cp", "-r", params.cloudBucketPath() + "/*", params.resultsLocalDir.canonicalPath
-        )
-        // finally, write the command response into the directory as well
-        val testResultOutput = params.resultsLocalDir.resolve(TEST_OUTPUT_FILE_NAME)
-        testResultOutput.bufferedWriter(Charsets.UTF_8).use {
-            gson.toJson(
-                testResults,
-                it
-            )
-        }
-        return testResults
-    }
-
-    /**
-     * find the given executable's path in the PATH via `which` command.
-     */
-    private fun findExecutable(name: String): String {
-        val output = ByteArrayOutputStream()
-        val result = execOperations.exec {
-            it.commandLine("which", name)
-            it.standardOutput = output
-            it.isIgnoreExitValue = true
-        }
-        if (result.exitValue != 0) {
-            throw GradleException(
-                """
-                Unable to find $name CLI executable.
-                `which $name` returned exit code ${result.exitValue}.
-                Make sure gcloud CLI is installed, authenticated and is part of your PATH.
-                See https://cloud.google.com/sdk/gcloud for installation instructions.
-                """.trimIndent()
-            )
-        }
-        return output.toString(Charsets.UTF_8).trim()
-    }
-
-    /**
-     * Data structure format for gcloud FTL command
-     */
-    internal data class TestResult(
-        @SerializedName("axis_value")
-        val axisValue: String,
-        val outcome: String,
-        @SerializedName("test_details")
-        val testDetails: String
-    ) {
-        val passed
-            get() = outcome.toLowerCase(Locale.US) in SUCCESS_OUTCOMES
-
-        companion object {
-            private val SUCCESS_OUTCOMES = listOf("passed", "flaky")
-        }
-    }
-
-    /**
-     * Parameters for invoking a test on the Firebase Test Lab
-     */
-    internal data class RunTestParameters(
-        /**
-         * The project path for which we are executing the tests for.
-         */
-        val projectPath: String,
-        /**
-         * The tested APK file
-         */
-        val testedApk: File,
-        /**
-         * The test APK file which includes the instrumentation tests
-         */
-        val testApk: File,
-        /**
-         * The name of the GS bucket to save the results
-         */
-        val bucketName: String = DEFAULT_BUCKET_NAME,
-        /**
-         * The GS Bucket directory where the results will be saved
-         */
-        val resultsBucketDir: String = buildRelativeResultDirPath(projectPath),
-        /**
-         * The local directory where we will download the test results
-         */
-        val resultsLocalDir: File,
-    ) {
-
-        /**
-         * Returns the path to the Google Cloud bucket where the test run results are saved
-         */
-        fun cloudBucketPath(): String {
-            return "gs://$bucketName/$resultsBucketDir"
-        }
-
-        companion object {
-            const val DEFAULT_BUCKET_NAME = "androidx-ftl-test-results"
-
-            /**
-             * The file into which the result of the gcloud command will be written.
-             */
-            const val TEST_OUTPUT_FILE_NAME = "testResults.json"
-
-            /**
-             * Generates a relative path for test results.
-             *
-             * If run on Github Actions CI, this method will use the environment variables to
-             * create a unique path for the action.
-             * If run locally, this will create a random UUID for the directory.
-             */
-            private fun buildRelativeResultDirPath(
-                projectPath: String
-            ): String {
-                // github action env variables:
-                // https://docs.github.com/en/actions/reference/environment-variables
-                val inGithubActions = System.getenv().containsKey("GITHUB_ACTIONS")
-                val pathValues = if (inGithubActions) {
-                    val workflowName = requireEnvValue("GITHUB_WORKFLOW")
-                    val runNumber = requireEnvValue("GITHUB_RUN_NUMBER")
-                    val runId = requireEnvValue("GITHUB_RUN_ID")
-                    val ref = System.getenv("GITHUB_REF")
-                    listOfNotNull(
-                        "github",
-                        projectPath,
-                        ref,
-                        workflowName,
-                        runNumber,
-                        runId,
-                    )
-                } else {
-                    listOf(
-                        "local",
-                        projectPath,
-                        UUID.randomUUID().toString()
-                    )
-                }
-                return pathValues.joinToString("/")
-            }
-
-            private fun requireEnvValue(name: String): String {
-                return System.getenv(name) ?: throw GradleException(
-                    "Cannot find required environment variable: $name"
-                )
-            }
-        }
-    }
-}
-
-private inline fun <reified T> Gson.parse(
-    input: String
-): T {
-    val typeToken = object : TypeToken<T>() {}.type
-    return this.fromJson(input, typeToken)
-}
\ No newline at end of file
diff --git a/buildSrc/src/main/kotlin/androidx/build/ftl/RunTestOnFTLTask.kt b/buildSrc/src/main/kotlin/androidx/build/ftl/RunTestOnFTLTask.kt
deleted file mode 100644
index 8ec207d..0000000
--- a/buildSrc/src/main/kotlin/androidx/build/ftl/RunTestOnFTLTask.kt
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.build.ftl
-
-import androidx.build.getDistributionDirectory
-import androidx.build.getSupportRootFolder
-import com.android.build.gradle.api.ApkVariant
-import com.android.build.gradle.api.ApkVariantOutput
-import com.android.build.gradle.api.TestVariant
-import org.gradle.api.DefaultTask
-import org.gradle.api.GradleException
-import org.gradle.api.Project
-import org.gradle.api.file.DirectoryProperty
-import org.gradle.api.file.RegularFileProperty
-import org.gradle.api.provider.Property
-import org.gradle.api.tasks.CacheableTask
-import org.gradle.api.tasks.Copy
-import org.gradle.api.tasks.InputFile
-import org.gradle.api.tasks.OutputDirectory
-import org.gradle.api.tasks.PathSensitive
-import org.gradle.api.tasks.PathSensitivity
-import org.gradle.api.tasks.TaskAction
-import org.gradle.api.tasks.TaskProvider
-import org.gradle.process.ExecOperations
-import org.gradle.workers.WorkAction
-import org.gradle.workers.WorkParameters
-import org.gradle.workers.WorkerExecutor
-import javax.inject.Inject
-
-/**
- * Task to run instrumentation tests on FTL.
- *
- * This task is only enabled on playground projects and requires gcloud CLI to be available on
- * the device with the right permissions.
- *
- * Due to the limitations of FTL, this task only support application instrumentation tests for now.
- */
-@Suppress("UnstableApiUsage") // for gradle property APIs
-@CacheableTask
-abstract class RunTestOnFTLTask @Inject constructor(
-    private val workerExecutor: WorkerExecutor
-) : DefaultTask() {
-    /**
-     * The test APK for the instrumentation test.
-     */
-    @get:[InputFile PathSensitive(PathSensitivity.NONE)]
-    abstract val testApk: RegularFileProperty
-
-    /**
-     * The tested application APK.
-     */
-    @get:[InputFile PathSensitive(PathSensitivity.NONE)]
-    abstract val testedApk: RegularFileProperty
-
-    /**
-     * Output file to write the results
-     */
-    @get:OutputDirectory
-    abstract val testResults: DirectoryProperty
-
-    @TaskAction
-    fun executeTest() {
-        workerExecutor.noIsolation().submit(
-            RunFTLTestWorkAction::class.java
-        ) {
-            it.testApk.set(testApk)
-            it.testedApk.set(testedApk)
-            it.testResults.set(testResults)
-            it.projectPath.set(project.relativeResultPath())
-        }
-    }
-
-    interface RunFTLTestParams : WorkParameters {
-        val projectPath: Property<String>
-        val testApk: RegularFileProperty
-        val testedApk: RegularFileProperty
-        val testResults: DirectoryProperty
-    }
-
-    abstract class RunFTLTestWorkAction @Inject constructor(
-        private val execOperations: ExecOperations
-    ) : WorkAction<RunFTLTestParams> {
-        override fun execute() {
-            val localTestResultDir = parameters.testResults.asFile.get()
-            localTestResultDir.apply {
-                deleteRecursively()
-                mkdirs()
-            }
-            val testApk = parameters.testApk.asFile.get()
-            val testedApk = parameters.testedApk.asFile.get()
-            val gcloud = GCloudCLIWrapper(execOperations)
-            val params = GCloudCLIWrapper.RunTestParameters(
-                testedApk = testedApk,
-                testApk = testApk,
-                projectPath = parameters.projectPath.get(),
-                resultsLocalDir = localTestResultDir
-
-            )
-            val result = gcloud.runTest(params)
-            val failed = result.filterNot {
-                it.passed
-            }
-            if (failed.isNotEmpty()) {
-                throw GradleException("These tests failed: $failed")
-            }
-        }
-    }
-
-    companion object {
-        private const val TASK_SUFFIX = "OnFirebaseTestLab"
-
-        /**
-         * Creates an FTL test runner task and returns it.
-         * Note that only application tests are supported hence this will return `null` for
-         * library projects.
-         */
-        fun create(project: Project, testVariant: TestVariant): TaskProvider<RunTestOnFTLTask>? {
-            // TODO add support for library project, which might require synthesizing another
-            //  APK :facepalm:
-            // see: // https://stackoverflow.com/questions/59827750/execute-instrumented-test-for-an-android-library-with-firebase-test-lab
-            val testedVariant = testVariant.testedVariant as? ApkVariant
-                ?: return null
-            val taskName = testVariant.name + TASK_SUFFIX
-            val testResultDir = project.layout.buildDirectory.dir(
-                "ftl-results"
-            )
-            // create task to copy results into dist directory
-            val copyToDistTask = project.tasks.register(
-                "copyResultsOf${taskName}ToDist",
-                Copy::class.java
-            ) {
-                it.description = "Copy test results from $taskName into DIST folder"
-                it.group = "build"
-                it.from(testResultDir)
-                it.into(
-                    project.getDistributionDirectory()
-                        .resolve("ftl-results/${project.relativeResultPath()}/$taskName")
-                )
-            }
-            return project.tasks.register(taskName, RunTestOnFTLTask::class.java) { task ->
-                task.description = "Run ${testVariant.name} tests on Firebase Test Lab"
-                task.group = "Verification"
-                task.testResults.set(testResultDir)
-                task.dependsOn(testVariant.packageApplicationProvider)
-                task.dependsOn(testedVariant.packageApplicationProvider)
-
-                task.testApk.set(
-                    testVariant.outputs
-                        .withType(ApkVariantOutput::class.java)
-                        .firstOrNull()
-                        ?.outputFile
-                )
-                task.testedApk.set(
-                    testedVariant.outputs
-                        .withType(ApkVariantOutput::class.java)
-                        .firstOrNull()
-                        ?.outputFile
-                )
-                task.finalizedBy(copyToDistTask)
-            }
-        }
-    }
-}
-
-/**
- * Returns the relative path of the project wrt the support root. This path is used for both
- * local dist path and cloud bucket paths.
- */
-private fun Project.relativeResultPath() = projectDir.relativeTo(
-    project.getSupportRootFolder()
-).path
\ No newline at end of file
diff --git a/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt b/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
index 8fe820e..1752636 100644
--- a/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
@@ -16,14 +16,15 @@
 
 package androidx.build.uptodatedness
 
-import androidx.build.VERIFY_UP_TO_DATE
 import org.gradle.api.GradleException
 import org.gradle.api.Project
 import org.gradle.api.Task
-import org.gradle.api.execution.TaskExecutionGraph
-import org.gradle.kotlin.dsl.extra
-import java.io.File
-import java.util.Date
+import org.gradle.api.services.BuildService
+import org.gradle.api.services.BuildServiceParameters
+import org.gradle.build.event.BuildEventsListenerRegistry
+import org.gradle.tooling.events.FinishEvent
+import org.gradle.tooling.events.OperationCompletionListener
+import org.gradle.tooling.events.task.TaskExecutionResult
 
 /**
  * Validates that all tasks (except a temporary exception list) are considered up-to-date.
@@ -34,7 +35,6 @@
  */
 
 const val DISALLOW_TASK_EXECUTION_FLAG_NAME = "disallowExecution"
-const val RECORD_FLAG_NAME = VERIFY_UP_TO_DATE
 
 // Temporary set of exempt tasks that are known to still be out-of-date after running once
 // Entries in this set may be task names (like assembleRelease) or task paths
@@ -143,7 +143,13 @@
     "buildCMakeRelWithDebInfo",
     ":appsearch:appsearch-local-storage:buildCMakeDebug[icing]",
     ":appsearch:appsearch-local-storage:buildCMakeRelWithDebInfo[icing]",
-    ":hilt:hilt-navigation-compose:kaptGenerateStubsReleaseKotlin"
+    ":hilt:hilt-navigation-compose:kaptGenerateStubsDebugKotlin",
+    ":hilt:hilt-navigation-compose:kaptGenerateStubsReleaseKotlin",
+
+    // https://github.com/gradle/gradle/issues/17262
+    ":doclava:compileJava",
+    ":doclava:processResources",
+    ":doclava:jar"
 )
 
 // Additional tasks that are expected to be temporarily out-of-date after running once
@@ -168,22 +174,53 @@
     "lintVitalRelease",
 )
 
-class TaskUpToDateValidator {
+class TaskUpToDateValidator :
+    BuildService<TaskUpToDateValidator.Parameters>, OperationCompletionListener {
+    open class Parameters : BuildServiceParameters
+    override fun getParameters(): Parameters {
+        return Parameters()
+    }
+
+    override fun onFinish(event: FinishEvent) {
+        val result = event.result
+        if (result is TaskExecutionResult) {
+            val name = event.descriptor.name
+            val executionReasons = result.executionReasons
+            if (executionReasons.isNullOrEmpty()) {
+                // empty list means task was actually up-to-date, see docs for
+                // TaskExecutionResult.executionReasons
+                // null list means the task already failed, so we'll skip emitting our error
+                return
+            }
+            if (!isAllowedToRerunTask(name)) {
+                throw GradleException(
+                    "Ran two consecutive builds of the same tasks, and in the " +
+                        "second build, observed:\n" +
+                        "task $name not UP-TO-DATE. It was out-of-date because:\n" +
+                        "${result.executionReasons}"
+                )
+            }
+        }
+    }
+
     companion object {
-
-        private val BUILD_START_TIME_KEY = "taskUpToDateValidatorSetupTime"
-
-        private fun shouldRecord(project: Project): Boolean {
-            return project.hasProperty(RECORD_FLAG_NAME)
-        }
-
         private fun shouldValidate(project: Project): Boolean {
-            return project.hasProperty(DISALLOW_TASK_EXECUTION_FLAG_NAME)
+            return project.providers.gradleProperty(DISALLOW_TASK_EXECUTION_FLAG_NAME)
+                .forUseAtConfigurationTime().isPresent()
         }
 
-        private fun isAllowedToRerunTask(task: Task): Boolean {
-            return ALLOW_RERUNNING_TASKS.contains(task.name) ||
-                ALLOW_RERUNNING_TASKS.contains(task.path)
+        private fun isAllowedToRerunTask(taskPath: String): Boolean {
+            if (ALLOW_RERUNNING_TASKS.contains(taskPath)) {
+                return true
+            }
+            val colonIndex = taskPath.lastIndexOf(":")
+            if (colonIndex >= 0) {
+                val taskName = taskPath.substring(colonIndex + 1)
+                if (ALLOW_RERUNNING_TASKS.contains(taskName)) {
+                    return true
+                }
+            }
+            return false
         }
 
         private fun shouldTryRerunningTask(task: Task): Boolean {
@@ -193,168 +230,25 @@
                 )
         }
 
-        private fun recordBuildStartTime(rootProject: Project) {
-            rootProject.extra.set(BUILD_START_TIME_KEY, Date())
-        }
+        fun setup(rootProject: Project, registry: BuildEventsListenerRegistry) {
+            if (!shouldValidate(rootProject)) {
+                return
+            }
+            // create listener for validating that any task that reran was expected to rerun
+            val validatorProvider = rootProject.getGradle().getSharedServices()
+                .registerIfAbsent(
+                    "TaskUpToDateValidator",
+                    TaskUpToDateValidator::class.java,
+                    { _ -> }
+                )
+            registry.onTaskCompletion(validatorProvider)
 
-        private fun getBuildStartTime(project: Project): Date {
-            return project.rootProject.extra.get(BUILD_START_TIME_KEY) as Date
-        }
-
-        fun setup(rootProject: Project) {
-            recordBuildStartTime(rootProject)
-            val taskGraph = rootProject.gradle.taskGraph
-            if (shouldValidate(rootProject)) {
-                taskGraph.beforeTask { task ->
-                    if (!shouldTryRerunningTask(task)) {
-                        task.enabled = false
-                    }
+            // skip rerunning tasks that are known to be unnecessary to rerun
+            rootProject.allprojects { subproject ->
+                subproject.tasks.configureEach { task ->
+                    task.onlyIf { shouldTryRerunningTask(task) }
                 }
             }
-            if (shouldRecord(rootProject) || shouldValidate(rootProject)) {
-                taskGraph.afterTask { task ->
-                    // In the second build, make sure that the task didn't rerun
-                    if (shouldValidate(rootProject)) {
-                        if (task.didWork) {
-                            if (!isAllowedToRerunTask(task)) {
-                                val message = "Ran two consecutive builds of the same tasks," +
-                                    " and in the second build, observed $task to be not " +
-                                    " UP-TO-DATE. This indicates that $task does not declare" +
-                                    " inputs and/or outputs correctly.\n" +
-                                    tryToExplainTaskExecution(task, taskGraph)
-                                throw GradleException(message)
-                            }
-                        }
-                    }
-                    // In the first build, record the task's inputs so that if they change in
-                    // the second build then we can compare.
-                    // In the second build, also record the task's inputs because we recorded
-                    // them in the first build, and we want the two builds to be as similar as
-                    // possible
-                    if (shouldTryRerunningTask(task) && !isAllowedToRerunTask(task)) {
-                        recordTaskInputs(task)
-                    }
-                }
-            }
-        }
-
-        fun recordTaskInputs(task: Task) {
-            val text = task.inputs.files.files.joinToString("\n")
-            val destFile = getTaskInputListPath(task)
-            destFile.parentFile.mkdirs()
-            destFile.writeText(text)
-        }
-
-        fun getTaskInputListPath(task: Task): File {
-            return File(getTasksInputListPath(task.project), task.name)
-        }
-
-        fun getTasksInputListPath(project: Project): File {
-            return File(project.buildDir, "TaskUpToDateValidator/inputs")
-        }
-
-        fun getPreviousTaskExecutionCompletionTimestamp(task: Task): Date {
-            // we're already saving the inputs of the task into a file,
-            // so we can check the timestamp of that file to know when the task last reran
-            val inputsFile = getTaskInputListPath(task)
-            return Date(inputsFile.lastModified())
-        }
-
-        fun checkForChangingSetOfInputs(task: Task): String {
-            val previousInputsFile = getTaskInputListPath(task)
-            val previousInputs = previousInputsFile.readLines()
-            val currentInputs = task.inputs.files.files.map { f -> f.toString() }
-            val addedInputs = currentInputs.minus(previousInputs)
-            val removedInputs = previousInputs.minus(currentInputs)
-            val addedMessage = if (addedInputs.size > 0) {
-                "Added these " + addedInputs.size + " inputs: " +
-                    addedInputs.joinToString("\n") + "\n"
-            } else {
-                ""
-            }
-            val removedMessage = if (removedInputs.size > 0) {
-                "Removed these " + removedInputs.size + " inputs: " +
-                    removedInputs.joinToString("\n") + "\n"
-            } else {
-                ""
-            }
-            return addedMessage + removedMessage
-        }
-
-        fun tryToExplainTaskExecution(task: Task, taskGraph: TaskExecutionGraph): String {
-            val numOutputFiles = task.outputs.files.files.size
-            val outputsMessage = if (numOutputFiles > 0) {
-                task.path + " declares " + numOutputFiles + " output files. This seems fine.\n"
-            } else {
-                task.path + " declares " + numOutputFiles + " output files. This is probably " +
-                    "an error.\n"
-            }
-
-            val inputFiles = task.inputs.files.files
-            var lastModifiedFile: File? = null
-            var lastModifiedWhen = Date(0)
-            for (inputFile in inputFiles) {
-                val modifiedWhen = Date(inputFile.lastModified())
-                if (modifiedWhen.compareTo(lastModifiedWhen) > 0) {
-                    lastModifiedFile = inputFile
-                    lastModifiedWhen = modifiedWhen
-                }
-            }
-
-            val inputSetModifiedMessage = checkForChangingSetOfInputs(task)
-            val inputsMessage = if (inputSetModifiedMessage != "") {
-                inputSetModifiedMessage
-            } else {
-                if (lastModifiedFile != null) {
-                    task.path + " declares " + inputFiles.size + " input files. The " +
-                        "last modified input file is\n" + lastModifiedFile + "\nmodified at " +
-                        lastModifiedWhen + " (the previous execution of this task completed at " +
-                        getPreviousTaskExecutionCompletionTimestamp(task) + " and this build " +
-                        "started at about " + getBuildStartTime(task.project) + "). " +
-                        tryToExplainFileModification(lastModifiedFile, taskGraph)
-                } else {
-                    task.path + " declares " + inputFiles.size + " input files.\n"
-                }
-            }
-
-            val reproductionMessage = "\nTo reproduce this error you can try running " +
-                "`./gradlew ${task.path} -P$RECORD_FLAG_NAME`\n"
-            val readLogsMessage = "\nYou can check why Gradle executed ${task.path} by " +
-                "passing the '--info' flag to Gradle and then searching stdout for output " +
-                "generated immediately before the task began to execute.\n" +
-                "Our best guess for the reason that ${task.path} executed is below.\n"
-            return readLogsMessage + outputsMessage + inputsMessage + reproductionMessage
-        }
-
-        fun getTaskDeclaringFile(file: File, taskGraph: TaskExecutionGraph): Task? {
-            for (task in taskGraph.allTasks) {
-                if (task.outputs.files.files.contains(file)) {
-                    return task
-                }
-            }
-            return null
-        }
-
-        fun tryToExplainFileModification(file: File, taskGraph: TaskExecutionGraph): String {
-            // Find the task declaring this file as an output,
-            // or the task declaring one of its parent dirs as an output
-            var createdByTask: Task? = null
-            var declaredFile: File? = file
-            while (createdByTask == null && declaredFile != null) {
-                createdByTask = getTaskDeclaringFile(declaredFile, taskGraph)
-                declaredFile = declaredFile.parentFile
-            }
-            if (createdByTask == null) {
-                return "This file is not declared as the output of any task in this build."
-            }
-            if (isAllowedToRerunTask(createdByTask)) {
-                return "This file is declared as an output of " + createdByTask +
-                    ", which is a task that is not yet validated by the TaskUpToDateValidator"
-            } else {
-                return "This file is decared as an output of " + createdByTask +
-                    ", which is a task that is validated by the TaskUpToDateValidator " +
-                    "(and therefore must not have been out-of-date during this build)"
-            }
         }
     }
 }
diff --git a/busytown/androidx_incremental.sh b/busytown/androidx_incremental.sh
index b5d5079..2c3383c1 100755
--- a/busytown/androidx_incremental.sh
+++ b/busytown/androidx_incremental.sh
@@ -29,9 +29,22 @@
 }
 hashOutDir
 
+# diagnostics to hopefully help us figure out b/188565660
+function zipKotlinMetadata() {
+  zipFile=kotlinMetadata.zip
+  echo "zipping kotlin metadata"
+  (cd $OUT_DIR && find -name "*kotlin_metadata" | xargs zip "$DIST_DIR/$zipFile")
+  echo done zipping kotlin metadata
+}
+
 # Run Gradle
-impl/build.sh buildOnServer checkExternalLicenses listTaskOutputs validateAllProperties \
-    --profile "$@"
+if impl/build.sh buildOnServer checkExternalLicenses listTaskOutputs validateAllProperties \
+    --profile "$@"; then
+  echo build succeeded
+else
+  zipKotlinMetadata
+  echo build failed
+fi
 
 # Parse performance profile reports (generated with the --profile option above) and re-export the metrics in an easily machine-readable format for tracking
 impl/parse_profile_htmls.sh
diff --git a/busytown/androidx_multiplatform.sh b/busytown/androidx_multiplatform.sh
index 70493d7..813a0b5 100755
--- a/busytown/androidx_multiplatform.sh
+++ b/busytown/androidx_multiplatform.sh
@@ -4,4 +4,4 @@
 cd "$(dirname $0)"
 
 # Disabled due to b/185938795
-# ./androidx.sh -Pandroidx.compose.multiplatformEnabled=true "$@"
+./androidx.sh -Pandroidx.compose.multiplatformEnabled=true "$@"
diff --git a/camera/camera-camera2-pipe-integration/build.gradle b/camera/camera-camera2-pipe-integration/build.gradle
index d7ee6fb..09c1751 100644
--- a/camera/camera-camera2-pipe-integration/build.gradle
+++ b/camera/camera-camera2-pipe-integration/build.gradle
@@ -14,14 +14,13 @@
  * limitations under the License.
  */
 
+
 import androidx.build.BundleInsideHelper
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -49,29 +48,29 @@
     // Classes and types that are only needed at runtime
     implementation(project(":lifecycle:lifecycle-livedata-ktx"))
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
-    implementation(KOTLIN_COROUTINES_GUAVA)
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinCoroutinesGuava)
+    implementation(libs.kotlinStdlib)
 
     // Since we jarjar CameraPipe, include the transitive dependencies as implementation
     implementation(CAMERA_PIPE_DEPS.API)
     implementation(CAMERA_PIPE_DEPS.IMPLEMENTATION)
 
-    kapt(DAGGER_COMPILER)
+    kapt(libs.dagger)
 
-    testImplementation(ANDROIDX_TEST_CORE)
-    testImplementation(ANDROIDX_TEST_RUNNER)
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
-    testImplementation(ROBOLECTRIC)
-    testImplementation(KOTLIN_COROUTINES_TEST)
+    testImplementation(libs.testCore)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
+    testImplementation(libs.robolectric)
+    testImplementation(libs.kotlinCoroutinesTest)
     testImplementation(project(":camera:camera-camera2-pipe-testing"))
     testImplementation(project(":internal-testutils-truth"))
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(KOTLIN_COROUTINES_ANDROID)
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(TRUTH)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.kotlinCoroutinesAndroid)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.truth)
     androidTestImplementation(project(":annotation:annotation-experimental"))
     androidTestImplementation(project(":camera:camera-lifecycle"))
     androidTestImplementation(project(":concurrent:concurrent-futures-ktx"))
diff --git a/camera/camera-camera2-pipe-testing/build.gradle b/camera/camera-camera2-pipe-testing/build.gradle
index c340844..189f0a1 100644
--- a/camera/camera-camera2-pipe-testing/build.gradle
+++ b/camera/camera-camera2-pipe-testing/build.gradle
@@ -14,14 +14,13 @@
  * limitations under the License.
  */
 
+
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
 import androidx.build.RunApiTasks
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -33,16 +32,16 @@
     api("androidx.annotation:annotation:1.1.0")
 
     // Classes and types that are only needed at runtime
-    implementation(KOTLIN_STDLIB)
-    implementation(KOTLIN_COROUTINES_GUAVA)
+    implementation(libs.kotlinStdlib)
+    implementation(libs.kotlinCoroutinesGuava)
     implementation(project(":camera:camera-camera2-pipe"))
 
-    testImplementation(ANDROIDX_TEST_CORE)
-    testImplementation(ANDROIDX_TEST_RUNNER)
-    testImplementation(JUNIT)
-    testImplementation(ROBOLECTRIC)
-    testImplementation(TRUTH)
-    testImplementation(KOTLIN_COROUTINES_TEST)
+    testImplementation(libs.testCore)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.junit)
+    testImplementation(libs.robolectric)
+    testImplementation(libs.truth)
+    testImplementation(libs.kotlinCoroutinesTest)
 }
 
 android {
diff --git a/camera/camera-camera2-pipe/build.gradle b/camera/camera-camera2-pipe/build.gradle
index 50d5b87..bbc9516 100644
--- a/camera/camera-camera2-pipe/build.gradle
+++ b/camera/camera-camera2-pipe/build.gradle
@@ -14,14 +14,13 @@
  * limitations under the License.
  */
 
+
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
 import androidx.build.RunApiTasks
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -38,22 +37,22 @@
     api(CAMERA_PIPE_DEPS.API)
     implementation(CAMERA_PIPE_DEPS.IMPLEMENTATION)
 
-    kapt(DAGGER_COMPILER)
+    kapt(libs.dagger)
 
-    testImplementation(ANDROIDX_TEST_CORE)
-    testImplementation(ANDROIDX_TEST_RUNNER)
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
-    testImplementation(ROBOLECTRIC)
-    testImplementation(KOTLIN_COROUTINES_TEST)
+    testImplementation(libs.testCore)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
+    testImplementation(libs.robolectric)
+    testImplementation(libs.kotlinCoroutinesTest)
     testImplementation(project(":camera:camera-camera2-pipe-testing"))
     testImplementation(project(":internal-testutils-truth"))
 
-    kaptTest(DAGGER_COMPILER)
+    kaptTest(libs.dagger)
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(TRUTH)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.truth)
 }
 
 android {
diff --git a/camera/camera-camera2-pipe/dependencies.gradle b/camera/camera-camera2-pipe/dependencies.gradle
index 6cd62b7..dfbf6eb 100644
--- a/camera/camera-camera2-pipe/dependencies.gradle
+++ b/camera/camera-camera2-pipe/dependencies.gradle
@@ -19,7 +19,7 @@
 ext {
     CAMERA_PIPE_DEPS = [
         API : [
-                "androidx.annotation:annotation:1.0.0",
+                "androidx.annotation:annotation:1.2.0",
                 KOTLIN_STDLIB,
                 KOTLIN_COROUTINES_ANDROID,
                 "org.jetbrains.kotlinx:atomicfu:0.13.1"
diff --git a/camera/camera-camera2-pipe/lint-baseline.xml b/camera/camera-camera2-pipe/lint-baseline.xml
deleted file mode 100644
index 205967d..0000000
--- a/camera/camera-camera2-pipe/lint-baseline.xml
+++ /dev/null
@@ -1,290 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.Camera2CameraMetadata is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        characteristics.physicalCameraIds.orEmpty().map { CameraId(it) }.toSet()"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt"
-            line="137"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        cameraDevice.createReprocessableCaptureSession("
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
-            line="160"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        cameraDevice.createConstrainedHighSpeedCaptureSession("
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
-            line="179"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        cameraDevice.createCaptureSessionByOutputConfigurations("
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
-            line="197"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        cameraDevice.createReprocessableCaptureSessionByConfigurations("
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
-            line="216"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            InputConfiguration(inputConfig.width, inputConfig.height, inputConfig.format),"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
-            line="217"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        val sessionConfig = SessionConfiguration("
-        errorLine2="                            ^">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
-            line="227"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            sessionConfig.inputConfiguration = InputConfiguration("
-        errorLine2="                                               ^">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
-            line="235"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            sessionConfig.inputConfiguration = InputConfiguration("
-        errorLine2="                                               ^">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
-            line="235"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            sessionConfig.inputConfiguration = InputConfiguration("
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
-            line="235"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        sessionConfig.sessionParameters = requestBuilder.build()"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
-            line="255"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        cameraDevice.createCaptureSession(sessionConfig)"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
-            line="257"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        cameraDevice.createReprocessCaptureRequest(inputResult)"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
-            line="270"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraCaptureSession is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return cameraCaptureSession.isReprocessable"
-        errorLine2="                                            ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt"
-            line="299"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraCaptureSession is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return cameraCaptureSession.inputSurface"
-        errorLine2="                                            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt"
-            line="309"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraCaptureSession is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            cameraCaptureSession.finalizeOutputConfigurations(outputConfigs.map { it.unwrap() })"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt"
-            line="326"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.camera.camera2.pipe.compat.AndroidOutputConfiguration.Companion is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                configuration = OutputConfiguration(size, outputKlass)"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt"
-            line="174"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.AndroidOutputConfiguration.Companion is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    configuration.maxSharedSurfaceCount"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt"
-            line="192"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.camera.camera2.pipe.compat.AndroidOutputConfiguration.Companion is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                this.enableSurfaceSharing()"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt"
-            line="203"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.AndroidOutputConfiguration.Companion is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                this.setPhysicalCameraId(physicalCameraId.value)"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt"
-            line="210"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.camera.camera2.pipe.compat.AndroidOutputConfiguration is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return output.surfaces"
-        errorLine2="                              ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt"
-            line="219"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.camera.camera2.pipe.compat.AndroidOutputConfiguration is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            output.addSurface(surface)"
-        errorLine2="                   ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt"
-            line="231"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.AndroidOutputConfiguration is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            output.removeSurface(surface)"
-        errorLine2="                   ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt"
-            line="238"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.core.Permissions is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            if (context.checkSelfPermission(Manifest.permission.CAMERA) == PERMISSION_GRANTED) {"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/core/Permissions.kt"
-            line="56"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.VirtualCameraManager is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        instance.openCamera("
-        errorLine2="                                 ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt"
-            line="237"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.VirtualCameraManager is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            manager.registerAvailabilityCallback(threads.camera2Executor, availabilityCallback)"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt"
-            line="328"
-            column="21"/>
-    </issue>
-
-</issues>
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ApiCompat.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ApiCompat.kt
index 3c1377e..f2d49f8 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ApiCompat.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/ApiCompat.kt
@@ -16,25 +16,191 @@
 
 package androidx.camera.camera2.pipe.compat
 
+import android.content.Context
+import android.hardware.camera2.CameraAccessException
+import android.hardware.camera2.CameraCaptureSession
 import android.hardware.camera2.CameraCharacteristics
+import android.hardware.camera2.CameraDevice
+import android.hardware.camera2.CameraManager
 import android.hardware.camera2.CaptureRequest
 import android.hardware.camera2.CaptureResult
 import android.hardware.camera2.TotalCaptureResult
+import android.hardware.camera2.params.InputConfiguration
 import android.hardware.camera2.params.OutputConfiguration
+import android.hardware.camera2.params.SessionConfiguration
 import android.os.Build
+import android.os.Handler
+import android.util.Size
+import android.view.Surface
+import androidx.annotation.DoNotInline
 import androidx.annotation.RequiresApi
+import androidx.annotation.RequiresPermission
+import java.util.concurrent.Executor
+
+@RequiresApi(Build.VERSION_CODES.M)
+internal object Api23Compat {
+    @JvmStatic
+    @DoNotInline
+    @Throws(CameraAccessException::class)
+    @Suppress("deprecation")
+    fun createReprocessableCaptureSession(
+        cameraDevice: CameraDevice,
+        inputConfig: InputConfiguration,
+        outputs: List<Surface>,
+        callback: CameraCaptureSession.StateCallback,
+        handler: Handler?
+    ) {
+        cameraDevice.createReprocessableCaptureSession(inputConfig, outputs, callback, handler)
+    }
+
+    @JvmStatic
+    @DoNotInline
+    @Throws(CameraAccessException::class)
+    @Suppress("deprecation")
+    fun createConstrainedHighSpeedCaptureSession(
+        cameraDevice: CameraDevice,
+        outputs: List<Surface>,
+        stateCallback: CameraCaptureSession.StateCallback,
+        handler: Handler?
+    ) {
+        cameraDevice.createConstrainedHighSpeedCaptureSession(
+            outputs,
+            stateCallback,
+            handler
+        )
+    }
+
+    @JvmStatic
+    @DoNotInline
+    @Throws(CameraAccessException::class)
+    fun createReprocessCaptureRequest(
+        cameraDevice: CameraDevice,
+        inputResult: TotalCaptureResult,
+    ): CaptureRequest.Builder {
+        return cameraDevice.createReprocessCaptureRequest(inputResult)
+    }
+
+    @JvmStatic
+    @DoNotInline
+    fun isReprocessable(cameraCaptureSession: CameraCaptureSession): Boolean {
+        return cameraCaptureSession.isReprocessable
+    }
+
+    @JvmStatic
+    @DoNotInline
+    fun getInputSurface(cameraCaptureSession: CameraCaptureSession): Surface? {
+        return cameraCaptureSession.inputSurface
+    }
+
+    @JvmStatic
+    @DoNotInline
+    fun newInputConfiguration(width: Int, height: Int, format: Int): InputConfiguration {
+        return InputConfiguration(width, height, format)
+    }
+
+    @JvmStatic
+    @DoNotInline
+    fun checkSelfPermission(context: Context, permission: String): Int {
+        return context.checkSelfPermission(permission)
+    }
+}
 
 @RequiresApi(Build.VERSION_CODES.N)
 internal object Api24Compat {
     @JvmStatic
+    @DoNotInline
+    @Throws(CameraAccessException::class)
+    @Suppress("deprecation")
+    fun createCaptureSessionByOutputConfigurations(
+        cameraDevice: CameraDevice,
+        outputConfig: List<OutputConfiguration?>,
+        stateCallback: CameraCaptureSession.StateCallback,
+        handler: Handler?
+    ) {
+        cameraDevice.createCaptureSessionByOutputConfigurations(
+            outputConfig,
+            stateCallback,
+            handler
+        )
+    }
+
+    @JvmStatic
+    @DoNotInline
+    @Throws(CameraAccessException::class)
+    @Suppress("deprecation")
+    fun createCaptureSessionByOutputConfigurations(
+        cameraDevice: CameraDevice,
+        inputConfig: InputConfiguration,
+        outputs: List<OutputConfiguration?>,
+        stateCallback: CameraCaptureSession.StateCallback,
+        handler: Handler?
+    ) {
+        cameraDevice.createReprocessableCaptureSessionByConfigurations(
+            inputConfig,
+            outputs,
+            stateCallback,
+            handler
+        )
+    }
+
+    @JvmStatic
+    @DoNotInline
     fun getSurfaceGroupId(outputConfiguration: OutputConfiguration): Int {
         return outputConfiguration.surfaceGroupId
     }
 }
 
+@RequiresApi(Build.VERSION_CODES.O)
+internal object Api26Compat {
+    @JvmStatic
+    @DoNotInline
+    @Throws(CameraAccessException::class)
+    fun finalizeOutputConfigurations(
+        cameraCaptureSession: CameraCaptureSession,
+        outputConfiguration: List<OutputConfiguration?>
+    ) {
+        return cameraCaptureSession.finalizeOutputConfigurations(outputConfiguration)
+    }
+
+    @JvmStatic
+    @DoNotInline
+    fun newOutputConfiguration(size: Size, klass: Class<*>): OutputConfiguration {
+        return OutputConfiguration(size, klass)
+    }
+
+    @JvmStatic
+    @DoNotInline
+    fun enableSurfaceSharing(outputConfig: OutputConfiguration) {
+        outputConfig.enableSurfaceSharing()
+    }
+
+    @JvmStatic
+    @DoNotInline
+    fun getSurfaces(outputConfig: OutputConfiguration): List<Surface> {
+        return outputConfig.surfaces
+    }
+
+    @JvmStatic
+    @DoNotInline
+    fun addSurfaces(outputConfig: OutputConfiguration, surface: Surface) {
+        return outputConfig.addSurface(surface)
+    }
+}
+
 @RequiresApi(Build.VERSION_CODES.P)
 internal object Api28Compat {
     @JvmStatic
+    @Throws(CameraAccessException::class)
+    @DoNotInline
+    fun createCaptureSession(
+        cameraDevice: CameraDevice,
+        sessionConfig: SessionConfiguration,
+    ) {
+        cameraDevice.createCaptureSession(sessionConfig)
+    }
+
+    @JvmStatic
+    @DoNotInline
     fun getAvailablePhysicalCameraRequestKeys(
         cameraCharacteristics: CameraCharacteristics
     ): List<CaptureRequest.Key<*>>? {
@@ -42,6 +208,7 @@
     }
 
     @JvmStatic
+    @DoNotInline
     fun getAvailableSessionKeys(
         cameraCharacteristics: CameraCharacteristics
     ): List<CaptureRequest.Key<*>>? {
@@ -49,9 +216,88 @@
     }
 
     @JvmStatic
+    @DoNotInline
+    fun getPhysicalCameraIds(
+        cameraCharacteristics: CameraCharacteristics
+    ): Set<String> {
+        return cameraCharacteristics.physicalCameraIds
+    }
+
+    @JvmStatic
+    @DoNotInline
     fun getPhysicalCaptureResults(
         totalCaptureResult: TotalCaptureResult
     ): Map<String, CaptureResult>? {
         return totalCaptureResult.physicalCameraResults
     }
-}
\ No newline at end of file
+
+    @JvmStatic
+    @DoNotInline
+    fun newSessionConfiguration(
+        sessionType: Int,
+        outputs: List<OutputConfiguration?>,
+        executor: Executor,
+        stateCallback: CameraCaptureSession.StateCallback
+    ): SessionConfiguration {
+        return SessionConfiguration(sessionType, outputs, executor, stateCallback)
+    }
+
+    @JvmStatic
+    @DoNotInline
+    fun setInputConfiguration(
+        sessionConfig: SessionConfiguration,
+        inputConfig: InputConfiguration
+    ) {
+        sessionConfig.inputConfiguration = inputConfig
+    }
+
+    @JvmStatic
+    @DoNotInline
+    fun setSessionParameters(
+        sessionConfig: SessionConfiguration,
+        params: CaptureRequest
+    ) {
+        sessionConfig.sessionParameters = params
+    }
+
+    @JvmStatic
+    @DoNotInline
+    fun getMaxSharedSurfaceCount(outputConfig: OutputConfiguration): Int {
+        return outputConfig.maxSharedSurfaceCount
+    }
+
+    @JvmStatic
+    @DoNotInline
+    fun setPhysicalCameraId(outputConfig: OutputConfiguration, cameraId: String?) {
+        outputConfig.setPhysicalCameraId(cameraId)
+    }
+
+    @JvmStatic
+    @DoNotInline
+    fun removeSurface(outputConfig: OutputConfiguration, surface: Surface) {
+        return outputConfig.removeSurface(surface)
+    }
+
+    @JvmStatic
+    @Throws(CameraAccessException::class)
+    @DoNotInline
+    @RequiresPermission(android.Manifest.permission.CAMERA)
+    fun openCamera(
+        cameraManager: CameraManager,
+        cameraId: String,
+        executor: Executor,
+        callback: CameraDevice.StateCallback
+    ) {
+        cameraManager.openCamera(cameraId, executor, callback)
+    }
+
+    @JvmStatic
+    @DoNotInline
+    fun registerAvailabilityCallback(
+        cameraManager: CameraManager,
+        executor: Executor,
+        callback: CameraManager.AvailabilityCallback
+    ) {
+        cameraManager.registerAvailabilityCallback(executor, callback)
+    }
+}
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt
index a1b29bb..8f9b59d 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt
@@ -134,7 +134,10 @@
                 try {
                     Debug.trace("Camera-${camera.value}#physicalCameraIds") {
                         @Suppress("UselessCallOnNotNull")
-                        characteristics.physicalCameraIds.orEmpty().map { CameraId(it) }.toSet()
+                        Api28Compat.getPhysicalCameraIds(characteristics)
+                            .orEmpty()
+                            .map { CameraId(it) }
+                            .toSet()
                     }
                 } catch (ignored: AssertionError) {
                     emptySet()
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt
index 3dec65c..0eed94e 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt
@@ -16,12 +16,10 @@
 
 package androidx.camera.camera2.pipe.compat
 
-import android.annotation.SuppressLint
 import android.hardware.camera2.CameraDevice
 import android.hardware.camera2.CaptureRequest
 import android.hardware.camera2.TotalCaptureResult
 import android.hardware.camera2.params.InputConfiguration
-import android.hardware.camera2.params.SessionConfiguration
 import android.os.Build
 import android.os.Handler
 import android.view.Surface
@@ -35,7 +33,6 @@
 import androidx.camera.camera2.pipe.core.Timestamps
 import androidx.camera.camera2.pipe.core.Timestamps.formatMs
 import androidx.camera.camera2.pipe.writeParameter
-import kotlin.jvm.Throws
 
 /** Interface around a [CameraDevice] with minor modifications.
  *
@@ -146,7 +143,6 @@
     }
 
     @RequiresApi(23)
-    @SuppressLint("UnsafeNewApiCall")
     override fun createReprocessableCaptureSession(
         input: InputConfiguration,
         outputs: List<Surface>,
@@ -156,8 +152,8 @@
 
         // This function was deprecated in Android Q, but is required for some configurations when
         // running on older versions of the OS.
-        @Suppress("deprecation")
-        cameraDevice.createReprocessableCaptureSession(
+        Api23Compat.createReprocessableCaptureSession(
+            cameraDevice,
             input,
             outputs,
             AndroidCaptureSessionStateCallback(this, stateCallback),
@@ -166,7 +162,6 @@
     }
 
     @RequiresApi(23)
-    @SuppressLint("UnsafeNewApiCall")
     override fun createConstrainedHighSpeedCaptureSession(
         outputs: List<Surface>,
         stateCallback: CameraCaptureSessionWrapper.StateCallback,
@@ -175,8 +170,8 @@
 
         // This function was deprecated in Android Q, but is required for some configurations when
         // running on older versions of the OS.
-        @Suppress("deprecation")
-        cameraDevice.createConstrainedHighSpeedCaptureSession(
+        Api23Compat.createConstrainedHighSpeedCaptureSession(
+            cameraDevice,
             outputs,
             AndroidCaptureSessionStateCallback(this, stateCallback),
             handler
@@ -184,7 +179,6 @@
     }
 
     @RequiresApi(24)
-    @SuppressLint("UnsafeNewApiCall")
     override fun createCaptureSessionByOutputConfigurations(
         outputConfigurations: List<OutputConfigurationWrapper>,
         stateCallback: CameraCaptureSessionWrapper.StateCallback,
@@ -193,8 +187,8 @@
 
         // This function was deprecated in Android Q, but is required for some configurations when
         // running on older versions of the OS.
-        @Suppress("deprecation")
-        cameraDevice.createCaptureSessionByOutputConfigurations(
+        Api24Compat.createCaptureSessionByOutputConfigurations(
+            cameraDevice,
             outputConfigurations.map { it.unwrap() },
             AndroidCaptureSessionStateCallback(this, stateCallback),
             handler
@@ -202,7 +196,6 @@
     }
 
     @RequiresApi(24)
-    @SuppressLint("UnsafeNewApiCall")
     override fun createReprocessableCaptureSessionByConfigurations(
         inputConfig: InputConfigData,
         outputs: List<OutputConfigurationWrapper>,
@@ -212,9 +205,11 @@
 
         // This function was deprecated in Android Q, but is required for some configurations when
         // running on older versions of the OS.
-        @Suppress("deprecation")
-        cameraDevice.createReprocessableCaptureSessionByConfigurations(
-            InputConfiguration(inputConfig.width, inputConfig.height, inputConfig.format),
+        Api24Compat.createCaptureSessionByOutputConfigurations(
+            cameraDevice,
+            Api23Compat.newInputConfiguration(
+                inputConfig.width, inputConfig.height, inputConfig.format
+            ),
             outputs.map { it.unwrap() },
             AndroidCaptureSessionStateCallback(this, stateCallback),
             handler
@@ -222,9 +217,8 @@
     }
 
     @RequiresApi(28)
-    @SuppressLint("UnsafeNewApiCall")
     override fun createCaptureSession(config: SessionConfigData) = rethrowCamera2Exceptions {
-        val sessionConfig = SessionConfiguration(
+        val sessionConfig = Api28Compat.newSessionConfiguration(
             config.sessionType,
             config.outputConfigurations.map { it.unwrap() },
             config.executor,
@@ -232,10 +226,13 @@
         )
 
         if (config.inputConfiguration != null) {
-            sessionConfig.inputConfiguration = InputConfiguration(
-                config.inputConfiguration.width,
-                config.inputConfiguration.height,
-                config.inputConfiguration.format
+            Api28Compat.setInputConfiguration(
+                sessionConfig,
+                Api23Compat.newInputConfiguration(
+                    config.inputConfiguration.width,
+                    config.inputConfiguration.height,
+                    config.inputConfiguration.format
+                )
             )
         }
 
@@ -252,9 +249,9 @@
                 requestBuilder.writeParameter(key, value)
             }
         }
-        sessionConfig.sessionParameters = requestBuilder.build()
+        Api28Compat.setSessionParameters(sessionConfig, requestBuilder.build())
 
-        cameraDevice.createCaptureSession(sessionConfig)
+        Api28Compat.createCaptureSession(cameraDevice, sessionConfig)
     }
 
     override fun createCaptureRequest(template: RequestTemplate): CaptureRequest.Builder =
@@ -263,11 +260,10 @@
         }
 
     @RequiresApi(23)
-    @SuppressLint("UnsafeNewApiCall")
     override fun createReprocessCaptureRequest(
         inputResult: TotalCaptureResult
     ): CaptureRequest.Builder = rethrowCamera2Exceptions {
-        cameraDevice.createReprocessCaptureRequest(inputResult)
+        Api23Compat.createReprocessCaptureRequest(cameraDevice, inputResult)
     }
 
     override fun unwrap(): CameraDevice? {
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt
index 72dde57..cab2111 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt
@@ -16,7 +16,6 @@
 
 package androidx.camera.camera2.pipe.compat
 
-import android.annotation.SuppressLint
 import android.hardware.camera2.CameraCaptureSession
 import android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession
 import android.hardware.camera2.CaptureRequest
@@ -28,7 +27,6 @@
 import androidx.camera.camera2.pipe.core.Log
 import kotlinx.atomicfu.atomic
 import java.io.Closeable
-import kotlin.jvm.Throws
 
 /**
  * Interface shim for [CameraCaptureSession] with minor modifications.
@@ -293,20 +291,18 @@
     }
 
     override val isReprocessable: Boolean
-        @SuppressLint("UnsafeNewApiCall")
         get() {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-                return cameraCaptureSession.isReprocessable
+                return Api23Compat.isReprocessable(cameraCaptureSession)
             }
             // Reprocessing is not supported  prior to Android M
             return false
         }
 
     override val inputSurface: Surface?
-        @SuppressLint("UnsafeNewApiCall")
         get() {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-                return cameraCaptureSession.inputSurface
+                return Api23Compat.getInputSurface(cameraCaptureSession)
             }
             // Reprocessing is not supported prior to Android M, and a CaptureSession that does not
             // support reprocessing will have a null input surface on M and beyond.
@@ -314,7 +310,6 @@
         }
 
     @RequiresApi(26)
-    @SuppressLint("UnsafeNewApiCall")
     override fun finalizeOutputConfigurations(outputConfigs: List<OutputConfigurationWrapper>) {
         check(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             "Attempting to call finalizeOutputConfigurations before O is not supported and may " +
@@ -323,7 +318,12 @@
         }
 
         rethrowCamera2Exceptions {
-            cameraCaptureSession.finalizeOutputConfigurations(outputConfigs.map { it.unwrap() })
+            Api26Compat.finalizeOutputConfigurations(
+                cameraCaptureSession,
+                outputConfigs.map {
+                    it.unwrap()
+                }
+            )
         }
     }
 
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt
index 810bf78..6d120e6 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt
@@ -171,7 +171,7 @@
                         "Unsupported OutputType: $outputType"
                     )
                 }
-                configuration = OutputConfiguration(size, outputKlass)
+                configuration = Api26Compat.newOutputConfiguration(size, outputKlass)
             }
 
             // Enable surface sharing, if set.
@@ -189,7 +189,7 @@
                 configuration,
                 surfaceSharing,
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                    configuration.maxSharedSurfaceCount
+                    Api28Compat.getMaxSharedSurfaceCount(configuration)
                 } else {
                     1
                 },
@@ -200,14 +200,14 @@
         private fun OutputConfiguration.enableSurfaceSharingCompat() {
             checkNOrHigher("surfaceSharing")
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-                this.enableSurfaceSharing()
+                Api26Compat.enableSurfaceSharing(this)
             }
         }
 
         private fun OutputConfiguration.setPhysicalCameraIdCompat(physicalCameraId: CameraId) {
             checkPOrHigher("physicalCameraId")
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                this.setPhysicalCameraId(physicalCameraId.value)
+                Api28Compat.setPhysicalCameraId(this, physicalCameraId.value)
             }
         }
     }
@@ -216,7 +216,7 @@
     override val surfaces: List<Surface>
         get() {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                return output.surfaces
+                return Api26Compat.getSurfaces(output)
             }
 
             // On older versions of the OS, only one surface is allowed, and if an output
@@ -228,14 +228,14 @@
     override fun addSurface(surface: Surface) {
         checkOOrHigher("addSurface")
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            output.addSurface(surface)
+            Api26Compat.addSurfaces(output, surface)
         }
     }
 
     override fun removeSurface(surface: Surface) {
         checkPOrHigher("removeSurface")
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-            output.removeSurface(surface)
+            Api28Compat.removeSurface(output, surface)
         }
     }
 
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt
index cb70f1a..aa1cf52 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt
@@ -204,7 +204,6 @@
 
     @SuppressLint(
         "MissingPermission", // Permissions are checked by calling methods.
-        "UnsafeNewApiCall" // Implementation calls the appropriate API depending on API level
     )
     private suspend fun openCameraWithRetry(
         cameraId: CameraId,
@@ -234,7 +233,8 @@
             try {
                 Debug.trace("CameraDevice-${cameraId.value}#openCamera") {
                     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                        instance.openCamera(
+                        Api28Compat.openCamera(
+                            instance,
                             cameraId.value,
                             threads.camera2Executor,
                             cameraState
@@ -325,7 +325,11 @@
         // TODO: Turn this into a broadcast service so that multiple listeners can be registered if
         //  needed.
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-            manager.registerAvailabilityCallback(threads.camera2Executor, availabilityCallback)
+            Api28Compat.registerAvailabilityCallback(
+                manager,
+                threads.camera2Executor,
+                availabilityCallback
+            )
         } else {
             manager.registerAvailabilityCallback(availabilityCallback, threads.camera2Handler)
         }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Permissions.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Permissions.kt
index f930442..ad4162c 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Permissions.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Permissions.kt
@@ -17,11 +17,11 @@
 package androidx.camera.camera2.pipe.core
 
 import android.Manifest
-import android.annotation.SuppressLint
 import android.content.Context
 import android.content.pm.PackageManager.PERMISSION_GRANTED
 import android.os.Build
 import androidx.annotation.RequiresApi
+import androidx.camera.camera2.pipe.compat.Api23Compat
 import javax.inject.Inject
 import javax.inject.Singleton
 
@@ -45,7 +45,6 @@
         }
 
     @RequiresApi(23)
-    @SuppressLint("UnsafeNewApiCall")
     private fun checkCameraPermission(): Boolean {
         // Granted camera permission is cached here to reduce the number of binder transactions
         // executed.  This is considered okay because when a user revokes a permission at runtime,
@@ -53,7 +52,9 @@
         // allowing the code to avoid re-querying after checkSelfPermission returns true.
         if (!_hasCameraPermission) {
             Debug.traceStart { "CXCP#checkCameraPermission" }
-            if (context.checkSelfPermission(Manifest.permission.CAMERA) == PERMISSION_GRANTED) {
+            if (Api23Compat.checkSelfPermission(context, Manifest.permission.CAMERA)
+                == PERMISSION_GRANTED
+            ) {
                 _hasCameraPermission = true
             }
             Debug.traceStop()
diff --git a/camera/camera-camera2/api/public_plus_experimental_current.txt b/camera/camera-camera2/api/public_plus_experimental_current.txt
index 4d34724..dce72bc 100644
--- a/camera/camera-camera2/api/public_plus_experimental_current.txt
+++ b/camera/camera-camera2/api/public_plus_experimental_current.txt
@@ -16,14 +16,6 @@
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setCaptureRequestOptions(androidx.camera.camera2.interop.CaptureRequestOptions);
   }
 
-  @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2CameraFilter {
-    method public static androidx.camera.core.CameraFilter createCameraFilter(androidx.camera.camera2.interop.Camera2CameraFilter.Camera2Filter);
-  }
-
-  public static interface Camera2CameraFilter.Camera2Filter {
-    method public java.util.List<androidx.camera.camera2.interop.Camera2CameraInfo!> filter(java.util.List<androidx.camera.camera2.interop.Camera2CameraInfo!>);
-  }
-
   @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2CameraInfo {
     method public static androidx.camera.camera2.interop.Camera2CameraInfo from(androidx.camera.core.CameraInfo);
     method public <T> T? getCameraCharacteristic(android.hardware.camera2.CameraCharacteristics.Key<T!>);
diff --git a/camera/camera-camera2/build.gradle b/camera/camera-camera2/build.gradle
index 55981b2..3052687 100644
--- a/camera/camera-camera2/build.gradle
+++ b/camera/camera-camera2/build.gradle
@@ -18,8 +18,6 @@
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -31,36 +29,36 @@
     api("androidx.annotation:annotation:1.2.0")
     implementation("androidx.core:core:1.1.0")
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
-    implementation(GUAVA_LISTENABLE_FUTURE)
-    implementation(AUTO_VALUE_ANNOTATIONS)
+    implementation(libs.guavaListenableFuture)
+    implementation(libs.autoValueAnnotations)
 
-    annotationProcessor(AUTO_VALUE)
+    annotationProcessor(libs.autoValue)
 
-    testImplementation(ANDROIDX_TEST_CORE)
-    testImplementation(ANDROIDX_TEST_RUNNER)
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
-    testImplementation(ROBOLECTRIC)
-    testImplementation(MOCKITO_CORE)
-    testImplementation(KOTLIN_COROUTINES_TEST)
+    testImplementation(libs.testCore)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
+    testImplementation(libs.robolectric)
+    testImplementation(libs.mockitoCore)
+    testImplementation(libs.kotlinCoroutinesTest)
     testImplementation("androidx.annotation:annotation-experimental:1.1.0")
     testImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.3.1")
     testImplementation(project(":camera:camera-testing"))
     testImplementation("androidx.arch.core:core-testing:2.1.0")
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testUiautomator)
+    androidTestImplementation(libs.espressoCore)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation("androidx.appcompat:appcompat:1.1.0")
     androidTestImplementation(project(":camera:camera-testing"))
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(KOTLIN_COROUTINES_ANDROID)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.kotlinCoroutinesAndroid)
     androidTestImplementation("androidx.annotation:annotation-experimental:1.1.0")
     androidTestImplementation(project(":internal-testutils-truth"))
     androidTestImplementation("org.jetbrains.kotlinx:atomicfu:0.13.1")
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java
index 5a3d6d4..87cc6f5 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java
@@ -241,6 +241,15 @@
     }
 
     @Test
+    public void setZoomRatio_futuresCompletes() {
+        assumeTrue(mCamera.getCameraInfo().getZoomState().getValue().getMaxZoomRatio() >= 2.0f);
+
+        // use ratio with fraction because it often causes unable-to-complete issue.
+        ListenableFuture<Void> result = mCamera.getCameraControl().setZoomRatio(1.3640054f);
+        assertFutureCompletes(result);
+    }
+
+    @Test
     public void rebindAndSetZoomRatio_futureCompletes() {
         mInstrumentation.runOnMainSync(() -> {
             try {
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java
index 8221172..7ce5e54 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java
@@ -58,7 +58,6 @@
 import androidx.core.util.Consumer;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.FlakyTest;
 import androidx.test.filters.LargeTest;
 import androidx.test.platform.app.InstrumentationRegistry;
 
@@ -124,13 +123,20 @@
         CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
     }
 
-    @FlakyTest // b/188598639
     @Test
     public void surfaceProvider_isUsedAfterSetting() {
         final Preview.SurfaceProvider surfaceProvider = mock(Preview.SurfaceProvider.class);
-        doAnswer(args -> ((SurfaceRequest) args.getArgument(0)).willNotProvideSurface()).when(
-                surfaceProvider).onSurfaceRequested(
-                any(SurfaceRequest.class));
+        doAnswer(args -> {
+            SurfaceTexture surfaceTexture = new SurfaceTexture(0);
+            surfaceTexture.setDefaultBufferSize(640, 480);
+            Surface surface = new Surface(surfaceTexture);
+            ((SurfaceRequest) args.getArgument(0)).provideSurface(surface,
+                    CameraXExecutors.directExecutor(), result -> {
+                        surfaceTexture.release();
+                        surface.release();
+                    });
+            return null;
+        }).when(surfaceProvider).onSurfaceRequested(any(SurfaceRequest.class));
 
         final Preview preview = mDefaultBuilder.build();
 
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/AndroidRZoomImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/AndroidRZoomImpl.java
index 8c834da..bade0ad 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/AndroidRZoomImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/AndroidRZoomImpl.java
@@ -19,7 +19,6 @@
 import android.graphics.Rect;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CaptureRequest;
-import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.TotalCaptureResult;
 import android.util.Range;
 
@@ -93,8 +92,10 @@
     @Override
     public void onCaptureResult(@NonNull TotalCaptureResult captureResult) {
         if (mPendingZoomRatioCompleter != null) {
+            CaptureRequest request = captureResult.getRequest();
+            Float zoomRatioFloat = (request == null) ? null :
+                    request.get(CaptureRequest.CONTROL_ZOOM_RATIO);
 
-            Float zoomRatioFloat = captureResult.get(CaptureResult.CONTROL_ZOOM_RATIO);
             if (zoomRatioFloat == null) {
                 return;
             }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraFilter.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraFilter.java
deleted file mode 100644
index b0e741b..0000000
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraFilter.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.camera.camera2.interop;
-
-import android.hardware.camera2.CameraCharacteristics;
-
-import androidx.annotation.NonNull;
-import androidx.camera.core.CameraFilter;
-import androidx.camera.core.CameraInfo;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Provides ability to filter cameras with camera IDs and characteristics and create the
- * corresponding {@link CameraFilter}.
- */
-@ExperimentalCamera2Interop
-public final class Camera2CameraFilter {
-
-    /**
-     * Creates a {@link CameraFilter} from a {@link Camera2Filter}.
-     */
-    @NonNull
-    public static CameraFilter createCameraFilter(@NonNull Camera2Filter filter) {
-        return cameraInfos -> {
-            List<Camera2CameraInfo> input = new ArrayList<>();
-            for (CameraInfo cameraInfo : cameraInfos) {
-                input.add(Camera2CameraInfo.from(cameraInfo));
-            }
-
-            List<Camera2CameraInfo> result = filter.filter(Collections.unmodifiableList(input));
-
-            List<CameraInfo> output = new ArrayList<>();
-            for (CameraInfo cameraInfo : cameraInfos) {
-                if (result.contains(Camera2CameraInfo.from(cameraInfo))) {
-                    output.add(cameraInfo);
-                }
-            }
-
-            return output;
-        };
-    }
-
-    /**
-     * An interface that filters cameras based on camera IDs and characteristics. Applications
-     * can implement the filter method for custom camera selection.
-     */
-    public interface Camera2Filter {
-        /**
-         * Filters a list of {@link Camera2CameraInfo} then returns those matching the requirements.
-         *
-         * <p>If the output list contains Camera2CameraInfo not in the input list, when used by a
-         * {@link androidx.camera.core.CameraSelector} then it will result in an
-         * IllegalArgumentException thrown when calling bindToLifecycle.
-         *
-         * <p>The Camera2CameraInfo that has lower index in the map has higher priority. When
-         * used by
-         * {@link androidx.camera.core.CameraSelector.Builder#addCameraFilter(CameraFilter)}, the
-         * available cameras will be filtered by the {@link Camera2Filter} and all other
-         * {@link CameraFilter}s by the order they were added. The first camera in the result
-         * will be selected if there are multiple cameras left.
-         *
-         * @param cameraInfos An unmodifiable list of {@link Camera2CameraInfo}s being filtered.
-         * @return The output map of camera IDs and their {@link CameraCharacteristics} that
-         * match the requirements. Users are expected to create a new map to return with.
-         */
-        @NonNull
-        List<Camera2CameraInfo> filter(@NonNull List<Camera2CameraInfo> cameraInfos);
-    }
-
-    // Should not be instantiated.
-    private Camera2CameraFilter() {}
-}
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/CameraSelectionOptimizerTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/CameraSelectionOptimizerTest.java
index d8d5e7e..41ca99d 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/CameraSelectionOptimizerTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/CameraSelectionOptimizerTest.java
@@ -28,9 +28,9 @@
 import android.os.Handler;
 import android.os.Looper;
 
-import androidx.camera.camera2.interop.Camera2CameraFilter;
 import androidx.camera.camera2.interop.Camera2CameraInfo;
 import androidx.camera.core.CameraFilter;
+import androidx.camera.core.CameraInfo;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.impl.CameraThreadConfig;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
@@ -127,20 +127,20 @@
     public void requireLensFacingBack_andSelectWidestAngle() throws Exception {
         setupNormalCameras();
 
-        CameraFilter widestAngleFilter = Camera2CameraFilter.createCameraFilter(
-                cameraInfoList -> {
-                    float minFocalLength = 10000;
-                    Camera2CameraInfo minFocalCameraInfo = null;
-                    for (Camera2CameraInfo camera2CameraInfo : cameraInfoList) {
-                        float focalLength = camera2CameraInfo.getCameraCharacteristic(
+        CameraFilter widestAngleFilter = cameraInfoList -> {
+            float minFocalLength = 10000;
+            CameraInfo minFocalCameraInfo = null;
+            for (CameraInfo cameraInfo : cameraInfoList) {
+                float focalLength =
+                        Camera2CameraInfo.from(cameraInfo).getCameraCharacteristic(
                                 CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)[0];
-                        if (focalLength < minFocalLength) {
-                            minFocalLength = focalLength;
-                            minFocalCameraInfo = camera2CameraInfo;
-                        }
-                    }
-                    return Arrays.asList(minFocalCameraInfo);
-                });
+                if (focalLength < minFocalLength) {
+                    minFocalLength = focalLength;
+                    minFocalCameraInfo = cameraInfo;
+                }
+            }
+            return Arrays.asList(minFocalCameraInfo);
+        };
 
         CameraSelector cameraSelector =
                 new CameraSelector.Builder()
@@ -155,7 +155,6 @@
         assertThat(cameraIds).containsExactly("2");
         // only camera "1" 's getCameraCharacteristics can be avoided.
         verify(mCamera2CameraFactory, never()).getCameraInfo("1");
-
     }
 
     @Test
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/interop/Camera2CameraFilterTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/interop/Camera2CameraFilterTest.java
deleted file mode 100644
index e985477..0000000
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/interop/Camera2CameraFilterTest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.camera.camera2.interop;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import android.hardware.camera2.CameraCharacteristics;
-import android.os.Build;
-
-import androidx.annotation.OptIn;
-import androidx.camera.camera2.internal.Camera2CameraInfoImpl;
-import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
-import androidx.camera.core.CameraFilter;
-import androidx.camera.core.CameraSelector;
-import androidx.camera.core.impl.CameraInternal;
-import androidx.camera.testing.fakes.FakeCamera;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-import org.robolectric.annotation.internal.DoNotInstrument;
-
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-@DoNotInstrument
-@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
-@OptIn(markerClass = ExperimentalCamera2Interop.class)
-public final class Camera2CameraFilterTest {
-    private static final String BACK_ID = "0";
-    private static final String FRONT_ID = "1";
-
-    private LinkedHashSet<CameraInternal> mCameras = new LinkedHashSet<>();
-    private CameraInternal mBackCamera;
-    private CameraInternal mFrontCamera;
-    private List<Camera2CameraInfo> mCameraInfos = new ArrayList<>();
-    private Camera2CameraInfo mCameraInfoBack;
-    private Camera2CameraInfo mCameraInfoFront;
-
-    @Before
-    public void setUp() {
-        CameraCharacteristicsCompat mockCharacteristicsCompatBack =
-                mock(CameraCharacteristicsCompat.class);
-        when(mockCharacteristicsCompatBack.get(
-                CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)).thenReturn(
-                CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL);
-        Camera2CameraInfoImpl mockCameraInfoImplBack = mock(Camera2CameraInfoImpl.class);
-        when(mockCameraInfoImplBack.getCameraId()).thenReturn(BACK_ID);
-        when(mockCameraInfoImplBack.getCameraCharacteristicsCompat())
-                .thenReturn(mockCharacteristicsCompatBack);
-        mCameraInfoBack = new Camera2CameraInfo(mockCameraInfoImplBack);
-        when(mockCameraInfoImplBack.getCamera2CameraInfo()).thenReturn(mCameraInfoBack);
-        mCameraInfos.add(mCameraInfoBack);
-        mBackCamera = new FakeCamera(null, mockCameraInfoImplBack);
-        mCameras.add(mBackCamera);
-
-        CameraCharacteristicsCompat mCharacteristicsCompatFront =
-                mock(CameraCharacteristicsCompat.class);
-        when(mCharacteristicsCompatFront.get(
-                CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)).thenReturn(
-                CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY);
-        Camera2CameraInfoImpl mockCameraInfoImplFront = mock(Camera2CameraInfoImpl.class);
-        when(mockCameraInfoImplFront.getCameraId()).thenReturn(FRONT_ID);
-        when(mockCameraInfoImplFront.getCameraCharacteristicsCompat())
-                .thenReturn(mCharacteristicsCompatFront);
-        mCameraInfoFront = new Camera2CameraInfo(mockCameraInfoImplFront);
-        when(mockCameraInfoImplFront.getCamera2CameraInfo()).thenReturn(mCameraInfoFront);
-        mCameraInfos.add(mCameraInfoFront);
-        mFrontCamera = new FakeCamera(null, mockCameraInfoImplFront);
-        mCameras.add(mFrontCamera);
-    }
-
-    @Test
-    public void canFilterWithCamera2Filter() {
-        Camera2CameraFilter.Camera2Filter camera2Filter = cameraInfos -> {
-            List<Camera2CameraInfo> output = new ArrayList<>();
-            for (Camera2CameraInfo cameraInfo : cameraInfos) {
-                if (cameraInfo.getCameraCharacteristic(
-                        CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL).equals(
-                        CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)) {
-                    output.add(cameraInfo);
-                }
-            }
-            return output;
-        };
-
-        assertThat(camera2Filter.filter(mCameraInfos)).containsExactly(mCameraInfoFront);
-    }
-
-    @Test
-    public void canSelectWithCameraSelector() {
-        CameraFilter filter = Camera2CameraFilter.createCameraFilter(cameraInfos -> {
-            List<Camera2CameraInfo> output = new ArrayList<>();
-            for (Camera2CameraInfo cameraInfo : cameraInfos) {
-                if (cameraInfo.getCameraId().equals(FRONT_ID)) {
-                    output.add(cameraInfo);
-                }
-            }
-            return output;
-        });
-
-        CameraSelector cameraSelector = new CameraSelector.Builder().addCameraFilter(
-                filter).build();
-        assertThat(cameraSelector.select(mCameras)).isEqualTo(mFrontCamera);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void exception_extraOutputCameraInfo() {
-        CameraFilter filter = Camera2CameraFilter.createCameraFilter(cameraInfos -> {
-            List<Camera2CameraInfo> output = new ArrayList<>();
-            // Add an extra camera id to output.
-            output.add(mock(Camera2CameraInfo.class));
-            return output;
-        });
-
-        CameraSelector cameraSelector = new CameraSelector.Builder().addCameraFilter(
-                filter).build();
-        cameraSelector.select(mCameras);
-    }
-
-    @Test(expected = UnsupportedOperationException.class)
-    public void exception_extraInputCameraInfo() {
-        CameraFilter filter = Camera2CameraFilter.createCameraFilter(cameraInfos -> {
-            // Add an extra camera id to input.
-            cameraInfos.add(mock(Camera2CameraInfo.class));
-            return cameraInfos;
-        });
-
-        CameraSelector cameraSelector = new CameraSelector.Builder().addCameraFilter(
-                filter).build();
-        // Should throw an exception if the input is modified.
-        cameraSelector.select(mCameras);
-    }
-}
diff --git a/camera/camera-core/api/current.ignore b/camera/camera-core/api/current.ignore
index 9cff33a..2f97885 100644
--- a/camera/camera-core/api/current.ignore
+++ b/camera/camera-core/api/current.ignore
@@ -1,3 +1,5 @@
 // Baseline format: 1.0
+AddedAbstractMethod: androidx.camera.core.CameraInfo#getCameraSelector():
+    Added method androidx.camera.core.CameraInfo.getCameraSelector()
 AddedAbstractMethod: androidx.camera.core.CameraInfo#getCameraState():
     Added method androidx.camera.core.CameraInfo.getCameraState()
diff --git a/camera/camera-core/api/current.txt b/camera/camera-core/api/current.txt
index 0f9be5f..4519564 100644
--- a/camera/camera-core/api/current.txt
+++ b/camera/camera-core/api/current.txt
@@ -22,7 +22,12 @@
   public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
   }
 
+  public interface CameraFilter {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
+  }
+
   public interface CameraInfo {
+    method public androidx.camera.core.CameraSelector getCameraSelector();
     method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
     method public int getSensorRotationDegrees();
     method public int getSensorRotationDegrees(int);
@@ -43,6 +48,7 @@
 
   public static final class CameraSelector.Builder {
     ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector.Builder addCameraFilter(androidx.camera.core.CameraFilter);
     method public androidx.camera.core.CameraSelector build();
     method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
   }
diff --git a/camera/camera-core/api/public_plus_experimental_current.txt b/camera/camera-core/api/public_plus_experimental_current.txt
index 14a591c..ea9906c 100644
--- a/camera/camera-core/api/public_plus_experimental_current.txt
+++ b/camera/camera-core/api/public_plus_experimental_current.txt
@@ -23,12 +23,12 @@
   public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
   }
 
-  @androidx.camera.core.ExperimentalCameraFilter public interface CameraFilter {
+  public interface CameraFilter {
     method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
   }
 
   public interface CameraInfo {
-    method @androidx.camera.core.ExperimentalCameraFilter public androidx.camera.core.CameraSelector getCameraSelector();
+    method public androidx.camera.core.CameraSelector getCameraSelector();
     method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
     method @androidx.camera.core.ExperimentalExposureCompensation public androidx.camera.core.ExposureState getExposureState();
     method public int getSensorRotationDegrees();
@@ -50,7 +50,7 @@
 
   public static final class CameraSelector.Builder {
     ctor public CameraSelector.Builder();
-    method @androidx.camera.core.ExperimentalCameraFilter public androidx.camera.core.CameraSelector.Builder addCameraFilter(androidx.camera.core.CameraFilter);
+    method public androidx.camera.core.CameraSelector.Builder addCameraFilter(androidx.camera.core.CameraFilter);
     method public androidx.camera.core.CameraSelector build();
     method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
   }
@@ -132,9 +132,6 @@
   @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalAvailableCamerasLimiter {
   }
 
-  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalCameraFilter {
-  }
-
   @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalCustomizableThreads {
   }
 
diff --git a/camera/camera-core/api/restricted_current.ignore b/camera/camera-core/api/restricted_current.ignore
index 9cff33a..2f97885 100644
--- a/camera/camera-core/api/restricted_current.ignore
+++ b/camera/camera-core/api/restricted_current.ignore
@@ -1,3 +1,5 @@
 // Baseline format: 1.0
+AddedAbstractMethod: androidx.camera.core.CameraInfo#getCameraSelector():
+    Added method androidx.camera.core.CameraInfo.getCameraSelector()
 AddedAbstractMethod: androidx.camera.core.CameraInfo#getCameraState():
     Added method androidx.camera.core.CameraInfo.getCameraState()
diff --git a/camera/camera-core/api/restricted_current.txt b/camera/camera-core/api/restricted_current.txt
index 0f9be5f..4519564 100644
--- a/camera/camera-core/api/restricted_current.txt
+++ b/camera/camera-core/api/restricted_current.txt
@@ -22,7 +22,12 @@
   public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
   }
 
+  public interface CameraFilter {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
+  }
+
   public interface CameraInfo {
+    method public androidx.camera.core.CameraSelector getCameraSelector();
     method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
     method public int getSensorRotationDegrees();
     method public int getSensorRotationDegrees(int);
@@ -43,6 +48,7 @@
 
   public static final class CameraSelector.Builder {
     ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector.Builder addCameraFilter(androidx.camera.core.CameraFilter);
     method public androidx.camera.core.CameraSelector build();
     method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
   }
diff --git a/camera/camera-core/build.gradle b/camera/camera-core/build.gradle
index aa1cb74..10d5397 100644
--- a/camera/camera-core/build.gradle
+++ b/camera/camera-core/build.gradle
@@ -18,8 +18,6 @@
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -29,39 +27,39 @@
 dependencies {
     api("androidx.annotation:annotation:1.2.0")
     api("androidx.lifecycle:lifecycle-livedata:2.1.0")
-    api(GUAVA_LISTENABLE_FUTURE)
+    api(libs.guavaListenableFuture)
     api("androidx.annotation:annotation-experimental:1.1.0")
-    api(KOTLIN_STDLIB) // Added for annotation-experimental
+    api(libs.kotlinStdlib) // Added for annotation-experimental
     implementation("androidx.exifinterface:exifinterface:1.0.0")
     implementation("androidx.core:core:1.1.0")
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
     implementation("androidx.lifecycle:lifecycle-common:2.1.0")
-    implementation(AUTO_VALUE_ANNOTATIONS)
+    implementation(libs.autoValueAnnotations)
 
-    annotationProcessor(AUTO_VALUE)
+    annotationProcessor(libs.autoValue)
 
-    testImplementation(KOTLIN_STDLIB)
-    testImplementation(ANDROIDX_TEST_CORE)
-    testImplementation(ANDROIDX_TEST_RUNNER)
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
-    testImplementation(ROBOLECTRIC)
-    testImplementation(MOCKITO_CORE)
+    testImplementation(libs.kotlinStdlib)
+    testImplementation(libs.testCore)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
+    testImplementation(libs.robolectric)
+    testImplementation(libs.mockitoCore)
     testImplementation(project(":camera:camera-testing"), {
         exclude group: "androidx.camera", module: "camera-core"
     })
     testImplementation("androidx.exifinterface:exifinterface:1.0.0")
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation(project(":camera:camera-testing"))
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(KOTLIN_COROUTINES_ANDROID)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.kotlinCoroutinesAndroid)
     androidTestImplementation("androidx.concurrent:concurrent-futures-ktx:1.1.0")
     androidTestImplementation(project(":internal-testutils-truth"))
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/Camera.java b/camera/camera-core/src/main/java/androidx/camera/core/Camera.java
index cb50103..4f29e186 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/Camera.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/Camera.java
@@ -21,7 +21,6 @@
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.impl.CameraConfig;
 import androidx.camera.core.impl.CameraInternal;
-import androidx.camera.core.internal.CameraUseCaseAdapter;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -32,7 +31,7 @@
  * camera via the {@link CameraControl}, and publish the state of the camera via {@link CameraInfo}.
  *
  * <p>{@linkplain androidx.camera.lifecycle.ProcessCameraProvider#bindToLifecycle(
- * androidx.lifecycle.LifecycleOwner, CameraSelector, UseCase...) An example} of how to obtain an
+ *androidx.lifecycle.LifecycleOwner, CameraSelector, UseCase...) An example} of how to obtain an
  * instance of this class can be found in the {@link androidx.camera.lifecycle} package.
  */
 public interface Camera {
@@ -81,6 +80,7 @@
      * first in this ordering will be used.
      *
      * <p> The set of CameraInternal should be static for the lifetime of the Camera.
+     *
      * @hide
      */
     @NonNull
@@ -97,20 +97,16 @@
     CameraConfig getExtendedConfig();
 
     /**
-     * Set the extended config of the Camera and potentially reconfigure the camera.
+     * Set the extended config of the Camera.
      *
-     * <p> This is used to apply additional configs that modifying the behavior of the camera and
-     * any attached {@link UseCase}. For example, this may limit the instances of CameraInternal
-     * that are used or configure the {@link ImageCapture} to use a
+     * <p>This is used to apply additional configs that modifying the behavior of the camera and
+     * any attached {@link UseCase}. For example, it may configure the {@link ImageCapture} to use a
      * {@link androidx.camera.core.impl.CaptureProcessor} in order to implement effects such as
      * HDR or bokeh.
-
-     * <p> This can cause the underlying camera to be reopen.
-     * @param cameraConfig if the null then it will reset the camera to an empty config.
      *
+     * @param cameraConfig if null then it will reset the camera to an empty config.
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    void setExtendedConfig(@Nullable CameraConfig cameraConfig) throws
-            CameraUseCaseAdapter.CameraException;
+    void setExtendedConfig(@Nullable CameraConfig cameraConfig);
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java
index c2c7f15..b1fe6ba 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java
@@ -28,7 +28,6 @@
 /**
  * An interface for filtering cameras.
  */
-@ExperimentalCameraFilter
 public interface CameraFilter {
     /**
      * Filters a list of {@link CameraInfo}s and returns those matching the requirements.
@@ -67,7 +66,7 @@
      * means a camera filter's {@link Id} can be mapped to a unique {@link CameraConfig}. An
      * example of this is extension modes, where a camera filter can represent an extension mode,
      * and each extension mode adds a set of camera configurations to the camera that supports it
-     * . {@link ExtendedCameraConfigProviderStore#getConfig(Object)} allows retrieving the
+     * . {@link ExtendedCameraConfigProviderStore#getConfigProvider(Object)} allows retrieving the
      * {@link CameraConfig} of an extension mode given the {@link CameraFilter.Id} of its camera
      * filter.
      *
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java
index 5f2a563..fa3d911 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java
@@ -180,7 +180,6 @@
      *
      * @return {@link CameraSelector} unique to this camera.
      */
-    @ExperimentalCameraFilter
     @NonNull
     CameraSelector getCameraSelector();
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java
index 73e8342..9ddde07 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java
@@ -18,7 +18,6 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.OptIn;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.impl.CameraInternal;
@@ -94,7 +93,6 @@
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
     @NonNull
     public List<CameraInfo> filter(@NonNull List<CameraInfo> cameraInfos) {
         List<CameraInfo> input = new ArrayList<>(cameraInfos);
@@ -168,7 +166,6 @@
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
     @Nullable
     public Integer getLensFacing() {
         Integer currentLensFacing = null;
@@ -212,7 +209,6 @@
          * <p>If lens facing is already set, this will add extra requirement for lens facing
          * instead of replacing the previous setting.
          */
-        @OptIn(markerClass = ExperimentalCameraFilter.class)
         @NonNull
         public Builder requireLensFacing(@LensFacing int lensFacing) {
             mCameraFilterSet.add(new LensFacingCameraFilter(lensFacing));
@@ -227,7 +223,6 @@
          * added when the {@link CameraSelector} is used, and the first camera output from the
          * filters will be selected.
          */
-        @ExperimentalCameraFilter
         @NonNull
         public Builder addCameraFilter(@NonNull CameraFilter cameraFilter) {
             mCameraFilterSet.add(cameraFilter);
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ExperimentalCameraFilter.java b/camera/camera-core/src/main/java/androidx/camera/core/ExperimentalCameraFilter.java
deleted file mode 100644
index 7ce851b..0000000
--- a/camera/camera-core/src/main/java/androidx/camera/core/ExperimentalCameraFilter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.camera.core;
-
-import static java.lang.annotation.RetentionPolicy.CLASS;
-
-import androidx.annotation.RequiresOptIn;
-
-import java.lang.annotation.Retention;
-
-/**
- * Denotes that the annotated method uses an experimental API that customizes camera filters to
- * select a specific camera.
- *
- * <p>{@link CameraSelector.Builder#addCameraFilter(CameraFilter)} can be used to add
- * customized {@link CameraFilter} implementations to the camera selector. Those camera filters
- * will be applied with the internal camera filters. If the {@link CameraFilter}s result in no
- * available camera, the camera selector will thrown an IllegalArgumentException.
- */
-@Retention(CLASS)
-@RequiresOptIn
-public @interface ExperimentalCameraFilter {
-}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfig.java
index 2d4d1a6..f65b9170 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfig.java
@@ -17,7 +17,6 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
-import androidx.camera.core.CameraFilter;
 
 /**
  * Configuration for a {@link androidx.camera.core.Camera}.
@@ -26,31 +25,11 @@
 
     // Option Declarations:
     // *********************************************************************************************
-
-    /**
-     * Option: camerax.core.camera.cameraFilter
-     */
-    Option<CameraFilter> OPTION_CAMERA_FILTER =
-            Option.create("camerax.core.camera.cameraFilter", CameraFilter.class);
-
     Option<UseCaseConfigFactory> OPTION_USECASE_CONFIG_FACTORY =
             Option.create("camerax.core.camera.useCaseConfigFactory",
                     UseCaseConfigFactory.class);
 
     /**
-     * Retrieves the camera filter from this configuration.
-     *
-     * <p> This filter is used to filter out additional cameras.
-     *
-     * @return The stored value, if it exists in this configuration. Otherwise a filter that does
-     * not filter out any cameras.
-     */
-    @NonNull
-    default CameraFilter getCameraFilter() {
-        return retrieveOption(OPTION_CAMERA_FILTER, CameraFilters.ANY);
-    }
-
-    /**
      * Retrieves the use case config factory instance.
      */
     @NonNull
@@ -61,18 +40,6 @@
      * @param <B> the top level builder type for which this builder is composed with.
      */
     interface Builder<B> {
-        /**
-         * Sets the {@link CameraFilter} to apply.
-         *
-         * <p> The filter which will be additionally applied to
-         * {@link androidx.camera.core.CameraSelector} when selecting a camera.
-         *
-         * @param cameraFilter the {@link CameraFilter} to apply.
-         * @return The current Builder.
-         */
-        @NonNull
-        B setCameraFilter(@NonNull CameraFilter cameraFilter);
-
         @NonNull
         B setUseCaseConfigFactory(@NonNull UseCaseConfigFactory factory);
     }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java
index 2007b49..48302fe 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.camera.core.CameraInfo;
 
 /**
@@ -26,11 +27,11 @@
  */
 public interface CameraConfigProvider {
 
-    CameraConfigProvider EMPTY = (cameraInfo, context) -> CameraConfigs.emptyConfig();
+    CameraConfigProvider EMPTY = (cameraInfo, context) -> null;
 
     /**
      * Returns a camera config according to the input camera info.
      */
-    @NonNull
+    @Nullable
     CameraConfig getConfig(@NonNull CameraInfo cameraInfo, @NonNull Context context);
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
index 43c07d5..a0fd33d 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
@@ -20,7 +20,6 @@
 import androidx.annotation.Nullable;
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.ExperimentalCameraFilter;
 import androidx.core.util.Preconditions;
 
 import java.util.Collections;
@@ -76,7 +75,6 @@
     CamcorderProfileProvider getCamcorderProfileProvider();
 
     /** {@inheritDoc} */
-    @ExperimentalCameraFilter
     @NonNull
     @Override
     default CameraSelector getCameraSelector() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java
index 8422efc..c7e24bc 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java
@@ -22,7 +22,6 @@
 import androidx.camera.core.CameraControl;
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.UseCase;
-import androidx.camera.core.internal.CameraUseCaseAdapter;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -184,8 +183,7 @@
     }
 
     @Override
-    default void setExtendedConfig(@Nullable CameraConfig cameraConfig) throws
-            CameraUseCaseAdapter.CameraException {
+    default void setExtendedConfig(@Nullable CameraConfig cameraConfig) {
         // Ignore the config since CameraInternal won't use the config
     }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java
index 81d48a3..66fc97b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java
@@ -53,7 +53,7 @@
      * {@link CameraConfigProvider} associated with the key.
      */
     @NonNull
-    public static CameraConfigProvider getConfig(@NonNull Object key) {
+    public static CameraConfigProvider getConfigProvider(@NonNull Object key) {
         final CameraConfigProvider provider;
         synchronized (LOCK) {
             provider = CAMERA_CONFIG_PROVIDERS.get(key);
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingCameraFilter.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingCameraFilter.java
index 55c247b..e388744 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingCameraFilter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingCameraFilter.java
@@ -17,11 +17,9 @@
 package androidx.camera.core.impl;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.OptIn;
 import androidx.camera.core.CameraFilter;
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.ExperimentalCameraFilter;
 import androidx.core.util.Preconditions;
 
 import java.util.ArrayList;
@@ -30,7 +28,6 @@
 /**
  * A filter that filters camera based on lens facing.
  */
-@OptIn(markerClass = ExperimentalCameraFilter.class)
 public class LensFacingCameraFilter implements CameraFilter {
     @CameraSelector.LensFacing
     private int mLensFacing;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
index 0619dfc..d830cd8 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
@@ -25,10 +25,8 @@
 import androidx.annotation.OptIn;
 import androidx.camera.core.Camera;
 import androidx.camera.core.CameraControl;
-import androidx.camera.core.CameraFilter;
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.ExperimentalCameraFilter;
 import androidx.camera.core.Logger;
 import androidx.camera.core.UseCase;
 import androidx.camera.core.ViewPort;
@@ -492,64 +490,13 @@
     }
 
     @Override
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
-    public void setExtendedConfig(@Nullable CameraConfig cameraConfig) throws CameraException {
+    public void setExtendedConfig(@Nullable CameraConfig cameraConfig) {
         synchronized (mLock) {
-            CameraConfig newCameraConfig = cameraConfig == null ? CameraConfigs.emptyConfig() :
-                    cameraConfig;
-            // Check for new camera
-            CameraFilter cameraFilter = newCameraConfig.getCameraFilter();
-            CameraSelector cameraSelector =
-                    new CameraSelector.Builder().addCameraFilter(cameraFilter).build();
-            CameraInternal cameraInternal = cameraSelector.select(mCameraInternals);
-
-            Map<UseCase, ConfigPair> configs = getConfigs(mUseCases,
-                    newCameraConfig.getUseCaseConfigFactory(), mUseCaseConfigFactory);
-
-            // Calculate the config
-            Map<UseCase, Size> suggestedResolutionsMap;
-            try {
-                suggestedResolutionsMap =
-                        calculateSuggestedResolutions(cameraInternal.getCameraInfoInternal(),
-                                mUseCases,
-                                Collections.emptyList(),
-                                configs);
-            } catch (IllegalArgumentException e) {
-                // It can fail because of the suggested resolution
-                // It can fail because the merged configs are no good
-                throw new CameraException(e.getMessage());
+            if (cameraConfig == null) {
+                mCameraConfig = CameraConfigs.emptyConfig();
+                return;
             }
-
-            updateViewPort(suggestedResolutionsMap, mUseCases);
-
-            if (mAttached) {
-                mCameraInternal.detachUseCases(mUseCases);
-            }
-
-            for (UseCase useCase : mUseCases) {
-                useCase.onDetach(mCameraInternal);
-            }
-
-            for (UseCase useCase : mUseCases) {
-                ConfigPair configPair = configs.get(useCase);
-                useCase.onAttach(cameraInternal, configPair.mExtendedConfig,
-                        configPair.mCameraConfig);
-                useCase.updateSuggestedResolution(
-                        Preconditions.checkNotNull(suggestedResolutionsMap.get(useCase)));
-            }
-
-            if (mAttached) {
-                notifyAttachedUseCasesChange(mUseCases);
-                cameraInternal.attachUseCases(mUseCases);
-            }
-
-            for (UseCase useCase : mUseCases) {
-                useCase.notifyState();
-            }
-
-            mCameraInternal = cameraInternal;
-            // Update the config map now that the setting has succeeded
-            mCameraConfig = newCameraConfig;
+            mCameraConfig = cameraConfig;
         }
     }
 
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.java b/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.java
deleted file mode 100644
index afd96b6..0000000
--- a/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.camera.core;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-
-import android.os.Build;
-
-import androidx.annotation.OptIn;
-import androidx.camera.core.impl.CameraControlInternal;
-import androidx.camera.core.impl.CameraInternal;
-import androidx.camera.testing.fakes.FakeCamera;
-import androidx.camera.testing.fakes.FakeCameraFactory;
-import androidx.camera.testing.fakes.FakeCameraInfoInternal;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-import org.robolectric.annotation.internal.DoNotInstrument;
-
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-
-@RunWith(RobolectricTestRunner.class)
-@DoNotInstrument
-@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
-public class CameraSelectorTest {
-    private static final String REAR_ID = "0";
-    private static final String FRONT_ID = "1";
-    private static final int REAR_ROTATION_DEGREE = 0;
-    private static final int FRONT_ROTATION_DEGREE = 90;
-    private CameraInternal mRearCamera;
-    private CameraInternal mFrontCamera;
-    private LinkedHashSet<CameraInternal> mCameras = new LinkedHashSet<>();
-
-    @Before
-    public void setUp() throws ExecutionException, InterruptedException {
-        FakeCameraFactory cameraFactory = new FakeCameraFactory();
-        mRearCamera = new FakeCamera(mock(CameraControlInternal.class),
-                new FakeCameraInfoInternal(REAR_ROTATION_DEGREE,
-                        CameraSelector.LENS_FACING_BACK));
-        cameraFactory.insertCamera(CameraSelector.LENS_FACING_BACK, REAR_ID, () -> mRearCamera);
-        mCameras.add(mRearCamera);
-        mFrontCamera = new FakeCamera(mock(CameraControlInternal.class),
-                new FakeCameraInfoInternal(FRONT_ROTATION_DEGREE,
-                        CameraSelector.LENS_FACING_FRONT));
-        cameraFactory.insertCamera(CameraSelector.LENS_FACING_FRONT, FRONT_ID, () -> mFrontCamera);
-        mCameras.add(mFrontCamera);
-    }
-
-    @Test
-    public void canSelectWithLensFacing() {
-        CameraSelector.Builder cameraSelectorBuilder = new CameraSelector.Builder();
-        cameraSelectorBuilder.requireLensFacing(CameraSelector.LENS_FACING_BACK);
-        assertThat(cameraSelectorBuilder.build().select(mCameras)).isEqualTo(mRearCamera);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void exception_ifNoAvailableCamera() {
-        CameraSelector.Builder cameraSelectorBuilder = new CameraSelector.Builder();
-        cameraSelectorBuilder.requireLensFacing(CameraSelector.LENS_FACING_BACK).requireLensFacing(
-                CameraSelector.LENS_FACING_FRONT);
-        cameraSelectorBuilder.build().select(mCameras);
-    }
-
-    @Test
-    public void canGetLensFacing() {
-        CameraSelector.Builder cameraSelectorBuilder = new CameraSelector.Builder();
-        cameraSelectorBuilder.requireLensFacing(CameraSelector.LENS_FACING_BACK);
-        assertThat(cameraSelectorBuilder.build().getLensFacing()).isEqualTo(
-                CameraSelector.LENS_FACING_BACK);
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void exception_ifGetLensFacingConflicted() {
-        CameraSelector.Builder cameraSelectorBuilder = new CameraSelector.Builder();
-        cameraSelectorBuilder.requireLensFacing(CameraSelector.LENS_FACING_BACK).requireLensFacing(
-                CameraSelector.LENS_FACING_FRONT);
-        cameraSelectorBuilder.build().getLensFacing();
-    }
-
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
-    @Test
-    public void canAppendFilters() {
-        CameraFilter filter0 = mock(CameraFilter.class);
-        CameraFilter filter1 = mock(CameraFilter.class);
-        CameraFilter filter2 = mock(CameraFilter.class);
-
-        CameraSelector cameraSelector = new CameraSelector.Builder()
-                .addCameraFilter(filter0)
-                .addCameraFilter(filter1)
-                .addCameraFilter(filter2)
-                .build();
-
-        assertThat(cameraSelector.getCameraFilterSet()).containsAtLeast(filter0, filter1, filter2);
-    }
-
-    @Test
-    public void canSelectDefaultBackCamera() {
-        assertThat(CameraSelector.DEFAULT_BACK_CAMERA.select(mCameras)).isEqualTo(mRearCamera);
-    }
-
-    @Test
-    public void canSelectDefaultFrontCamera() {
-        assertThat(CameraSelector.DEFAULT_FRONT_CAMERA.select(mCameras)).isEqualTo(mFrontCamera);
-    }
-
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
-    @Test(expected = IllegalArgumentException.class)
-    public void exception_extraOutputCamera() {
-        CameraSelector.Builder cameraSelectorBuilder = new CameraSelector.Builder();
-        cameraSelectorBuilder.addCameraFilter(cameraInfos -> {
-            List<CameraInfo> result = new ArrayList<>();
-            // Add an extra camera to output.
-            result.add(new FakeCameraInfoInternal());
-            return result;
-        });
-        cameraSelectorBuilder.build().select(mCameras);
-    }
-
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
-    @Test(expected = UnsupportedOperationException.class)
-    public void exception_extraInputCamera() {
-        CameraSelector.Builder cameraSelectorBuilder = new CameraSelector.Builder();
-        cameraSelectorBuilder.addCameraFilter(cameraInfos -> {
-            CameraInfo cameraInfo = new FakeCameraInfoInternal();
-            // Add an extra camera to input.
-            cameraInfos.add(cameraInfo);
-            return cameraInfos;
-        });
-        // Should throw an exception if the input is modified.
-        cameraSelectorBuilder.build().select(mCameras);
-    }
-}
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.kt
new file mode 100644
index 0000000..df97222
--- /dev/null
+++ b/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.kt
@@ -0,0 +1,173 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.camera.core
+
+import android.os.Build
+import androidx.camera.core.impl.CameraControlInternal
+import androidx.camera.core.impl.CameraInternal
+import androidx.camera.testing.fakes.FakeCamera
+import androidx.camera.testing.fakes.FakeCameraFactory
+import androidx.camera.testing.fakes.FakeCameraInfoInternal
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+import java.util.LinkedHashSet
+import java.util.concurrent.ExecutionException
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+public class CameraSelectorTest {
+
+    private val mRearId = "0"
+    private val mFrontId = "1"
+    private val mRearRotation = 0
+    private val mFrontRotation = 90
+    private val mCameras = LinkedHashSet<CameraInternal>()
+
+    private lateinit var mRearCamera: CameraInternal
+    private lateinit var mFrontCamera: CameraInternal
+
+    @Before
+    @Throws(ExecutionException::class, InterruptedException::class)
+    public fun setUp() {
+        val cameraFactory = FakeCameraFactory()
+        mRearCamera = FakeCamera(
+            Mockito.mock(CameraControlInternal::class.java),
+            FakeCameraInfoInternal(mRearRotation, CameraSelector.LENS_FACING_BACK)
+        )
+        cameraFactory.insertCamera(CameraSelector.LENS_FACING_BACK, mRearId) { mRearCamera }
+        mCameras.add(mRearCamera)
+        mFrontCamera = FakeCamera(
+            Mockito.mock(CameraControlInternal::class.java),
+            FakeCameraInfoInternal(mFrontRotation, CameraSelector.LENS_FACING_FRONT)
+        )
+        cameraFactory.insertCamera(CameraSelector.LENS_FACING_FRONT, mFrontId) { mFrontCamera }
+        mCameras.add(mFrontCamera)
+    }
+
+    @Test
+    public fun canSelectWithLensFacing() {
+        val cameraSelectorBuilder = CameraSelector.Builder()
+        cameraSelectorBuilder.requireLensFacing(CameraSelector.LENS_FACING_BACK)
+        assertThat(cameraSelectorBuilder.build().select(mCameras)).isEqualTo(mRearCamera)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    public fun exception_ifNoAvailableCamera() {
+        val cameraSelectorBuilder = CameraSelector.Builder()
+        cameraSelectorBuilder
+            .requireLensFacing(CameraSelector.LENS_FACING_BACK)
+            .requireLensFacing(CameraSelector.LENS_FACING_FRONT)
+        cameraSelectorBuilder.build().select(mCameras)
+    }
+
+    @Test
+    public fun canGetLensFacing() {
+        val cameraSelectorBuilder = CameraSelector.Builder()
+        cameraSelectorBuilder.requireLensFacing(CameraSelector.LENS_FACING_BACK)
+        assertThat(cameraSelectorBuilder.build().lensFacing)
+            .isEqualTo(CameraSelector.LENS_FACING_BACK)
+    }
+
+    @Test(expected = IllegalStateException::class)
+    public fun exception_ifGetLensFacingConflicted() {
+        val cameraSelectorBuilder = CameraSelector.Builder()
+        cameraSelectorBuilder.requireLensFacing(CameraSelector.LENS_FACING_BACK)
+            .requireLensFacing(CameraSelector.LENS_FACING_FRONT)
+        cameraSelectorBuilder.build().lensFacing
+    }
+
+    @Test
+    public fun canAppendFilters() {
+        val filter0 = Mockito.mock(
+            CameraFilter::class.java
+        )
+        val filter1 = Mockito.mock(
+            CameraFilter::class.java
+        )
+        val filter2 = Mockito.mock(
+            CameraFilter::class.java
+        )
+        val cameraSelector = CameraSelector.Builder()
+            .addCameraFilter(filter0)
+            .addCameraFilter(filter1)
+            .addCameraFilter(filter2)
+            .build()
+        assertThat(cameraSelector.cameraFilterSet).containsAtLeast(filter0, filter1, filter2)
+    }
+
+    @Test
+    public fun canSelectDefaultBackCamera() {
+        assertThat(CameraSelector.DEFAULT_BACK_CAMERA.select(mCameras)).isEqualTo(mRearCamera)
+    }
+
+    @Test
+    public fun canSelectDefaultFrontCamera() {
+        assertThat(CameraSelector.DEFAULT_FRONT_CAMERA.select(mCameras))
+            .isEqualTo(mFrontCamera)
+    }
+
+    @Test
+    public fun canSelectWithCameraFilter() {
+        val filter = CameraFilter { cameraInfos: List<CameraInfo> ->
+            val output: MutableList<CameraInfo> =
+                ArrayList()
+            for (cameraInfo in cameraInfos) {
+                if (cameraInfo.sensorRotationDegrees == mFrontRotation) {
+                    output.add(cameraInfo)
+                }
+            }
+            output
+        }
+        val cameraSelector = CameraSelector.Builder().addCameraFilter(
+            filter
+        ).build()
+        assertThat(cameraSelector.select(mCameras)).isEqualTo(mFrontCamera)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    public fun exception_extraOutputCamera() {
+        val cameraSelectorBuilder = CameraSelector.Builder()
+        cameraSelectorBuilder.addCameraFilter {
+            val result: MutableList<CameraInfo> =
+                ArrayList()
+            // Add an extra camera to output.
+            result.add(FakeCameraInfoInternal())
+            result
+        }
+        cameraSelectorBuilder.build().select(mCameras)
+    }
+
+    @Test(expected = UnsupportedOperationException::class)
+    public fun exception_extraInputCamera() {
+        val cameraSelectorBuilder = CameraSelector.Builder()
+        cameraSelectorBuilder.addCameraFilter { cameraInfos: MutableList<CameraInfo> ->
+            val cameraInfo: CameraInfo = FakeCameraInfoInternal()
+            // Add an extra camera to input.
+            cameraInfos.add(cameraInfo)
+            cameraInfos
+        }
+        // Should throw an exception if the input is modified.
+        cameraSelectorBuilder.build().select(mCameras)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStoreTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStoreTest.kt
index 571126b..27291ae 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStoreTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStoreTest.kt
@@ -37,12 +37,13 @@
 
         ExtendedCameraConfigProviderStore.addConfig(id, cameraConfigProvider)
 
-        assertThat(ExtendedCameraConfigProviderStore.getConfig(id)).isEqualTo(cameraConfigProvider)
+        assertThat(ExtendedCameraConfigProviderStore.getConfigProvider(id))
+            .isEqualTo(cameraConfigProvider)
     }
 
     @Test
     public fun returnDefaultEmptyCameraConfigProvider_whenNoDataStored() {
-        assertThat(ExtendedCameraConfigProviderStore.getConfig(Object())).isEqualTo(
+        assertThat(ExtendedCameraConfigProviderStore.getConfigProvider(Object())).isEqualTo(
             CameraConfigProvider.EMPTY
         )
     }
diff --git a/camera/camera-extensions-stub/build.gradle b/camera/camera-extensions-stub/build.gradle
index a5511a1..6d234f3 100644
--- a/camera/camera-extensions-stub/build.gradle
+++ b/camera/camera-extensions-stub/build.gradle
@@ -12,12 +12,12 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
-import androidx.build.LibraryVersions
-import androidx.build.LibraryGroups
-import androidx.build.Publish
 
-plugins {
+ import androidx.build.LibraryGroups
+ import androidx.build.LibraryVersions
+ import androidx.build.Publish
+
+ plugins {
     id("AndroidXPlugin")
     id("com.android.library")
 }
diff --git a/camera/camera-extensions-stub/lint-baseline.xml b/camera/camera-extensions-stub/lint-baseline.xml
index a79d08a..9b4df78 100644
--- a/camera/camera-extensions-stub/lint-baseline.xml
+++ b/camera/camera-extensions-stub/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
@@ -8,7 +8,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="45"
+            line="46"
             column="22"/>
     </issue>
 
@@ -19,7 +19,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="45"
+            line="46"
             column="39"/>
     </issue>
 
@@ -30,7 +30,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="50"
+            line="51"
             column="12"/>
     </issue>
 
@@ -41,7 +41,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="55"
+            line="56"
             column="12"/>
     </issue>
 
@@ -52,7 +52,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="65"
+            line="66"
             column="24"/>
     </issue>
 
@@ -63,7 +63,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="65"
+            line="66"
             column="41"/>
     </issue>
 
@@ -74,7 +74,7 @@
         errorLine2="            ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="66"
+            line="67"
             column="13"/>
     </issue>
 
@@ -85,7 +85,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="76"
+            line="77"
             column="12"/>
     </issue>
 
@@ -96,7 +96,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="81"
+            line="82"
             column="12"/>
     </issue>
 
@@ -107,7 +107,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="86"
+            line="87"
             column="12"/>
     </issue>
 
@@ -118,7 +118,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="91"
+            line="92"
             column="12"/>
     </issue>
 
@@ -261,7 +261,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="45"
+            line="46"
             column="22"/>
     </issue>
 
@@ -272,7 +272,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="45"
+            line="46"
             column="39"/>
     </issue>
 
@@ -283,7 +283,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="50"
+            line="51"
             column="12"/>
     </issue>
 
@@ -294,7 +294,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="55"
+            line="56"
             column="12"/>
     </issue>
 
@@ -305,7 +305,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="65"
+            line="66"
             column="24"/>
     </issue>
 
@@ -316,7 +316,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="65"
+            line="66"
             column="41"/>
     </issue>
 
@@ -327,7 +327,7 @@
         errorLine2="            ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="66"
+            line="67"
             column="13"/>
     </issue>
 
@@ -338,7 +338,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="76"
+            line="77"
             column="12"/>
     </issue>
 
@@ -349,7 +349,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="81"
+            line="82"
             column="12"/>
     </issue>
 
@@ -360,7 +360,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="86"
+            line="87"
             column="12"/>
     </issue>
 
@@ -371,7 +371,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="91"
+            line="92"
             column="12"/>
     </issue>
 
@@ -514,7 +514,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="45"
+            line="46"
             column="22"/>
     </issue>
 
@@ -525,7 +525,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="45"
+            line="46"
             column="39"/>
     </issue>
 
@@ -536,7 +536,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="50"
+            line="51"
             column="12"/>
     </issue>
 
@@ -547,7 +547,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="55"
+            line="56"
             column="12"/>
     </issue>
 
@@ -558,7 +558,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="65"
+            line="66"
             column="24"/>
     </issue>
 
@@ -569,7 +569,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="65"
+            line="66"
             column="41"/>
     </issue>
 
@@ -580,7 +580,7 @@
         errorLine2="            ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="66"
+            line="67"
             column="13"/>
     </issue>
 
@@ -591,7 +591,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="76"
+            line="77"
             column="12"/>
     </issue>
 
@@ -602,7 +602,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="81"
+            line="82"
             column="12"/>
     </issue>
 
@@ -613,7 +613,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="86"
+            line="87"
             column="12"/>
     </issue>
 
@@ -624,7 +624,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="91"
+            line="92"
             column="12"/>
     </issue>
 
@@ -877,7 +877,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="45"
+            line="46"
             column="22"/>
     </issue>
 
@@ -888,7 +888,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="45"
+            line="46"
             column="39"/>
     </issue>
 
@@ -899,7 +899,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="50"
+            line="51"
             column="12"/>
     </issue>
 
@@ -910,7 +910,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="55"
+            line="56"
             column="12"/>
     </issue>
 
@@ -921,7 +921,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="65"
+            line="66"
             column="24"/>
     </issue>
 
@@ -932,7 +932,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="65"
+            line="66"
             column="41"/>
     </issue>
 
@@ -943,7 +943,7 @@
         errorLine2="            ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="66"
+            line="67"
             column="13"/>
     </issue>
 
@@ -954,7 +954,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="76"
+            line="77"
             column="12"/>
     </issue>
 
@@ -965,7 +965,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="81"
+            line="82"
             column="12"/>
     </issue>
 
@@ -976,7 +976,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="86"
+            line="87"
             column="12"/>
     </issue>
 
@@ -987,7 +987,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="91"
+            line="92"
             column="12"/>
     </issue>
 
@@ -1130,7 +1130,7 @@
         errorLine2="                                 ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java"
-            line="41"
+            line="42"
             column="34"/>
     </issue>
 
@@ -1141,7 +1141,7 @@
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java"
-            line="41"
+            line="42"
             column="51"/>
     </issue>
 
@@ -1152,7 +1152,7 @@
         errorLine2="              ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java"
-            line="52"
+            line="53"
             column="15"/>
     </issue>
 
@@ -1163,7 +1163,7 @@
         errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java"
-            line="52"
+            line="53"
             column="32"/>
     </issue>
 
@@ -1174,7 +1174,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java"
-            line="57"
+            line="58"
             column="5"/>
     </issue>
 
@@ -1185,7 +1185,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java"
-            line="60"
+            line="61"
             column="5"/>
     </issue>
 
@@ -1196,7 +1196,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="45"
+            line="46"
             column="22"/>
     </issue>
 
@@ -1207,7 +1207,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="45"
+            line="46"
             column="39"/>
     </issue>
 
@@ -1218,7 +1218,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="50"
+            line="51"
             column="12"/>
     </issue>
 
@@ -1229,7 +1229,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="55"
+            line="56"
             column="12"/>
     </issue>
 
@@ -1240,7 +1240,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="65"
+            line="66"
             column="24"/>
     </issue>
 
@@ -1251,7 +1251,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="65"
+            line="66"
             column="41"/>
     </issue>
 
@@ -1262,7 +1262,7 @@
         errorLine2="            ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="66"
+            line="67"
             column="13"/>
     </issue>
 
@@ -1273,7 +1273,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="76"
+            line="77"
             column="12"/>
     </issue>
 
@@ -1284,7 +1284,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="81"
+            line="82"
             column="12"/>
     </issue>
 
@@ -1295,7 +1295,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="86"
+            line="87"
             column="12"/>
     </issue>
 
@@ -1306,7 +1306,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="91"
+            line="92"
             column="12"/>
     </issue>
 
diff --git a/camera/camera-extensions/build.gradle b/camera/camera-extensions/build.gradle
index 9740be7..c9cfa28 100644
--- a/camera/camera-extensions/build.gradle
+++ b/camera/camera-extensions/build.gradle
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
-import androidx.build.LibraryVersions
+
 import androidx.build.LibraryGroups
+import androidx.build.LibraryVersions
 import androidx.build.Publish
 import androidx.build.RunApiTasks
 
@@ -27,32 +27,32 @@
 }
 
 dependencies {
-    api(GUAVA_LISTENABLE_FUTURE)
+    api(libs.guavaListenableFuture)
     api(project(":camera:camera-core"))
     implementation(project(":camera:camera-camera2"))
     implementation("androidx.core:core:1.0.0")
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
-    implementation(AUTO_VALUE_ANNOTATIONS)
-    annotationProcessor(AUTO_VALUE)
+    implementation(libs.autoValueAnnotations)
+    annotationProcessor(libs.autoValue)
 
     compileOnly(project(":camera:camera-extensions-stub"))
 
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
-    testImplementation(ROBOLECTRIC)
-    testImplementation(TRUTH)
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
+    testImplementation(libs.robolectric)
+    testImplementation(libs.truth)
     testImplementation(project(":camera:camera-testing"))
     testImplementation(project(":camera:camera-extensions-stub"))
     // To use the extensions-stub for testing directly.
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has its own MockMaker
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has its own MockMaker
-    androidTestImplementation(TRUTH)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(libs.truth)
     androidTestImplementation(project(":camera:camera-lifecycle"))
     androidTestImplementation(project(":camera:camera-testing"))
     androidTestImplementation(project(":internal-testutils-truth"))
diff --git a/camera/camera-extensions/lint-baseline.xml b/camera/camera-extensions/lint-baseline.xml
index f404e0f..5bc97e7 100644
--- a/camera/camera-extensions/lint-baseline.xml
+++ b/camera/camera-extensions/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java
index 8f46507..48ec5ce 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.extensions;
 
+import static androidx.camera.extensions.util.ExtensionsTestUtil.assumeCompatibleDevice;
 import static androidx.camera.testing.SurfaceTextureProvider.createSurfaceTextureProvider;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -50,7 +51,6 @@
 import androidx.camera.core.impl.PreviewConfig;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.util.ExtensionsTestUtil;
 import androidx.camera.lifecycle.ProcessCameraProvider;
 import androidx.camera.testing.CameraUtil;
@@ -92,7 +92,7 @@
     private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
     private final Context mContext = ApplicationProvider.getApplicationContext();
 
-    private final EffectMode mEffectMode;
+    private final ExtensionsManager.EffectMode mEffectMode;
     @ExtensionMode.Mode
     private final int mExtensionMode;
     @CameraSelector.LensFacing
@@ -103,7 +103,8 @@
     private CameraSelector mBaseCameraSelector;
     private CameraSelector mExtensionsCameraSelector;
 
-    public ExtensionTest(EffectMode effectMode, @CameraSelector.LensFacing int lensFacing) {
+    public ExtensionTest(ExtensionsManager.EffectMode effectMode,
+            @CameraSelector.LensFacing int lensFacing) {
         mEffectMode = effectMode;
         mExtensionMode = ExtensionsTestUtil.effectModeToExtensionMode(mEffectMode);
         mLensFacing = lensFacing;
@@ -111,6 +112,7 @@
 
     @Before
     public void setUp() throws Exception {
+        assumeCompatibleDevice();
         assumeTrue(CameraUtil.deviceHasCamera());
         assumeTrue(CameraUtil.hasCameraWithLensFacing(mLensFacing));
 
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsErrorListenerTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsErrorListenerTest.java
index 146847c..3f8c741 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsErrorListenerTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsErrorListenerTest.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.extensions;
 
+import static androidx.camera.extensions.util.ExtensionsTestUtil.assumeCompatibleDevice;
 import static androidx.camera.extensions.util.ExtensionsTestUtil.effectModeToExtensionMode;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -38,7 +39,6 @@
 import androidx.camera.core.impl.CameraInfoInternal;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.extensions.ExtensionsErrorListener.ExtensionsErrorCode;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.ImageCaptureExtenderImpl;
 import androidx.camera.extensions.impl.PreviewExtenderImpl;
 import androidx.camera.extensions.util.ExtensionsTestUtil;
@@ -90,7 +90,7 @@
 
     private ExtensionsInfo mExtensionsInfo;
     private CameraSelector mCameraSelector;
-    private EffectMode mEffectMode;
+    private ExtensionsManager.EffectMode mEffectMode;
     @ExtensionMode.Mode
     private int mExtensionMode;
     @CameraSelector.LensFacing
@@ -110,7 +110,7 @@
         }
     };
 
-    public ExtensionsErrorListenerTest(EffectMode effectMode,
+    public ExtensionsErrorListenerTest(ExtensionsManager.EffectMode effectMode,
             @CameraSelector.LensFacing int lensFacing) {
         mEffectMode = effectMode;
         mExtensionMode = effectModeToExtensionMode(effectMode);
@@ -122,6 +122,7 @@
 
     @Before
     public void setUp() throws InterruptedException, ExecutionException, TimeoutException {
+        assumeCompatibleDevice();
         assumeTrue(CameraUtil.deviceHasCamera());
 
         mProcessCameraProvider = ProcessCameraProvider.getInstance(mContext).get(
@@ -163,8 +164,8 @@
 
         ImageCapture imageCapture = ExtensionsTestUtil.createImageCaptureWithEffect(mEffectMode,
                 mLensFacing);
-        Preview noEffectPreview = ExtensionsTestUtil.createPreviewWithEffect(EffectMode.NORMAL,
-                mLensFacing);
+        Preview noEffectPreview = ExtensionsTestUtil.createPreviewWithEffect(
+                ExtensionsManager.EffectMode.NORMAL, mLensFacing);
         mErrorCode.set(null);
 
         mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, mCameraSelector, imageCapture,
@@ -195,8 +196,8 @@
     public void receiveErrorCode_whenOnlyEnablePreview_ByExtenderAPI() throws InterruptedException {
         ExtensionsManager.setExtensionsErrorListener(mExtensionsErrorListener);
 
-        ImageCapture noEffectImageCapture =
-                ExtensionsTestUtil.createImageCaptureWithEffect(EffectMode.NORMAL, mLensFacing);
+        ImageCapture noEffectImageCapture = ExtensionsTestUtil.createImageCaptureWithEffect(
+                ExtensionsManager.EffectMode.NORMAL, mLensFacing);
         Preview preview = ExtensionsTestUtil.createPreviewWithEffect(mEffectMode, mLensFacing);
         mErrorCode.set(null);
 
@@ -246,16 +247,16 @@
     @Test
     public void receiveErrorCode_whenEnableMismatchedImageCapturePreview_ByExtenderAPI()
             throws InterruptedException, CameraAccessException, CameraInfoUnavailableException {
-        EffectMode mismatchedEffectMode;
+        ExtensionsManager.EffectMode mismatchedEffectMode;
 
-        if (mEffectMode != EffectMode.BOKEH) {
-            assumeTrue(ExtensionsManager.isExtensionAvailable(EffectMode.BOKEH,
+        if (mEffectMode != ExtensionsManager.EffectMode.BOKEH) {
+            assumeTrue(ExtensionsManager.isExtensionAvailable(ExtensionsManager.EffectMode.BOKEH,
                     mLensFacing));
-            mismatchedEffectMode = EffectMode.BOKEH;
+            mismatchedEffectMode = ExtensionsManager.EffectMode.BOKEH;
         } else {
-            assumeTrue(ExtensionsManager.isExtensionAvailable(EffectMode.HDR,
+            assumeTrue(ExtensionsManager.isExtensionAvailable(ExtensionsManager.EffectMode.HDR,
                     mLensFacing));
-            mismatchedEffectMode = EffectMode.HDR;
+            mismatchedEffectMode = ExtensionsManager.EffectMode.HDR;
         }
 
         assumeTrue(canSupportImageCaptureTogetherWithPreview(mEffectMode, mismatchedEffectMode));
@@ -338,7 +339,8 @@
     }
 
     private boolean canSupportImageCaptureTogetherWithPreview(
-            @NonNull EffectMode imageCaptureEffectMode, @NonNull EffectMode previewEffectMode)
+            @NonNull ExtensionsManager.EffectMode imageCaptureEffectMode,
+            @NonNull ExtensionsManager.EffectMode previewEffectMode)
             throws CameraAccessException, CameraInfoUnavailableException {
 
         CameraUseCaseAdapter camera = CameraUtil.createCameraUseCaseAdapter(mContext,
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsInfoTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsInfoTest.kt
index 97e144a..e1e435d 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsInfoTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsInfoTest.kt
@@ -21,7 +21,6 @@
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.CameraSelector.LensFacing
 import androidx.camera.extensions.ExtensionMode.Mode
-import androidx.camera.extensions.ExtensionsManager.EffectMode
 import androidx.camera.extensions.util.ExtensionsTestUtil
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
@@ -54,7 +53,7 @@
 
     private val instrumentation = InstrumentationRegistry.getInstrumentation()
 
-    private val effectMode: EffectMode =
+    private val effectMode: ExtensionsManager.EffectMode =
         ExtensionsTestUtil.extensionModeToEffectMode(extensionMode)
 
     private lateinit var extensionsInfo: ExtensionsInfo
@@ -63,6 +62,7 @@
     @Before
     @Throws(Exception::class)
     fun setUp() {
+        ExtensionsTestUtil.assumeCompatibleDevice()
         assumeTrue(CameraUtil.deviceHasCamera())
 
         cameraProvider =
@@ -84,7 +84,9 @@
         TimeoutException::class
     )
     fun cleanUp() {
-        cameraProvider.shutdown()[10000, TimeUnit.MILLISECONDS]
+        if (::cameraProvider.isInitialized) {
+            cameraProvider.shutdown().get(10000, TimeUnit.MILLISECONDS)
+        }
         ExtensionsManager.deinit().get(10000, TimeUnit.MILLISECONDS)
     }
 
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
index 0740955..1fed877 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
@@ -16,11 +16,13 @@
 
 package androidx.camera.extensions
 
+import androidx.camera.extensions.util.ExtensionsTestUtil
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.testutils.assertThrows
 import com.google.common.truth.Truth.assertThat
 import org.junit.After
+import org.junit.Before
 import org.junit.Test
 import java.util.concurrent.TimeUnit
 
@@ -29,6 +31,11 @@
 
     private val context = InstrumentationRegistry.getInstrumentation().context
 
+    @Before
+    fun setUp() {
+        ExtensionsTestUtil.assumeCompatibleDevice()
+    }
+
     @After
     fun teardown() {
         ExtensionsManager.deinit().get()
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java
index 91b4639..6c72f4a 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java
@@ -16,6 +16,8 @@
 
 package androidx.camera.extensions;
 
+import static androidx.camera.extensions.util.ExtensionsTestUtil.assumeCompatibleDevice;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assume.assumeTrue;
@@ -51,6 +53,8 @@
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.extensions.impl.CaptureStageImpl;
 import androidx.camera.extensions.impl.ImageCaptureExtenderImpl;
+import androidx.camera.extensions.internal.ExtensionVersion;
+import androidx.camera.extensions.internal.Version;
 import androidx.camera.extensions.util.ExtensionsTestUtil;
 import androidx.camera.testing.CameraAvailabilityUtil;
 import androidx.camera.testing.CameraUtil;
@@ -88,6 +92,7 @@
 
     @Before
     public void setUp() throws InterruptedException, ExecutionException, TimeoutException {
+        assumeCompatibleDevice();
         assumeTrue(CameraUtil.deviceHasCamera());
 
         CameraX.initialize(mContext, Camera2Config.defaultConfig()).get();
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderValidationTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderValidationTest.kt
index d0808dd..e1f7df7 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderValidationTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderValidationTest.kt
@@ -22,6 +22,8 @@
 import androidx.camera.core.CameraInfoUnavailableException
 import androidx.camera.core.CameraSelector
 import androidx.camera.extensions.ExtensionMode.Mode
+import androidx.camera.extensions.internal.ExtensionVersion
+import androidx.camera.extensions.internal.Version
 import androidx.camera.extensions.util.ExtensionsTestUtil
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
@@ -57,6 +59,7 @@
     @Before
     @Throws(Exception::class)
     fun setUp() {
+        ExtensionsTestUtil.assumeCompatibleDevice()
         Assume.assumeTrue(CameraUtil.deviceHasCamera())
         Assume.assumeTrue(
             CameraUtil.hasCameraWithLensFacing(
@@ -84,7 +87,9 @@
         TimeoutException::class
     )
     fun cleanUp() {
-        cameraProvider.shutdown()[10000, TimeUnit.MILLISECONDS]
+        if (::cameraProvider.isInitialized) {
+            cameraProvider.shutdown().get(10000, TimeUnit.MILLISECONDS)
+        }
         ExtensionsManager.deinit()[10000, TimeUnit.MILLISECONDS]
     }
 
@@ -102,7 +107,8 @@
     )
     fun getSupportedResolutionsImplementationTest() {
         // getSupportedResolutions supported since version 1.1
-        Assume.assumeTrue(ExtensionVersion.getRuntimeVersion().compareTo(Version.VERSION_1_1) >= 0)
+        val version = ExtensionVersion.getRuntimeVersion()
+        Assume.assumeTrue(version != null && version.compareTo(Version.VERSION_1_1) >= 0)
 
         // Creates the ImageCaptureExtenderImpl to retrieve the target format/resolutions pair list
         // from vendor library for the target effect mode.
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java
index cf2f189..f7c6642 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.extensions;
 
+import static androidx.camera.extensions.util.ExtensionsTestUtil.assumeCompatibleDevice;
 import static androidx.camera.testing.SurfaceTextureProvider.createSurfaceTextureProvider;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -56,6 +57,8 @@
 import androidx.camera.extensions.impl.PreviewExtenderImpl;
 import androidx.camera.extensions.impl.PreviewImageProcessorImpl;
 import androidx.camera.extensions.impl.RequestUpdateProcessorImpl;
+import androidx.camera.extensions.internal.ExtensionVersion;
+import androidx.camera.extensions.internal.Version;
 import androidx.camera.extensions.util.ExtensionsTestUtil;
 import androidx.camera.testing.CameraAvailabilityUtil;
 import androidx.camera.testing.CameraUtil;
@@ -110,6 +113,7 @@
 
     @Before
     public void setUp() throws InterruptedException, ExecutionException, TimeoutException {
+        assumeCompatibleDevice();
         assumeTrue(CameraUtil.deviceHasCamera());
         assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK));
 
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderValidationTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderValidationTest.kt
index 053a5ff..0f94c94 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderValidationTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderValidationTest.kt
@@ -22,6 +22,8 @@
 import androidx.camera.core.CameraInfoUnavailableException
 import androidx.camera.core.CameraSelector
 import androidx.camera.extensions.ExtensionMode.Mode
+import androidx.camera.extensions.internal.ExtensionVersion
+import androidx.camera.extensions.internal.Version
 import androidx.camera.extensions.util.ExtensionsTestUtil
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
@@ -57,6 +59,7 @@
     @Before
     @Throws(Exception::class)
     fun setUp() {
+        ExtensionsTestUtil.assumeCompatibleDevice()
         Assume.assumeTrue(CameraUtil.deviceHasCamera())
         Assume.assumeTrue(
             CameraUtil.hasCameraWithLensFacing(
@@ -83,7 +86,9 @@
         TimeoutException::class
     )
     fun cleanUp() {
-        cameraProvider.shutdown()[10000, TimeUnit.MILLISECONDS]
+        if (::cameraProvider.isInitialized) {
+            cameraProvider.shutdown().get(10000, TimeUnit.MILLISECONDS)
+        }
         ExtensionsManager.deinit()[10000, TimeUnit.MILLISECONDS]
     }
 
@@ -101,7 +106,8 @@
     )
     fun getSupportedResolutionsImplementationTest() {
         // getSupportedResolutions supported since version 1.1
-        Assume.assumeTrue(ExtensionVersion.getRuntimeVersion().compareTo(Version.VERSION_1_1) >= 0)
+        val version = ExtensionVersion.getRuntimeVersion()
+        Assume.assumeTrue(version != null && version.compareTo(Version.VERSION_1_1) >= 0)
 
         // Creates the ImageCaptureExtenderImpl to retrieve the target format/resolutions pair list
         // from vendor library for the target effect mode.
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
index 63758d5..4e98ef6 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
@@ -23,32 +23,19 @@
 import android.content.Context;
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCharacteristics;
+import android.os.Build;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.camera.core.CameraInfoUnavailableException;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.CameraX;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Preview;
 import androidx.camera.core.impl.ImageCaptureConfig;
 import androidx.camera.core.impl.PreviewConfig;
-import androidx.camera.extensions.AutoImageCaptureExtender;
-import androidx.camera.extensions.AutoPreviewExtender;
-import androidx.camera.extensions.BeautyImageCaptureExtender;
-import androidx.camera.extensions.BeautyPreviewExtender;
-import androidx.camera.extensions.BokehImageCaptureExtender;
-import androidx.camera.extensions.BokehPreviewExtender;
 import androidx.camera.extensions.ExtensionMode;
 import androidx.camera.extensions.ExtensionsManager;
-import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.ExtensionsManager.ExtensionsAvailability;
-import androidx.camera.extensions.HdrImageCaptureExtender;
-import androidx.camera.extensions.HdrPreviewExtender;
-import androidx.camera.extensions.ImageCaptureExtender;
-import androidx.camera.extensions.NightImageCaptureExtender;
-import androidx.camera.extensions.NightPreviewExtender;
-import androidx.camera.extensions.PreviewExtender;
 import androidx.camera.extensions.impl.AutoImageCaptureExtenderImpl;
 import androidx.camera.extensions.impl.AutoPreviewExtenderImpl;
 import androidx.camera.extensions.impl.BeautyImageCaptureExtenderImpl;
@@ -65,6 +52,8 @@
 
 import com.google.common.util.concurrent.ListenableFuture;
 
+import org.junit.AssumptionViolatedException;
+
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.concurrent.ExecutionException;
@@ -75,16 +64,16 @@
     @NonNull
     public static Collection<Object[]> getAllEffectLensFacingCombinations() {
         return Arrays.asList(new Object[][]{
-                {EffectMode.BOKEH, CameraSelector.LENS_FACING_FRONT},
-                {EffectMode.BOKEH, CameraSelector.LENS_FACING_BACK},
-                {EffectMode.HDR, CameraSelector.LENS_FACING_FRONT},
-                {EffectMode.HDR, CameraSelector.LENS_FACING_BACK},
-                {EffectMode.BEAUTY, CameraSelector.LENS_FACING_FRONT},
-                {EffectMode.BEAUTY, CameraSelector.LENS_FACING_BACK},
-                {EffectMode.NIGHT, CameraSelector.LENS_FACING_FRONT},
-                {EffectMode.NIGHT, CameraSelector.LENS_FACING_BACK},
-                {EffectMode.AUTO, CameraSelector.LENS_FACING_FRONT},
-                {EffectMode.AUTO, CameraSelector.LENS_FACING_BACK}
+                {ExtensionsManager.EffectMode.BOKEH, CameraSelector.LENS_FACING_FRONT},
+                {ExtensionsManager.EffectMode.BOKEH, CameraSelector.LENS_FACING_BACK},
+                {ExtensionsManager.EffectMode.HDR, CameraSelector.LENS_FACING_FRONT},
+                {ExtensionsManager.EffectMode.HDR, CameraSelector.LENS_FACING_BACK},
+                {ExtensionsManager.EffectMode.BEAUTY, CameraSelector.LENS_FACING_FRONT},
+                {ExtensionsManager.EffectMode.BEAUTY, CameraSelector.LENS_FACING_BACK},
+                {ExtensionsManager.EffectMode.NIGHT, CameraSelector.LENS_FACING_FRONT},
+                {ExtensionsManager.EffectMode.NIGHT, CameraSelector.LENS_FACING_BACK},
+                {ExtensionsManager.EffectMode.AUTO, CameraSelector.LENS_FACING_FRONT},
+                {ExtensionsManager.EffectMode.AUTO, CameraSelector.LENS_FACING_BACK}
         });
     }
 
@@ -126,7 +115,7 @@
     }
 
     @ExtensionMode.Mode
-    public static int effectModeToExtensionMode(@NonNull EffectMode effectMode) {
+    public static int effectModeToExtensionMode(@NonNull ExtensionsManager.EffectMode effectMode) {
         switch (effectMode) {
             case NORMAL:
                 return ExtensionMode.NONE;
@@ -144,27 +133,28 @@
         throw new IllegalArgumentException("Effect mode not found: " + effectMode);
     }
 
-    public static EffectMode extensionModeToEffectMode(@ExtensionMode.Mode int mode) {
+    public static ExtensionsManager.EffectMode extensionModeToEffectMode(
+            @ExtensionMode.Mode int mode) {
         switch (mode) {
             case ExtensionMode.NONE:
-                return EffectMode.NORMAL;
+                return ExtensionsManager.EffectMode.NORMAL;
             case ExtensionMode.BOKEH:
-                return EffectMode.BOKEH;
+                return ExtensionsManager.EffectMode.BOKEH;
             case ExtensionMode.HDR:
-                return EffectMode.HDR;
+                return ExtensionsManager.EffectMode.HDR;
             case ExtensionMode.NIGHT:
-                return EffectMode.NIGHT;
+                return ExtensionsManager.EffectMode.NIGHT;
             case ExtensionMode.BEAUTY:
-                return EffectMode.BEAUTY;
+                return ExtensionsManager.EffectMode.BEAUTY;
             case ExtensionMode.AUTO:
-                return EffectMode.AUTO;
+                return ExtensionsManager.EffectMode.AUTO;
         }
         throw new IllegalArgumentException("Extension mode not found: " + mode);
     }
 
     /**
-     * Creates an {@link ImageCapture.Builder} object for specific {@link EffectMode} and
-     * {@link CameraSelector.LensFacing}.
+     * Creates an {@link ImageCapture.Builder} object for specific
+     * {@link ExtensionsManager.EffectMode} and {@link CameraSelector.LensFacing}.
      *
      * @param effectMode The effect mode for the created object.
      * @param lensFacing The lens facing for the created object.
@@ -172,32 +162,33 @@
      */
     @NonNull
     public static ImageCapture.Builder createImageCaptureConfigBuilderWithEffect(
-            @NonNull EffectMode effectMode, @CameraSelector.LensFacing int lensFacing) {
+            @NonNull ExtensionsManager.EffectMode effectMode,
+            @CameraSelector.LensFacing int lensFacing) {
         ImageCapture.Builder builder = new ImageCapture.Builder();
         CameraSelector selector =
                 new CameraSelector.Builder().requireLensFacing(lensFacing).build();
-        ImageCaptureExtender extender = null;
+        androidx.camera.extensions.ImageCaptureExtender extender = null;
 
         switch (effectMode) {
             case HDR:
-                extender = HdrImageCaptureExtender.create(builder);
+                extender = androidx.camera.extensions.HdrImageCaptureExtender.create(builder);
                 break;
             case BOKEH:
-                extender = BokehImageCaptureExtender.create(builder);
+                extender = androidx.camera.extensions.BokehImageCaptureExtender.create(builder);
                 break;
             case BEAUTY:
-                extender = BeautyImageCaptureExtender.create(builder);
+                extender = androidx.camera.extensions.BeautyImageCaptureExtender.create(builder);
                 break;
             case NIGHT:
-                extender = NightImageCaptureExtender.create(builder);
+                extender = androidx.camera.extensions.NightImageCaptureExtender.create(builder);
                 break;
             case AUTO:
-                extender = AutoImageCaptureExtender.create(builder);
+                extender = androidx.camera.extensions.AutoImageCaptureExtender.create(builder);
                 break;
         }
 
         // Applies effect configs if it is not normal mode.
-        if (effectMode != EffectMode.NORMAL) {
+        if (effectMode != ExtensionsManager.EffectMode.NORMAL) {
             assertNotNull(extender);
             assertTrue(extender.isExtensionAvailable(selector));
             extender.enableExtension(selector);
@@ -207,41 +198,42 @@
     }
 
     /**
-     * Creates a {@link Preview.Builder} object for specific {@link EffectMode} and
-     * {@link CameraSelector.LensFacing}.
+     * Creates a {@link Preview.Builder} object for specific {@link ExtensionsManager.EffectMode}
+     * and {@link CameraSelector.LensFacing}.
      *
      * @param effectMode The effect mode for the created object.
      * @param lensFacing The lens facing for the created object.
      * @return A {@link Preview.Builder} object.
      */
     @NonNull
-    public static Preview.Builder createPreviewBuilderWithEffect(@NonNull EffectMode effectMode,
+    public static Preview.Builder createPreviewBuilderWithEffect(
+            @NonNull ExtensionsManager.EffectMode effectMode,
             @CameraSelector.LensFacing int lensFacing) {
         Preview.Builder builder = new Preview.Builder();
         CameraSelector selector =
                 new CameraSelector.Builder().requireLensFacing(lensFacing).build();
-        PreviewExtender extender = null;
+        androidx.camera.extensions.PreviewExtender extender = null;
 
         switch (effectMode) {
             case HDR:
-                extender = HdrPreviewExtender.create(builder);
+                extender = androidx.camera.extensions.HdrPreviewExtender.create(builder);
                 break;
             case BOKEH:
-                extender = BokehPreviewExtender.create(builder);
+                extender = androidx.camera.extensions.BokehPreviewExtender.create(builder);
                 break;
             case BEAUTY:
-                extender = BeautyPreviewExtender.create(builder);
+                extender = androidx.camera.extensions.BeautyPreviewExtender.create(builder);
                 break;
             case NIGHT:
-                extender = NightPreviewExtender.create(builder);
+                extender = androidx.camera.extensions.NightPreviewExtender.create(builder);
                 break;
             case AUTO:
-                extender = AutoPreviewExtender.create(builder);
+                extender = androidx.camera.extensions.AutoPreviewExtender.create(builder);
                 break;
         }
 
         // Applies effect configs if it is not normal mode.
-        if (effectMode != EffectMode.NORMAL) {
+        if (effectMode != ExtensionsManager.EffectMode.NORMAL) {
             assertNotNull(extender);
             assertTrue(extender.isExtensionAvailable(selector));
             extender.enableExtension(selector);
@@ -251,8 +243,8 @@
     }
 
     /**
-     * Creates an {@link ImageCaptureConfig} object for specific {@link EffectMode} and
-     * {@link CameraSelector.LensFacing}.
+     * Creates an {@link ImageCaptureConfig} object for specific
+     * {@link ExtensionsManager.EffectMode} and {@link CameraSelector.LensFacing}.
      *
      * @param effectMode The effect mode for the created object.
      * @param lensFacing The lens facing for the created object.
@@ -260,14 +252,15 @@
      */
     @NonNull
     public static ImageCaptureConfig createImageCaptureConfigWithEffect(
-            @NonNull EffectMode effectMode, @CameraSelector.LensFacing int lensFacing) {
+            @NonNull ExtensionsManager.EffectMode effectMode,
+            @CameraSelector.LensFacing int lensFacing) {
         ImageCapture.Builder imageCaptureConfigBuilder =
                 createImageCaptureConfigBuilderWithEffect(effectMode, lensFacing);
         return imageCaptureConfigBuilder.getUseCaseConfig();
     }
 
     /**
-     * Creates a {@link PreviewConfig} object for specific {@link EffectMode} and
+     * Creates a {@link PreviewConfig} object for specific {@link ExtensionsManager.EffectMode} and
      * {@link CameraSelector.LensFacing}.
      *
      * @param effectMode The effect mode for the created object.
@@ -275,7 +268,8 @@
      * @return A {@link PreviewConfig} object.
      */
     @NonNull
-    public static PreviewConfig createPreviewConfigWithEffect(@NonNull EffectMode effectMode,
+    public static PreviewConfig createPreviewConfigWithEffect(
+            @NonNull ExtensionsManager.EffectMode effectMode,
             @CameraSelector.LensFacing int lensFacing) {
         Preview.Builder previewBuilder =
                 createPreviewBuilderWithEffect(effectMode, lensFacing);
@@ -283,7 +277,7 @@
     }
 
     /**
-     * Creates an {@link ImageCapture} object for specific {@link EffectMode} and
+     * Creates an {@link ImageCapture} object for specific {@link ExtensionsManager.EffectMode} and
      * {@link CameraSelector.LensFacing}.
      *
      * @param effectMode The effect mode for the created object.
@@ -291,13 +285,14 @@
      * @return An {@link ImageCapture} object.
      */
     @NonNull
-    public static ImageCapture createImageCaptureWithEffect(@NonNull EffectMode effectMode,
+    public static ImageCapture createImageCaptureWithEffect(
+            @NonNull ExtensionsManager.EffectMode effectMode,
             @CameraSelector.LensFacing int lensFacing) {
         return createImageCaptureConfigBuilderWithEffect(effectMode, lensFacing).build();
     }
 
     /**
-     * Creates a {@link Preview} object for specific {@link EffectMode} and
+     * Creates a {@link Preview} object for specific {@link ExtensionsManager.EffectMode} and
      * {@link CameraSelector.LensFacing}.
      *
      * @param effectMode The effect mode for the created object.
@@ -305,14 +300,14 @@
      * @return A {@link Preview} object.
      */
     @NonNull
-    public static Preview createPreviewWithEffect(@NonNull EffectMode effectMode,
+    public static Preview createPreviewWithEffect(@NonNull ExtensionsManager.EffectMode effectMode,
             @CameraSelector.LensFacing int lensFacing) {
         return createPreviewBuilderWithEffect(effectMode, lensFacing).build();
     }
 
     /**
-     * Creates an {@link ImageCaptureExtenderImpl} object for specific {@link EffectMode} and
-     * {@link CameraSelector.LensFacing}.
+     * Creates an {@link ImageCaptureExtenderImpl} object for specific
+     * {@link ExtensionsManager.EffectMode} and {@link CameraSelector.LensFacing}.
      *
      * @param effectMode The effect mode for the created object.
      * @param lensFacing The lens facing for the created object.
@@ -320,8 +315,8 @@
      */
     @NonNull
     public static ImageCaptureExtenderImpl createImageCaptureExtenderImpl(
-            @NonNull EffectMode effectMode, @CameraSelector.LensFacing int lensFacing)
-            throws CameraInfoUnavailableException, CameraAccessException {
+            @NonNull ExtensionsManager.EffectMode effectMode,
+            @CameraSelector.LensFacing int lensFacing) throws CameraAccessException {
         ImageCaptureExtenderImpl impl = null;
 
         switch (effectMode) {
@@ -356,17 +351,17 @@
     }
 
     /**
-     * Creates a {@link PreviewExtenderImpl} object for specific {@link EffectMode} and
-     * {@link CameraSelector.LensFacing}.
+     * Creates a {@link PreviewExtenderImpl} object for specific
+     * {@link ExtensionsManager.EffectMode} and {@link CameraSelector.LensFacing}.
      *
      * @param effectMode The effect mode for the created object.
      * @param lensFacing The lens facing for the created object.
      * @return A {@link PreviewExtenderImpl} object.
      */
     @NonNull
-    public static PreviewExtenderImpl createPreviewExtenderImpl(@NonNull EffectMode effectMode,
-            @CameraSelector.LensFacing int lensFacing)
-            throws CameraInfoUnavailableException, CameraAccessException {
+    public static PreviewExtenderImpl createPreviewExtenderImpl(
+            @NonNull ExtensionsManager.EffectMode effectMode,
+            @CameraSelector.LensFacing int lensFacing) throws CameraAccessException {
         PreviewExtenderImpl impl = null;
 
         switch (effectMode) {
@@ -401,33 +396,34 @@
     }
 
     /**
-     * Creates an {@link ImageCaptureExtender} object for specific {@link EffectMode} and
-     * {@link ImageCapture.Builder}.
+     * Creates an {@link androidx.camera.extensions.ImageCaptureExtender} object for specific
+     * {@link ExtensionsManager.EffectMode} and {@link ImageCapture.Builder}.
      *
      * @param effectMode The effect mode for the created object.
      * @param builder    The {@link ImageCapture.Builder} for the created object.
-     * @return An {@link ImageCaptureExtender} object.
+     * @return An {@link androidx.camera.extensions.ImageCaptureExtender} object.
      */
     @NonNull
-    public static ImageCaptureExtender createImageCaptureExtender(@NonNull EffectMode effectMode,
+    public static androidx.camera.extensions.ImageCaptureExtender createImageCaptureExtender(
+            @NonNull ExtensionsManager.EffectMode effectMode,
             @NonNull ImageCapture.Builder builder) {
-        ImageCaptureExtender extender = null;
+        androidx.camera.extensions.ImageCaptureExtender extender = null;
 
         switch (effectMode) {
             case HDR:
-                extender = HdrImageCaptureExtender.create(builder);
+                extender = androidx.camera.extensions.HdrImageCaptureExtender.create(builder);
                 break;
             case BOKEH:
-                extender = BokehImageCaptureExtender.create(builder);
+                extender = androidx.camera.extensions.BokehImageCaptureExtender.create(builder);
                 break;
             case BEAUTY:
-                extender = BeautyImageCaptureExtender.create(builder);
+                extender = androidx.camera.extensions.BeautyImageCaptureExtender.create(builder);
                 break;
             case NIGHT:
-                extender = NightImageCaptureExtender.create(builder);
+                extender = androidx.camera.extensions.NightImageCaptureExtender.create(builder);
                 break;
             case AUTO:
-                extender = AutoImageCaptureExtender.create(builder);
+                extender = androidx.camera.extensions.AutoImageCaptureExtender.create(builder);
                 break;
         }
         assertNotNull(extender);
@@ -436,33 +432,33 @@
     }
 
     /**
-     * Creates a {@link PreviewExtender} object for specific {@link EffectMode} and
-     * {@link Preview.Builder}.
+     * Creates a {@link androidx.camera.extensions.PreviewExtender} object for specific
+     * {@link ExtensionsManager.EffectMode} and {@link Preview.Builder}.
      *
      * @param effectMode The effect mode for the created object.
      * @param builder    The {@link Preview.Builder} for the created object.
-     * @return A {@link PreviewExtender} object.
+     * @return A {@link androidx.camera.extensions.PreviewExtender} object.
      */
     @NonNull
-    public static PreviewExtender createPreviewExtender(@NonNull EffectMode effectMode,
-            @NonNull Preview.Builder builder) {
-        PreviewExtender extender = null;
+    public static androidx.camera.extensions.PreviewExtender createPreviewExtender(
+            @NonNull ExtensionsManager.EffectMode effectMode, @NonNull Preview.Builder builder) {
+        androidx.camera.extensions.PreviewExtender extender = null;
 
         switch (effectMode) {
             case HDR:
-                extender = HdrPreviewExtender.create(builder);
+                extender = androidx.camera.extensions.HdrPreviewExtender.create(builder);
                 break;
             case BOKEH:
-                extender = BokehPreviewExtender.create(builder);
+                extender = androidx.camera.extensions.BokehPreviewExtender.create(builder);
                 break;
             case BEAUTY:
-                extender = BeautyPreviewExtender.create(builder);
+                extender = androidx.camera.extensions.BeautyPreviewExtender.create(builder);
                 break;
             case NIGHT:
-                extender = NightPreviewExtender.create(builder);
+                extender = androidx.camera.extensions.NightPreviewExtender.create(builder);
                 break;
             case AUTO:
-                extender = AutoPreviewExtender.create(builder);
+                extender = androidx.camera.extensions.AutoPreviewExtender.create(builder);
                 break;
         }
         assertNotNull(extender);
@@ -470,6 +466,12 @@
         return extender;
     }
 
+    public static void assumeCompatibleDevice() {
+        if (Build.DEVICE.equalsIgnoreCase("sailfish") && Build.VERSION.SDK_INT == 26) {
+            throw new AssumptionViolatedException("Known issue, b/187711991.");
+        }
+    }
+
     @Nullable
     private static String getCameraIdUnchecked(@NonNull CameraSelector cameraSelector) {
         try {
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
index 258e4e27..a4eb7d6 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
@@ -21,6 +21,7 @@
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Logger;
 import androidx.camera.extensions.impl.AutoImageCaptureExtenderImpl;
+import androidx.camera.extensions.internal.ExtensionVersion;
 
 /**
  * Load the OEM extension implementation for auto effect type.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java
index baa4b46..39611fb 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java
@@ -21,6 +21,7 @@
 import androidx.camera.core.Logger;
 import androidx.camera.core.Preview;
 import androidx.camera.extensions.impl.AutoPreviewExtenderImpl;
+import androidx.camera.extensions.internal.ExtensionVersion;
 
 /**
  * Load the OEM extension Preview implementation for auto effect type.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
index 538923d..276cee0 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
@@ -21,6 +21,7 @@
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Logger;
 import androidx.camera.extensions.impl.BeautyImageCaptureExtenderImpl;
+import androidx.camera.extensions.internal.ExtensionVersion;
 
 /**
  * Load the OEM extension implementation for beauty effect type.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java
index b43ac6d..85b20e1 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java
@@ -21,6 +21,7 @@
 import androidx.camera.core.Logger;
 import androidx.camera.core.Preview;
 import androidx.camera.extensions.impl.BeautyPreviewExtenderImpl;
+import androidx.camera.extensions.internal.ExtensionVersion;
 
 /**
  * Load the OEM extension Preview implementation for beauty effect type.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
index aff33f6..7b6b349 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
@@ -21,6 +21,7 @@
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Logger;
 import androidx.camera.extensions.impl.BokehImageCaptureExtenderImpl;
+import androidx.camera.extensions.internal.ExtensionVersion;
 
 /**
  * Loads the OEM extension implementation for bokeh effect type.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java
index 999bbae..a5f4600 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java
@@ -21,6 +21,7 @@
 import androidx.camera.core.Logger;
 import androidx.camera.core.Preview;
 import androidx.camera.extensions.impl.BokehPreviewExtenderImpl;
+import androidx.camera.extensions.internal.ExtensionVersion;
 
 /**
  * Load the OEM extension Preview implementation for bokeh effect type.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionCameraFilter.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionCameraFilter.java
index 811b450..58b0463 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionCameraFilter.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionCameraFilter.java
@@ -25,7 +25,6 @@
 import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
 import androidx.camera.core.CameraFilter;
 import androidx.camera.core.CameraInfo;
-import androidx.camera.core.ExperimentalCameraFilter;
 import androidx.camera.core.impl.CameraInfoInternal;
 import androidx.camera.extensions.impl.ImageCaptureExtenderImpl;
 import androidx.camera.extensions.impl.PreviewExtenderImpl;
@@ -38,7 +37,6 @@
  * A filter that filters camera based on extender implementation. If the implementation is
  * unavailable, the camera will be considered available.
  */
-@OptIn(markerClass = ExperimentalCameraFilter.class)
 public final class ExtensionCameraFilter implements CameraFilter {
     private final Id mId;
     private final PreviewExtenderImpl mPreviewExtenderImpl;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsConfig.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsConfig.java
index 61ed618..495a20f 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsConfig.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsConfig.java
@@ -17,7 +17,6 @@
 package androidx.camera.extensions;
 
 import androidx.annotation.NonNull;
-import androidx.camera.core.CameraFilter;
 import androidx.camera.core.impl.CameraConfig;
 import androidx.camera.core.impl.Config;
 import androidx.camera.core.impl.MutableOptionsBundle;
@@ -73,13 +72,6 @@
 
         @NonNull
         @Override
-        public Builder setCameraFilter(@NonNull CameraFilter cameraFilter) {
-            mConfig.insertOption(OPTION_CAMERA_FILTER, cameraFilter);
-            return this;
-        }
-
-        @NonNull
-        @Override
         public Builder setUseCaseConfigFactory(@NonNull UseCaseConfigFactory factory) {
             mConfig.insertOption(OPTION_USECASE_CONFIG_FACTORY, factory);
             return this;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsInfo.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsInfo.java
index 4059f0c..b344ead 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsInfo.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsInfo.java
@@ -19,13 +19,11 @@
 import android.content.Context;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.OptIn;
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.Camera;
 import androidx.camera.core.CameraFilter;
 import androidx.camera.core.CameraProvider;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.ExperimentalCameraFilter;
 import androidx.camera.core.impl.CameraConfigProvider;
 import androidx.camera.core.impl.CameraFilters;
 import androidx.camera.core.impl.ExtendedCameraConfigProviderStore;
@@ -80,7 +78,6 @@
      * @throws IllegalArgumentException if the base {@link CameraSelector} has contained
      * extension related configuration in it.
      */
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
     @NonNull
     public CameraSelector getExtensionCameraSelector(@NonNull CameraSelector baseCameraSelector,
             @ExtensionMode.Mode int mode) {
@@ -128,7 +125,6 @@
      * @param baseCameraSelector The base {@link CameraSelector} to find a camera to use.
      * @param mode The target extension mode to support.
      */
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
     public boolean isExtensionAvailable(
             @NonNull CameraProvider cameraProvider,
             @NonNull CameraSelector baseCameraSelector,
@@ -146,7 +142,6 @@
         return true;
     }
 
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
     private CameraFilter getFilter(@ExtensionMode.Mode int mode) {
         CameraFilter filter;
         String id = getExtendedCameraConfigProviderId(mode);
@@ -191,7 +186,7 @@
     private void injectExtensionCameraConfig(@ExtensionMode.Mode int mode) {
         CameraFilter.Id id = CameraFilter.Id.create(getExtendedCameraConfigProviderId(mode));
 
-        if (ExtendedCameraConfigProviderStore.getConfig(id) == CameraConfigProvider.EMPTY) {
+        if (ExtendedCameraConfigProviderStore.getConfigProvider(id) == CameraConfigProvider.EMPTY) {
             ExtendedCameraConfigProviderStore.addConfig(id, (cameraInfo, context) -> {
                 ExtensionsUseCaseConfigFactory factory = new
                         ExtensionsUseCaseConfigFactory(mode, cameraInfo, context);
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java
index bc70d09..97e663c 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java
@@ -30,6 +30,9 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.camera.extensions.impl.InitializerImpl;
+import androidx.camera.extensions.internal.ExtensionVersion;
+import androidx.camera.extensions.internal.Version;
+import androidx.camera.extensions.internal.VersionName;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -147,15 +150,14 @@
                                 public void onSuccess() {
                                     Logger.d(TAG, "Successfully initialized extensions");
                                     setInitialized(true);
-                                    completer.set(
-                                        ExtensionsAvailability.LIBRARY_AVAILABLE);
+                                    completer.set(ExtensionsAvailability.LIBRARY_AVAILABLE);
                                 }
 
                                 @Override
                                 public void onFailure(int error) {
                                     Logger.d(TAG, "Failed to initialize extensions");
-                                    completer.set(
-                                        ExtensionsAvailability.LIBRARY_UNAVAILABLE_ERROR_LOADING);
+                                    completer.set(ExtensionsAvailability
+                                            .LIBRARY_UNAVAILABLE_ERROR_LOADING);
                                 }
                                 },
                                 CameraXExecutors.mainThreadExecutor());
@@ -363,7 +365,14 @@
         }
     }
 
-    static void postExtensionsError(ExtensionsErrorListener.ExtensionsErrorCode errorCode) {
+    /**
+     * Posts extension error to the listener.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public static void postExtensionsError(
+            @NonNull ExtensionsErrorListener.ExtensionsErrorCode errorCode) {
         synchronized (ERROR_LOCK) {
             final ExtensionsErrorListener listenerReference = sExtensionsErrorListener;
             if (listenerReference != null) {
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
index 9fb4154..c3ce107 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
@@ -21,6 +21,8 @@
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Logger;
 import androidx.camera.extensions.impl.HdrImageCaptureExtenderImpl;
+import androidx.camera.extensions.internal.ExtensionVersion;
+
 /**
  * Load the OEM extension implementation for HDR effect type.
  */
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java
index 84fb8ea..3122998 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java
@@ -21,6 +21,7 @@
 import androidx.camera.core.Logger;
 import androidx.camera.core.Preview;
 import androidx.camera.extensions.impl.HdrPreviewExtenderImpl;
+import androidx.camera.extensions.internal.ExtensionVersion;
 
 /**
  * Load the OEM extension Preview implementation for HDR effect type.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
index 4f8cf2d..86bfdc4 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
@@ -35,7 +35,6 @@
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.CameraX;
-import androidx.camera.core.ExperimentalCameraFilter;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Logger;
 import androidx.camera.core.UseCase;
@@ -49,6 +48,8 @@
 import androidx.camera.extensions.impl.ImageCaptureExtenderImpl;
 import androidx.camera.extensions.internal.AdaptingCaptureProcessor;
 import androidx.camera.extensions.internal.AdaptingCaptureStage;
+import androidx.camera.extensions.internal.ExtensionVersion;
+import androidx.camera.extensions.internal.Version;
 import androidx.core.util.Consumer;
 
 import java.util.ArrayList;
@@ -70,7 +71,6 @@
     private int mEffectMode;
     private ExtensionCameraFilter mExtensionCameraFilter;
 
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
     void init(ImageCapture.Builder builder, ImageCaptureExtenderImpl implementation,
             @ExtensionMode.Mode int effectMode) {
         mBuilder = builder;
@@ -94,7 +94,6 @@
      * Returns the camera specified with the given camera selector and this extension, null if
      * there's no available can be found.
      */
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
     private String getCameraWithExtension(@NonNull CameraSelector cameraSelector) {
         CameraSelector.Builder extensionCameraSelectorBuilder =
                 CameraSelector.Builder.fromSelector(cameraSelector);
@@ -119,7 +118,6 @@
      * @param cameraSelector The selector used to determine the camera for which to enable
      *                       extensions.
      */
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
     public void enableExtension(@NonNull CameraSelector cameraSelector) {
         String cameraId = getCameraWithExtension(cameraSelector);
         if (cameraId == null) {
@@ -150,11 +148,8 @@
 
     /**
      * Update extension related configs to the builder.
-     *
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static void updateBuilderConfig(@NonNull ImageCapture.Builder builder,
+    private static void updateBuilderConfig(@NonNull ImageCapture.Builder builder,
             @ExtensionMode.Mode int effectMode, @NonNull ImageCaptureExtenderImpl impl,
             @NonNull Context context) {
         CaptureProcessorImpl captureProcessor = impl.getCaptureProcessor();
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
index 4c99fc1..277e833 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
@@ -21,6 +21,7 @@
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Logger;
 import androidx.camera.extensions.impl.NightImageCaptureExtenderImpl;
+import androidx.camera.extensions.internal.ExtensionVersion;
 
 /**
  * Load the OEM extension implementation for night effect type.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java
index 23c9cb8..dd38274 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java
@@ -21,6 +21,7 @@
 import androidx.camera.core.Logger;
 import androidx.camera.core.Preview;
 import androidx.camera.extensions.impl.NightPreviewExtenderImpl;
+import androidx.camera.extensions.internal.ExtensionVersion;
 
 /**
  * Load the OEM extension Preview implementation for night effect type.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java
index 5367452..80da011 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java
@@ -35,7 +35,6 @@
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.CameraX;
-import androidx.camera.core.ExperimentalCameraFilter;
 import androidx.camera.core.Logger;
 import androidx.camera.core.Preview;
 import androidx.camera.core.UseCase;
@@ -48,6 +47,9 @@
 import androidx.camera.extensions.internal.AdaptingCaptureStage;
 import androidx.camera.extensions.internal.AdaptingPreviewProcessor;
 import androidx.camera.extensions.internal.AdaptingRequestUpdateProcessor;
+import androidx.camera.extensions.internal.CloseableProcessor;
+import androidx.camera.extensions.internal.ExtensionVersion;
+import androidx.camera.extensions.internal.Version;
 import androidx.core.util.Consumer;
 
 import java.util.Collection;
@@ -67,7 +69,6 @@
     private int mEffectMode;
     private ExtensionCameraFilter mExtensionCameraFilter;
 
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
     void init(Preview.Builder builder, PreviewExtenderImpl implementation,
             @ExtensionMode.Mode int effectMode) {
         mBuilder = builder;
@@ -91,7 +92,6 @@
      * Returns the camera specified with the given camera selector and this extension, null if
      * there's no available can be found.
      */
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
     private String getCameraWithExtension(@NonNull CameraSelector cameraSelector) {
         CameraSelector.Builder extensionCameraSelectorBuilder =
                 CameraSelector.Builder.fromSelector(cameraSelector);
@@ -116,7 +116,6 @@
      * @param cameraSelector The selector used to determine the camera for which to enable
      *                       extensions.
      */
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
     public void enableExtension(@NonNull CameraSelector cameraSelector) {
         String cameraId = getCameraWithExtension(cameraSelector);
         if (cameraId == null) {
@@ -147,11 +146,8 @@
 
     /**
      * Update extension related configs to the builder.
-     *
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static void updateBuilderConfig(@NonNull Preview.Builder builder,
+    private static void updateBuilderConfig(@NonNull Preview.Builder builder,
             @ExtensionMode.Mode int effectMode, @NonNull PreviewExtenderImpl impl,
             @NonNull Context context) {
         PreviewExtenderAdapter previewExtenderAdapter;
@@ -396,15 +392,4 @@
             return null;
         }
     }
-
-    /**
-     * A processor that can be closed so that the underlying processing implementation is skipped,
-     * if it has been closed.
-     *
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public interface CloseableProcessor {
-        void close();
-    }
 }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingPreviewProcessor.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingPreviewProcessor.java
index 191870f..fad4afa 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingPreviewProcessor.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingPreviewProcessor.java
@@ -33,7 +33,6 @@
 import androidx.camera.core.impl.CameraCaptureResults;
 import androidx.camera.core.impl.CaptureProcessor;
 import androidx.camera.core.impl.ImageProxyBundle;
-import androidx.camera.extensions.PreviewExtender;
 import androidx.camera.extensions.impl.PreviewImageProcessorImpl;
 import androidx.core.util.Preconditions;
 
@@ -45,8 +44,7 @@
 /**
  * A {@link CaptureProcessor} that calls a vendor provided preview processing implementation.
  */
-public final class AdaptingPreviewProcessor implements CaptureProcessor,
-        PreviewExtender.CloseableProcessor {
+public final class AdaptingPreviewProcessor implements CaptureProcessor, CloseableProcessor {
     private static final String TAG = "AdaptingPreviewProcesso";
     private final PreviewImageProcessorImpl mImpl;
     private BlockingCloseAccessCounter mAccessCounter = new BlockingCloseAccessCounter();
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingRequestUpdateProcessor.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingRequestUpdateProcessor.java
index 1b32169..c1445b9 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingRequestUpdateProcessor.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingRequestUpdateProcessor.java
@@ -27,7 +27,6 @@
 import androidx.camera.core.impl.CameraCaptureResults;
 import androidx.camera.core.impl.CaptureStage;
 import androidx.camera.core.impl.ImageInfoProcessor;
-import androidx.camera.extensions.PreviewExtender;
 import androidx.camera.extensions.impl.CaptureStageImpl;
 import androidx.camera.extensions.impl.PreviewExtenderImpl;
 import androidx.camera.extensions.impl.RequestUpdateProcessorImpl;
@@ -37,7 +36,7 @@
  * A {@link ImageInfoProcessor} that calls a vendor provided preview processing implementation.
  */
 public final class AdaptingRequestUpdateProcessor implements ImageInfoProcessor,
-        PreviewExtender.CloseableProcessor {
+        CloseableProcessor {
     private final PreviewExtenderImpl mPreviewExtenderImpl;
     private final RequestUpdateProcessorImpl mProcessorImpl;
     private BlockingCloseAccessCounter mAccessCounter = new BlockingCloseAccessCounter();
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/CloseableProcessor.java
similarity index 63%
copy from camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
copy to camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/CloseableProcessor.java
index bfc1884..5fb4252 100644
--- a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/CloseableProcessor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,16 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+package androidx.camera.extensions.internal;
 
-import static org.junit.Assert.assertNotNull;
+/**
+ * A processor that can be closed so that the underlying processing implementation is skipped,
+ * if it has been closed.
+ */
+public interface CloseableProcessor {
 
-import org.junit.Test;
-
-public class VersionNameTest {
-    @Test
-    public void testCurrentVersion_shouldNotEmpty() {
-        assertNotNull(VersionName.getCurrentVersion().getVersion());
-    }
+    /**
+     * Close the processor.
+     */
+    void close();
 }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionVersion.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionVersion.java
similarity index 92%
rename from camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionVersion.java
rename to camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionVersion.java
index 436a99a..9877538 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionVersion.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionVersion.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,16 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+package androidx.camera.extensions.internal;
 
+import androidx.annotation.Nullable;
 import androidx.camera.core.Logger;
 import androidx.camera.extensions.impl.ExtensionVersionImpl;
 
 /**
  * Provides interfaces to check the extension version.
  */
-abstract class ExtensionVersion {
+public abstract class ExtensionVersion {
     private static final String TAG = "ExtenderVersion";
 
     private static volatile ExtensionVersion sExtensionVersion;
@@ -51,7 +52,7 @@
      * @return true if OEM returned a major version is matched with the current version, false
      * otherwise.
      */
-    static boolean isExtensionVersionSupported() {
+    public static boolean isExtensionVersionSupported() {
         return getInstance().getVersionObject() != null;
     }
 
@@ -63,7 +64,8 @@
      * <tt>null</tt> if the OEM library didn't implement the version checking method or the
      * version is not compatible with CameraX.
      */
-    static Version getRuntimeVersion() {
+    @Nullable
+    public static Version getRuntimeVersion() {
         return getInstance().getVersionObject();
     }
 
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ImageCaptureConfigProvider.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ImageCaptureConfigProvider.java
index dbc33ff..48f770b 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ImageCaptureConfigProvider.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ImageCaptureConfigProvider.java
@@ -16,31 +16,61 @@
 
 package androidx.camera.extensions.internal;
 
+import static androidx.camera.extensions.internal.PreviewConfigProvider.OPTION_PREVIEW_CONFIG_PROVIDER_MODE;
+
 import android.content.Context;
 import android.hardware.camera2.CameraCharacteristics;
+import android.os.Build;
+import android.util.Pair;
+import android.util.Size;
 
+import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.OptIn;
+import androidx.camera.camera2.impl.Camera2ImplConfig;
+import androidx.camera.camera2.impl.CameraEventCallback;
+import androidx.camera.camera2.impl.CameraEventCallbacks;
 import androidx.camera.camera2.interop.Camera2CameraInfo;
 import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.ImageCapture;
+import androidx.camera.core.Logger;
+import androidx.camera.core.UseCase;
+import androidx.camera.core.impl.CaptureBundle;
+import androidx.camera.core.impl.CaptureConfig;
+import androidx.camera.core.impl.CaptureStage;
+import androidx.camera.core.impl.Config;
 import androidx.camera.core.impl.ConfigProvider;
 import androidx.camera.core.impl.ImageCaptureConfig;
 import androidx.camera.core.impl.OptionsBundle;
 import androidx.camera.extensions.ExtensionMode;
-import androidx.camera.extensions.ImageCaptureExtender;
+import androidx.camera.extensions.ExtensionsErrorListener;
+import androidx.camera.extensions.ExtensionsManager;
 import androidx.camera.extensions.impl.AutoImageCaptureExtenderImpl;
 import androidx.camera.extensions.impl.BeautyImageCaptureExtenderImpl;
 import androidx.camera.extensions.impl.BokehImageCaptureExtenderImpl;
+import androidx.camera.extensions.impl.CaptureProcessorImpl;
+import androidx.camera.extensions.impl.CaptureStageImpl;
 import androidx.camera.extensions.impl.HdrImageCaptureExtenderImpl;
 import androidx.camera.extensions.impl.ImageCaptureExtenderImpl;
 import androidx.camera.extensions.impl.NightImageCaptureExtenderImpl;
+import androidx.core.util.Consumer;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * Provides extensions related configs for image capture
  */
 public class ImageCaptureConfigProvider implements ConfigProvider<ImageCaptureConfig> {
+    private static final String TAG = "ImageCaptureConfigProvider";
+    static final Config.Option<Integer> OPTION_IMAGE_CAPTURE_CONFIG_PROVIDER_MODE =
+            Config.Option.create("camerax.extensions.imageCaptureConfigProvider.mode",
+                    Integer.class);
+
     private ImageCaptureExtenderImpl mImpl;
     private Context mContext;
     @ExtensionMode.Mode
@@ -90,8 +120,228 @@
 
         ImageCapture.Builder builder = new ImageCapture.Builder();
 
-        ImageCaptureExtender.updateBuilderConfig(builder, mEffectMode, mImpl, mContext);
+        updateBuilderConfig(builder, mEffectMode, mImpl, mContext);
 
         return builder.getUseCaseConfig();
     }
+
+    /**
+     * Update extension related configs to the builder.
+     */
+    private void updateBuilderConfig(@NonNull ImageCapture.Builder builder,
+            @ExtensionMode.Mode int effectMode, @NonNull ImageCaptureExtenderImpl impl,
+            @NonNull Context context) {
+        CaptureProcessorImpl captureProcessor = impl.getCaptureProcessor();
+        if (captureProcessor != null) {
+            builder.setCaptureProcessor(new AdaptingCaptureProcessor(captureProcessor));
+        }
+
+        if (impl.getMaxCaptureStage() > 0) {
+            builder.setMaxCaptureStages(impl.getMaxCaptureStage());
+        }
+
+        ImageCaptureEventAdapter imageCaptureEventAdapter = new ImageCaptureEventAdapter(impl,
+                context);
+        new Camera2ImplConfig.Extender<>(builder).setCameraEventCallback(
+                new CameraEventCallbacks(imageCaptureEventAdapter));
+        builder.setUseCaseEventCallback(imageCaptureEventAdapter);
+
+        try {
+            Consumer<Collection<UseCase>> attachedUseCasesUpdateListener =
+                    useCases -> checkPreviewEnabled(effectMode, useCases);
+            builder.setAttachedUseCasesUpdateListener(attachedUseCasesUpdateListener);
+        } catch (NoSuchMethodError e) {
+            // setAttachedUseCasesUpdateListener function may not exist in the used core library.
+            // Catches the NoSuchMethodError and make the extensions be able to be enabled but
+            // only the ExtensionsErrorListener does not work.
+            Logger.e(TAG, "Can't set attached use cases update listener.");
+        }
+
+        builder.setCaptureBundle(imageCaptureEventAdapter);
+        builder.getMutableConfig().insertOption(OPTION_IMAGE_CAPTURE_CONFIG_PROVIDER_MODE,
+                effectMode);
+
+        List<Pair<Integer, Size[]>> supportedResolutions = getSupportedResolutions(impl);
+        if (supportedResolutions != null) {
+            builder.setSupportedResolutions(supportedResolutions);
+        }
+    }
+
+    /**
+     * Get the supported resolutions.
+     */
+    @Nullable
+    private List<Pair<Integer, Size[]>> getSupportedResolutions(
+            @NonNull ImageCaptureExtenderImpl impl) {
+        if (ExtensionVersion.getRuntimeVersion().compareTo(Version.VERSION_1_1) < 0) {
+            return null;
+        }
+
+        try {
+            return impl.getSupportedResolutions();
+        } catch (NoSuchMethodError e) {
+            Logger.e(TAG, "getSupportedResolution interface is not implemented in vendor library.");
+            return null;
+        }
+    }
+
+    private void checkPreviewEnabled(@ExtensionMode.Mode int effectMode,
+            Collection<UseCase> activeUseCases) {
+        boolean isPreviewExtenderEnabled = false;
+        boolean isMismatched = false;
+
+        // In case all use cases are unbound when doing the check.
+        if (activeUseCases == null || activeUseCases.isEmpty()) {
+            return;
+        }
+
+        for (UseCase useCase : activeUseCases) {
+            int previewExtenderMode = useCase.getCurrentConfig().retrieveOption(
+                    OPTION_PREVIEW_CONFIG_PROVIDER_MODE, ExtensionMode.NONE);
+
+            if (effectMode == previewExtenderMode) {
+                isPreviewExtenderEnabled = true;
+            } else if (previewExtenderMode != ExtensionMode.NONE) {
+                isMismatched = true;
+            }
+        }
+
+        if (isMismatched) {
+            ExtensionsManager.postExtensionsError(
+                    ExtensionsErrorListener.ExtensionsErrorCode.MISMATCHED_EXTENSIONS_ENABLED);
+        } else if (!isPreviewExtenderEnabled) {
+            ExtensionsManager.postExtensionsError(
+                    ExtensionsErrorListener.ExtensionsErrorCode.PREVIEW_EXTENSION_REQUIRED);
+        }
+    }
+
+    /**
+     * An implementation to adapt the OEM provided implementation to core.
+     */
+    private static class ImageCaptureEventAdapter extends CameraEventCallback implements
+            UseCase.EventCallback,
+            CaptureBundle {
+        @NonNull
+        private final ImageCaptureExtenderImpl mImpl;
+        @NonNull
+        private final Context mContext;
+        private final AtomicBoolean mActive = new AtomicBoolean(true);
+        private final Object mLock = new Object();
+        @GuardedBy("mLock")
+        private volatile int mEnabledSessionCount = 0;
+        @GuardedBy("mLock")
+        private volatile boolean mUnbind = false;
+
+        ImageCaptureEventAdapter(@NonNull ImageCaptureExtenderImpl impl,
+                @NonNull Context context) {
+            mImpl = impl;
+            mContext = context;
+        }
+
+        @OptIn(markerClass = ExperimentalCamera2Interop.class)
+        @Override
+        public void onAttach(@NonNull CameraInfo cameraInfo) {
+            if (mActive.get()) {
+                String cameraId = Camera2CameraInfo.from(cameraInfo).getCameraId();
+                CameraCharacteristics cameraCharacteristics =
+                        Camera2CameraInfo.extractCameraCharacteristics(cameraInfo);
+                mImpl.onInit(cameraId, cameraCharacteristics, mContext);
+            }
+        }
+
+        @Override
+        public void onDetach() {
+            synchronized (mLock) {
+                mUnbind = true;
+                if (mEnabledSessionCount == 0) {
+                    callDeInit();
+                }
+            }
+        }
+
+        private void callDeInit() {
+            if (mActive.get()) {
+                mImpl.onDeInit();
+                mActive.set(false);
+            }
+        }
+
+        @Override
+        @Nullable
+        public CaptureConfig onPresetSession() {
+            if (mActive.get()) {
+                CaptureStageImpl captureStageImpl = mImpl.onPresetSession();
+                if (captureStageImpl != null) {
+                    if (Build.VERSION.SDK_INT >= 28) {
+                        return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
+                    } else {
+                        Logger.w(TAG, "The CaptureRequest parameters returned from "
+                                + "onPresetSession() will be passed to the camera device as part "
+                                + "of the capture session via "
+                                + "SessionConfiguration#setSessionParameters(CaptureRequest) "
+                                + "which only supported from API level 28!");
+                    }
+                }
+            }
+            return null;
+        }
+
+        @Override
+        @Nullable
+        public CaptureConfig onEnableSession() {
+            try {
+                if (mActive.get()) {
+                    CaptureStageImpl captureStageImpl = mImpl.onEnableSession();
+                    if (captureStageImpl != null) {
+                        return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
+                    }
+                }
+
+                return null;
+            } finally {
+                synchronized (mLock) {
+                    mEnabledSessionCount++;
+                }
+            }
+        }
+
+        @Override
+        @Nullable
+        public CaptureConfig onDisableSession() {
+            try {
+                if (mActive.get()) {
+                    CaptureStageImpl captureStageImpl = mImpl.onDisableSession();
+                    if (captureStageImpl != null) {
+                        return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
+                    }
+                }
+
+                return null;
+            } finally {
+                synchronized (mLock) {
+                    mEnabledSessionCount--;
+                    if (mEnabledSessionCount == 0 && mUnbind) {
+                        callDeInit();
+                    }
+                }
+            }
+        }
+
+        @Override
+        @Nullable
+        public List<CaptureStage> getCaptureStages() {
+            if (mActive.get()) {
+                List<CaptureStageImpl> captureStages = mImpl.getCaptureStages();
+                if (captureStages != null && !captureStages.isEmpty()) {
+                    ArrayList<CaptureStage> ret = new ArrayList<>();
+                    for (CaptureStageImpl s : captureStages) {
+                        ret.add(new AdaptingCaptureStage(s));
+                    }
+                    return ret;
+                }
+            }
+
+            return null;
+        }
+    }
 }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/PreviewConfigProvider.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/PreviewConfigProvider.java
index e186004..63dcb65 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/PreviewConfigProvider.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/PreviewConfigProvider.java
@@ -16,31 +16,55 @@
 
 package androidx.camera.extensions.internal;
 
+import static androidx.camera.extensions.internal.ImageCaptureConfigProvider.OPTION_IMAGE_CAPTURE_CONFIG_PROVIDER_MODE;
+
 import android.content.Context;
 import android.hardware.camera2.CameraCharacteristics;
+import android.os.Build;
+import android.util.Pair;
+import android.util.Size;
 
+import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.OptIn;
+import androidx.camera.camera2.impl.Camera2ImplConfig;
+import androidx.camera.camera2.impl.CameraEventCallback;
+import androidx.camera.camera2.impl.CameraEventCallbacks;
 import androidx.camera.camera2.interop.Camera2CameraInfo;
 import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
 import androidx.camera.core.CameraInfo;
+import androidx.camera.core.Logger;
 import androidx.camera.core.Preview;
+import androidx.camera.core.UseCase;
+import androidx.camera.core.impl.CaptureConfig;
+import androidx.camera.core.impl.Config;
 import androidx.camera.core.impl.ConfigProvider;
 import androidx.camera.core.impl.OptionsBundle;
 import androidx.camera.core.impl.PreviewConfig;
 import androidx.camera.extensions.ExtensionMode;
-import androidx.camera.extensions.PreviewExtender;
+import androidx.camera.extensions.ExtensionsErrorListener;
+import androidx.camera.extensions.ExtensionsManager;
 import androidx.camera.extensions.impl.AutoPreviewExtenderImpl;
 import androidx.camera.extensions.impl.BeautyPreviewExtenderImpl;
 import androidx.camera.extensions.impl.BokehPreviewExtenderImpl;
+import androidx.camera.extensions.impl.CaptureStageImpl;
 import androidx.camera.extensions.impl.HdrPreviewExtenderImpl;
 import androidx.camera.extensions.impl.NightPreviewExtenderImpl;
 import androidx.camera.extensions.impl.PreviewExtenderImpl;
+import androidx.camera.extensions.impl.PreviewImageProcessorImpl;
+import androidx.core.util.Consumer;
+
+import java.util.Collection;
+import java.util.List;
 
 /**
  * For providing extensions config for preview.
  */
 public class PreviewConfigProvider implements ConfigProvider<PreviewConfig> {
+    private static final String TAG = "PreviewConfigProvider";
+    static final Config.Option<Integer> OPTION_PREVIEW_CONFIG_PROVIDER_MODE = Config.Option.create(
+            "camerax.extensions.previewConfigProvider.mode", Integer.class);
     private PreviewExtenderImpl mImpl;
     private Context mContext;
     @ExtensionMode.Mode
@@ -90,8 +114,250 @@
         }
         Preview.Builder builder = new Preview.Builder();
 
-        PreviewExtender.updateBuilderConfig(builder, mEffectMode, mImpl, mContext);
+        updateBuilderConfig(builder, mEffectMode, mImpl, mContext);
 
         return builder.getUseCaseConfig();
     }
+
+    /**
+     * Update extension related configs to the builder.
+     */
+    private void updateBuilderConfig(@NonNull Preview.Builder builder,
+            @ExtensionMode.Mode int effectMode, @NonNull PreviewExtenderImpl impl,
+            @NonNull Context context) {
+        PreviewEventAdapter previewEventAdapter;
+
+        switch (impl.getProcessorType()) {
+            case PROCESSOR_TYPE_REQUEST_UPDATE_ONLY:
+                AdaptingRequestUpdateProcessor adaptingRequestUpdateProcessor =
+                        new AdaptingRequestUpdateProcessor(impl);
+                builder.setImageInfoProcessor(adaptingRequestUpdateProcessor);
+                previewEventAdapter = new PreviewEventAdapter(impl, context,
+                        adaptingRequestUpdateProcessor);
+                break;
+            case PROCESSOR_TYPE_IMAGE_PROCESSOR:
+                AdaptingPreviewProcessor adaptingPreviewProcessor = new
+                        AdaptingPreviewProcessor((PreviewImageProcessorImpl) impl.getProcessor());
+                builder.setCaptureProcessor(adaptingPreviewProcessor);
+                previewEventAdapter = new PreviewEventAdapter(impl, context,
+                        adaptingPreviewProcessor);
+                break;
+            default:
+                previewEventAdapter = new PreviewEventAdapter(impl, context, null);
+        }
+
+        new Camera2ImplConfig.Extender<>(builder).setCameraEventCallback(
+                new CameraEventCallbacks(previewEventAdapter));
+        builder.setUseCaseEventCallback(previewEventAdapter);
+
+        try {
+            Consumer<Collection<UseCase>> attachedUseCasesUpdateListener =
+                    useCases -> checkImageCaptureEnabled(effectMode, useCases);
+            builder.setAttachedUseCasesUpdateListener(attachedUseCasesUpdateListener);
+        } catch (NoSuchMethodError e) {
+            // setAttachedUseCasesUpdateListener function may not exist in the used core library.
+            // Catches the NoSuchMethodError and make the extensions be able to be enabled but
+            // only the ExtensionsErrorListener does not work.
+            Logger.e(TAG, "Can't set attached use cases update listener.");
+        }
+
+        builder.getMutableConfig().insertOption(OPTION_PREVIEW_CONFIG_PROVIDER_MODE, effectMode);
+        List<Pair<Integer, Size[]>> supportedResolutions = getSupportedResolutions(impl);
+        if (supportedResolutions != null) {
+            builder.setSupportedResolutions(supportedResolutions);
+        }
+    }
+
+    /**
+     * Get the resolutions.
+     */
+    @Nullable
+    private List<Pair<Integer, Size[]>> getSupportedResolutions(@NonNull PreviewExtenderImpl impl) {
+        if (ExtensionVersion.getRuntimeVersion().compareTo(Version.VERSION_1_1) < 0) {
+            return null;
+        }
+
+        try {
+            return impl.getSupportedResolutions();
+        } catch (NoSuchMethodError e) {
+            Logger.e(TAG, "getSupportedResolution interface is not implemented in vendor library.");
+            return null;
+        }
+    }
+
+    private void checkImageCaptureEnabled(@ExtensionMode.Mode int effectMode,
+            Collection<UseCase> activeUseCases) {
+        boolean isImageCaptureExtenderEnabled = false;
+        boolean isMismatched = false;
+
+        // In case all use cases are unbound when doing the check.
+        if (activeUseCases == null || activeUseCases.isEmpty()) {
+            return;
+        }
+
+        for (UseCase useCase : activeUseCases) {
+            int imageCaptureExtenderMode = useCase.getCurrentConfig().retrieveOption(
+                    OPTION_IMAGE_CAPTURE_CONFIG_PROVIDER_MODE,
+                    ExtensionMode.NONE);
+
+            if (effectMode == imageCaptureExtenderMode) {
+                isImageCaptureExtenderEnabled = true;
+            } else if (imageCaptureExtenderMode != ExtensionMode.NONE) {
+                isMismatched = true;
+            }
+        }
+
+        if (isMismatched) {
+            ExtensionsManager.postExtensionsError(
+                    ExtensionsErrorListener.ExtensionsErrorCode.MISMATCHED_EXTENSIONS_ENABLED);
+        } else if (!isImageCaptureExtenderEnabled) {
+            ExtensionsManager.postExtensionsError(
+                    ExtensionsErrorListener.ExtensionsErrorCode.IMAGE_CAPTURE_EXTENSION_REQUIRED);
+        }
+    }
+
+    /**
+     * An implementation to adapt the OEM provided implementation to core.
+     */
+    private static class PreviewEventAdapter extends CameraEventCallback implements
+            UseCase.EventCallback {
+        @NonNull
+        final PreviewExtenderImpl mImpl;
+        @NonNull
+        private final Context mContext;
+
+        final CloseableProcessor mCloseableProcessor;
+
+        // Once the adapter has set mActive to false a new instance needs to be created
+        @GuardedBy("mLock")
+        volatile boolean mActive = true;
+        final Object mLock = new Object();
+        @GuardedBy("mLock")
+        private volatile int mEnabledSessionCount = 0;
+        @GuardedBy("mLock")
+        private volatile boolean mUnbind = false;
+
+        PreviewEventAdapter(@NonNull PreviewExtenderImpl impl,
+                @NonNull Context context, @Nullable CloseableProcessor closeableProcessor) {
+            mImpl = impl;
+            mContext = context;
+            mCloseableProcessor = closeableProcessor;
+        }
+
+        @OptIn(markerClass = ExperimentalCamera2Interop.class)
+        @Override
+        public void onAttach(@NonNull CameraInfo cameraInfo) {
+            synchronized (mLock) {
+                if (mActive) {
+                    String cameraId = Camera2CameraInfo.from(cameraInfo).getCameraId();
+                    CameraCharacteristics cameraCharacteristics =
+                            Camera2CameraInfo.extractCameraCharacteristics(cameraInfo);
+                    mImpl.onInit(cameraId, cameraCharacteristics, mContext);
+                }
+            }
+        }
+
+        @Override
+        public void onDetach() {
+            synchronized (mLock) {
+                mUnbind = true;
+                if (mEnabledSessionCount == 0) {
+                    callDeInit();
+                }
+            }
+        }
+
+        private void callDeInit() {
+            synchronized (mLock) {
+                if (mActive) {
+                    if (mCloseableProcessor != null) {
+                        mCloseableProcessor.close();
+                    }
+                    mImpl.onDeInit();
+                    mActive = false;
+                }
+            }
+        }
+
+        @Override
+        @Nullable
+        public CaptureConfig onPresetSession() {
+            synchronized (mLock) {
+                CaptureStageImpl captureStageImpl = mImpl.onPresetSession();
+                if (captureStageImpl != null) {
+                    if (Build.VERSION.SDK_INT >= 28) {
+                        return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
+                    } else {
+                        Logger.w(TAG, "The CaptureRequest parameters returned from "
+                                + "onPresetSession() will be passed to the camera device as part "
+                                + "of the capture session via "
+                                + "SessionConfiguration#setSessionParameters(CaptureRequest) "
+                                + "which only supported from API level 28!");
+                    }
+                }
+            }
+
+            return null;
+        }
+
+        @Override
+        @Nullable
+        public CaptureConfig onEnableSession() {
+            try {
+                synchronized (mLock) {
+                    if (mActive) {
+                        CaptureStageImpl captureStageImpl = mImpl.onEnableSession();
+                        if (captureStageImpl != null) {
+                            return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
+                        }
+                    }
+                }
+
+                return null;
+            } finally {
+                synchronized (mLock) {
+                    mEnabledSessionCount++;
+                }
+            }
+        }
+
+        @Override
+        @Nullable
+        public CaptureConfig onDisableSession() {
+            try {
+                synchronized (mLock) {
+                    if (mActive) {
+                        CaptureStageImpl captureStageImpl = mImpl.onDisableSession();
+                        if (captureStageImpl != null) {
+                            return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
+                        }
+                    }
+                }
+
+                return null;
+            } finally {
+                synchronized (mLock) {
+                    mEnabledSessionCount--;
+                    if (mEnabledSessionCount == 0 && mUnbind) {
+                        callDeInit();
+                    }
+                }
+            }
+        }
+
+        @Override
+        @Nullable
+        public CaptureConfig onRepeating() {
+            synchronized (mLock) {
+                if (mActive) {
+                    CaptureStageImpl captureStageImpl = mImpl.getCaptureStage();
+                    if (captureStageImpl != null) {
+                        return new AdaptingCaptureStage(captureStageImpl).getCaptureConfig();
+                    }
+                }
+            }
+
+            return null;
+        }
+    }
 }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/Version.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/Version.java
similarity index 84%
rename from camera/camera-extensions/src/main/java/androidx/camera/extensions/Version.java
rename to camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/Version.java
index 081656d..aa474ae 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/Version.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/Version.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,11 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+package androidx.camera.extensions.internal;
 
 import android.text.TextUtils;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import com.google.auto.value.AutoValue;
 
@@ -31,9 +32,9 @@
  * Class encapsulating a version with major, minor, patch and description values.
  */
 @AutoValue
-abstract class Version implements Comparable<Version> {
-    static final Version VERSION_1_0 = Version.create(1, 0, 0, "");
-    static final Version VERSION_1_1 = Version.create(1, 1, 0, "");
+public abstract class Version implements Comparable<Version> {
+    public static final Version VERSION_1_0 = Version.create(1, 0, 0, "");
+    public static final Version VERSION_1_1 = Version.create(1, 1, 0, "");
 
     private static final Pattern VERSION_STRING_PATTERN =
             Pattern.compile("(\\d+)(?:\\.(\\d+))(?:\\.(\\d+))(?:\\-(.+))?");
@@ -45,7 +46,8 @@
      *                      (major.minor.patch[-description])
      * @return the parsed Version object or <tt>null</tt> if the versionString format is invalid.
      */
-    public static Version parse(String versionString) {
+    @Nullable
+    public static Version parse(@NonNull String versionString) {
         if (TextUtils.isEmpty(versionString)) {
             return null;
         }
@@ -65,7 +67,8 @@
     /**
      * Creates a new instance of the Version object with the given parameters.
      */
-    public static Version create(int major, int minor, int patch, String description) {
+    @NonNull
+    public static Version create(int major, int minor, int patch, @NonNull String description) {
         return new AutoValue_Version(major, minor, patch, description);
     }
 
@@ -73,7 +76,10 @@
     Version() {
     }
 
-    abstract int getMajor();
+    /**
+     * Gets the major version number.
+     */
+    public abstract int getMajor();
 
     abstract int getMinor();
 
@@ -100,14 +106,20 @@
      * <var>other</var>.
      */
     @Override
-    public int compareTo(Version other) {
+    public int compareTo(@NonNull Version other) {
         return createBigInteger(this).compareTo(createBigInteger(other));
     }
 
+    /**
+     * To compare the major number with the input value.
+     */
     public int compareTo(int majorVersion) {
         return compareTo(majorVersion, 0);
     }
 
+    /**
+     * To compare the major and minor numbers with the input values.
+     */
     public int compareTo(int majorVersion, int minorVersion) {
         if (getMajor() == majorVersion) {
             return Integer.compare(getMinor(), minorVersion);
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/VersionName.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/VersionName.java
similarity index 86%
rename from camera/camera-extensions/src/main/java/androidx/camera/extensions/VersionName.java
rename to camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/VersionName.java
index cdbd374..2175792 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/VersionName.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/VersionName.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,28 +14,26 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+package androidx.camera.extensions.internal;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
+import androidx.camera.extensions.BuildConfig;
 
 /**
  * The version of CameraX extension releases.
- *
- * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class VersionName {
     /* The current version of the CameraX extension. */
     private static final VersionName CURRENT = new VersionName(BuildConfig.CAMERA_VERSION);
 
     @NonNull
-    static VersionName getCurrentVersion() {
+    public static VersionName getCurrentVersion() {
         return CURRENT;
     }
 
     private final Version mVersion;
 
+    @NonNull
     public Version getVersion() {
         return mVersion;
     }
@@ -53,6 +51,7 @@
      *
      * @return the string of the version in a form of MAJOR.MINOR.PATCH-description.
      */
+    @NonNull
     public String toVersionString() {
         return mVersion.toString();
     }
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/ExtensionVersionTest.java b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/ExtensionVersionTest.java
similarity index 95%
rename from camera/camera-extensions/src/test/java/androidx/camera/extensions/ExtensionVersionTest.java
rename to camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/ExtensionVersionTest.java
index 0474f2a..3cb4e02 100644
--- a/camera/camera-extensions/src/test/java/androidx/camera/extensions/ExtensionVersionTest.java
+++ b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/ExtensionVersionTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+package androidx.camera.extensions.internal;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -29,6 +29,7 @@
 import androidx.camera.extensions.impl.ExtensionVersionImpl;
 
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -56,7 +57,7 @@
         setTestApiVersion(testString);
 
         assertTrue(ExtensionVersion.isExtensionVersionSupported());
-        assertEquals(ExtensionVersion.getRuntimeVersion(), Version.parse(testString));
+        Assert.assertEquals(ExtensionVersion.getRuntimeVersion(), Version.parse(testString));
     }
 
     @Test
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/VersionNameTest.java
similarity index 89%
rename from camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
rename to camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/VersionNameTest.java
index bfc1884..d8a36f7 100644
--- a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
+++ b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/VersionNameTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+package androidx.camera.extensions.internal;
 
 import static org.junit.Assert.assertNotNull;
 
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionTest.java b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/VersionTest.java
similarity index 97%
rename from camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionTest.java
rename to camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/VersionTest.java
index 31df428..65294fc 100644
--- a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionTest.java
+++ b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/VersionTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+package androidx.camera.extensions.internal;
 
 import static com.google.common.truth.Truth.assertThat;
 
diff --git a/camera/camera-lifecycle/build.gradle b/camera/camera-lifecycle/build.gradle
index c6c7cea..42d4b73 100644
--- a/camera/camera-lifecycle/build.gradle
+++ b/camera/camera-lifecycle/build.gradle
@@ -18,8 +18,6 @@
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -28,21 +26,21 @@
 
 dependencies {
     api("androidx.lifecycle:lifecycle-common:2.1.0")
-    api(GUAVA_LISTENABLE_FUTURE)
+    api(libs.guavaListenableFuture)
     api(project(":camera:camera-core"))
     implementation("androidx.core:core:1.1.0")
-    implementation(AUTO_VALUE_ANNOTATIONS)
+    implementation(libs.autoValueAnnotations)
 
-    annotationProcessor(AUTO_VALUE)
+    annotationProcessor(libs.autoValue)
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(TRUTH)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.truth)
     androidTestImplementation(project(":camera:camera-testing"))
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(KOTLIN_COROUTINES_ANDROID)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.kotlinCoroutinesAndroid)
     androidTestImplementation("androidx.annotation:annotation-experimental:1.1.0")
     androidTestImplementation("androidx.concurrent:concurrent-futures-ktx:1.1.0")
     androidTestImplementation(project(":internal-testutils-truth"))
diff --git a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCamera.java b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCamera.java
index 4b82800..f0acb3e 100644
--- a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCamera.java
+++ b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCamera.java
@@ -255,8 +255,7 @@
     }
 
     @Override
-    public void setExtendedConfig(@Nullable CameraConfig cameraConfig) throws
-            CameraUseCaseAdapter.CameraException {
+    public void setExtendedConfig(@Nullable CameraConfig cameraConfig)  {
         mCameraUseCaseAdapter.setExtendedConfig(cameraConfig);
     }
 }
diff --git a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java
index 5233c98..59f3692 100644
--- a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java
+++ b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java
@@ -33,7 +33,6 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.CameraX;
 import androidx.camera.core.CameraXConfig;
-import androidx.camera.core.ExperimentalCameraFilter;
 import androidx.camera.core.ExperimentalUseCaseGroup;
 import androidx.camera.core.ImageAnalysis;
 import androidx.camera.core.ImageCapture;
@@ -43,7 +42,6 @@
 import androidx.camera.core.UseCaseGroup;
 import androidx.camera.core.ViewPort;
 import androidx.camera.core.impl.CameraConfig;
-import androidx.camera.core.impl.CameraConfigs;
 import androidx.camera.core.impl.CameraInternal;
 import androidx.camera.core.impl.ExtendedCameraConfigProviderStore;
 import androidx.camera.core.impl.utils.ContextUtil;
@@ -155,7 +153,7 @@
     public static ListenableFuture<ProcessCameraProvider> getInstance(
             @NonNull Context context) {
         Preconditions.checkNotNull(context);
-        return Futures.transform(CameraX.getOrCreateInstance(context), cameraX ->  {
+        return Futures.transform(CameraX.getOrCreateInstance(context), cameraX -> {
             sAppInstance.setCameraX(cameraX);
             sAppInstance.setContext(ContextUtil.getApplicationContext(context));
             return sAppInstance;
@@ -374,7 +372,6 @@
     @SuppressWarnings({"lambdaLast", "unused", "deprecation"})
     @RestrictTo(Scope.LIBRARY_GROUP)
     @ExperimentalUseCaseGroup
-    @OptIn(markerClass = ExperimentalCameraFilter.class)
     @NonNull
     public Camera bindToLifecycle(
             @NonNull LifecycleOwner lifecycleOwner,
@@ -431,32 +428,29 @@
                                     mCameraX.getDefaultConfigFactory()));
         }
 
-        CameraConfig cameraConfig = CameraConfigs.emptyConfig();
+        CameraConfig cameraConfig = null;
 
         // Retrieves extended camera configs from ExtendedCameraConfigProviderStore
         for (CameraFilter cameraFilter : cameraSelector.getCameraFilterSet()) {
             if (cameraFilter.getId() != CameraFilter.Id.DEFAULT) {
-                CameraConfig extendedCameraConfig = ExtendedCameraConfigProviderStore.getConfig(
-                        cameraFilter.getId()).getConfig(lifecycleCameraToBind.getCameraInfo(),
-                        mContext);
+                CameraConfig extendedCameraConfig =
+                        ExtendedCameraConfigProviderStore.getConfigProvider(cameraFilter.getId())
+                                .getConfig(lifecycleCameraToBind.getCameraInfo(), mContext);
+                if (extendedCameraConfig == null) { // ignore IDs unrelated to camera configs.
+                    continue;
+                }
 
                 // Only allows one camera config now.
-                if (extendedCameraConfig != CameraConfigs.emptyConfig()
-                        && cameraConfig != CameraConfigs.emptyConfig()) {
+                if (cameraConfig != null) {
                     throw new IllegalArgumentException(
                             "Cannot apply multiple extended camera configs at the same time.");
-                } else {
-                    cameraConfig = extendedCameraConfig;
                 }
+                cameraConfig = extendedCameraConfig;
             }
         }
 
         // Applies extended camera configs to the camera
-        try {
-            lifecycleCameraToBind.setExtendedConfig(cameraConfig);
-        } catch (CameraUseCaseAdapter.CameraException e) {
-            throw new IllegalArgumentException(e.getMessage());
-        }
+        lifecycleCameraToBind.setExtendedConfig(cameraConfig);
 
         if (useCases.length == 0) {
             return lifecycleCameraToBind;
diff --git a/camera/camera-testing/build.gradle b/camera/camera-testing/build.gradle
index 0f3fd42..8613c38 100644
--- a/camera/camera-testing/build.gradle
+++ b/camera/camera-testing/build.gradle
@@ -15,11 +15,9 @@
  */
 
 
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
     id("AndroidXPlugin")
@@ -28,27 +26,27 @@
 }
 
 dependencies {
-    implementation(ANDROIDX_TEST_CORE)
-    implementation(ANDROIDX_TEST_RULES)
-    implementation(ANDROIDX_TEST_UIAUTOMATOR)
+    implementation(libs.testCore)
+    implementation(libs.testRules)
+    implementation(libs.testUiautomator)
     api("androidx.annotation:annotation:1.2.0")
-    implementation(ESPRESSO_CORE)
-    implementation(GUAVA_LISTENABLE_FUTURE)
+    implementation(libs.espressoCore)
+    implementation(libs.guavaListenableFuture)
     implementation("androidx.appcompat:appcompat:1.1.0")
     api(project(":camera:camera-core"))
     implementation("androidx.core:core:1.1.0")
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
     implementation("androidx.test.espresso:espresso-idling-resource:3.1.0")
-    implementation(JUNIT)
-    implementation(KOTLIN_STDLIB)
-    implementation(KOTLIN_COROUTINES_ANDROID)
+    implementation(libs.junit)
+    implementation(libs.kotlinStdlib)
+    implementation(libs.kotlinCoroutinesAndroid)
 
-    testImplementation(ANDROIDX_TEST_CORE)
-    testImplementation(ANDROIDX_TEST_RUNNER)
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
-    testImplementation(ROBOLECTRIC)
-    testImplementation(MOCKITO_CORE)
+    testImplementation(libs.testCore)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
+    testImplementation(libs.robolectric)
+    testImplementation(libs.mockitoCore)
 }
 
 android {
diff --git a/camera/camera-video/build.gradle b/camera/camera-video/build.gradle
index 70b825f..a3e03e9 100644
--- a/camera/camera-video/build.gradle
+++ b/camera/camera-video/build.gradle
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
-import androidx.build.LibraryVersions
+
 import androidx.build.LibraryGroups
+import androidx.build.LibraryVersions
 import androidx.build.Publish
 
 plugins {
@@ -30,38 +30,38 @@
     api(project(":camera:camera-core"))
     implementation("androidx.core:core:1.1.0")
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
-    implementation(AUTO_VALUE_ANNOTATIONS)
+    implementation(libs.autoValueAnnotations)
 
-    annotationProcessor(AUTO_VALUE)
+    annotationProcessor(libs.autoValue)
 
     // TODO(leohuang): We need this for assertThrows. Point back to the AndroidX shared version if
     //  it is ever upgraded.
     testImplementation("junit:junit:4.13")
-    testImplementation(KOTLIN_STDLIB)
-    testImplementation(ANDROIDX_TEST_CORE)
-    testImplementation(ANDROIDX_TEST_RUNNER)
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
-    testImplementation(ROBOLECTRIC)
-    testImplementation(MOCKITO_CORE)
+    testImplementation(libs.kotlinStdlib)
+    testImplementation(libs.testCore)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
+    testImplementation(libs.robolectric)
+    testImplementation(libs.mockitoCore)
     testImplementation(project(":camera:camera-testing"), {
         exclude group: "androidx.camera", module: "camera-core"
     })
 
     androidTestImplementation(project(path: ":camera:camera-camera2"))
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation(project(":camera:camera-testing"))
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(KOTLIN_COROUTINES_ANDROID)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.kotlinCoroutinesAndroid)
     androidTestImplementation(project(":concurrent:concurrent-futures-ktx"))
     androidTestImplementation(project(":internal-testutils-truth"))
-    androidTestImplementation MOCKITO_KOTLIN, {
+    androidTestImplementation libs.mockitoKotlin, {
         exclude group: 'org.mockito' // to keep control on the mockito version
     }
 }
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
index f773e6c..86d15a2 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
@@ -66,23 +66,20 @@
             put(MediaStore.Video.Media.DISPLAY_NAME, fileName)
         }
 
-        val uri = contentResolver.insert(
-            MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
-            contentValues
-        )
-
-        assertThat(uri).isNotNull()
-
         val mediaStoreOutputOptions = MediaStoreOutputOptions.builder()
             .setContentResolver(contentResolver)
             .setFileSizeLimit(FILE_SIZE_LIMIT)
-            .setUri(uri!!)
+            .setCollection(MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
+            .setContentValues(contentValues)
             .build()
 
-        assertThat(mediaStoreOutputOptions.uri).isNotNull()
+        assertThat(mediaStoreOutputOptions.contentResolver).isEqualTo(contentResolver)
+        assertThat(mediaStoreOutputOptions.collection).isEqualTo(
+            MediaStore.Video.Media.EXTERNAL_CONTENT_URI
+        )
+        assertThat(mediaStoreOutputOptions.contentValues).isEqualTo(contentValues)
         assertThat(mediaStoreOutputOptions.type).isEqualTo(OutputOptions.Type.MEDIA_STORE)
         assertThat(mediaStoreOutputOptions.fileSizeLimit).isEqualTo(FILE_SIZE_LIMIT)
-        contentResolver.delete(uri, null, null)
     }
 
     @Test
@@ -130,18 +127,15 @@
             put(MediaStore.Video.Media.TITLE, fileName)
             put(MediaStore.Video.Media.DISPLAY_NAME, fileName)
         }
-        val uri = contentResolver.insert(
-            MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
-            contentValues
-        )
+
         val mediaStoreOutputOptions = MediaStoreOutputOptions.builder()
             .setContentResolver(contentResolver)
-            .setUri(uri!!)
+            .setCollection(MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
+            .setContentValues(contentValues)
             .build()
 
         assertThat(mediaStoreOutputOptions.fileSizeLimit)
             .isEqualTo(OutputOptions.FILE_SIZE_UNLIMITED)
-        contentResolver.delete(uri, null, null)
     }
 
     @Test
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java b/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java
index 6be768d0..0172750 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java
@@ -19,6 +19,7 @@
 import static androidx.camera.video.OutputOptions.Type.MEDIA_STORE;
 
 import android.content.ContentResolver;
+import android.content.ContentValues;
 import android.net.Uri;
 
 import androidx.annotation.NonNull;
@@ -30,6 +31,22 @@
  *
  * <p> The result could be saved to a shared storage. The results will remain on the device after
  * the app is uninstalled.
+ *
+ * Example:
+ *
+ * <pre>{@code
+ *
+ * ContentValues contentValues = new ContentValues();
+ * contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "NEW_VIDEO");
+ * contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4");
+ *
+ * MediaStoreOutputOptions options = MediaStoreOutputOptions.builder()
+ *         .setContentResolver(contentResolver)
+ *         .setCollection(MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
+ *         .setContentValues(contentValues)
+ *         .build();
+ *
+ * }</pre>
  */
 @AutoValue
 public abstract class MediaStoreOutputOptions extends OutputOptions {
@@ -38,7 +55,9 @@
         super(MEDIA_STORE);
     }
 
-    /** Returns a builder for this MediaStoreOutputOptions. */
+    /**
+     * Returns a builder for this MediaStoreOutputOptions.
+     */
     @NonNull
     public static Builder builder() {
         return new AutoValue_MediaStoreOutputOptions.Builder()
@@ -52,15 +71,23 @@
     public abstract ContentResolver getContentResolver();
 
     /**
+     * Gets the URL of the table to insert into.
+     */
+    @NonNull
+    public abstract Uri getCollection();
+
+    /**
+     * Gets the content values to be included in the created file.
+     */
+    @NonNull
+    public abstract ContentValues getContentValues();
+
+    /**
      * Gets the limit for the file length in bytes.
      */
     @Override
     public abstract int getFileSizeLimit();
 
-    /** Gets the Uri instance */
-    @NonNull
-    public abstract Uri getUri();
-
     /** The builder of the {@link MediaStoreOutputOptions}. */
     @AutoValue.Builder
     public abstract static class Builder {
@@ -71,9 +98,13 @@
         @NonNull
         public abstract Builder setContentResolver(@NonNull ContentResolver contentResolver);
 
-        /** Defines how to store the result. */
+        /** Sets the URL of the table to insert into. */
         @NonNull
-        public abstract Builder setUri(@NonNull Uri uri);
+        public abstract Builder setCollection(@NonNull Uri collectionUri);
+
+        /** Sets the content values to be included in the created file. */
+        @NonNull
+        public abstract Builder setContentValues(@NonNull ContentValues contentValues);
 
         /**
          * Sets the limit for the file length in bytes. Zero or negative values are considered
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/OutputResults.java b/camera/camera-video/src/main/java/androidx/camera/video/OutputResults.java
new file mode 100644
index 0000000..074e3a5
--- /dev/null
+++ b/camera/camera-video/src/main/java/androidx/camera/video/OutputResults.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.camera.video;
+
+import android.net.Uri;
+
+import androidx.annotation.NonNull;
+import androidx.core.util.Preconditions;
+
+import com.google.auto.value.AutoValue;
+
+/**
+ * Class to provide the information of the output.
+ */
+@AutoValue
+public abstract class OutputResults {
+
+    @NonNull
+    static OutputResults of(@NonNull Uri outputUri) {
+        Preconditions.checkNotNull(outputUri, "OutputUri cannot be null.");
+        return new AutoValue_OutputResults(outputUri);
+    }
+
+    /**
+     * Gets the {@link Uri} of the output.
+     *
+     * <p>Returns the actual {@link Uri} of the output destination if the
+     * {@link OutputOptions} is implemented by {@link MediaStoreOutputOptions}, otherwise
+     * returns {@link Uri#EMPTY}.
+     */
+    @NonNull
+    public abstract Uri getOutputUri();
+}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoCaptureLegacy.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoCaptureLegacy.java
index 0fa02bf..b8a4537 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoCaptureLegacy.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoCaptureLegacy.java
@@ -69,12 +69,10 @@
 import android.view.Display;
 import android.view.Surface;
 
-import androidx.annotation.DoNotInline;
 import androidx.annotation.GuardedBy;
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
 import androidx.annotation.RequiresPermission;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
@@ -102,6 +100,7 @@
 import androidx.camera.core.internal.ThreadConfig;
 import androidx.camera.core.internal.utils.VideoUtil;
 import androidx.camera.video.impl.VideoCaptureLegacyConfig;
+import androidx.camera.video.internal.compat.Api26Impl;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.concurrent.futures.CallbackToFutureAdapter.Completer;
 import androidx.core.util.Consumer;
@@ -1886,21 +1885,4 @@
             }
         }
     }
-
-    /**
-     * Nested class to avoid verification errors for methods introduced in Android 8.0 (API 26).
-     */
-    @RequiresApi(26)
-    private static class Api26Impl {
-
-        private Api26Impl() {
-        }
-
-        @DoNotInline
-        @NonNull
-        static MediaMuxer createMediaMuxer(@NonNull FileDescriptor fileDescriptor, int format)
-                throws IOException {
-            return new MediaMuxer(fileDescriptor, format);
-        }
-    }
 }
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoRecordEvent.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoRecordEvent.java
index 75b071b..32c7993 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoRecordEvent.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoRecordEvent.java
@@ -215,17 +215,19 @@
 
     @NonNull
     static Finalize finalize(@NonNull OutputOptions outputOptions,
-            @NonNull RecordingStats recordingStats) {
-        return new Finalize(outputOptions, recordingStats, ERROR_NONE, null);
+            @NonNull RecordingStats recordingStats,
+            @NonNull OutputResults outputResults) {
+        return new Finalize(outputOptions, recordingStats, outputResults, ERROR_NONE, null);
     }
 
     @NonNull
     static Finalize finalizeWithError(@NonNull OutputOptions outputOptions,
             @NonNull RecordingStats recordingStats,
+            @NonNull OutputResults outputResults,
             @VideoRecordError int error,
             @Nullable Throwable cause) {
         Preconditions.checkArgument(error != ERROR_NONE, "An error type is required.");
-        return new Finalize(outputOptions, recordingStats, error, cause);
+        return new Finalize(outputOptions, recordingStats, outputResults, error, cause);
     }
 
     /**
@@ -241,6 +243,7 @@
      * file.
      */
     public static final class Finalize extends VideoRecordEvent {
+        private final OutputResults mOutputResults;
         @VideoRecordError
         private final int mError;
         private final Throwable mCause;
@@ -248,9 +251,11 @@
         @SuppressWarnings("WeakerAccess") /* synthetic accessor */
         Finalize(@NonNull OutputOptions outputOptions,
                 @NonNull RecordingStats recordingStats,
+                @NonNull OutputResults outputResults,
                 @VideoRecordError int error,
                 @Nullable Throwable cause) {
             super(outputOptions, recordingStats);
+            mOutputResults = outputResults;
             mError = error;
             mCause = cause;
         }
@@ -263,6 +268,14 @@
         }
 
         /**
+         * Gets the {@link OutputResults}.
+         */
+        @NonNull
+        public OutputResults getOutputResults() {
+            return mOutputResults;
+        }
+
+        /**
          * Indicates whether an error occurred.
          *
          * <p>Returns {@code true} if {@link #getError()} returns {@link #ERROR_NONE}, otherwise
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/Api26Impl.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/Api26Impl.java
new file mode 100644
index 0000000..901bca0
--- /dev/null
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/Api26Impl.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.camera.video.internal.compat;
+
+import android.media.MediaMuxer;
+
+import androidx.annotation.DoNotInline;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+import java.io.FileDescriptor;
+import java.io.IOException;
+
+/**
+ * Helper class to avoid verification errors for methods introduced in Android 8.0 (API 26).
+ */
+@RequiresApi(26)
+public final class Api26Impl {
+
+    private Api26Impl() {
+    }
+
+    /**
+     * Uses a {@link FileDescriptor} as output destination to create a {@link MediaMuxer}.
+     */
+    @DoNotInline
+    @NonNull
+    public static MediaMuxer createMediaMuxer(@NonNull FileDescriptor fileDescriptor, int format)
+            throws IOException {
+        return new MediaMuxer(fileDescriptor, format);
+    }
+}
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.kt
index 1afa049..771958c 100644
--- a/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.kt
+++ b/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.camera.video
 
+import android.net.Uri
 import android.os.Build
 import com.google.common.truth.Truth.assertThat
 import org.junit.Assert
@@ -25,12 +26,12 @@
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
 import java.io.File
-import java.lang.RuntimeException
 
 private const val INVALID_FILE_PATH = "/invalid/file/path"
 private val TEST_OUTPUT_OPTION =
     FileOutputOptions.builder().setFile(File(INVALID_FILE_PATH)).build()
 private val TEST_RECORDING_STATE = RecordingStats.of(0, 0)
+private val TEST_OUTPUT_RESULT = OutputResults.of(Uri.EMPTY)
 
 @RunWith(RobolectricTestRunner::class)
 @DoNotInstrument
@@ -53,12 +54,14 @@
     fun canCreateFinalize() {
         val event = VideoRecordEvent.finalize(
             TEST_OUTPUT_OPTION,
-            TEST_RECORDING_STATE
+            TEST_RECORDING_STATE,
+            TEST_OUTPUT_RESULT
         )
 
         assertThat(event.eventType).isEqualTo(VideoRecordEvent.EventType.FINALIZE)
         assertThat(event.outputOptions).isEqualTo(TEST_OUTPUT_OPTION)
         assertThat(event.recordingStats).isEqualTo(TEST_RECORDING_STATE)
+        assertThat(event.outputResults).isEqualTo(TEST_OUTPUT_RESULT)
         assertThat(event.hasError()).isFalse()
         assertThat(event.error).isEqualTo(VideoRecordEvent.ERROR_NONE)
         assertThat(event.cause).isNull()
@@ -71,6 +74,7 @@
         val event = VideoRecordEvent.finalizeWithError(
             TEST_OUTPUT_OPTION,
             TEST_RECORDING_STATE,
+            TEST_OUTPUT_RESULT,
             error,
             cause
         )
@@ -78,6 +82,7 @@
         assertThat(event.eventType).isEqualTo(VideoRecordEvent.EventType.FINALIZE)
         assertThat(event.outputOptions).isEqualTo(TEST_OUTPUT_OPTION)
         assertThat(event.recordingStats).isEqualTo(TEST_RECORDING_STATE)
+        assertThat(event.outputResults).isEqualTo(TEST_OUTPUT_RESULT)
         assertThat(event.hasError()).isTrue()
         assertThat(event.error).isEqualTo(error)
         assertThat(event.cause).isEqualTo(cause)
@@ -89,6 +94,7 @@
             VideoRecordEvent.finalizeWithError(
                 TEST_OUTPUT_OPTION,
                 TEST_RECORDING_STATE,
+                TEST_OUTPUT_RESULT,
                 VideoRecordEvent.ERROR_NONE,
                 RuntimeException()
             )
diff --git a/camera/camera-view/api/current.txt b/camera/camera-view/api/current.txt
index 160857f..d9c61fc 100644
--- a/camera/camera-view/api/current.txt
+++ b/camera/camera-view/api/current.txt
@@ -75,5 +75,13 @@
     enum_constant public static final androidx.camera.view.PreviewView.StreamState STREAMING;
   }
 
+  public abstract class RotationReceiver {
+    ctor public RotationReceiver(android.content.Context);
+    method public boolean canDetectOrientation();
+    method public void disable();
+    method public void enable();
+    method public abstract void onRotationChanged(int);
+  }
+
 }
 
diff --git a/camera/camera-view/api/public_plus_experimental_current.txt b/camera/camera-view/api/public_plus_experimental_current.txt
index 4190144..a02bc5e 100644
--- a/camera/camera-view/api/public_plus_experimental_current.txt
+++ b/camera/camera-view/api/public_plus_experimental_current.txt
@@ -53,6 +53,7 @@
     method @UiThread public androidx.camera.view.CameraController? getController();
     method @UiThread public androidx.camera.view.PreviewView.ImplementationMode getImplementationMode();
     method @UiThread public androidx.camera.core.MeteringPointFactory getMeteringPointFactory();
+    method public androidx.camera.view.transform.OutputTransform? getOutputTransform();
     method public androidx.lifecycle.LiveData<androidx.camera.view.PreviewView.StreamState!> getPreviewStreamState();
     method @UiThread public androidx.camera.view.PreviewView.ScaleType getScaleType();
     method @UiThread public androidx.camera.core.Preview.SurfaceProvider getSurfaceProvider();
@@ -82,6 +83,47 @@
     enum_constant public static final androidx.camera.view.PreviewView.StreamState STREAMING;
   }
 
+  public abstract class RotationReceiver {
+    ctor public RotationReceiver(android.content.Context);
+    method public boolean canDetectOrientation();
+    method public void disable();
+    method public void enable();
+    method public abstract void onRotationChanged(int);
+  }
+
+}
+
+package androidx.camera.view.transform {
+
+  public final class CoordinateTransform {
+    ctor public CoordinateTransform(androidx.camera.view.transform.OutputTransform, androidx.camera.view.transform.OutputTransform);
+    method public void getTransform(android.graphics.Matrix);
+    method public void mapPoint(android.graphics.PointF);
+    method public void mapPoints(float[]);
+    method public void mapRect(android.graphics.RectF);
+  }
+
+  public final class FileTransformFactory {
+    ctor public FileTransformFactory();
+    method public androidx.camera.view.transform.OutputTransform getOutputTransform(android.content.ContentResolver, android.net.Uri) throws java.io.IOException;
+    method public androidx.camera.view.transform.OutputTransform getOutputTransform(java.io.File) throws java.io.IOException;
+    method public androidx.camera.view.transform.OutputTransform getOutputTransform(java.io.InputStream) throws java.io.IOException;
+    method public boolean isUsingExifOrientation();
+    method public void setUsingExifOrientation(boolean);
+  }
+
+  public final class ImageProxyTransformFactory {
+    ctor public ImageProxyTransformFactory();
+    method public androidx.camera.view.transform.OutputTransform getOutputTransform(androidx.camera.core.ImageProxy);
+    method public boolean isUsingCropRect();
+    method public boolean isUsingRotationDegrees();
+    method public void setUsingCropRect(boolean);
+    method public void setUsingRotationDegrees(boolean);
+  }
+
+  public final class OutputTransform {
+  }
+
 }
 
 package androidx.camera.view.video {
diff --git a/camera/camera-view/api/restricted_current.txt b/camera/camera-view/api/restricted_current.txt
index 56cdeaa..a47bbc3 100644
--- a/camera/camera-view/api/restricted_current.txt
+++ b/camera/camera-view/api/restricted_current.txt
@@ -75,5 +75,13 @@
     enum_constant public static final androidx.camera.view.PreviewView.StreamState STREAMING;
   }
 
+  public abstract class RotationReceiver {
+    ctor public RotationReceiver(android.content.Context);
+    method public boolean canDetectOrientation();
+    method public void disable();
+    method public void enable();
+    method public abstract void onRotationChanged(int);
+  }
+
 }
 
diff --git a/camera/camera-view/build.gradle b/camera/camera-view/build.gradle
index e32f7a9..43e55a9 100644
--- a/camera/camera-view/build.gradle
+++ b/camera/camera-view/build.gradle
@@ -19,8 +19,6 @@
 import androidx.build.LibraryVersions
 import androidx.build.Publish
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -35,23 +33,23 @@
     api("androidx.camera:camera-core:${VIEW_ATOMIC_GROUP_PINNED_VER}")
     implementation("androidx.camera:camera-lifecycle:${VIEW_ATOMIC_GROUP_PINNED_VER}")
     implementation("androidx.annotation:annotation-experimental:1.1.0-rc01")
-    implementation(GUAVA_LISTENABLE_FUTURE)
+    implementation(libs.guavaListenableFuture)
     implementation("androidx.core:core:1.3.2")
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
-    implementation(AUTO_VALUE_ANNOTATIONS)
+    implementation(libs.autoValueAnnotations)
     implementation("androidx.appcompat:appcompat:1.1.0")
     // Added for annotation-experimental
-    compileOnly(KOTLIN_STDLIB)
+    compileOnly(libs.kotlinStdlib)
 
-    annotationProcessor(AUTO_VALUE)
+    annotationProcessor(libs.autoValue)
 
-    testImplementation(ANDROIDX_TEST_RUNNER)
-    testImplementation(MOCKITO_CORE)
-    testImplementation(ROBOLECTRIC)
-    testImplementation(KOTLIN_STDLIB)
-    testImplementation(TRUTH)
-    testImplementation(ANDROIDX_TEST_RULES)
-    testImplementation(ANDROIDX_TEST_CORE)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.mockitoCore)
+    testImplementation(libs.robolectric)
+    testImplementation(libs.kotlinStdlib)
+    testImplementation(libs.truth)
+    testImplementation(libs.testRules)
+    testImplementation(libs.testCore)
     testImplementation(project(":camera:camera-testing")) {
         // Ensure camera-testing does not pull in camera-core project dependency which will
         // override pinned dependency.
@@ -63,18 +61,18 @@
         // override pinned dependency.
         exclude(group:"androidx.camera", module:"camera-core")
     }
-    androidTestImplementation(MOCKITO_CORE)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(TRUTH)
+    androidTestImplementation(libs.mockitoCore)
+    androidTestImplementation(libs.espressoCore)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testUiautomator)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.truth)
     androidTestImplementation("androidx.camera:camera-camera2:${VIEW_ATOMIC_GROUP_PINNED_VER}")
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it's own MockMaker
 }
 android {
     defaultConfig {
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewTest.java b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.java
similarity index 98%
rename from camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewTest.java
rename to camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.java
index 03776b3..20b613f 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewTest.java
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.java
@@ -49,6 +49,7 @@
 import androidx.camera.core.Camera;
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.CameraSelector;
+import androidx.camera.core.CameraX;
 import androidx.camera.core.MeteringPoint;
 import androidx.camera.core.MeteringPointFactory;
 import androidx.camera.core.Preview;
@@ -89,8 +90,10 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicReference;
 
 /**
@@ -98,7 +101,7 @@
  */
 @LargeTest
 @RunWith(AndroidJUnit4.class)
-public class PreviewViewTest {
+public class PreviewViewDeviceTest {
 
     private static final Size DEFAULT_SURFACE_SIZE = new Size(640, 480);
     private static final Rect DEFAULT_CROP_RECT = new Rect(0, 0, 640, 480);
@@ -113,6 +116,7 @@
     private final List<SurfaceRequest> mSurfaceRequestList = new ArrayList<>();
     private PreviewView mPreviewView;
     private MeteringPointFactory mMeteringPointFactory;
+    private final UiDevice mUiDevice = UiDevice.getInstance(mInstrumentation);
 
     @Before
     public void setUp() throws CoreAppTestUtil.ForegroundOccupiedError {
@@ -121,12 +125,13 @@
     }
 
     @After
-    public void tearDown() {
+    public void tearDown() throws InterruptedException, ExecutionException, TimeoutException {
         for (SurfaceRequest surfaceRequest : mSurfaceRequestList) {
             surfaceRequest.willNotProvideSurface();
             // Ensure all successful requests have their returned future finish.
             surfaceRequest.getDeferrableSurface().close();
         }
+        CameraX.shutdown().get(10, TimeUnit.SECONDS);
     }
 
     @Test
@@ -244,8 +249,7 @@
         assertThat(countDownLatch.await(1, TimeUnit.SECONDS)).isTrue();
 
         // Act: pinch-in 80% in 100 steps.
-        UiDevice.getInstance(mInstrumentation).findObject(new UiSelector().index(0))
-                .pinchIn(80, 100);
+        mUiDevice.findObject(new UiSelector().index(0)).pinchIn(80, 100);
 
         // Assert: pinch-to-zoom is called.
         assertThat(semaphore.tryAcquire(1, TimeUnit.SECONDS)).isTrue();
@@ -279,7 +283,7 @@
         assertThat(countDownLatch.await(1, TimeUnit.SECONDS)).isTrue();
 
         // Act: click on PreviewView
-        UiDevice.getInstance(mInstrumentation).findObject(new UiSelector().index(0)).click();
+        mUiDevice.findObject(new UiSelector().index(0)).click();
 
         // Assert: tap-to-focus is invoked.
         assertThat(semaphore.tryAcquire(1, TimeUnit.SECONDS)).isTrue();
@@ -301,7 +305,7 @@
         assertThat(countDownLatch.await(1, TimeUnit.SECONDS)).isTrue();
 
         // Act: click on PreviewView.
-        UiDevice.getInstance(mInstrumentation).findObject(new UiSelector().index(0)).click();
+        mUiDevice.findObject(new UiSelector().index(0)).click();
 
         // Assert: view is clicked.
         assertThat(semaphore.tryAcquire(1, TimeUnit.SECONDS)).isTrue();
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/transform/FileTransformFactoryDeviceTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/transform/FileTransformFactoryDeviceTest.kt
index 52a65ac..419cc54 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/transform/FileTransformFactoryDeviceTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/transform/FileTransformFactoryDeviceTest.kt
@@ -29,6 +29,7 @@
 import androidx.test.filters.LargeTest
 import androidx.test.rule.GrantPermissionRule
 import com.google.common.truth.Truth.assertThat
+import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -46,7 +47,7 @@
 @RunWith(AndroidJUnit4::class)
 public class FileTransformFactoryDeviceTest {
 
-    private val factory = FileTransformFactory.Builder().build()
+    private lateinit var factory: FileTransformFactory
     private val contentResolver = getApplicationContext<Context>().contentResolver
 
     @get:Rule
@@ -54,6 +55,17 @@
         Manifest.permission.WRITE_EXTERNAL_STORAGE
     )
 
+    @Before
+    public fun setUp() {
+        factory = FileTransformFactory()
+    }
+
+    @Test
+    public fun setUseRotationDegrees_getterReturnsTrue() {
+        factory.isUsingExifOrientation = true
+        assertThat(factory.isUsingExifOrientation).isTrue()
+    }
+
     @Test
     public fun extractFromFile() {
         factory.getOutputTransform(createImageFile()).assertMapping(1f, 1f, WIDTH, HEIGHT)
@@ -61,9 +73,8 @@
 
     @Test
     public fun extractFromFileWithExifInfo() {
-        val factoryWithExifInfo = FileTransformFactory.Builder().setUseExifOrientation(true).build()
-        factoryWithExifInfo
-            .getOutputTransform(createImageFile(ExifInterface.ORIENTATION_ROTATE_90))
+        factory.isUsingExifOrientation = true
+        factory.getOutputTransform(createImageFile(ExifInterface.ORIENTATION_ROTATE_90))
             .assertMapping(1f, 1f, 0, WIDTH)
     }
 
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java b/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
index 2cab702..98d607f 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
@@ -205,7 +205,7 @@
     // Synthetic access
     @SuppressWarnings("WeakerAccess")
     @NonNull
-    final SensorRotationListener mSensorRotationListener;
+    final RotationReceiver mRotationReceiver;
 
     @Nullable
     private final DisplayRotationListener mDisplayRotationListener;
@@ -242,7 +242,7 @@
 
         // Listen to motion sensor reading and set target rotation for ImageCapture and
         // VideoCapture.
-        mSensorRotationListener = new SensorRotationListener(mAppContext) {
+        mRotationReceiver = new RotationReceiver(mAppContext) {
             @Override
             public void onRotationChanged(int rotation) {
                 mImageAnalysis.setTargetRotation(rotation);
@@ -272,7 +272,7 @@
      * Gets a {@link ListenableFuture} that completes when camera initialization completes.
      *
      * <p> This future may fail with an {@link InitializationException} and associated cause that
-     * can be retrieved by {@link Throwable#getCause()). The cause will be a
+     * can be retrieved by {@link Throwable#getCause()}. The cause will be a
      * {@link CameraUnavailableException} if it fails to access any camera during initialization.
      *
      * <p> In the rare case that the future fails with {@link CameraUnavailableException}, the
@@ -419,14 +419,14 @@
     private void startListeningToRotationEvents() {
         getDisplayManager().registerDisplayListener(mDisplayRotationListener,
                 new Handler(Looper.getMainLooper()));
-        if (mSensorRotationListener.canDetectOrientation()) {
-            mSensorRotationListener.enable();
+        if (mRotationReceiver.canDetectOrientation()) {
+            mRotationReceiver.enable();
         }
     }
 
     private void stopListeningToRotationEvents() {
         getDisplayManager().unregisterDisplayListener(mDisplayRotationListener);
-        mSensorRotationListener.disable();
+        mRotationReceiver.disable();
     }
 
     private DisplayManager getDisplayManager() {
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java b/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
index 89775f6..7062c6a 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
@@ -45,7 +45,6 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.OptIn;
-import androidx.annotation.RestrictTo;
 import androidx.annotation.UiThread;
 import androidx.annotation.VisibleForTesting;
 import androidx.camera.core.CameraControl;
@@ -847,15 +846,12 @@
      *
      * <p> {@link PreviewView} needs to be in {@link ImplementationMode#COMPATIBLE} mode for the
      * transform to work correctly. For example, the returned {@link OutputTransform} may
-     * not respect the value of {@link #getScaleX()} when {@link ImplementationMode#PERFORMANCE}
+     * not respect the value of {@link #getMatrix()} when {@link ImplementationMode#PERFORMANCE}
      * mode is used.
      *
      * @return the transform applied on the preview by this {@link PreviewView}.
-     * @hide
      * @see CoordinateTransform
      */
-    // TODO(b/179827713): unhide this once all transform utils are done.
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     @TransformExperimental
     @Nullable
     public OutputTransform getOutputTransform() {
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/RotationReceiver.java b/camera/camera-view/src/main/java/androidx/camera/view/RotationReceiver.java
new file mode 100644
index 0000000..b64fad4
--- /dev/null
+++ b/camera/camera-view/src/main/java/androidx/camera/view/RotationReceiver.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.camera.view;
+
+import android.content.Context;
+import android.hardware.SensorManager;
+import android.view.OrientationEventListener;
+import android.view.Surface;
+
+import androidx.annotation.NonNull;
+import androidx.camera.core.UseCase;
+
+/**
+ * Helper class for receiving rotation updates from the {@link SensorManager} when the
+ * orientation of the device has changed.
+ *
+ * <p> This class is an wrapper of {@link OrientationEventListener} that notifies the app about
+ * physical orientation changes in the format of {@link Surface} rotation. It's useful when the
+ * device UI is in a fixed portrait or landscape orientation, while the app still wants to set the
+ * {@link UseCase} target rotation based on the device's physical orientation.
+ *
+ * <pre><code>
+ * rotationReceiver = new RotationReceiver(context) {
+ *         public void onRotationChanged(int rotation) {
+ *             mImageCapture.setTargetRotation(rotation);
+ *         }
+ * };
+ * if (rotationReceiver.canDetectOrientation()) {
+ *     rotationReceiver.enable();
+ * }
+ *
+ * // Disable it when it's no longer needed.
+ * rotationReceiver.disable();
+ * </code></pre>
+ *
+ * @see OrientationEventListener
+ */
+public abstract class RotationReceiver {
+
+    private static final int INVALID_SURFACE_ROTATION = -1;
+
+    // Synthetic access
+    @SuppressWarnings("WeakerAccess")
+    int mRotation = INVALID_SURFACE_ROTATION;
+
+    private final OrientationEventListener mOrientationEventListener;
+
+    public RotationReceiver(@NonNull Context context) {
+        mOrientationEventListener = new OrientationEventListener(context) {
+            @Override
+            public void onOrientationChanged(int orientation) {
+                if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
+                    // Short-circuit if orientation is unknown. Unknown rotation can't be handled
+                    // so it shouldn't be sent.
+                    return;
+                }
+
+                int newRotation;
+                if (orientation >= 315 || orientation < 45) {
+                    newRotation = Surface.ROTATION_0;
+                } else if (orientation >= 225) {
+                    newRotation = Surface.ROTATION_90;
+                } else if (orientation >= 135) {
+                    newRotation = Surface.ROTATION_180;
+                } else {
+                    newRotation = Surface.ROTATION_270;
+                }
+                if (mRotation != newRotation) {
+                    mRotation = newRotation;
+                    onRotationChanged(newRotation);
+                }
+            }
+        };
+    }
+
+    /**
+     * Checks if the RotationReceiver can detect orientation changes.
+     *
+     * @see OrientationEventListener#canDetectOrientation()
+     */
+    public boolean canDetectOrientation() {
+        return mOrientationEventListener.canDetectOrientation();
+    }
+
+    /**
+     * Enables the RotationReceiver so it will monitor the sensor and call onRotationChanged when
+     * the device orientation changes.
+     *
+     * <p> By default, the receiver is not enabled.
+     *
+     * @see OrientationEventListener#enable()
+     */
+    public void enable() {
+        mOrientationEventListener.enable();
+    }
+
+    /**
+     * Disables the RotationReceiver.
+     *
+     * @see OrientationEventListener#disable()
+     */
+    public void disable() {
+        mOrientationEventListener.disable();
+    }
+
+    /**
+     * Called when the physical rotation of the device changes.
+     *
+     * <p> The rotation is one of the {@link Surface} rotations mapped from orientation
+     * degrees.
+     *
+     * <table summary="Orientation degrees to Surface rotation mapping">
+     * <tr><th>Orientation degrees</th><th>Surface rotation</th></tr>
+     * <tr><td>[-45°, 45°)</td><td>{@link Surface#ROTATION_0}</td></tr>
+     * <tr><td>[45°, 135°)</td><td>{@link Surface#ROTATION_270}</td></tr>
+     * <tr><td>[135°, 225°)</td><td>{@link Surface#ROTATION_180}</td></tr>
+     * <tr><td>[225°, 315°)</td><td>{@link Surface#ROTATION_90}</td></tr>
+     * </table>
+     *
+     * @see OrientationEventListener#onOrientationChanged(int)
+     */
+    public abstract void onRotationChanged(int rotation);
+}
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/SensorRotationListener.java b/camera/camera-view/src/main/java/androidx/camera/view/SensorRotationListener.java
deleted file mode 100644
index d0919d4..0000000
--- a/camera/camera-view/src/main/java/androidx/camera/view/SensorRotationListener.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.camera.view;
-
-import android.content.Context;
-import android.view.OrientationEventListener;
-import android.view.Surface;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-
-/**
- * Listens to motion sensor reading and converts the orientation degrees to {@link Surface}
- * rotation.
- *
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public abstract class SensorRotationListener extends OrientationEventListener {
-
-    public static final int INVALID_SURFACE_ROTATION = -1;
-
-    private int mRotation = INVALID_SURFACE_ROTATION;
-
-    public SensorRotationListener(@NonNull Context context) {
-        super(context);
-    }
-
-    @Override
-    public void onOrientationChanged(int orientation) {
-        if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
-            // Short-circuit if orientation is unknown. Unknown rotation can't be handled so it
-            // shouldn't be sent.
-            return;
-        }
-
-        int newRotation;
-        if (orientation >= 315 || orientation < 45) {
-            newRotation = Surface.ROTATION_0;
-        } else if (orientation >= 225) {
-            newRotation = Surface.ROTATION_90;
-        } else if (orientation >= 135) {
-            newRotation = Surface.ROTATION_180;
-        } else {
-            newRotation = Surface.ROTATION_270;
-        }
-        if (mRotation != newRotation) {
-            mRotation = newRotation;
-            onRotationChanged(newRotation);
-        }
-    }
-
-    /**
-     * Invoked when rotation changes.
-     *
-     * <p> The output rotation is defined as the UI Surface rotation, or what the Surface rotation
-     * should be if the app's orientation is not locked.
-     */
-    public abstract void onRotationChanged(int rotation);
-}
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/transform/CoordinateTransform.java b/camera/camera-view/src/main/java/androidx/camera/view/transform/CoordinateTransform.java
index 2b15595..297560a 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/transform/CoordinateTransform.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/transform/CoordinateTransform.java
@@ -19,9 +19,10 @@
 import static androidx.camera.view.TransformUtils.isAspectRatioMatchingWithRoundingError;
 
 import android.graphics.Matrix;
+import android.graphics.PointF;
+import android.graphics.RectF;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
 import androidx.camera.core.ImageAnalysis;
 import androidx.camera.core.Logger;
 import androidx.camera.core.UseCase;
@@ -29,35 +30,45 @@
 import androidx.camera.core.ViewPort;
 import androidx.camera.view.PreviewView;
 import androidx.camera.view.TransformExperimental;
+import androidx.core.util.Preconditions;
 
 /**
  * This class represents the transform from one {@link OutputTransform} to another.
  *
  * <p> This class can be used to map the coordinates of one {@link OutputTransform} to another,
- * given that they are both from the same {@link UseCaseGroup}. {@link OutputTransform} can
+ * given that they are associated with the same {@link ViewPort}. {@link OutputTransform} can
  * represent the output of a {@link UseCase} or {@link PreviewView}. For example, mapping the
  * coordinates of detected objects from {@link ImageAnalysis} output to the drawing location in
  * {@link PreviewView}.
  *
- * TODO(b/179827713): add code samples when more {@link OutputTransform} subclasses are available.
- * TODO(b/179827713): unhide this class once all transform utils are done.
+ * <pre><code>
+ * // imageProxy the output of an ImageAnalysis.
+ * OutputTransform source = ImageProxyTransformFactory().getOutputTransform(imageProxy);
+ * OutputTransform target = previewView.getOutputTransform();
  *
- * @hide
+ * // Build the transform from ImageAnalysis to PreviewView
+ * CoordinateTransform coordinateTransform = new CoordinateTransform(source, target);
+ *
+ * // Detect face in ImageProxy and transform the coordinates to PreviewView.
+ * // The value of faceBox can be used to highlight the face in PreviewView.
+ * RectF faceBox = detectFaceInImageProxy(imageProxy);
+ * coordinateTransform.mapRect(faceBox);
+ *
+ * </code></pre>
  */
 @TransformExperimental
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class CoordinateTransform {
+public final class CoordinateTransform {
 
     private static final String TAG = "CoordinateTransform";
     private static final String MISMATCH_MSG = "The source viewport (%s) does not match the target "
-            + "viewport (%s). Please make sure they are from the same UseCaseGroup.";
+            + "viewport (%s). Please make sure they are associated with the same Viewport.";
 
     private final Matrix mMatrix;
 
     /**
      * Creates the transform between the {@code source} and the {@code target}.
      *
-     * <p> The source and the target must be from the same {@link UseCaseGroup}.
+     * <p> The source and the target must be associated with the same {@link ViewPort}.
      *
      * @param source the source
      * @see UseCaseGroup
@@ -73,14 +84,15 @@
         if (!isAspectRatioMatchingWithRoundingError(
                 source.getViewPortSize(), /* isAccurate1= */ false,
                 target.getViewPortSize(), /* isAccurate2= */ false)) {
-            // Mismatched aspect ratio means the outputs are not from the same UseCaseGroup
+            // Mismatched aspect ratio means the outputs are not associated with the same Viewport.
             Logger.w(TAG, String.format(MISMATCH_MSG, source.getViewPortSize(),
                     target.getViewPortSize()));
         }
 
         // Concatenate the source transform with the target transform.
         mMatrix = new Matrix();
-        source.getMatrix().invert(mMatrix);
+        Preconditions.checkState(source.getMatrix().invert(mMatrix),
+                "The source transform cannot be inverted");
         mMatrix.postConcat(target.getMatrix());
     }
 
@@ -105,5 +117,27 @@
         mMatrix.mapPoints(points);
     }
 
-    // TODO(b/179827713): add overloading mapPoints method for other data types.
+    /**
+     * Apply this transform to the {@link PointF}, and write the transformed points back into
+     * the array
+     *
+     * @param point The point to transform.
+     */
+    public void mapPoint(@NonNull PointF point) {
+        float[] pointArray = new float[]{point.x, point.y};
+        mMatrix.mapPoints(pointArray);
+        point.x = pointArray[0];
+        point.y = pointArray[1];
+    }
+
+    /**
+     * Apply this transform to the rectangle, and write the transformed rectangle back into it.
+     * This is accomplished by transforming the 4 corners of rect, and then setting it to the
+     * bounds of those points.
+     *
+     * @param rect The rectangle to transform.
+     */
+    public void mapRect(@NonNull RectF rect) {
+        mMatrix.mapRect(rect);
+    }
 }
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/transform/FileTransformFactory.java b/camera/camera-view/src/main/java/androidx/camera/view/transform/FileTransformFactory.java
index 04b8608..5f6a5d7 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/transform/FileTransformFactory.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/transform/FileTransformFactory.java
@@ -29,7 +29,8 @@
 import android.net.Uri;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
+import androidx.camera.core.ImageCapture;
+import androidx.camera.core.UseCase;
 import androidx.camera.core.impl.utils.Exif;
 import androidx.camera.view.TransformExperimental;
 
@@ -39,24 +40,42 @@
 import java.io.InputStream;
 
 /**
- * Factory for extracting transform info from on disk image files.
+ * Factory for extracting transform info from image files.
  *
- * TODO(b/179827713): unhide this class once all transform utils are done.
+ * <p> This class is for extracting a {@link OutputTransform} from an image file saved by
+ * {@link ImageCapture}. The {@link OutputTransform} represents the transform being applied to
+ * the original camera buffer, which can be used by {@link CoordinateTransform} to transform
+ * coordinates between {@link UseCase}s.
  *
- * @hide
+ * @see OutputTransform
+ * @see CoordinateTransform
  */
 @TransformExperimental
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class FileTransformFactory {
+public final class FileTransformFactory {
 
-    private final boolean mUseExifOrientation;
+    private boolean mUsingExifOrientation;
 
-    FileTransformFactory(boolean useExifOrientation) {
-        mUseExifOrientation = useExifOrientation;
+    /**
+     * Whether to include the {@link ExifInterface#TAG_ORIENTATION}.
+     *
+     * By default, this value is false, e.g. loading image with {@link BitmapFactory} does
+     * not apply the exif orientation to the loaded {@link Bitmap}. Only set this if the exif
+     * orientation is applied to the loaded file. For example, if the image is loaded by a 3P
+     * library that automatically applies exif orientation.
+     */
+    public void setUsingExifOrientation(boolean usingExifOrientation) {
+        mUsingExifOrientation = usingExifOrientation;
     }
 
     /**
-     * Extracts transform from the given {@link Uri}.
+     * Whether the factory respects the exif of the image file.
+     */
+    public boolean isUsingExifOrientation() {
+        return mUsingExifOrientation;
+    }
+
+    /**
+     * Extracts transform info from the given {@link Uri}.
      */
     @NonNull
     public OutputTransform getOutputTransform(@NonNull ContentResolver contentResolver,
@@ -68,7 +87,7 @@
     }
 
     /**
-     * Extracts transform from the given {@link File}.
+     * Extracts transform info from the given {@link File}.
      */
     @NonNull
     public OutputTransform getOutputTransform(@NonNull File file) throws IOException {
@@ -78,7 +97,7 @@
     }
 
     /**
-     * Extracts transform from the given {@link InputStream}.
+     * Extracts transform info from the given {@link InputStream}.
      */
     @NonNull
     public OutputTransform getOutputTransform(@NonNull InputStream inputStream) throws IOException {
@@ -88,7 +107,7 @@
         // Map the normalized space to the image buffer.
         Matrix matrix = getNormalizedToBuffer(cropRect);
 
-        if (mUseExifOrientation) {
+        if (mUsingExifOrientation) {
             // Add exif transform if enabled.
             matrix.postConcat(
                     getExifTransform(exif.getOrientation(), exif.getWidth(), exif.getHeight()));
@@ -96,37 +115,4 @@
 
         return new OutputTransform(matrix, rectToSize(cropRect));
     }
-
-    /**
-     * Builder for {@link FileTransformFactory}.
-     *
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public static class Builder {
-        boolean mUseExifOrientation = false;
-
-        /**
-         * Builds {@link FileTransformFactory}.
-         */
-        @NonNull
-        public FileTransformFactory build() {
-            return new FileTransformFactory(mUseExifOrientation);
-        }
-
-        /**
-         * Whether to include the {@link ExifInterface#TAG_ORIENTATION}.
-         *
-         * <p> By default, the value is false. Loading image with {@link BitmapFactory} does not
-         * apply the exif orientation to the loaded {@link Bitmap}. Only set this if the exif
-         * orientation is applied to the loaded file. For example, if the image is loaded by a 3P
-         * library that automatically applies exif orientation.
-         */
-        @NonNull
-        public Builder setUseExifOrientation(boolean useExifOrientation) {
-            mUseExifOrientation = useExifOrientation;
-            return this;
-        }
-    }
-
 }
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/transform/ImageProxyTransformFactory.java b/camera/camera-view/src/main/java/androidx/camera/view/transform/ImageProxyTransformFactory.java
index 136d742..ae331ae 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/transform/ImageProxyTransformFactory.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/transform/ImageProxyTransformFactory.java
@@ -25,29 +25,74 @@
 import android.graphics.RectF;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
 import androidx.camera.core.ImageAnalysis;
 import androidx.camera.core.ImageCapture;
+import androidx.camera.core.ImageInfo;
 import androidx.camera.core.ImageProxy;
+import androidx.camera.core.UseCase;
 import androidx.camera.view.TransformExperimental;
 
 /**
  * Factory for extracting transform info from {@link ImageProxy}.
  *
- * TODO(b/179827713): unhide this class once all transform utils are done.
+ * <p> This class is for extracting a {@link OutputTransform} from an {@link ImageProxy} object. The
+ * {@link OutputTransform} represents the transform being applied to the original camera buffer,
+ * which can be used by {@link CoordinateTransform} to transform coordinates between
+ * {@link UseCase}s.
  *
- * @hide
+ * @see OutputTransform
+ * @see CoordinateTransform
  */
 @TransformExperimental
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class ImageProxyTransformFactory {
+public final class ImageProxyTransformFactory {
 
-    private final boolean mUseCropRect;
-    private final boolean mUseRotationDegrees;
+    private boolean mUsingCropRect;
+    private boolean mUsingRotationDegrees;
 
-    ImageProxyTransformFactory(boolean useCropRect, boolean useRotationDegrees) {
-        mUseCropRect = useCropRect;
-        mUseRotationDegrees = useRotationDegrees;
+    public ImageProxyTransformFactory() {
+    }
+
+    /**
+     * Whether to use the crop rect of the {@link ImageProxy}.
+     *
+     * <p> By default, the value is false and the factory uses the {@link ImageProxy}'s
+     * entire buffer. Only set this value if the coordinates to be transformed respect the
+     * crop rect. For example, top-left corner of the crop rect is (0, 0).
+     */
+    public void setUsingCropRect(boolean usingCropRect) {
+        mUsingCropRect = usingCropRect;
+    }
+
+    /**
+     * Whether the factory respects the value of {@link ImageProxy#getCropRect()}.
+     *
+     * <p>By default, the value is false.
+     */
+    public boolean isUsingCropRect() {
+        return mUsingCropRect;
+    }
+
+    /**
+     * Whether to use the rotation degrees of the {@link ImageProxy}.
+     *
+     * <p> By default, the value is false and the factory uses a rotation degree of 0. Only
+     * set this value to true if the coordinates to be transformed is after the rotation degree is
+     * applied. For example, if the {@link ImageInfo#getRotationDegrees()} is 90 degrees, (0, 0) in
+     * the original buffer should be mapped to (height, 0) in the rotated image. Set this value
+     * to true if the input coordinates are based on the original image, and false if the
+     * coordinates are based on the rotated image.
+     */
+    public void setUsingRotationDegrees(boolean usingRotationDegrees) {
+        mUsingRotationDegrees = usingRotationDegrees;
+    }
+
+    /**
+     * Whether the factory respects the value of {@link ImageInfo#getRotationDegrees()}.
+     *
+     * <p>By default, the value is false.
+     */
+    public boolean isUsingRotationDegrees() {
+        return mUsingRotationDegrees;
     }
 
     /**
@@ -76,7 +121,7 @@
      * Gets the crop rect based on factory settings.
      */
     private RectF getCropRect(@NonNull ImageProxy imageProxy) {
-        if (mUseCropRect) {
+        if (mUsingCropRect) {
             return new RectF(imageProxy.getCropRect());
         }
         // The default crop rect is the full buffer.
@@ -87,7 +132,7 @@
      * Gets the rotation degrees based on factory settings.
      */
     private int getRotationDegrees(@NonNull ImageProxy imageProxy) {
-        if (mUseRotationDegrees) {
+        if (mUsingRotationDegrees) {
             return imageProxy.getImageInfo().getRotationDegrees();
         }
         // The default is no rotation.
@@ -103,49 +148,4 @@
         }
         return new RectF(0, 0, rect.width(), rect.height());
     }
-
-    /**
-     * Builder of {@link ImageProxyTransformFactory}.
-     */
-    public static class Builder {
-
-        private boolean mUseCropRect = false;
-        private boolean mUseRotationDegrees = false;
-
-        /**
-         * Whether to use the crop rect of the {@link ImageProxy}.
-         *
-         * <p> By default, the value is false and the factory uses the {@link ImageProxy}'s
-         * entire buffer. Only set this value if the coordinates to be transformed respect the
-         * crop rect. For example, top-left corner of the crop rect is (0, 0).
-         */
-        @NonNull
-        public Builder setUseCropRect(boolean useCropRect) {
-            mUseCropRect = useCropRect;
-            return this;
-        }
-
-        /**
-         * Whether to use the rotation degrees of the {@link ImageProxy}.
-         *
-         * <p> By default, the value is false and the factory uses a rotation degree of 0. Only
-         * set this value if the coordinates to be transformed respect the rotation degrees. For
-         * example, if rotation is 90°, (0, 0) should map to (0, height) on the buffer.
-         */
-        @NonNull
-        public Builder setUseRotationDegrees(boolean useRotationDegrees) {
-            mUseRotationDegrees = useRotationDegrees;
-            return this;
-        }
-
-        // TODO(b/179827713): Add support for mirroring.
-
-        /**
-         * Builds the {@link ImageProxyTransformFactory} object.
-         */
-        @NonNull
-        public ImageProxyTransformFactory build() {
-            return new ImageProxyTransformFactory(mUseCropRect, mUseRotationDegrees);
-        }
-    }
 }
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/transform/OutputTransform.java b/camera/camera-view/src/main/java/androidx/camera/view/transform/OutputTransform.java
index f1dddc6..5df172e 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/transform/OutputTransform.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/transform/OutputTransform.java
@@ -30,14 +30,9 @@
  *
  * <p> Represents the rotation, cropping and/or mirroring applied to the raw buffer of a
  * {@link UseCase} output.
- *
- * TODO(b/179827713): unhide this class once all transform utils are done.
- *
- * @hide
  */
 @TransformExperimental
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class OutputTransform {
+public final class OutputTransform {
 
     @NonNull
     final Matrix mMatrix;
@@ -45,16 +40,16 @@
     final Size mViewPortSize;
 
     /**
-     * @param matrix       The mapping from a normalized viewport space (0, 0) - (1, 1) to
-     *                     the transformed output. e.g. the (0, 0) maps to the (top, left) of
+     * @param matrix       The mapping from a normalized viewport space (-1, -1) - (1, 1) to
+     *                     the transformed output. e.g. the (-1, -1) maps to the (top, left) of
      *                     the viewport and (1, 1) maps to the (bottom, right) of the
      *                     viewport.
-     * @param viewPortSize The aspect ratio of the viewport. This is not used in transform
-     *                     computation. This is only used for mitigating the user mistake of not
+     * @param viewPortSize The aspect ratio of the viewport. This is not used to calculate the
+     *                     transform. This is only used for mitigating the user mistake of not
      *                     using a {@link UseCaseGroup}. By comparing the viewport to that of the
      *                     other {@link OutputTransform}, we can at least make sure that they
-     *                     have the same aspect ratio. Viewports with different aspect ratios
-     *                     cannot be from the same {@link UseCaseGroup}.
+     *                     have the same aspect ratio, and warn developers if not. Viewports with
+     *                     different aspect ratios cannot be from the same {@link UseCaseGroup}.
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
diff --git a/camera/camera-view/src/test/java/androidx/camera/view/CameraControllerTest.kt b/camera/camera-view/src/test/java/androidx/camera/view/CameraControllerTest.kt
index 916d316..fe3a1c0 100644
--- a/camera/camera-view/src/test/java/androidx/camera/view/CameraControllerTest.kt
+++ b/camera/camera-view/src/test/java/androidx/camera/view/CameraControllerTest.kt
@@ -64,7 +64,7 @@
         val controller = LifecycleCameraController(context)
 
         // Act.
-        controller.mSensorRotationListener.onRotationChanged(Surface.ROTATION_180)
+        controller.mRotationReceiver.onRotationChanged(Surface.ROTATION_180)
 
         // Assert.
         assertThat(controller.mImageAnalysis.targetRotation).isEqualTo(Surface.ROTATION_180)
diff --git a/camera/camera-view/src/test/java/androidx/camera/view/transform/CoordinateTransformTest.kt b/camera/camera-view/src/test/java/androidx/camera/view/transform/CoordinateTransformTest.kt
index 4a22fb5..419116c 100644
--- a/camera/camera-view/src/test/java/androidx/camera/view/transform/CoordinateTransformTest.kt
+++ b/camera/camera-view/src/test/java/androidx/camera/view/transform/CoordinateTransformTest.kt
@@ -17,7 +17,9 @@
 package androidx.camera.view.transform
 
 import android.graphics.Matrix
+import android.graphics.PointF
 import android.graphics.Rect
+import android.graphics.RectF
 import android.os.Build
 import androidx.camera.view.transform.TransformTestUtils.createFakeImageProxy
 import com.google.common.truth.Truth.assertThat
@@ -27,6 +29,8 @@
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
 
+private const val FLOAT_ERROR = 1E-4F
+
 /**
  * Unit tests for [CoordinateTransform].
  */
@@ -36,9 +40,55 @@
 public class CoordinateTransformTest {
 
     @Test
+    public fun mapPointF() {
+        // Arrange: the target is source with a 90° rotation.
+        val imageProxyTransformFactory = ImageProxyTransformFactory()
+        imageProxyTransformFactory.isUsingRotationDegrees = true
+        val source = imageProxyTransformFactory.getOutputTransform(
+            createFakeImageProxy(3, 4, 0, Rect(0, 0, 3, 4))
+        )
+        val target = imageProxyTransformFactory.getOutputTransform(
+            createFakeImageProxy(3, 4, 90, Rect(0, 0, 3, 4))
+        )
+
+        // Act.
+        val transform = CoordinateTransform(source, target)
+
+        // Assert: top-left corner is mapped to top-right.
+        val point = PointF(0F, 0F)
+        transform.mapPoint(point)
+        assertThat(point.x).isWithin(FLOAT_ERROR).of(4F)
+        assertThat(point.y).isWithin(FLOAT_ERROR).of(0F)
+    }
+
+    @Test
+    public fun mapRect() {
+        // Arrange: the target is source with a 90° rotation.
+        val imageProxyTransformFactory = ImageProxyTransformFactory()
+        imageProxyTransformFactory.isUsingRotationDegrees = true
+        val source = imageProxyTransformFactory.getOutputTransform(
+            createFakeImageProxy(3, 4, 0, Rect(0, 0, 3, 4))
+        )
+        val target = imageProxyTransformFactory.getOutputTransform(
+            createFakeImageProxy(3, 4, 90, Rect(0, 0, 3, 4))
+        )
+
+        // Act.
+        val transform = CoordinateTransform(source, target)
+
+        // Assert: the 3x4 rect is mapped to a 4x3 rect.
+        val rect = RectF(0F, 0F, 3F, 4F)
+        transform.mapRect(rect)
+        assertThat(rect.left).isWithin(FLOAT_ERROR).of(0F)
+        assertThat(rect.top).isWithin(FLOAT_ERROR).of(0F)
+        assertThat(rect.right).isWithin(FLOAT_ERROR).of(4F)
+        assertThat(rect.bottom).isWithin(FLOAT_ERROR).of(3F)
+    }
+
+    @Test
     public fun sameSourceAndTarget_getsIdentityMatrix() {
         // Arrange.
-        val imageProxyTransformFactory = ImageProxyTransformFactory.Builder().build()
+        val imageProxyTransformFactory = ImageProxyTransformFactory()
         val imageProxy = imageProxyTransformFactory.getOutputTransform(
             createFakeImageProxy(3, 4, 0, Rect(0, 0, 3, 4))
         )
@@ -58,7 +108,7 @@
     @Test
     public fun scaleImageProxy() {
         // Arrange: create 2 ImageProxy with the only difference being 10x scale.
-        val imageProxyTransformFactory = ImageProxyTransformFactory.Builder().build()
+        val imageProxyTransformFactory = ImageProxyTransformFactory()
         val source = imageProxyTransformFactory.getOutputTransform(
             createFakeImageProxy(3, 4, 0, Rect(0, 0, 3, 4))
         )
@@ -78,8 +128,8 @@
     @Test
     public fun scaleAndRotateImageProxy() {
         // Arrange: create 2 ImageProxy with different scale and rotation.
-        val imageProxyTransformFactory = ImageProxyTransformFactory.Builder()
-            .setUseRotationDegrees(true).build()
+        val imageProxyTransformFactory = ImageProxyTransformFactory()
+        imageProxyTransformFactory.isUsingRotationDegrees = true
         val source = imageProxyTransformFactory.getOutputTransform(
             createFakeImageProxy(3, 4, 270, Rect(0, 0, 3, 4))
         )
@@ -100,8 +150,8 @@
     public fun withViewPortWithoutCropRect() {
         // Arrange: create 2 ImageProxy that have crop rect, but the coordinates do not respect the
         // crop rect. (MLKit scenario).
-        val imageProxyTransformFactory = ImageProxyTransformFactory.Builder()
-            .setUseRotationDegrees(true).build()
+        val imageProxyTransformFactory = ImageProxyTransformFactory()
+        imageProxyTransformFactory.isUsingRotationDegrees = true
         val source = imageProxyTransformFactory.getOutputTransform(
             createFakeImageProxy(16, 12, 0, Rect(2, 2, 10, 8))
         )
@@ -122,8 +172,8 @@
     public fun withViewPortAndCropRect() {
         // Arrange: create 2 ImageProxy that have crop rect, and the coordinates respect the crop
         // rect.
-        val imageProxyTransformFactory = ImageProxyTransformFactory.Builder()
-            .setUseCropRect(true).build()
+        val imageProxyTransformFactory = ImageProxyTransformFactory()
+        imageProxyTransformFactory.isUsingCropRect = true
         val source = imageProxyTransformFactory.getOutputTransform(
             createFakeImageProxy(
                 16, 12, 0, Rect(2, 2, 10, 8)
diff --git a/camera/camera-view/src/test/java/androidx/camera/view/transform/ImageProxyTransformFactoryTest.kt b/camera/camera-view/src/test/java/androidx/camera/view/transform/ImageProxyTransformFactoryTest.kt
index 42bf40a..19747bc 100644
--- a/camera/camera-view/src/test/java/androidx/camera/view/transform/ImageProxyTransformFactoryTest.kt
+++ b/camera/camera-view/src/test/java/androidx/camera/view/transform/ImageProxyTransformFactoryTest.kt
@@ -35,10 +35,26 @@
 public class ImageProxyTransformFactoryTest {
 
     @Test
+    public fun setUseRotationDegrees_getterReturnsTrue() {
+        val factory = ImageProxyTransformFactory()
+        assertThat(factory.isUsingRotationDegrees).isFalse()
+        factory.isUsingRotationDegrees = true
+        assertThat(factory.isUsingRotationDegrees).isTrue()
+    }
+
+    @Test
+    public fun setUseCropRect_getterReturnsTrue() {
+        val factory = ImageProxyTransformFactory()
+        assertThat(factory.isUsingCropRect).isFalse()
+        factory.isUsingCropRect = true
+        assertThat(factory.isUsingCropRect).isTrue()
+    }
+
+    @Test
     public fun withoutRotationOrCropRect_scaled() {
         // Arrange: a 3x4 rect.
         val imageProxy = createFakeImageProxy(3, 4, 90, Rect(0, 0, 3, 4))
-        val imageProxyTransformFactory = ImageProxyTransformFactory.Builder().build()
+        val imageProxyTransformFactory = ImageProxyTransformFactory()
         val transform = imageProxyTransformFactory.getOutputTransform(imageProxy)
 
         // Assert: The bottom-right of the normalized space (1, 1) mapped to (3, 4)
@@ -51,9 +67,8 @@
     public fun withRotation_scaledAndRotated() {
         // Arrange: a 3x4 rect with 90° rotation.
         // (the MLKit scenario).
-        val imageProxyTransformFactory = ImageProxyTransformFactory.Builder()
-            .setUseRotationDegrees(true)
-            .build()
+        val imageProxyTransformFactory = ImageProxyTransformFactory()
+        imageProxyTransformFactory.isUsingRotationDegrees = true
         val imageProxy = createFakeImageProxy(3, 4, 90, Rect(0, 0, 3, 4))
         val transform = imageProxyTransformFactory.getOutputTransform(imageProxy)
 
@@ -66,9 +81,9 @@
     @Test
     public fun withCropRect_cropped() {
         // Arrange: a 16x12 rect with a 8x12 crop rect (8,0)-(16,12).
-        val imageProxyTransformFactory = ImageProxyTransformFactory.Builder()
-            .setUseCropRect(true)
-            .build()
+        val imageProxyTransformFactory = ImageProxyTransformFactory()
+        imageProxyTransformFactory.isUsingCropRect = true
+
         val imageProxy = createFakeImageProxy(16, 12, 90, Rect(8, 0, 16, 12))
         val transform = imageProxyTransformFactory.getOutputTransform(imageProxy)
 
@@ -82,10 +97,9 @@
     @Test
     public fun rotationAndCrop() {
         // Arrange: crop rect with rotation.
-        val imageProxyTransformFactory = ImageProxyTransformFactory.Builder()
-            .setUseCropRect(true)
-            .setUseRotationDegrees(true)
-            .build()
+        val imageProxyTransformFactory = ImageProxyTransformFactory()
+        imageProxyTransformFactory.isUsingRotationDegrees = true
+        imageProxyTransformFactory.isUsingCropRect = true
         val imageProxy = createFakeImageProxy(16, 12, 90, Rect(8, 0, 16, 12))
         val transform = imageProxyTransformFactory.getOutputTransform(imageProxy)
 
diff --git a/camera/integration-tests/camerapipetestapp/build.gradle b/camera/integration-tests/camerapipetestapp/build.gradle
index 4aa9ef6..1caa678 100644
--- a/camera/integration-tests/camerapipetestapp/build.gradle
+++ b/camera/integration-tests/camerapipetestapp/build.gradle
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
+import static androidx.build.dependencies.DependenciesKt.CONSTRAINT_LAYOUT
 
 plugins {
     id("AndroidXPlugin")
@@ -51,7 +51,7 @@
 
 dependencies {
     // Internal library
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
 
     // Android Support Library
     implementation("androidx.appcompat:appcompat:1.1.0")
@@ -61,15 +61,15 @@
     implementation(project(":camera:camera-camera2-pipe"))
 
     // Testing framework
-    testImplementation(TRUTH)
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(TRUTH)
-    debugImplementation(ANDROIDX_TEST_CORE)
+    testImplementation(libs.truth)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testUiautomator)
+    androidTestImplementation(libs.espressoCore)
+    androidTestImplementation(libs.truth)
+    debugImplementation(libs.testCore)
 }
diff --git a/camera/integration-tests/camerapipetestapp/lint-baseline.xml b/camera/integration-tests/camerapipetestapp/lint-baseline.xml
index a23af71..6dca65d 100644
--- a/camera/integration-tests/camerapipetestapp/lint-baseline.xml
+++ b/camera/integration-tests/camerapipetestapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
@@ -45,136 +45,4 @@
             column="6"/>
     </issue>
 
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.colorPrimary` appears to be unused"
-        errorLine1="    &lt;color name=&quot;colorPrimary&quot;>#6200EE&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="17"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.colorPrimaryDark` appears to be unused"
-        errorLine1="    &lt;color name=&quot;colorPrimaryDark&quot;>#3700B3&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="18"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.colorAccent` appears to be unused"
-        errorLine1="    &lt;color name=&quot;colorAccent&quot;>#03DAC5&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="19"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.blackTransparent` appears to be unused"
-        errorLine1="    &lt;color name=&quot;blackTransparent&quot;>#C0000000&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="20"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.transparent` appears to be unused"
-        errorLine1="    &lt;color name=&quot;transparent&quot;>#00000000&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="23"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.gray` appears to be unused"
-        errorLine1="    &lt;color name=&quot;gray&quot;>#978082&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="26"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.cameraPipeThemeBgOverlayDark50` appears to be unused"
-        errorLine1="    &lt;color name=&quot;cameraPipeThemeBgOverlayDark50&quot;>#DD080808&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="33"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.cameraPipeThemeFgLight700` appears to be unused"
-        errorLine1="    &lt;color name=&quot;cameraPipeThemeFgLight700&quot;>#FFD0D0D0&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="42"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.cameraPipeThemeFgLight900` appears to be unused"
-        errorLine1="    &lt;color name=&quot;cameraPipeThemeFgLight900&quot;>#FFFCFCFC&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="44"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.cameraPipeThemeFgAccent` appears to be unused"
-        errorLine1="    &lt;color name=&quot;cameraPipeThemeFgAccent&quot;>#FF0090D0&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="47"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.cameraPipeThemeFgError800` appears to be unused"
-        errorLine1="    &lt;color name=&quot;cameraPipeThemeFgError800&quot;>#FFD00000&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="48"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.cameraPipeThemeFgError900` appears to be unused"
-        errorLine1="    &lt;color name=&quot;cameraPipeThemeFgError900&quot;>#FFE00000&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="49"
-            column="12"/>
-    </issue>
-
 </issues>
diff --git a/camera/integration-tests/coretestapp/build.gradle b/camera/integration-tests/coretestapp/build.gradle
index 1fd48a3..61455aa 100644
--- a/camera/integration-tests/coretestapp/build.gradle
+++ b/camera/integration-tests/coretestapp/build.gradle
@@ -15,9 +15,10 @@
  * limitations under the License.
  */
 
+
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
-import static androidx.build.dependencies.DependenciesKt.*
+import static androidx.build.dependencies.DependenciesKt.CONSTRAINT_LAYOUT
 
 plugins {
     id("AndroidXPlugin")
@@ -75,35 +76,37 @@
 
     // Android Support Library
     api(CONSTRAINT_LAYOUT, { transitive = true })
-    implementation(GUAVA_ANDROID)
-    implementation(ESPRESSO_IDLING_RESOURCE)
+    implementation(libs.guavaAndroid)
+    implementation(libs.espressoIdlingResource)
+    // MLKit library: Barcode scanner
+    implementation(libs.mlkitBarcode, excludes.mlkit)
 
     // 3P library
-    debugImplementation(LEAKCANARY)
+    debugImplementation(libs.leakcanary)
     // Testing resource dependency for manifest
     debugImplementation(project(":camera:camera-testing"))
 
     // Testing framework
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(ESPRESSO_IDLING_RESOURCE)
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(KOTLIN_COROUTINES_ANDROID)
-    androidTestImplementation(LEAKCANARY)
-    androidTestImplementation(LEAKCANARY_INSTRUMENTATION)
-    androidTestImplementation(TRUTH)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testUiautomator)
+    androidTestImplementation(libs.espressoCore)
+    androidTestImplementation(libs.espressoIdlingResource)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.kotlinCoroutinesAndroid)
+    androidTestImplementation(libs.leakcanary)
+    androidTestImplementation(libs.leakcanaryInstrumentation)
+    androidTestImplementation(libs.truth)
     androidTestImplementation(project(":camera:camera-testing"))
     androidTestImplementation(project(":concurrent:concurrent-futures"))
     androidTestImplementation(project(":concurrent:concurrent-futures-ktx"))
     androidTestImplementation(project(":internal-testutils-runtime"))
     androidTestImplementation(project(":lifecycle:lifecycle-runtime-testing"))
 
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
 }
 
 // Allow usage of Kotlin's @OptIn.
diff --git a/camera/integration-tests/coretestapp/lint-baseline.xml b/camera/integration-tests/coretestapp/lint-baseline.xml
index 444e113..b9701dd 100644
--- a/camera/integration-tests/coretestapp/lint-baseline.xml
+++ b/camera/integration-tests/coretestapp/lint-baseline.xml
@@ -1,27 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="RestrictedApi"
-        message="VideoCapture.startRecording can only be called from within the same library group (groupId=androidx.camera)"
-        errorLine1="                    getVideoCapture().startRecording(mVideoFileSaver.getNewVideoOutputFileOptions("
-        errorLine2="                                      ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="355"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="VideoCapture.stopRecording can only be called from within the same library group (groupId=androidx.camera)"
-        errorLine1="                getVideoCapture().stopRecording();"
-        errorLine2="                                  ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="367"
-            column="35"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnsupportedChromeOsHardware"
diff --git a/camera/integration-tests/extensionstestapp/build.gradle b/camera/integration-tests/extensionstestapp/build.gradle
index bdcea02..77a4380 100644
--- a/camera/integration-tests/extensionstestapp/build.gradle
+++ b/camera/integration-tests/extensionstestapp/build.gradle
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
+import static androidx.build.dependencies.DependenciesKt.CONSTRAINT_LAYOUT
 
 plugins {
     id("AndroidXPlugin")
@@ -38,7 +38,7 @@
     implementation(project(":camera:camera-lifecycle"))
     implementation(project(":camera:camera-view"))
     implementation("androidx.test.espresso:espresso-idling-resource:3.1.0")
-    implementation(GUAVA_LISTENABLE_FUTURE)
+    implementation(libs.guavaListenableFuture)
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
 
     // Android Support Library
@@ -46,14 +46,14 @@
     implementation("androidx.appcompat:appcompat:1.1.0")
 
     // Guava
-    implementation(GUAVA_ANDROID)
+    implementation(libs.guavaAndroid)
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testUiautomator)
+    androidTestImplementation(libs.espressoCore)
     androidTestImplementation(project(":camera:camera-testing"))
     androidTestCompileOnly(project(":camera:camera-extensions-stub"))
 
diff --git a/camera/integration-tests/extensionstestapp/lint-baseline.xml b/camera/integration-tests/extensionstestapp/lint-baseline.xml
index ce123d0..e773319 100644
--- a/camera/integration-tests/extensionstestapp/lint-baseline.xml
+++ b/camera/integration-tests/extensionstestapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnsupportedChromeOsHardware"
@@ -30,7 +30,7 @@
         errorLine2="                            ~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java"
-            line="277"
+            line="281"
             column="29"/>
     </issue>
 
diff --git a/camera/integration-tests/extensionstestlib/build.gradle b/camera/integration-tests/extensionstestlib/build.gradle
index ea4767e..deb9bbd 100644
--- a/camera/integration-tests/extensionstestlib/build.gradle
+++ b/camera/integration-tests/extensionstestlib/build.gradle
@@ -14,8 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
-import androidx.build.LibraryVersions
+
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 
diff --git a/camera/integration-tests/extensionstestlib/lint-baseline.xml b/camera/integration-tests/extensionstestlib/lint-baseline.xml
index bafcebb..19e17b2 100644
--- a/camera/integration-tests/extensionstestlib/lint-baseline.xml
+++ b/camera/integration-tests/extensionstestlib/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
@@ -8,7 +8,7 @@
         errorLine2="                                                       ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="93"
+            line="94"
             column="56"/>
     </issue>
 
@@ -19,72 +19,6 @@
         errorLine2="                                                           ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="109"
-            column="60"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                                mImageWriter.queueInputImage(image);"
-        errorLine2="                                             ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="121"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                            mImageWriter = ImageWriter.newInstance(surface, 1);"
-        errorLine2="                                                       ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="98"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                                Image image = mImageWriter.dequeueInputImage();"
-        errorLine2="                                                           ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="114"
-            column="60"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                                mImageWriter.queueInputImage(image);"
-        errorLine2="                                             ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="126"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                            mImageWriter = ImageWriter.newInstance(surface, 1);"
-        errorLine2="                                                       ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="93"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                                Image image = mImageWriter.dequeueInputImage();"
-        errorLine2="                                                           ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
             line="110"
             column="60"/>
     </issue>
@@ -95,7 +29,7 @@
         errorLine1="                                mImageWriter.queueInputImage(image);"
         errorLine2="                                             ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
+            file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
             line="122"
             column="46"/>
     </issue>
@@ -106,8 +40,74 @@
         errorLine1="                            mImageWriter = ImageWriter.newInstance(surface, 1);"
         errorLine2="                                                       ~~~~~~~~~~~">
         <location
+            file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
+            line="99"
+            column="56"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                Image image = mImageWriter.dequeueInputImage();"
+        errorLine2="                                                           ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
+            line="115"
+            column="60"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                mImageWriter.queueInputImage(image);"
+        errorLine2="                                             ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
+            line="127"
+            column="46"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            mImageWriter = ImageWriter.newInstance(surface, 1);"
+        errorLine2="                                                       ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
+            line="94"
+            column="56"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                Image image = mImageWriter.dequeueInputImage();"
+        errorLine2="                                                           ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
+            line="111"
+            column="60"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                mImageWriter.queueInputImage(image);"
+        errorLine2="                                             ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
+            line="123"
+            column="46"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            mImageWriter = ImageWriter.newInstance(surface, 1);"
+        errorLine2="                                                       ~~~~~~~~~~~">
+        <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="104"
+            line="105"
             column="56"/>
     </issue>
 
@@ -118,7 +118,7 @@
         errorLine2="                                                             ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="140"
+            line="141"
             column="62"/>
     </issue>
 
@@ -129,7 +129,7 @@
         errorLine2="                                         ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="200"
+            line="201"
             column="42"/>
     </issue>
 
@@ -140,7 +140,7 @@
         errorLine2="                                                       ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="93"
+            line="94"
             column="56"/>
     </issue>
 
@@ -151,7 +151,7 @@
         errorLine2="                                                           ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="109"
+            line="110"
             column="60"/>
     </issue>
 
@@ -162,7 +162,7 @@
         errorLine2="                                             ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="121"
+            line="122"
             column="46"/>
     </issue>
 
@@ -173,7 +173,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="56"
+            line="57"
             column="22"/>
     </issue>
 
@@ -184,7 +184,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="56"
+            line="57"
             column="39"/>
     </issue>
 
@@ -195,7 +195,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="75"
+            line="76"
             column="12"/>
     </issue>
 
@@ -206,7 +206,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="85"
+            line="86"
             column="12"/>
     </issue>
 
@@ -217,7 +217,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="142"
+            line="143"
             column="24"/>
     </issue>
 
@@ -228,7 +228,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="142"
+            line="143"
             column="41"/>
     </issue>
 
@@ -239,7 +239,7 @@
         errorLine2="            ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="143"
+            line="144"
             column="13"/>
     </issue>
 
@@ -250,7 +250,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="153"
+            line="154"
             column="12"/>
     </issue>
 
@@ -261,7 +261,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="169"
+            line="170"
             column="12"/>
     </issue>
 
@@ -272,7 +272,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="179"
+            line="180"
             column="12"/>
     </issue>
 
@@ -283,7 +283,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="194"
+            line="195"
             column="12"/>
     </issue>
 
@@ -426,7 +426,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="60"
+            line="61"
             column="22"/>
     </issue>
 
@@ -437,7 +437,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="60"
+            line="61"
             column="39"/>
     </issue>
 
@@ -448,7 +448,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="80"
+            line="81"
             column="12"/>
     </issue>
 
@@ -459,7 +459,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="90"
+            line="91"
             column="12"/>
     </issue>
 
@@ -470,7 +470,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="147"
+            line="148"
             column="24"/>
     </issue>
 
@@ -481,7 +481,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="147"
+            line="148"
             column="41"/>
     </issue>
 
@@ -492,7 +492,7 @@
         errorLine2="            ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="148"
+            line="149"
             column="13"/>
     </issue>
 
@@ -503,7 +503,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="158"
+            line="159"
             column="12"/>
     </issue>
 
@@ -514,7 +514,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="174"
+            line="175"
             column="12"/>
     </issue>
 
@@ -525,7 +525,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="184"
+            line="185"
             column="12"/>
     </issue>
 
@@ -536,7 +536,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="199"
+            line="200"
             column="12"/>
     </issue>
 
@@ -679,7 +679,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="56"
+            line="57"
             column="22"/>
     </issue>
 
@@ -690,7 +690,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="56"
+            line="57"
             column="39"/>
     </issue>
 
@@ -701,7 +701,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="75"
+            line="76"
             column="12"/>
     </issue>
 
@@ -712,7 +712,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="85"
+            line="86"
             column="12"/>
     </issue>
 
@@ -723,7 +723,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="143"
+            line="144"
             column="24"/>
     </issue>
 
@@ -734,7 +734,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="143"
+            line="144"
             column="41"/>
     </issue>
 
@@ -745,7 +745,7 @@
         errorLine2="            ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="144"
+            line="145"
             column="13"/>
     </issue>
 
@@ -756,7 +756,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="154"
+            line="155"
             column="12"/>
     </issue>
 
@@ -767,7 +767,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="170"
+            line="171"
             column="12"/>
     </issue>
 
@@ -778,7 +778,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="180"
+            line="181"
             column="12"/>
     </issue>
 
@@ -789,7 +789,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="195"
+            line="196"
             column="12"/>
     </issue>
 
@@ -1064,7 +1064,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="58"
+            line="59"
             column="22"/>
     </issue>
 
@@ -1075,7 +1075,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="58"
+            line="59"
             column="39"/>
     </issue>
 
@@ -1086,7 +1086,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="69"
+            line="70"
             column="12"/>
     </issue>
 
@@ -1097,7 +1097,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="96"
+            line="97"
             column="12"/>
     </issue>
 
@@ -1108,7 +1108,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="220"
+            line="221"
             column="24"/>
     </issue>
 
@@ -1119,7 +1119,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="220"
+            line="221"
             column="41"/>
     </issue>
 
@@ -1130,7 +1130,7 @@
         errorLine2="            ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="221"
+            line="222"
             column="13"/>
     </issue>
 
@@ -1141,7 +1141,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="231"
+            line="232"
             column="12"/>
     </issue>
 
@@ -1152,7 +1152,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="243"
+            line="244"
             column="12"/>
     </issue>
 
@@ -1163,7 +1163,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="249"
+            line="250"
             column="12"/>
     </issue>
 
@@ -1174,7 +1174,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="260"
+            line="261"
             column="12"/>
     </issue>
 
@@ -1317,7 +1317,7 @@
         errorLine2="                                 ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java"
-            line="41"
+            line="42"
             column="34"/>
     </issue>
 
@@ -1328,7 +1328,7 @@
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java"
-            line="41"
+            line="42"
             column="51"/>
     </issue>
 
@@ -1339,7 +1339,7 @@
         errorLine2="              ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java"
-            line="52"
+            line="53"
             column="15"/>
     </issue>
 
@@ -1350,7 +1350,7 @@
         errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java"
-            line="52"
+            line="53"
             column="32"/>
     </issue>
 
@@ -1361,7 +1361,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java"
-            line="57"
+            line="58"
             column="5"/>
     </issue>
 
@@ -1372,7 +1372,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java"
-            line="60"
+            line="61"
             column="5"/>
     </issue>
 
@@ -1383,7 +1383,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="56"
+            line="57"
             column="22"/>
     </issue>
 
@@ -1394,7 +1394,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="56"
+            line="57"
             column="39"/>
     </issue>
 
@@ -1405,7 +1405,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="75"
+            line="76"
             column="12"/>
     </issue>
 
@@ -1416,7 +1416,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="85"
+            line="86"
             column="12"/>
     </issue>
 
@@ -1427,7 +1427,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="142"
+            line="143"
             column="24"/>
     </issue>
 
@@ -1438,7 +1438,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="142"
+            line="143"
             column="41"/>
     </issue>
 
@@ -1449,7 +1449,7 @@
         errorLine2="            ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="143"
+            line="144"
             column="13"/>
     </issue>
 
@@ -1460,7 +1460,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="153"
+            line="154"
             column="12"/>
     </issue>
 
@@ -1471,7 +1471,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="169"
+            line="170"
             column="12"/>
     </issue>
 
@@ -1482,7 +1482,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="179"
+            line="180"
             column="12"/>
     </issue>
 
@@ -1493,7 +1493,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="194"
+            line="195"
             column="12"/>
     </issue>
 
diff --git a/camera/integration-tests/timingtestapp/build.gradle b/camera/integration-tests/timingtestapp/build.gradle
index db40530..73186e7 100644
--- a/camera/integration-tests/timingtestapp/build.gradle
+++ b/camera/integration-tests/timingtestapp/build.gradle
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
+import static androidx.build.dependencies.DependenciesKt.CONSTRAINT_LAYOUT
 
 plugins {
     id("AndroidXPlugin")
@@ -64,18 +64,18 @@
     implementation("androidx.exifinterface:exifinterface:1.0.0")
     implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.2.0")
     implementation(CONSTRAINT_LAYOUT, { transitive = true })
-    implementation(KOTLIN_STDLIB)
-    implementation(KOTLIN_COROUTINES_ANDROID)
+    implementation(libs.kotlinStdlib)
+    implementation(libs.kotlinCoroutinesAndroid)
 
     // Testing framework
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE)
-    implementation(ESPRESSO_IDLING_RESOURCE)
-    implementation(TRUTH)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.espressoCore)
+    implementation(libs.espressoIdlingResource)
+    implementation(libs.truth)
 
     // Statistics library
-    implementation(GUAVA_ANDROID)
+    implementation(libs.guavaAndroid)
 }
diff --git a/camera/integration-tests/timingtestapp/lint-baseline.xml b/camera/integration-tests/timingtestapp/lint-baseline.xml
index 61d8df2..3a68c2d 100644
--- a/camera/integration-tests/timingtestapp/lint-baseline.xml
+++ b/camera/integration-tests/timingtestapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
@@ -45,169 +45,4 @@
             column="6"/>
     </issue>
 
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_camera1` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_camera1&quot;>Camera1&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="21"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_camera2` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_camera2&quot;>Camera2&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="22"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_camerax` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_camerax&quot;>CameraX&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="23"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_size_max` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_size_max&quot;>Max image size&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="24"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_size_min` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_size_min&quot;>Min image size&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="25"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_focus_auto` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_focus_auto&quot;>Auto-focus&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="26"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_focus_continuous` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_focus_continuous&quot;>Continuous focus&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="27"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_camera` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_camera&quot;>Camera:&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="28"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_log` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_log&quot;>Log: &lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="32"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.settings_numtests_summary` appears to be unused"
-        errorLine1="    &lt;string name=&quot;settings_numtests_summary&quot;>Number of repetitions to do for repeated tests&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="46"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.settings_previewbuffer_summary` appears to be unused"
-        errorLine1="    &lt;string name=&quot;settings_previewbuffer_summary&quot;>Length of time to allow the preview buffer to run before trying to capture an image. Longer values will ensure the hardware frame buffer is full to offer accurate capture-only latency.&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="50"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.settings_autotest_header` appears to be unused"
-        errorLine1="    &lt;string name=&quot;settings_autotest_header&quot;>Auto-test settings&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="52"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.settings_autotest_header_key` appears to be unused"
-        errorLine1="    &lt;string name=&quot;settings_autotest_header_key&quot;>settings_autotest_header_key&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="53"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.ic_launcher_background` appears to be unused"
-        errorLine1="    &lt;color name=&quot;ic_launcher_background&quot;>#A617A1&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/ic_launcher_background.xml"
-            line="18"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_launcher_foreground` appears to be unused"
-        errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/drawable-v24/ic_launcher_foreground.xml"
-            line="17"
-            column="1"/>
-    </issue>
-
 </issues>
diff --git a/camera/integration-tests/uiwidgetstestapp/build.gradle b/camera/integration-tests/uiwidgetstestapp/build.gradle
index e52e977..ad5c90b 100644
--- a/camera/integration-tests/uiwidgetstestapp/build.gradle
+++ b/camera/integration-tests/uiwidgetstestapp/build.gradle
@@ -13,9 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.application")
@@ -52,7 +49,7 @@
 
 dependencies {
     // Internal library
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
     implementation(project(":camera:camera-camera2"))
     implementation(project(":camera:camera-lifecycle"))
     implementation(project(":camera:camera-view"))
@@ -62,16 +59,16 @@
     implementation("androidx.viewpager2:viewpager2:1.0.0")
 
     // Testing framework
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testUiautomator)
+    androidTestImplementation(libs.espressoCore)
     androidTestImplementation(project(":camera:camera-testing"))
     androidTestImplementation(project(":internal-testutils-runtime"))
-    androidTestImplementation(TRUTH)
-    debugImplementation(ANDROIDX_TEST_CORE)
+    androidTestImplementation(libs.truth)
+    debugImplementation(libs.testCore)
     debugImplementation("androidx.fragment:fragment-testing:1.2.5")
     // Testing resource dependency for manifest
     debugImplementation(project(":camera:camera-testing"))
diff --git a/camera/integration-tests/uiwidgetstestapp/lint-baseline.xml b/camera/integration-tests/uiwidgetstestapp/lint-baseline.xml
index 3416faf..f3c0b38 100644
--- a/camera/integration-tests/uiwidgetstestapp/lint-baseline.xml
+++ b/camera/integration-tests/uiwidgetstestapp/lint-baseline.xml
@@ -2,27 +2,6 @@
 <issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.lang.instrument`. Referenced from `org.jacoco.agent.rt.internal_0a097fa.CoverageTransformer`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/org/jacoco/org.jacoco.agent/0.8.7-SNAPSHOT/org.jacoco.agent-0.8.7-SNAPSHOT-runtime.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.lang.management`. Referenced from `org.jacoco.agent.rt.internal_0a097fa.JmxRegistration`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/org/jacoco/org.jacoco.agent/0.8.7-SNAPSHOT/org.jacoco.agent-0.8.7-SNAPSHOT-runtime.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `javax.management`. Referenced from `org.jacoco.agent.rt.internal_0a097fa.JmxRegistration`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/org/jacoco/org.jacoco.agent/0.8.7-SNAPSHOT/org.jacoco.agent-0.8.7-SNAPSHOT-runtime.jar"/>
-    </issue>
-
-    <issue
         id="PermissionImpliesUnsupportedChromeOsHardware"
         message="Permission exists without corresponding hardware `&lt;uses-feature android:name=&quot;android.hardware.camera&quot; required=&quot;false&quot;>` tag"
         errorLine1="    &lt;uses-permission android:name=&quot;android.permission.CAMERA&quot; />"
diff --git a/camera/integration-tests/viewtestapp/build.gradle b/camera/integration-tests/viewtestapp/build.gradle
index 689feab..295b9a4 100644
--- a/camera/integration-tests/viewtestapp/build.gradle
+++ b/camera/integration-tests/viewtestapp/build.gradle
@@ -14,9 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.application")
@@ -57,7 +54,7 @@
     implementation("androidx.camera:camera-lifecycle:${VIEW_ATOMIC_GROUP_PINNED_VER}")
     implementation(project(":lifecycle:lifecycle-runtime"))
     implementation(project(":camera:camera-view"))
-    implementation(GUAVA_ANDROID)
+    implementation(libs.guavaAndroid)
     implementation("androidx.exifinterface:exifinterface:1.3.2")
 
     // Lifecycle and LiveData
@@ -67,17 +64,17 @@
     implementation("androidx.appcompat:appcompat:1.1.0")
 
     // Testing framework
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testUiautomator)
+    androidTestImplementation(libs.espressoCore)
     androidTestImplementation(project(":lifecycle:lifecycle-runtime-testing"))
     androidTestImplementation(project(":lifecycle:lifecycle-runtime"))
     androidTestImplementation("androidx.lifecycle:lifecycle-livedata-ktx:2.2.0")
-    androidTestImplementation(TRUTH)
-    debugImplementation(ANDROIDX_TEST_CORE)
+    androidTestImplementation(libs.truth)
+    debugImplementation(libs.testCore)
     debugImplementation("androidx.fragment:fragment-testing:1.2.3")
     // camera-testing added as 'implementation' dependency to include camera-testing activity in APK
     debugImplementation(project(":camera:camera-testing")) {
diff --git a/camera/integration-tests/viewtestapp/lint-baseline.xml b/camera/integration-tests/viewtestapp/lint-baseline.xml
index 2c3854f..07b6fc0 100644
--- a/camera/integration-tests/viewtestapp/lint-baseline.xml
+++ b/camera/integration-tests/viewtestapp/lint-baseline.xml
@@ -1,71 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="RestrictedApi"
-        message="CameraView.getMaxVideoDuration can only be called from within the same library group (groupId=androidx.camera)"
-        errorLine1="                            if (mCameraView.getMaxVideoDuration() > 0) {"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java"
-            line="82"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="CameraView.getMaxVideoDuration can only be called from within the same library group (groupId=androidx.camera)"
-        errorLine1="                                sendEmptyMessageDelayed(RELEASE, mCameraView.getMaxVideoDuration());"
-        errorLine2="                                                                             ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java"
-            line="83"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="CameraView.getMaxVideoDuration can only be called from within the same library group (groupId=androidx.camera)"
-        errorLine1="                        &amp;&amp; (mCameraView.getMaxVideoDuration() &lt;= 0"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java"
-            line="198"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="CameraView.getMaxVideoDuration can only be called from within the same library group (groupId=androidx.camera)"
-        errorLine1="                        || deltaSinceDownEvent() &lt; mCameraView.getMaxVideoDuration())) {"
-        errorLine2="                                                               ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java"
-            line="199"
-            column="64"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="CameraView.getMaxVideoDuration can only be called from within the same library group (groupId=androidx.camera)"
-        errorLine1="                } else if ((mCameraView.getMaxVideoDuration() &lt;= 0"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java"
-            line="208"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="CameraView.getMaxVideoDuration can only be called from within the same library group (groupId=androidx.camera)"
-        errorLine1="                        || deltaSinceDownEvent() &lt; mCameraView.getMaxVideoDuration())) {"
-        errorLine2="                                                               ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java"
-            line="209"
-            column="64"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="PermissionImpliesUnsupportedChromeOsHardware"
@@ -89,92 +23,4 @@
             column="6"/>
     </issue>
 
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.preview` appears to be unused"
-        errorLine1="    &lt;string name=&quot;preview&quot;>Preview&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="20"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.btn_confirm` appears to be unused"
-        errorLine1="    &lt;string name=&quot;btn_confirm&quot;>Confirm&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="42"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.btn_cancel` appears to be unused"
-        errorLine1="    &lt;string name=&quot;btn_cancel&quot;>Cancel&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="43"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `onTap` of class `CaptureViewOnTouchListener` requires synthetic accessor"
-        errorLine1="                            onTap();"
-        errorLine2="                            ~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java"
-            line="78"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `onHold` of class `CaptureViewOnTouchListener` requires synthetic accessor"
-        errorLine1="                            onHold();"
-        errorLine2="                            ~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java"
-            line="81"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCameraView` of class `CaptureViewOnTouchListener` requires synthetic accessor"
-        errorLine1="                            if (mCameraView.getMaxVideoDuration() > 0) {"
-        errorLine2="                                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java"
-            line="82"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCameraView` of class `CaptureViewOnTouchListener` requires synthetic accessor"
-        errorLine1="                                sendEmptyMessageDelayed(RELEASE, mCameraView.getMaxVideoDuration());"
-        errorLine2="                                                                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java"
-            line="83"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `onRelease` of class `CaptureViewOnTouchListener` requires synthetic accessor"
-        errorLine1="                            onRelease();"
-        errorLine2="                            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/view/CaptureViewOnTouchListener.java"
-            line="87"
-            column="29"/>
-    </issue>
-
 </issues>
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraControllerFragment.java b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraControllerFragment.java
index 46cb4308..9fab3a8f 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraControllerFragment.java
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraControllerFragment.java
@@ -51,7 +51,7 @@
 import androidx.camera.view.CameraController;
 import androidx.camera.view.LifecycleCameraController;
 import androidx.camera.view.PreviewView;
-import androidx.camera.view.SensorRotationListener;
+import androidx.camera.view.RotationReceiver;
 import androidx.camera.view.video.ExperimentalVideo;
 import androidx.camera.view.video.OnVideoSavedCallback;
 import androidx.camera.view.video.OutputFileOptions;
@@ -89,7 +89,7 @@
     private ToggleButton mTapToFocusToggle;
     private TextView mZoomStateText;
     private TextView mTorchStateText;
-    private RotationListener mSensorRotationListener;
+    private SensorRotationReceiver mSensorRotationReceiver;
     private TextView mLuminance;
     private boolean mIsAnalyzerSet = true;
 
@@ -123,8 +123,8 @@
             @Nullable ViewGroup container,
             @Nullable Bundle savedInstanceState) {
         mExecutorService = Executors.newSingleThreadExecutor();
-        mSensorRotationListener = new RotationListener(requireContext());
-        mSensorRotationListener.enable();
+        mSensorRotationReceiver = new SensorRotationReceiver(requireContext());
+        mSensorRotationReceiver.enable();
         mCameraController = new LifecycleCameraController(requireContext());
         checkFailedFuture(mCameraController.getInitializationFuture());
         runSafely(() -> mCameraController.bindToLifecycle(getViewLifecycleOwner()));
@@ -321,8 +321,8 @@
         if (mExecutorService != null) {
             mExecutorService.shutdown();
         }
-        if (mSensorRotationListener != null) {
-            mSensorRotationListener.disable();
+        if (mSensorRotationReceiver != null) {
+            mSensorRotationReceiver.disable();
         }
     }
 
@@ -451,11 +451,11 @@
     /**
      * Listens to accelerometer rotation change and pass it to tests.
      */
-    static class RotationListener extends SensorRotationListener {
+    static class SensorRotationReceiver extends RotationReceiver {
 
         private int mRotation;
 
-        RotationListener(@NonNull Context context) {
+        SensorRotationReceiver(@NonNull Context context) {
             super(context);
         }
 
@@ -498,7 +498,7 @@
      */
     @RestrictTo(RestrictTo.Scope.TESTS)
     int getSensorRotation() {
-        return mSensorRotationListener.getRotation();
+        return mSensorRotationReceiver.getRotation();
     }
 
     @VisibleForTesting
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/TransformFragment.java b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/TransformFragment.java
index 0ed1968..78b879c 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/TransformFragment.java
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/TransformFragment.java
@@ -74,6 +74,7 @@
  * A fragment that demos transform utilities.
  */
 @SuppressLint("RestrictedAPI")
+@OptIn(markerClass = TransformExperimental.class)
 public final class TransformFragment extends Fragment {
 
     private static final String TAG = "TransformFragment";
@@ -103,15 +104,13 @@
     @SuppressWarnings("WeakerAccess")
     RectF mBrightestTile;
 
-    private final FileTransformFactory mFileTransformFactoryWithoutExif =
-            new FileTransformFactory.Builder().build();
-    private final FileTransformFactory mFileTransformFactoryWithExif =
-            new FileTransformFactory.Builder().setUseExifOrientation(true).build();
+    private FileTransformFactory mFileTransformFactoryWithoutExif;
+    private FileTransformFactory mFileTransformFactoryWithExif;
 
     private final ImageAnalysis.Analyzer mAnalyzer = new ImageAnalysis.Analyzer() {
 
         private final ImageProxyTransformFactory mImageProxyTransformFactory =
-                new ImageProxyTransformFactory.Builder().build();
+                new ImageProxyTransformFactory();
 
         @Override
         @OptIn(markerClass = TransformExperimental.class)
@@ -265,10 +264,14 @@
 
     @NonNull
     @Override
+    @OptIn(markerClass = TransformExperimental.class)
     public View onCreateView(
             @NonNull LayoutInflater inflater,
             @Nullable ViewGroup container,
             @Nullable Bundle savedInstanceState) {
+        mFileTransformFactoryWithoutExif = new FileTransformFactory();
+        mFileTransformFactoryWithExif = new FileTransformFactory();
+        mFileTransformFactoryWithExif.setUsingExifOrientation(true);
         mExecutorService = Executors.newSingleThreadExecutor();
         mCameraController = new LifecycleCameraController(requireContext());
         mCameraController.bindToLifecycle(getViewLifecycleOwner());
diff --git a/car/app/app-automotive/api/current.txt b/car/app/app-automotive/api/current.txt
index 74fbbf3..cd0d094 100644
--- a/car/app/app-automotive/api/current.txt
+++ b/car/app/app-automotive/api/current.txt
@@ -21,13 +21,13 @@
   }
 
   public final class SurfaceWrapper {
-    ctor public SurfaceWrapper(android.os.IBinder?, int, int, int, int, android.view.Surface);
+    ctor public SurfaceWrapper(android.os.IBinder?, @Dimension int, @Dimension int, int, int, android.view.Surface);
     method public int getDensityDpi();
     method public int getDisplayId();
-    method public int getHeight();
+    method @Dimension public int getHeight();
     method public android.os.IBinder? getHostToken();
     method public android.view.Surface getSurface();
-    method public int getWidth();
+    method @Dimension public int getWidth();
   }
 
 }
diff --git a/car/app/app-automotive/api/public_plus_experimental_current.txt b/car/app/app-automotive/api/public_plus_experimental_current.txt
index 2549890..3f11cc2 100644
--- a/car/app/app-automotive/api/public_plus_experimental_current.txt
+++ b/car/app/app-automotive/api/public_plus_experimental_current.txt
@@ -21,13 +21,13 @@
   }
 
   public final class SurfaceWrapper {
-    ctor public SurfaceWrapper(android.os.IBinder?, int, int, int, int, android.view.Surface);
+    ctor public SurfaceWrapper(android.os.IBinder?, @Dimension int, @Dimension int, int, int, android.view.Surface);
     method public int getDensityDpi();
     method public int getDisplayId();
-    method public int getHeight();
+    method @Dimension public int getHeight();
     method public android.os.IBinder? getHostToken();
     method public android.view.Surface getSurface();
-    method public int getWidth();
+    method @Dimension public int getWidth();
   }
 
 }
diff --git a/car/app/app-automotive/api/restricted_current.txt b/car/app/app-automotive/api/restricted_current.txt
index 2549890..3f11cc2 100644
--- a/car/app/app-automotive/api/restricted_current.txt
+++ b/car/app/app-automotive/api/restricted_current.txt
@@ -21,13 +21,13 @@
   }
 
   public final class SurfaceWrapper {
-    ctor public SurfaceWrapper(android.os.IBinder?, int, int, int, int, android.view.Surface);
+    ctor public SurfaceWrapper(android.os.IBinder?, @Dimension int, @Dimension int, int, int, android.view.Surface);
     method public int getDensityDpi();
     method public int getDisplayId();
-    method public int getHeight();
+    method @Dimension public int getHeight();
     method public android.os.IBinder? getHostToken();
     method public android.view.Surface getSurface();
-    method public int getWidth();
+    method @Dimension public int getWidth();
   }
 
 }
diff --git a/car/app/app-automotive/src/androidTest/AndroidManifest.xml b/car/app/app-automotive/src/androidTest/AndroidManifest.xml
index f5f2ff9..db2ba14 100644
--- a/car/app/app-automotive/src/androidTest/AndroidManifest.xml
+++ b/car/app/app-automotive/src/androidTest/AndroidManifest.xml
@@ -15,6 +15,6 @@
   limitations under the License.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="androidx.car.app.activity.test">
+    package="androidx.car.app.automotive.test">
 
 </manifest>
diff --git a/car/app/app-automotive/src/main/AndroidManifest.xml b/car/app/app-automotive/src/main/AndroidManifest.xml
index 3a91379..0e5d23c 100644
--- a/car/app/app-automotive/src/main/AndroidManifest.xml
+++ b/car/app/app-automotive/src/main/AndroidManifest.xml
@@ -15,7 +15,7 @@
   limitations under the License.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="androidx.car.app"
+    package="androidx.car.app.automotive"
     android:versionCode="1"
     android:versionName="0.1">
     <queries>
@@ -30,7 +30,7 @@
     -->
     <application>
         <activity
-            android:name=".activity.CarAppActivity"
+            android:name="androidx.car.app.activity.CarAppActivity"
             android:theme="@android:style/Theme.NoTitleBar"
             android:exported="false"
             android:windowSoftInputMode="adjustResize">
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/activity/CarAppActivity.java b/car/app/app-automotive/src/main/java/androidx/car/app/activity/CarAppActivity.java
index 3171fb1..be5bb52 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/activity/CarAppActivity.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/activity/CarAppActivity.java
@@ -32,7 +32,6 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
-import androidx.car.app.R;
 import androidx.car.app.activity.renderer.ICarAppActivity;
 import androidx.car.app.activity.renderer.IRendererCallback;
 import androidx.car.app.activity.renderer.IRendererService;
@@ -41,6 +40,7 @@
 import androidx.car.app.activity.renderer.surface.SurfaceHolderListener;
 import androidx.car.app.activity.renderer.surface.SurfaceWrapperProvider;
 import androidx.car.app.activity.renderer.surface.TemplateSurfaceView;
+import androidx.car.app.automotive.R;
 import androidx.car.app.serialization.Bundleable;
 import androidx.car.app.serialization.BundlerException;
 import androidx.car.app.utils.ThreadUtils;
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/activity/ErrorHandler.java b/car/app/app-automotive/src/main/java/androidx/car/app/activity/ErrorHandler.java
index 9fa3081..cc3ce4b 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/activity/ErrorHandler.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/activity/ErrorHandler.java
@@ -21,7 +21,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StringRes;
-import androidx.car.app.R;
+import androidx.car.app.automotive.R;
 
 /**
  * Error handling abstraction
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/activity/ErrorMessageFragment.java b/car/app/app-automotive/src/main/java/androidx/car/app/activity/ErrorMessageFragment.java
index c66cc1a..502e337 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/activity/ErrorMessageFragment.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/activity/ErrorMessageFragment.java
@@ -33,7 +33,7 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.VisibleForTesting;
-import androidx.car.app.R;
+import androidx.car.app.automotive.R;
 import androidx.fragment.app.Fragment;
 
 import java.util.List;
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceWrapper.java b/car/app/app-automotive/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceWrapper.java
index e304f54..8d2ddee 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceWrapper.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceWrapper.java
@@ -22,6 +22,7 @@
 import android.view.Surface;
 import android.view.SurfaceView;
 
+import androidx.annotation.Dimension;
 import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -34,8 +35,10 @@
     @Nullable
     private IBinder mHostToken;
     @Keep
+    @Dimension
     private int mWidth;
     @Keep
+    @Dimension
     private int mHeight;
     @Keep
     private int mDisplayId;
@@ -50,14 +53,14 @@
      *
      * @param hostToken  a token used for constructing SurfaceControlViewHost. see
      *                   {@link SurfaceView} for more details
-     * @param width      the width of the surface view
-     * @param height     the height of the surface view
+     * @param width      the width of the surface view in pixels
+     * @param height     the height of the surface view in pixels
      * @param displayId  the ID of the display showing the surface
-     * @param densityDpi the density of the display showing the surface
+     * @param densityDpi the density of the display showing the surface expressed as dots-per-inch
      * @param surface    the surface for which the wrapper is created
      */
-    public SurfaceWrapper(@Nullable IBinder hostToken, int width, int height, int displayId,
-            int densityDpi, @NonNull Surface surface) {
+    public SurfaceWrapper(@Nullable IBinder hostToken, @Dimension int width, @Dimension int height,
+            int displayId, int densityDpi, @NonNull Surface surface) {
         mHostToken = hostToken;
         mWidth = width;
         mHeight = height;
@@ -79,15 +82,17 @@
     }
 
     /**
-     * Returns the width of the {@link SurfaceView} contained in this class.
+     * Returns the width of the contained {@link SurfaceView} in pixels.
      */
+    @Dimension
     public int getWidth() {
         return mWidth;
     }
 
     /**
-     * Returns the width of the {@link SurfaceView} contained in this class.
+     * Returns the height of the contained {@link SurfaceView} in pixels.
      */
+    @Dimension
     public int getHeight() {
         return mHeight;
     }
@@ -101,15 +106,15 @@
     }
 
     /**
-     * Returns the display id of the {@link SurfaceView} contained in this class.
+     * Returns the screen density expressed as dots-per-inch of the {@link android.view.Display}
+     * for the contained {@link SurfaceView}.
      */
     public int getDensityDpi() {
         return mDensityDpi;
     }
 
     /**
-     * Returns the screen density of the {@link android.view.Display} for the {@link SurfaceView}
-     * contained in this class.
+     * Returns the {@link Surface} of the contained {@link SurfaceView}.
      */
     @NonNull
     public Surface getSurface() {
diff --git a/car/app/app-automotive/src/test/AndroidManifest.xml b/car/app/app-automotive/src/test/AndroidManifest.xml
index d66221d..8ab2286 100644
--- a/car/app/app-automotive/src/test/AndroidManifest.xml
+++ b/car/app/app-automotive/src/test/AndroidManifest.xml
@@ -15,5 +15,5 @@
   limitations under the License.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="androidx.car.app">
+    package="androidx.car.app.automotive">
 </manifest>
diff --git a/car/app/app-projected/src/main/AndroidManifest.xml b/car/app/app-projected/src/main/AndroidManifest.xml
index 9dcedf7..ced5923 100644
--- a/car/app/app-projected/src/main/AndroidManifest.xml
+++ b/car/app/app-projected/src/main/AndroidManifest.xml
@@ -15,6 +15,6 @@
   limitations under the License.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="androidx.car.app">
+    package="androidx.car.app.projected">
 
 </manifest>
\ No newline at end of file
diff --git a/car/app/app-samples/navigation/common/lint-baseline.xml b/car/app/app-samples/navigation/common/lint-baseline.xml
index e9956c6..46c007f 100644
--- a/car/app/app-samples/navigation/common/lint-baseline.xml
+++ b/car/app/app-samples/navigation/common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/car/app/app-samples/places/mobile/lint-baseline.xml b/car/app/app-samples/places/mobile/lint-baseline.xml
index 82752fe..81bc66c 100644
--- a/car/app/app-samples/places/mobile/lint-baseline.xml
+++ b/car/app/app-samples/places/mobile/lint-baseline.xml
@@ -8,7 +8,7 @@
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/AndroidManifest.xml"
-            line="48"
+            line="49"
             column="23"/>
     </issue>
 
diff --git a/car/app/app-samples/showcase/automotive/lint-baseline.xml b/car/app/app-samples/showcase/automotive/lint-baseline.xml
index ddd5daf..4653593 100644
--- a/car/app/app-samples/showcase/automotive/lint-baseline.xml
+++ b/car/app/app-samples/showcase/automotive/lint-baseline.xml
@@ -8,7 +8,7 @@
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/AndroidManifest.xml"
-            line="73"
+            line="74"
             column="23"/>
     </issue>
 
diff --git a/car/app/app-samples/showcase/common/lint-baseline.xml b/car/app/app-samples/showcase/common/lint-baseline.xml
index 89c30e2..f8d21eaf 100644
--- a/car/app/app-samples/showcase/common/lint-baseline.xml
+++ b/car/app/app-samples/showcase/common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/SelectableListsDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/SelectableListsDemoScreen.java
index 463794b..8521109 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/SelectableListsDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/SelectableListsDemoScreen.java
@@ -53,7 +53,8 @@
                                                                 getCarContext(),
                                                                 R.drawable
                                                                         .ic_fastfood_white_48dp))
-                                                        .build())
+                                                        .build(),
+                                                Row.IMAGE_TYPE_ICON)
                                         .setTitle("Option 1")
                                         .addText("Some additional text")
                                         .build())
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/StartScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/StartScreen.java
index 2725c15..c65f3b1 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/StartScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/StartScreen.java
@@ -71,7 +71,8 @@
                                         IconCompat.createWithResource(
                                                 getCarContext(),
                                                 R.drawable.ic_map_white_48dp))
-                                        .build())
+                                        .build(),
+                                Row.IMAGE_TYPE_ICON)
                         .setTitle("Navigation Demos")
                         .setOnClickListener(
                                 () -> getScreenManager()
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/TaskRestrictionDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/TaskRestrictionDemoScreen.java
index c6e43bc..8992b7f 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/TaskRestrictionDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/TaskRestrictionDemoScreen.java
@@ -41,7 +41,7 @@
     private final int mStep;
     private boolean mIsBackOperation = false;
     private boolean mToggleState = false;
-    private int mImageSize = Row.IMAGE_TYPE_SMALL;
+    private int mImageType = Row.IMAGE_TYPE_ICON;
 
     public TaskRestrictionDemoScreen(int step, @NonNull CarContext carContext) {
         super(carContext);
@@ -110,13 +110,13 @@
                                                         getCarContext(),
                                                         R.drawable.ic_fastfood_white_48dp))
                                                 .build(),
-                                        mImageSize)
+                                        mImageType)
                                 .setOnClickListener(
                                         () -> {
-                                            mImageSize =
-                                                    mImageSize == Row.IMAGE_TYPE_SMALL
+                                            mImageType =
+                                                    mImageType == Row.IMAGE_TYPE_ICON
                                                             ? Row.IMAGE_TYPE_LARGE
-                                                            : Row.IMAGE_TYPE_SMALL;
+                                                            : Row.IMAGE_TYPE_ICON;
                                             invalidate();
                                         })
                                 .build());
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/NavigationDemosScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/NavigationDemosScreen.java
index b4853d6..d118696 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/NavigationDemosScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/NavigationDemosScreen.java
@@ -47,7 +47,8 @@
                                         IconCompat.createWithResource(
                                                 getCarContext(),
                                                 R.drawable.ic_explore_white_24dp))
-                                        .build())
+                                        .build(),
+                                Row.IMAGE_TYPE_ICON)
                         .setTitle("Navigation Template Demo")
                         .setOnClickListener(
                                 () ->
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/GridTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/GridTemplateDemoScreen.java
index bb34bd5..3a37401 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/GridTemplateDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/GridTemplateDemoScreen.java
@@ -90,14 +90,14 @@
         // Grid item with an icon and a title.
         gridItemListBuilder.addItem(
                 new GridItem.Builder()
-                        .setImage(new CarIcon.Builder(mIcon).build())
+                        .setImage(new CarIcon.Builder(mIcon).build(), GridItem.IMAGE_TYPE_ICON)
                         .setTitle("Non-actionable")
                         .build());
 
-        // Grid item with a large icon, a title, onClickListener and no text.
+        // Grid item with an icon, a title, onClickListener and no text.
         gridItemListBuilder.addItem(
                 new GridItem.Builder()
-                        .setImage(new CarIcon.Builder(mIcon).build(), GridItem.IMAGE_TYPE_LARGE)
+                        .setImage(new CarIcon.Builder(mIcon).build(), GridItem.IMAGE_TYPE_ICON)
                         .setTitle("Second Item")
                         .setOnClickListener(
                                 () ->
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/textandicons/IconsDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/textandicons/IconsDemoScreen.java
index 28daaee..d3802d9 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/textandicons/IconsDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/textandicons/IconsDemoScreen.java
@@ -56,7 +56,8 @@
                                         IconCompat.createWithResource(
                                                 getCarContext(),
                                                 R.drawable.ic_fastfood_white_48dp))
-                                        .build())
+                                        .build(),
+                                Row.IMAGE_TYPE_ICON)
                         .setTitle("A vector drawable, without a tint")
                         .build());
 
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/textandicons/RowDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/textandicons/RowDemoScreen.java
index d027de8..9c074f3 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/textandicons/RowDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/textandicons/RowDemoScreen.java
@@ -64,7 +64,8 @@
                                         IconCompat.createWithResource(
                                                 getCarContext(),
                                                 R.drawable.ic_fastfood_white_48dp))
-                                        .build())
+                                        .build(),
+                                Row.IMAGE_TYPE_ICON)
                         .build());
 
         listBuilder.addItem(
@@ -76,7 +77,8 @@
                                                 getCarContext(),
                                                 R.drawable
                                                         .ic_emoji_food_beverage_white_48dp))
-                                        .build())
+                                        .build(),
+                                Row.IMAGE_TYPE_ICON)
                         .build());
 
         listBuilder.addItem(
diff --git a/car/app/app-samples/showcase/mobile/lint-baseline.xml b/car/app/app-samples/showcase/mobile/lint-baseline.xml
index 3827612..b47a401 100644
--- a/car/app/app-samples/showcase/mobile/lint-baseline.xml
+++ b/car/app/app-samples/showcase/mobile/lint-baseline.xml
@@ -8,7 +8,7 @@
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/AndroidManifest.xml"
-            line="55"
+            line="56"
             column="23"/>
     </issue>
 
@@ -19,7 +19,7 @@
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/AndroidManifest.xml"
-            line="69"
+            line="70"
             column="23"/>
     </issue>
 
diff --git a/car/app/app/api/current.txt b/car/app/app/api/current.txt
index 22d593f..3a71b2b 100644
--- a/car/app/app/api/current.txt
+++ b/car/app/app/api/current.txt
@@ -422,6 +422,16 @@
     method public androidx.car.app.model.GridTemplate.Builder setTitle(CharSequence);
   }
 
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallback {
+    method public void onInputSubmitted(String);
+    method public void onInputTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallbackDelegate {
+    method public void sendInputSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendInputTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
   @androidx.car.app.annotations.CarProtocol public interface Item {
   }
 
@@ -489,12 +499,14 @@
   }
 
   @androidx.car.app.annotations.CarProtocol public final class MessageTemplate implements androidx.car.app.model.Template {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getActionStrip();
     method public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.CarText? getDebugMessage();
     method public androidx.car.app.model.Action? getHeaderAction();
     method public androidx.car.app.model.CarIcon? getIcon();
     method public androidx.car.app.model.CarText getMessage();
     method public androidx.car.app.model.CarText? getTitle();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public boolean isLoading();
   }
 
   public static final class MessageTemplate.Builder {
@@ -502,10 +514,12 @@
     ctor public MessageTemplate.Builder(androidx.car.app.model.CarText);
     method public androidx.car.app.model.MessageTemplate.Builder addAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.MessageTemplate build();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
     method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(Throwable);
     method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(String);
     method public androidx.car.app.model.MessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.MessageTemplate.Builder setIcon(androidx.car.app.model.CarIcon);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setLoading(boolean);
     method public androidx.car.app.model.MessageTemplate.Builder setTitle(CharSequence);
   }
 
@@ -753,6 +767,7 @@
     method public androidx.car.app.model.CarText? getDefaultValue();
     method public androidx.car.app.model.CarText? getErrorMessage();
     method public androidx.car.app.model.CarText? getHint();
+    method public androidx.car.app.model.InputCallbackDelegate getInputCallbackDelegate();
     method public int getInputType();
     method public int getKeyboardType();
     method public androidx.car.app.model.OnInputCompletedDelegate getOnInputCompletedDelegate();
@@ -767,6 +782,7 @@
 
   public static final class InputSignInMethod.Builder {
     ctor public InputSignInMethod.Builder(androidx.car.app.model.OnInputCompletedListener);
+    ctor public InputSignInMethod.Builder(androidx.car.app.model.InputCallback);
     method public androidx.car.app.model.signin.InputSignInMethod build();
     method public androidx.car.app.model.signin.InputSignInMethod.Builder setDefaultValue(String);
     method public androidx.car.app.model.signin.InputSignInMethod.Builder setErrorMessage(CharSequence);
diff --git a/car/app/app/api/public_plus_experimental_current.txt b/car/app/app/api/public_plus_experimental_current.txt
index da4dcba..dbcb362 100644
--- a/car/app/app/api/public_plus_experimental_current.txt
+++ b/car/app/app/api/public_plus_experimental_current.txt
@@ -425,6 +425,16 @@
     method public androidx.car.app.model.GridTemplate.Builder setTitle(CharSequence);
   }
 
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallback {
+    method public void onInputSubmitted(String);
+    method public void onInputTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallbackDelegate {
+    method public void sendInputSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendInputTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
   @androidx.car.app.annotations.CarProtocol public interface Item {
   }
 
@@ -492,12 +502,14 @@
   }
 
   @androidx.car.app.annotations.CarProtocol public final class MessageTemplate implements androidx.car.app.model.Template {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getActionStrip();
     method public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.CarText? getDebugMessage();
     method public androidx.car.app.model.Action? getHeaderAction();
     method public androidx.car.app.model.CarIcon? getIcon();
     method public androidx.car.app.model.CarText getMessage();
     method public androidx.car.app.model.CarText? getTitle();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public boolean isLoading();
   }
 
   public static final class MessageTemplate.Builder {
@@ -505,10 +517,12 @@
     ctor public MessageTemplate.Builder(androidx.car.app.model.CarText);
     method public androidx.car.app.model.MessageTemplate.Builder addAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.MessageTemplate build();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
     method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(Throwable);
     method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(String);
     method public androidx.car.app.model.MessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.MessageTemplate.Builder setIcon(androidx.car.app.model.CarIcon);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setLoading(boolean);
     method public androidx.car.app.model.MessageTemplate.Builder setTitle(CharSequence);
   }
 
@@ -756,6 +770,7 @@
     method public androidx.car.app.model.CarText? getDefaultValue();
     method public androidx.car.app.model.CarText? getErrorMessage();
     method public androidx.car.app.model.CarText? getHint();
+    method public androidx.car.app.model.InputCallbackDelegate getInputCallbackDelegate();
     method public int getInputType();
     method public int getKeyboardType();
     method public androidx.car.app.model.OnInputCompletedDelegate getOnInputCompletedDelegate();
@@ -770,6 +785,7 @@
 
   public static final class InputSignInMethod.Builder {
     ctor public InputSignInMethod.Builder(androidx.car.app.model.OnInputCompletedListener);
+    ctor public InputSignInMethod.Builder(androidx.car.app.model.InputCallback);
     method public androidx.car.app.model.signin.InputSignInMethod build();
     method public androidx.car.app.model.signin.InputSignInMethod.Builder setDefaultValue(String);
     method public androidx.car.app.model.signin.InputSignInMethod.Builder setErrorMessage(CharSequence);
diff --git a/car/app/app/api/restricted_current.txt b/car/app/app/api/restricted_current.txt
index 22d593f..3a71b2b 100644
--- a/car/app/app/api/restricted_current.txt
+++ b/car/app/app/api/restricted_current.txt
@@ -422,6 +422,16 @@
     method public androidx.car.app.model.GridTemplate.Builder setTitle(CharSequence);
   }
 
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallback {
+    method public void onInputSubmitted(String);
+    method public void onInputTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallbackDelegate {
+    method public void sendInputSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendInputTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
   @androidx.car.app.annotations.CarProtocol public interface Item {
   }
 
@@ -489,12 +499,14 @@
   }
 
   @androidx.car.app.annotations.CarProtocol public final class MessageTemplate implements androidx.car.app.model.Template {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getActionStrip();
     method public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.CarText? getDebugMessage();
     method public androidx.car.app.model.Action? getHeaderAction();
     method public androidx.car.app.model.CarIcon? getIcon();
     method public androidx.car.app.model.CarText getMessage();
     method public androidx.car.app.model.CarText? getTitle();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public boolean isLoading();
   }
 
   public static final class MessageTemplate.Builder {
@@ -502,10 +514,12 @@
     ctor public MessageTemplate.Builder(androidx.car.app.model.CarText);
     method public androidx.car.app.model.MessageTemplate.Builder addAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.MessageTemplate build();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
     method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(Throwable);
     method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(String);
     method public androidx.car.app.model.MessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.MessageTemplate.Builder setIcon(androidx.car.app.model.CarIcon);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setLoading(boolean);
     method public androidx.car.app.model.MessageTemplate.Builder setTitle(CharSequence);
   }
 
@@ -753,6 +767,7 @@
     method public androidx.car.app.model.CarText? getDefaultValue();
     method public androidx.car.app.model.CarText? getErrorMessage();
     method public androidx.car.app.model.CarText? getHint();
+    method public androidx.car.app.model.InputCallbackDelegate getInputCallbackDelegate();
     method public int getInputType();
     method public int getKeyboardType();
     method public androidx.car.app.model.OnInputCompletedDelegate getOnInputCompletedDelegate();
@@ -767,6 +782,7 @@
 
   public static final class InputSignInMethod.Builder {
     ctor public InputSignInMethod.Builder(androidx.car.app.model.OnInputCompletedListener);
+    ctor public InputSignInMethod.Builder(androidx.car.app.model.InputCallback);
     method public androidx.car.app.model.signin.InputSignInMethod build();
     method public androidx.car.app.model.signin.InputSignInMethod.Builder setDefaultValue(String);
     method public androidx.car.app.model.signin.InputSignInMethod.Builder setErrorMessage(CharSequence);
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java b/car/app/app/src/main/aidl/androidx/car/app/model/IInputCallback.aidl
similarity index 63%
copy from camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
copy to car/app/app/src/main/aidl/androidx/car/app/model/IInputCallback.aidl
index bfc1884..a21c1b7 100644
--- a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
+++ b/car/app/app/src/main/aidl/androidx/car/app/model/IInputCallback.aidl
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+package androidx.car.app.model;
 
-import static org.junit.Assert.assertNotNull;
+import androidx.car.app.IOnDoneCallback;
 
-import org.junit.Test;
-
-public class VersionNameTest {
-    @Test
-    public void testCurrentVersion_shouldNotEmpty() {
-        assertNotNull(VersionName.getCurrentVersion().getVersion());
-    }
+/** @hide */
+oneway interface IInputCallback {
+  void onInputTextChanged(String text, IOnDoneCallback callback) = 1;
+  void onInputSubmitted(String text, IOnDoneCallback callback) = 2;
 }
diff --git a/car/app/app/src/main/java/androidx/car/app/CarContext.java b/car/app/app/src/main/java/androidx/car/app/CarContext.java
index 092fdee..3e97f76 100644
--- a/car/app/app/src/main/java/androidx/car/app/CarContext.java
+++ b/car/app/app/src/main/java/androidx/car/app/CarContext.java
@@ -186,6 +186,9 @@
      *   <dd>A {@link ScreenManager} for management of {@link Screen}s.
      * </dl>
      *
+     * <p><b>This method should not be called until the {@link Lifecycle.State} of the context's
+     * {@link Session} is at least {@link Lifecycle.State#CREATED}</b>.
+     *
      * @param name The name of the car service requested. This should be one of
      *             {@link #APP_SERVICE},
      *             {@link #NAVIGATION_SERVICE} or {@link #SCREEN_SERVICE}
@@ -218,6 +221,9 @@
      * <p>Currently supported classes are: {@link AppManager}, {@link NavigationManager}, {@link
      * ScreenManager}.
      *
+     * <p><b>This method should not be called until the {@link Lifecycle.State} of the context's
+     * {@link Session} is at least {@link Lifecycle.State#CREATED}</b>.
+     *
      * @param serviceClass the class of the requested service
      * @throws IllegalArgumentException if {@code serviceClass} is not the class of a supported car
      *                                  service
@@ -231,6 +237,9 @@
     /**
      * Gets the name of the car service that is represented by the specified class.
      *
+     * <p><b>This method should not be called until the {@link Lifecycle.State} of the context's
+     * {@link Session} is at least {@link Lifecycle.State#CREATED}</b>.
+     *
      * @param serviceClass the class of the requested service
      * @return the car service name to use with {@link #getCarService(String)}
      * @throws IllegalArgumentException if {@code serviceClass} is not the class of a supported car
@@ -281,6 +290,9 @@
      *       method will throw a {@link SecurityException}.
      * </dl>
      *
+     * <p><b>This method should not be called until the {@link Lifecycle.State} of the context's
+     * {@link Session} is at least {@link Lifecycle.State#CREATED}</b>.
+     *
      * @param intent the {@link Intent} to send to the target application
      * @throws SecurityException         if the app attempts to start a different app explicitly or
      *                                   does not have permissions for the requested action
@@ -348,6 +360,9 @@
      * to this {@link CarContext} will become {@code State.DESTROYED}.
      *
      * <p>At some point after this call, the OS will destroy your {@link CarAppService}.
+     *
+     * <p><b>This method should not be called until the {@link Lifecycle.State} of the context's
+     * {@link Session} is at least {@link Lifecycle.State#CREATED}</b>.
      */
     public void finishCarApp() {
         mHostDispatcher.dispatch(
@@ -367,6 +382,9 @@
      *
      * <p>Whenever the dark mode status changes, you will receive a call to {@link
      * Session#onCarConfigurationChanged}.
+     *
+     * <p><b>This method should not be called until the {@link Lifecycle.State} of the context's
+     * {@link Session} is at least {@link Lifecycle.State#CREATED}</b>.
      */
     public boolean isDarkMode() {
         return (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK)
@@ -410,9 +428,12 @@
      * <p>Clients must ensure no elements annotated with a {@link RequiresCarApi} value higher
      * than returned by this method is used at runtime.
      *
-     * <p>Please refer to {@link RequiresCarApi} description for more details on how to
+     * <p>Refer to {@link RequiresCarApi} description for more details on how to
      * implement forward compatibility.
      *
+     * <p><b>This method should not be called until the {@link Lifecycle.State} of the context's
+     * {@link Session} is at least {@link Lifecycle.State#CREATED}</b>.
+     *
      * @return a value between {@link AppInfo#getMinCarAppApiLevel()} and
      * {@link AppInfo#getLatestCarAppApiLevel()}. In case of incompatibility, the host will
      * disconnect from the service before completing the handshake
diff --git a/car/app/app/src/main/java/androidx/car/app/Screen.java b/car/app/app/src/main/java/androidx/car/app/Screen.java
index 9066d570..ff0eb57 100644
--- a/car/app/app/src/main/java/androidx/car/app/Screen.java
+++ b/car/app/app/src/main/java/androidx/car/app/Screen.java
@@ -244,12 +244,13 @@
      *   <li>{@link androidx.car.app.model.MessageTemplate}
      * </ul>
      *
-     * If the 5 template quota is exhausted and the app attempts to send a new template, the host
-     * will display an error message to the user. Note that this limit applies to the number of
-     * templates, and not the number of screen instances in the stack. For example, if while in
-     * screen A an app sends 2 templates, and then pushes screen B, it can now send 3 more
-     * templates. Alternatively, if each screen is structured to send a single template, then the
-     * app can push 5 {@link Screen} instances onto the {@link ScreenManager} stack.
+     * <p><b>If the 5 template quota is exhausted and the app attempts to send a new template, the
+     * host will display an error message to the user before closing the app.</b> Note that this
+     * limit applies to the number of templates, and not the number of screen instances in the
+     * stack. For example, if while in screen A an app sends 2 templates, and then pushes screen
+     * B, it can now send 3 more templates. Alternatively, if each screen is structured to send a
+     * single template, then the app can push 5 {@link Screen} instances onto the
+     * {@link ScreenManager} stack.
      *
      * <p>There are special cases to these restrictions: template refreshes, back and reset
      * operations.
diff --git a/car/app/app/src/main/java/androidx/car/app/Session.java b/car/app/app/src/main/java/androidx/car/app/Session.java
index 2d3aafd..0138f4d 100644
--- a/car/app/app/src/main/java/androidx/car/app/Session.java
+++ b/car/app/app/src/main/java/androidx/car/app/Session.java
@@ -176,7 +176,9 @@
      * Returns the {@link CarContext} for this session.
      *
      * <p><b>The {@link CarContext} is not fully initialized until this session's {@link
-     * Lifecycle.State} is at least {@link Lifecycle.State#CREATED}</b>
+     * Lifecycle.State} is at least {@link Lifecycle.State#CREATED}</b>. Some instance methods
+     * should not be called before this state has been reached. See the documentation in
+     * {@link CarContext} for details on any such restrictions.
      *
      * @see #getLifecycle
      */
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Action.java b/car/app/app/src/main/java/androidx/car/app/model/Action.java
index b5d4768..61d38ec 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Action.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Action.java
@@ -340,9 +340,10 @@
          *
          * <h4>Icon Sizing Guidance</h4>
          *
-         * The provided icon should have a maximum size of 36 x 36 dp. If the icon exceeds this
-         * maximum size in either one of the dimensions, it will be scaled down to be centered
-         * inside the bounding box while preserving the aspect ratio.
+         * To minimize scaling artifacts across a wide range of car screens, apps should provide
+         * icons targeting a 88 x 88 dp bounding box. If the icon exceeds this maximum size in
+         * either one of the dimensions, it will be scaled down to be centered inside the
+         * bounding box while preserving its aspect ratio.
          *
          * <p>See {@link CarIcon} for more details related to providing icon and image resources
          * that work with different car screen pixel densities.
@@ -378,9 +379,10 @@
          *
          * <h4>Requirements</h4>
          *
-         * <p>The host may ignore this color and use the default instead if the color does not
-         * pass the contrast requirements. See the documentation on where the {@link Action} is
-         * added for more details on any other restriction(s) that might apply.
+         * <p>Depending on contrast requirements, capabilities of the vehicle screens, or other
+         * factors, the color may be ignored by the host or overridden by the vehicle system. See
+         * the documentation on where the {@link Action} is added for more details on any other
+         * restriction(s) that might apply.
          *
          * @param backgroundColor the {@link CarColor} to set as background. Use {@link
          *                        CarColor#DEFAULT} to let the host pick a default
diff --git a/car/app/app/src/main/java/androidx/car/app/model/CarIcon.java b/car/app/app/src/main/java/androidx/car/app/model/CarIcon.java
index 39f1055..1003326 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/CarIcon.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/CarIcon.java
@@ -48,14 +48,12 @@
  *
  * <h4>Car Screen Pixel Densities</h4>
  *
- * <p>Similar to Android devices, car screens cover a wide range of pixel densities. To ensure that
- * icons and images render well across all car screens, use vector assets whenever possible to avoid
- * scaling issues. If you use a bitmap instead, ensure that you have resources that address multiple
- * pixel density buckets.
- *
- * <p>In order to support all car screen sizes and pixel density, you can use configuration
- * qualifiers in your resource files (e.g. "mdpi", "hdpi", etc). See
- * {@link androidx.car.app.CarContext} for more details.
+ * <p>Similar to Android devices, car screens cover a wide range of sizes and densities. To
+ * ensure that icons and images render well across all car screens, use vector assets whenever
+ * possible to avoid scaling issues. If your app relies on bitmaps or other non-vector
+ * assets, you should ensure that you have resources that address multiple size and  pixel density
+ * buckets using configuration qualifiers in your resource folders (e.g. "large", "xlarge", "mdpi",
+ * "hdpi", etc). See {@link androidx.car.app.CarContext} for more details.
  *
  * <h4>Themed Drawables</h4>
  *
@@ -353,13 +351,14 @@
          * Sets the tint of the icon to the given {@link CarColor}.
          *
          * <p>This tint overrides the tint set through {@link IconCompat#setTint(int)} in the
-         * backing {@link IconCompat} with a {@link CarColor} tint.The tint set through {@link
+         * backing {@link IconCompat} with a {@link CarColor} tint. The tint set through {@link
          * IconCompat#setTint(int)} is not guaranteed to be applied if the {@link CarIcon} tint
          * is not set.
          *
          * <p>The tint mode used to blend this color is {@link Mode#SRC_IN}.
          *
-         * <p>By default, no tint is set unless one is specified with this method.
+         * <p>Depending on contrast requirements, capabilities of the vehicle screens, or other
+         *  factors, the color may be ignored by the host or overridden by the vehicle system.
          *
          * @throws NullPointerException if {@code tin} is {@code null}
          * @see CarColor
diff --git a/car/app/app/src/main/java/androidx/car/app/model/ForegroundCarColorSpan.java b/car/app/app/src/main/java/androidx/car/app/model/ForegroundCarColorSpan.java
index 906ff32..b33a565 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/ForegroundCarColorSpan.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/ForegroundCarColorSpan.java
@@ -41,8 +41,9 @@
  *
  * <p>The host may ignore the color specified in the {@link ForegroundCarColorSpan} and instead use
  * a default color unless support for {@link ForegroundCarColorSpan} is explicitly documented in the
- * API that takes the string. The host may use a default color if the color in the span does not
- * pass the contrast requirements.
+ * API that takes the string. Depending on contrast requirements, capabilities of the vehicle
+ * screens, or other factors, the color may also be ignored by the host or overridden by the
+ * vehicle system.
  *
  * @see CarColor
  * @see ForegroundColorSpan
diff --git a/car/app/app/src/main/java/androidx/car/app/model/GridItem.java b/car/app/app/src/main/java/androidx/car/app/model/GridItem.java
index edb7b7a..9e191cd 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/GridItem.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/GridItem.java
@@ -55,8 +55,9 @@
     /**
      * Represents an icon to be displayed in the grid item.
      *
-     * <p>If necessary, icons will be scaled down to fit within a 64 x 64 dp bounding box,
-     * preserving their aspect ratios.
+     * <p>To minimize scaling artifacts across a wide range of car screens, apps should provide
+     * icons targeting a 128 x 128 dp bounding box. If necessary, the icon will be scaled down while
+     * preserving its aspect ratio.
      *
      * <p>A tint color is expected to be provided via {@link CarIcon.Builder#setTint}. Otherwise, a
      * default tint color as determined by the host will be applied.
@@ -66,8 +67,9 @@
     /**
      * Represents a large image to be displayed in the grid item.
      *
-     * <p>If necessary, these images will be scaled down to fit within a 64 x 64 dp bounding box,
-     * preserving their aspect ratio.
+     * <p>To minimize scaling artifacts across a wide range of car screens, apps should provide
+     * images targeting a 128 x 128 dp bounding box. If necessary, the image will be scaled down
+     * while preserving its aspect ratio.
      */
     public static final int IMAGE_TYPE_LARGE = (1 << 1);
 
@@ -323,7 +325,7 @@
          *
          * <p>If the input image's size exceeds the sizing requirements for the given image type in
          * either one of the dimensions, it will be scaled down to be centered inside the
-         * bounding box while preserving the aspect ratio.
+         * bounding box while preserving its aspect ratio.
          *
          * <p>See {@link CarIcon} for more details related to providing icon and image resources
          * that work with different car screen pixel densities.
diff --git a/car/app/app/src/main/java/androidx/car/app/model/InputCallback.java b/car/app/app/src/main/java/androidx/car/app/model/InputCallback.java
new file mode 100644
index 0000000..ca1ac38
--- /dev/null
+++ b/car/app/app/src/main/java/androidx/car/app/model/InputCallback.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.car.app.model;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.annotations.RequiresCarApi;
+
+/** A listener for handling text input completion event. */
+@RequiresCarApi(2)
+public interface InputCallback {
+    /**
+     * Notifies when the user finished entering text in an input box.
+     *
+     * <p>This event is sent when the user finishes typing in the keyboard and pressed enter.
+     * If the user simply stops typing and closes the keyboard, this event will not be sent.
+     *
+     * @param text the text that was entered, or an empty string if no text was typed.
+     */
+    void onInputSubmitted(@NonNull String text);
+
+    /**
+     * Notifies the current {@code text} has changed in an input box.
+     *
+     * <p>The host may invoke this callback as the user types an input text. The frequency of
+     * these updates is not guaranteed to be after every individual keystroke. The host may
+     * decide to wait for several keystrokes before sending a single update.
+     *
+     * @param text the current text that the user has typed
+     */
+    void onInputTextChanged(@NonNull String text);
+}
diff --git a/car/app/app/src/main/java/androidx/car/app/model/InputCallbackDelegate.java b/car/app/app/src/main/java/androidx/car/app/model/InputCallbackDelegate.java
new file mode 100644
index 0000000..f98eeb4
--- /dev/null
+++ b/car/app/app/src/main/java/androidx/car/app/model/InputCallbackDelegate.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.car.app.model;
+
+import android.annotation.SuppressLint;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.OnDoneCallback;
+import androidx.car.app.annotations.RequiresCarApi;
+
+/**
+ * A host-side interface for reporting text input events to clients.
+ */
+@RequiresCarApi(2)
+public interface InputCallbackDelegate {
+    /**
+     * Notifies that the user has submitted the text.
+     *
+     * @param value    the text entered
+     * @param callback the {@link OnDoneCallback} to trigger when the client finishes handling
+     *                 the event
+     */
+    // This mirrors the AIDL class and is not supposed to support an executor as an input.
+    @SuppressLint("ExecutorRegistration")
+    void sendInputSubmitted(@NonNull String value, @NonNull OnDoneCallback callback);
+
+    /**
+     * Notifies that user input text has changed.
+     *
+     * @param value    the text entered
+     * @param callback the {@link OnDoneCallback} to trigger when the client finishes handling
+     *                 the event
+     */
+    // This mirrors the AIDL class and is not supposed to support an executor as an input.
+    @SuppressLint("ExecutorRegistration")
+    void sendInputTextChanged(@NonNull String value, @NonNull OnDoneCallback callback);
+}
diff --git a/car/app/app/src/main/java/androidx/car/app/model/InputCallbackDelegateImpl.java b/car/app/app/src/main/java/androidx/car/app/model/InputCallbackDelegateImpl.java
new file mode 100644
index 0000000..e44cfa5
--- /dev/null
+++ b/car/app/app/src/main/java/androidx/car/app/model/InputCallbackDelegateImpl.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.car.app.model;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+
+import static java.util.Objects.requireNonNull;
+
+import android.annotation.SuppressLint;
+import android.os.RemoteException;
+
+import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.car.app.IOnDoneCallback;
+import androidx.car.app.OnDoneCallback;
+import androidx.car.app.utils.RemoteUtils;
+
+/**
+ * Implementation class for {@link InputCallbackDelegate} to allow IPC for text-input-related
+ * events.
+ *
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public class InputCallbackDelegateImpl implements InputCallbackDelegate {
+    @Keep
+    @Nullable
+    private final IInputCallback mCallback;
+
+    @Override
+    public void sendInputSubmitted(@NonNull String text, @NonNull OnDoneCallback callback) {
+        try {
+            requireNonNull(mCallback).onInputSubmitted(text,
+                    RemoteUtils.createOnDoneCallbackStub(callback));
+        } catch (RemoteException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void sendInputTextChanged(@NonNull String text, @NonNull OnDoneCallback callback) {
+        try {
+            requireNonNull(mCallback).onInputTextChanged(text,
+                    RemoteUtils.createOnDoneCallbackStub(callback));
+        } catch (RemoteException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /** Creates an instance of {@link InputCallbackDelegate}. */
+    // This mirrors the AIDL class and is not supposed to support an executor as an input.
+    @SuppressLint("ExecutorRegistration")
+    @NonNull
+    public static InputCallbackDelegate create(@NonNull InputCallback callback) {
+        return new InputCallbackDelegateImpl(requireNonNull(callback));
+    }
+
+    private InputCallbackDelegateImpl(@NonNull InputCallback callback) {
+        mCallback = new OnInputCallbackStub(callback);
+    }
+
+    /** For serialization. */
+    private InputCallbackDelegateImpl() {
+        mCallback = null;
+    }
+
+    @Keep // We need to keep these stub for Bundler serialization logic.
+    private static class OnInputCallbackStub extends IInputCallback.Stub {
+        private final InputCallback mCallback;
+
+        OnInputCallbackStub(InputCallback callback) {
+            mCallback = callback;
+        }
+
+        @Override
+        public void onInputSubmitted(String value, IOnDoneCallback callback) {
+            RemoteUtils.dispatchCallFromHost(callback, "onInputSubmitted",
+                    () -> {
+                        mCallback.onInputSubmitted(value);
+                        return null;
+
+                    });
+        }
+
+        @Override
+        public void onInputTextChanged(String value, IOnDoneCallback callback) {
+            RemoteUtils.dispatchCallFromHost(callback, "onInputTextChanged",
+                    () -> {
+                        mCallback.onInputTextChanged(value);
+                        return null;
+
+                    });
+        }
+    }
+}
diff --git a/car/app/app/src/main/java/androidx/car/app/model/LongMessageTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/LongMessageTemplate.java
index 371815b..7c0498a 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/LongMessageTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/LongMessageTemplate.java
@@ -16,6 +16,7 @@
 
 package androidx.car.app.model;
 
+import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_BODY;
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_HEADER;
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_SIMPLE;
 
@@ -232,13 +233,13 @@
         /**
          * Adds an {@link Action} to display along with the message.
          *
-         * <p>The action's title color can be customized with {@link ForegroundCarColorSpan}
-         * instances, any other spans will be ignored by the host.
-         *
          * <h4>Requirements</h4>
          *
-         * The action must use a {@link androidx.car.app.model.ParkedOnlyOnClickListener}, and any
-         * actions above the maximum limit of 2 will be ignored.
+         * This template allows up to 2 {@link Action}s in its body, and they must use a
+         * {@link androidx.car.app.model.ParkedOnlyOnClickListener}.
+         *
+         * <p>Each action's title color can be customized with {@link ForegroundCarColorSpan}
+         * instances, any other spans will be ignored by the host.
          *
          * @throws IllegalArgumentException if {@code action} does not meet the requirements
          * @throws NullPointerException     if {@code action} is {@code null}
@@ -252,6 +253,7 @@
             }
 
             mActionList.add(action);
+            ACTIONS_CONSTRAINTS_BODY.validateOrThrow(mActionList);
             return this;
         }
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/MessageTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/MessageTemplate.java
index 6744ce4..0434b6e 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/MessageTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/MessageTemplate.java
@@ -16,7 +16,9 @@
 
 package androidx.car.app.model;
 
+import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_BODY;
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_HEADER;
+import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_SIMPLE;
 
 import static java.util.Objects.hash;
 import static java.util.Objects.requireNonNull;
@@ -27,6 +29,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.constraints.CarIconConstraints;
 import androidx.car.app.utils.CollectionUtils;
 
@@ -47,6 +50,8 @@
 @CarProtocol
 public final class MessageTemplate implements Template {
     @Keep
+    private final boolean mIsLoading;
+    @Keep
     @Nullable
     private final CarText mTitle;
     @Keep
@@ -63,6 +68,19 @@
     private final Action mHeaderAction;
     @Keep
     private final List<Action> mActionList;
+    @Keep
+    @Nullable
+    private final ActionStrip mActionStrip;
+
+    /**
+     * Returns whether the template is loading.
+     *
+     * @see Builder#setLoading(boolean)
+     */
+    @RequiresCarApi(2)
+    public boolean isLoading() {
+        return mIsLoading;
+    }
 
     /**
      * Returns the title of the template or {@code null} if not set.
@@ -86,6 +104,17 @@
     }
 
     /**
+     * Returns the {@link ActionStrip} for this template or {@code null} if not set.
+     *
+     * @see Builder#setActionStrip(ActionStrip)
+     */
+    @RequiresCarApi(2)
+    @Nullable
+    public ActionStrip getActionStrip() {
+        return mActionStrip;
+    }
+
+    /**
      * Returns the message to display in the template.
      *
      * @see Builder#Builder(CharSequence)
@@ -95,7 +124,6 @@
         return requireNonNull(mMessage);
     }
 
-
     /**
      * Returns a debug message to display in the template or {@code null} if not set.
      *
@@ -135,7 +163,8 @@
 
     @Override
     public int hashCode() {
-        return hash(mTitle, mMessage, mDebugMessage, mHeaderAction, mActionList, mIcon);
+        return hash(mIsLoading, mTitle, mMessage, mDebugMessage, mHeaderAction, mActionList, mIcon,
+                mActionStrip);
     }
 
     @Override
@@ -148,35 +177,42 @@
         }
         MessageTemplate otherTemplate = (MessageTemplate) other;
 
-        return Objects.equals(mTitle, otherTemplate.mTitle)
+        return mIsLoading == otherTemplate.mIsLoading
+                && Objects.equals(mTitle, otherTemplate.mTitle)
                 && Objects.equals(mMessage, otherTemplate.mMessage)
                 && Objects.equals(mDebugMessage, otherTemplate.mDebugMessage)
                 && Objects.equals(mHeaderAction, otherTemplate.mHeaderAction)
                 && Objects.equals(mActionList, otherTemplate.mActionList)
-                && Objects.equals(mIcon, otherTemplate.mIcon);
+                && Objects.equals(mIcon, otherTemplate.mIcon)
+                && Objects.equals(mActionStrip, otherTemplate.mActionStrip);
     }
 
     MessageTemplate(Builder builder) {
+        mIsLoading = builder.mIsLoading;
         mTitle = builder.mTitle;
         mMessage = builder.mMessage;
         mDebugMessage = builder.mDebugMessage;
         mIcon = builder.mIcon;
         mHeaderAction = builder.mHeaderAction;
+        mActionStrip = builder.mActionStrip;
         mActionList = CollectionUtils.unmodifiableCopy(builder.mActionList);
     }
 
     /** Constructs an empty instance, used by serialization code. */
     private MessageTemplate() {
+        mIsLoading = false;
         mTitle = null;
         mMessage = null;
         mDebugMessage = null;
         mIcon = null;
         mHeaderAction = null;
+        mActionStrip = null;
         mActionList = Collections.emptyList();
     }
 
     /** A builder of {@link MessageTemplate}. */
     public static final class Builder {
+        boolean mIsLoading;
         @Nullable
         CarText mTitle;
         CarText mMessage;
@@ -186,6 +222,8 @@
         CarIcon mIcon;
         @Nullable
         Action mHeaderAction;
+        @Nullable
+        ActionStrip mActionStrip;
         List<Action> mActionList = new ArrayList<>();
         @Nullable
         Throwable mDebugCause;
@@ -193,6 +231,21 @@
         String mDebugString;
 
         /**
+         * Sets whether the template is in a loading state.
+         *
+         * <p>If set to {@code true}, the UI shows a loading indicator where the icon
+         * would be otherwise. The caller is expected to call
+         * {@link androidx.car.app.Screen#invalidate()} and send the new template content to the
+         * host once the data is ready.
+         */
+        @RequiresCarApi(2)
+        @NonNull
+        public Builder setLoading(boolean isLoading) {
+            mIsLoading = isLoading;
+            return this;
+        }
+
+        /**
          * Sets the title of the template.
          *
          * <p>Unless set with this method, the template will not have a title.
@@ -251,9 +304,10 @@
          *
          * <h4>Icon Sizing Guidance</h4>
          *
-         * The provided icon should have a maximum size of 64 x 64 dp. If the icon exceeds this
-         * maximum size in either one of the dimensions, it will be scaled down and centered
-         * inside the bounding box while preserving the aspect ratio.
+         * To minimize scaling artifacts across a wide range of car screens, apps should provide
+         * icons targeting a 128 x 128 dp bounding box. If the icon exceeds this maximum size in
+         * either one of the dimensions, it will be scaled down to be centered inside the
+         * bounding box while preserving its aspect ratio.
          *
          * <p>See {@link CarIcon} for more details related to providing icon and image resources
          * that work with different car screen pixel densities.
@@ -290,19 +344,44 @@
         }
 
         /**
+         * Sets the {@link ActionStrip} for this template or {@code null} to not display an {@link
+         * ActionStrip}.
+         *
+         * <p>Unless set with this method, the template will not have an action strip.
+         *
+         * <h4>Requirements</h4>
+         *
+         * This template allows up to 2 {@link Action}s in its {@link ActionStrip}. Of the 2 allowed
+         * {@link Action}s, one of them can contain a title as set via
+         * {@link Action.Builder#setTitle}. Otherwise, only {@link Action}s with icons are allowed.
+         *
+         * @throws IllegalArgumentException if {@code actionStrip} does not meet the requirements
+         * @throws NullPointerException     if {@code actionStrip} is {@code null}
+         */
+        @RequiresCarApi(2)
+        @NonNull
+        public Builder setActionStrip(@NonNull ActionStrip actionStrip) {
+            ACTIONS_CONSTRAINTS_SIMPLE.validateOrThrow(requireNonNull(actionStrip).getActions());
+            mActionStrip = actionStrip;
+            return this;
+        }
+
+        /**
          * Adds an {@link Action} to display along with the message.
          *
-         * <p>The action's title color can be customized with {@link ForegroundCarColorSpan}
-         * instances, any other spans will be ignored by the host.
+         * <h4>Requirements</h4>
          *
-         * <p>Any actions above the maximum limit of 2 will be ignored.
+         * This template allows up to 2 {@link Action}s in its body. The action's title color can
+         * be customized with {@link ForegroundCarColorSpan} instances, any other spans will be
+         * ignored by the host.
          *
-         * @throws NullPointerException if {@code action} is {@code null}
+         * @throws NullPointerException     if {@code action} is {@code null}
+         * @throws IllegalArgumentException if {@code action} does not meet the requirements
          */
         @NonNull
         public Builder addAction(@NonNull Action action) {
-            requireNonNull(action);
-            mActionList.add(action);
+            mActionList.add(requireNonNull(action));
+            ACTIONS_CONSTRAINTS_BODY.validateOrThrow(mActionList);
             return this;
         }
 
@@ -315,11 +394,16 @@
          *
          * <p>Either a header {@link Action} or title must be set on the template.
          *
-         * @throws IllegalStateException if the message is empty, or if the template does not have
-         *                               either a title or header {@link Action} set
+         * @throws IllegalStateException if the message is empty, if the template does not have
+         *                               either a title or header {@link Action} set, or if the
+         *                               template is in loading state and an icon is specified.
          */
         @NonNull
         public MessageTemplate build() {
+            if (mIsLoading && mIcon != null) {
+                throw new IllegalStateException(
+                        "Template in a loading state can not have an icon");
+            }
             if (mMessage.isEmpty()) {
                 throw new IllegalStateException("Message cannot be empty");
             }
diff --git a/car/app/app/src/main/java/androidx/car/app/model/PlaceMarker.java b/car/app/app/src/main/java/androidx/car/app/model/PlaceMarker.java
index 5e4b9a2..30ea12b 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/PlaceMarker.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/PlaceMarker.java
@@ -50,14 +50,21 @@
     /**
      * Represents a marker icon.
      *
-     * <p>Icons always have a tint applied to them.
+     * <p>To minimize scaling artifacts across a wide range of car screens, apps should provide
+     * images targeting a 64 x 64 dp bounding box. If necessary, the icon will be scaled down while
+     * preserving its aspect ratio.
+     *
+     * <p>A tint color is expected to be provided via {@link CarIcon.Builder#setTint}. Otherwise, a
+     * default tint color as determined by the host will be applied.
      */
     public static final int TYPE_ICON = 0;
 
     /**
      * Represents a marker image.
      *
-     * <p>No background will be applied.
+     * <p>To minimize scaling artifacts across a wide range of car screens, apps should provide
+     * images targeting a 72 x 72 dp bounding box. If necessary, the icon will be scaled down while
+     * preserving its aspect ratio.
      */
     public static final int TYPE_IMAGE = 1;
 
@@ -180,18 +187,9 @@
          *
          * <h4>Icon Sizing Guidance</h4>
          *
-         * <ul>
-         *   <li>For {@link #TYPE_IMAGE}, the provided image should be 36 x 36 dp. The host
-         *       applies 4 dp rounded corners before the icon is rendered on either the map or
-         *       the list.
-         *   <li>For {@link #TYPE_ICON}, the provided icon should be 32 x 32 dp and have its tint
-         *       value set via {@link CarIcon.Builder#setTint}. Otherwise, a default tint color as
-         *       determined by the host will be applied.
-         * </ul>
-         *
-         * <p>If the size of the provided icon exceeds the size requirements described above in
-         * either one of the dimensions, it will be scaled down and centered inside the bounding
-         * box while preserving the aspect ratio.
+         * If the input icon's size exceeds the sizing requirements for the given icon type in
+         * either one of the dimensions, it will be scaled down to be centered inside the
+         * bounding box while preserving its aspect ratio.
          *
          * <p>See {@link CarIcon} for more details related to providing icon and image resources
          * that work with different car screen pixel densities.
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Row.java b/car/app/app/src/main/java/androidx/car/app/model/Row.java
index 50b944d..5040901 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Row.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Row.java
@@ -63,24 +63,27 @@
     /**
      * Represents a small image to be displayed in the row.
      *
-     * <p>If necessary, small images will be scaled down to fit within a 36 x 36 dp bounding box,
-     * preserving their aspect ratio.
+     * <p>To minimize scaling artifacts across a wide range of car screens, apps should provide
+     * images targeting a 88 x 88 dp bounding box. If necessary, the image will be scaled down while
+     * preserving its aspect ratio.
      */
     public static final int IMAGE_TYPE_SMALL = (1 << 0);
 
     /**
      * Represents a large image to be displayed in the row.
      *
-     * <p>If necessary, large images will be scaled down to fit within a 64 x 64 dp bounding box,
-     * preserving their aspect ratio.
+     * <p>To minimize scaling artifacts across a wide range of car screens, apps should provide
+     * images targeting a 224 x 224 dp bounding box. If necessary, the image will be scaled down
+     * while preserving its aspect ratio.
      */
     public static final int IMAGE_TYPE_LARGE = (1 << 1);
 
     /**
      * Represents a small image to be displayed in the row.
      *
-     * <p>If necessary, icons will be scaled down to fit within a 44 x 44 dp bounding box,
-     * preserving their aspect ratios.
+     * <p>To minimize scaling artifacts across a wide range of car screens, apps should provide
+     * images targeting a 88 x 88 dp bounding box. If necessary, the icon will be scaled down while
+     * preserving its aspect ratio.
      *
      * <p>A tint color is expected to be provided via {@link CarIcon.Builder#setTint}. Otherwise, a
      * default tint color as determined by the host will be applied.
@@ -434,7 +437,7 @@
          *
          * <p>If the input image's size exceeds the sizing requirements for the given image type in
          * either one of the dimensions, it will be scaled down to be centered inside the
-         * bounding box while preserving the aspect ratio.
+         * bounding box while preserving its aspect ratio.
          *
          * <p>See {@link CarIcon} for more details related to providing icon and image resources
          * that work with different car screen pixel densities.
diff --git a/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java
index 5d0ac3a..dd7c21a 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java
@@ -49,7 +49,7 @@
     /** A listener for search updates. */
     public interface SearchCallback {
         /**
-         * Notifies the current {@code searchText}.
+         * Notifies the current {@code searchText} has changed.
          *
          * <p>The host may invoke this callback as the user types a search text. The frequency of
          * these updates is not guaranteed to be after every individual keystroke. The host may
diff --git a/car/app/app/src/main/java/androidx/car/app/model/constraints/ActionsConstraints.java b/car/app/app/src/main/java/androidx/car/app/model/constraints/ActionsConstraints.java
index af5bde5..3350af3 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/constraints/ActionsConstraints.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/constraints/ActionsConstraints.java
@@ -47,6 +47,14 @@
             new ActionsConstraints.Builder().setMaxActions(2).build();
 
     /**
+     * Constraints for actions within the template body.
+     */
+    @NonNull
+    public static final ActionsConstraints ACTIONS_CONSTRAINTS_BODY =
+            new ActionsConstraints.Builder(ACTIONS_CONSTRAINTS_CONSERVATIVE)
+                    .setMaxCustomTitles(2).build();
+
+    /**
      * Constraints for template headers, where only the special-purpose back and app-icon standard
      * actions are allowed.
      */
diff --git a/car/app/app/src/main/java/androidx/car/app/model/signin/InputSignInMethod.java b/car/app/app/src/main/java/androidx/car/app/model/signin/InputSignInMethod.java
index de7a464..666947a 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/signin/InputSignInMethod.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/signin/InputSignInMethod.java
@@ -30,6 +30,9 @@
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.CarText;
+import androidx.car.app.model.InputCallback;
+import androidx.car.app.model.InputCallbackDelegate;
+import androidx.car.app.model.InputCallbackDelegateImpl;
 import androidx.car.app.model.OnInputCompletedDelegate;
 import androidx.car.app.model.OnInputCompletedDelegateImpl;
 import androidx.car.app.model.OnInputCompletedListener;
@@ -126,6 +129,8 @@
     @Keep
     @Nullable
     private final OnInputCompletedDelegate mOnInputCompletedDelegate;
+    @Nullable
+    private final InputCallbackDelegate mInputCallbackDelegate;
     @Keep
     private final boolean mShowKeyboardByDefault;
 
@@ -194,6 +199,16 @@
     }
 
     /**
+     * Returns the {@link InputCallbackDelegate} for input callbacks.
+     *
+     * @see Builder#Builder(InputCallback)
+     */
+    @NonNull
+    public InputCallbackDelegate getInputCallbackDelegate() {
+        return requireNonNull(mInputCallbackDelegate);
+    }
+
+    /**
      * Returns whether to show the keyboard by default or not.
      *
      * @see Builder#setShowKeyboardByDefault
@@ -240,6 +255,7 @@
         mErrorMessage = builder.mErrorMessage;
         mKeyboardType = builder.mKeyboardType;
         mOnInputCompletedDelegate = builder.mOnInputCompletedDelegate;
+        mInputCallbackDelegate = builder.mInputCallbackDelegate;
         mShowKeyboardByDefault = builder.mShowKeyboardByDefault;
     }
 
@@ -251,12 +267,14 @@
         mErrorMessage = null;
         mKeyboardType = KEYBOARD_DEFAULT;
         mOnInputCompletedDelegate = null;
+        mInputCallbackDelegate = null;
         mShowKeyboardByDefault = false;
     }
 
     /** A builder of {@link InputSignInMethod}. */
     public static final class Builder {
-        final OnInputCompletedDelegate mOnInputCompletedDelegate;
+        @Nullable final OnInputCompletedDelegate mOnInputCompletedDelegate;
+        @Nullable final InputCallbackDelegate mInputCallbackDelegate;
         @Nullable
         CarText mHint;
         @Nullable
@@ -385,10 +403,27 @@
          */
         @SuppressLint("ExecutorRegistration")
         public Builder(@NonNull OnInputCompletedListener listener) {
+            mInputCallbackDelegate = null;
             mOnInputCompletedDelegate = OnInputCompletedDelegateImpl.create(
                     requireNonNull(listener));
         }
 
+        /**
+         * Returns an {@link InputSignInMethod.Builder} instance.
+         *
+         * <p>Note that the listener relates to UI events and will be executed on the main thread
+         * using {@link Looper#getMainLooper()}.
+         *
+         * @param listener the {@link InputCallbackDelegate} to be notified of input events
+         * @throws NullPointerException if {@code listener} is {@code null}
+         */
+        @SuppressLint("ExecutorRegistration")
+        public Builder(@NonNull InputCallback listener) {
+            mOnInputCompletedDelegate = null;
+            mInputCallbackDelegate = InputCallbackDelegateImpl.create(
+                    requireNonNull(listener));
+        }
+
         @KeyboardType
         private static int validateKeyboardType(@KeyboardType int keyboardType) {
             if (keyboardType != KEYBOARD_DEFAULT && keyboardType != KEYBOARD_EMAIL
diff --git a/car/app/app/src/main/java/androidx/car/app/model/signin/SignInTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/signin/SignInTemplate.java
index ea6221e..4ea50c7 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/signin/SignInTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/signin/SignInTemplate.java
@@ -16,6 +16,7 @@
 
 package androidx.car.app.model.signin;
 
+import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_BODY;
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_HEADER;
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_SIMPLE;
 
@@ -300,15 +301,16 @@
         /**
          * Adds an {@link Action} to display alongside the sign-in content.
          *
-         * <p>By default, no actions are displayed.
-         *
          * <p>The action's title color can be customized with {@link ForegroundCarColorSpan}
          * instances, any other spans will be ignored by the host.
          *
          * <h4>Requirements</h4>
          *
-         * The action must use a {@link androidx.car.app.model.ParkedOnlyOnClickListener}, and any
-         * actions above the maximum limit of 2 will be ignored.
+         * This template allows up to 2 {@link Action}s in its body, and they must use a
+         * {@link androidx.car.app.model.ParkedOnlyOnClickListener}.
+         *
+         * <p>Each action's title color can be customized with {@link ForegroundCarColorSpan}
+         * instances, any other spans will be ignored by the host.
          *
          * @throws NullPointerException  if {@code action} is {@code null}
          * @throws IllegalArgumentException if {@code action} does not meet the requirements
@@ -322,6 +324,7 @@
             }
 
             mActionList.add(action);
+            ACTIONS_CONSTRAINTS_BODY.validateOrThrow(mActionList);
             return this;
         }
 
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/Destination.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/Destination.java
index 8c18dfa..f6a9642 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/Destination.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/Destination.java
@@ -159,9 +159,9 @@
          *
          * <h4>Image Sizing Guidance</h4>
          *
-         * The provided image should have a maximum size of 64 x 64 dp. If the image exceeds this
-         * maximum size in either one of the dimensions, it will be scaled down and centered
-         * inside the
+         * To minimize scaling artifacts across a wide range of car screens, apps should provide
+         * images targeting a 128 x 128 dp bounding box. If the image exceeds this maximum size in
+         * either one of the dimensions, it will be scaled down to be centered inside the
          * bounding box while preserving the aspect ratio.
          *
          * <p>See {@link CarIcon} for more details related to providing icon and image resources
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/Maneuver.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/Maneuver.java
index 9c09bd6..a9d7e10 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/Maneuver.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/Maneuver.java
@@ -601,11 +601,12 @@
         /**
          * Sets an image representing the maneuver.
          *
-         * <h4>Image Sizing Guidance</h4>
+         * <h4>Icon Sizing Guidance</h4>
          *
-         * The provided image should have a maximum size of 64 x 64 dp. If the image exceeds this
-         * maximum size in either one of the dimensions, it will be scaled down and centered
-         * inside the bounding box while preserving the aspect ratio.
+         * To minimize scaling artifacts across a wide range of car screens, apps should provide
+         * icons targeting a 128 x 128 dp bounding box. If the icon exceeds this maximum size in
+         * either one of the dimensions, it will be scaled down to be centered inside the
+         * bounding box while preserving its aspect ratio.
          *
          * <p>See {@link CarIcon} for more details related to providing icon and image resources
          * that work with different car screen pixel densities.
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/MessageInfo.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/MessageInfo.java
index a4b3eef..f2874b0 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/MessageInfo.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/MessageInfo.java
@@ -165,7 +165,15 @@
         /**
          * Sets the image to display along with the message.
          *
-         * <p>Unless set with this method, the message will not have an image.
+         * <h4>Image Sizing Guidance</h4>
+         *
+         * To minimize scaling artifacts across a wide range of car screens, apps should provide
+         * images targeting a 128 x 128 dp bounding box. If the image exceeds this maximum size in
+         * either one of the dimensions, it will be scaled down to be centered inside the
+         * bounding box while preserving the aspect ratio.
+         *
+         * <p>See {@link CarIcon} for more details related to providing icon and image resources
+         * that work with different car screen pixel densities.
          *
          * @throws NullPointerException if {@code image} is {@code null}
          */
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java
index ac84c54..c3045fe 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java
@@ -300,8 +300,8 @@
         /**
          * Sets the background color to use for the navigation information.
          *
-         * <p>The host may ignore this color and use a default color instead if the color does
-         * not pass the contrast requirements.
+         * <p>Depending on contrast requirements, capabilities of the vehicle screens, or other
+         *  factors, the color may be ignored by the host or overridden by the vehicle system.
          */
         @NonNull
         public Builder setBackgroundColor(@NonNull CarColor backgroundColor) {
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutingInfo.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutingInfo.java
index b79f167..57be50d 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutingInfo.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutingInfo.java
@@ -161,8 +161,10 @@
          * <h4>Image Sizing Guidance</h4>
          *
          * Images in the cue of the {@link Step} object, set with {@link Step.Builder#setCue}, can
-         * contain image spans. If necessary, those images in the spans will be scaled down to fit
-         * within a 108 x 36 dp bounding box, while preserving their aspect ratio.
+         * contain image spans. To minimize scaling artifacts across a wide range of car screens,
+         * apps should provide images targeting a 250 x 83 dp bounding box. If necessary, those
+         * images in the spans will be scaled down to fit the bounding box while preserving their
+         * aspect ratios.
          *
          * <p>See {@link CarIcon} for more details related to providing icon and image resources
          * that work with different car screen pixel densities.
@@ -186,8 +188,10 @@
          * <h4>Image Sizing Guidance</h4>
          *
          * Images in the cue of the {@link Step} object, set with {@link Step.Builder#setCue}, can
-         * contain image spans. If necessary, those images in the spans will be scaled down to fit
-         * within a 108 x 32 dp bounding box, while preserving their aspect ratio.
+         * contain image spans. To minimize scaling artifacts across a wide range of car screens,
+         * apps should provide images targeting a 250 x 83 dp bounding box. If necessary, those
+         * images in the spans will be scaled down to fit the bounding box while preserving their
+         * aspect ratios.
          *
          * <p>See {@link CarIcon} for more details related to providing icon and image resources
          * that work with different car screen pixel densities.
@@ -208,10 +212,14 @@
          *
          * <h4>Image Sizing Guidance</h4>
          *
-         * The image may be scaled down to fit a rectangle of 320 x 200 dp while preserving the
-         * aspect ratio. On smaller screens the junction image may result in the hiding of the
-         * {@link Lane}s, {@link TravelEstimate} or next {@link Step}. The aspect ratio should be
-         * greater than or equal to 1.6 in order to fit the horizontal space fully.
+         * To minimize scaling artifacts across a wide range of car screens, apps should provide
+         * images targeting a 500 x 312 dp bounding box. If the image exceeds this maximum size in
+         * either one of the dimensions, it will be scaled down to be centered inside the
+         * bounding box while preserving its aspect ratio. The aspect ratio should be greater than
+         * or equal to 1.6 in order to fit the horizontal space fully.
+         *
+         * <p>On smaller screens the junction image may result in the hiding of the {@link Lane}
+         * s, {@link TravelEstimate} or next {@link Step}.
          *
          * <p>See {@link CarIcon} for more details related to providing icon and image resources
          * that work with different car screen pixel densities.
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/Step.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/Step.java
index 5af30b8..b338c39 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/Step.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/Step.java
@@ -255,9 +255,10 @@
          *
          * <h4>Image Sizing Guidance</h4>
          *
-         * The provided image should have a maximum size of 294 x 44 dp. If the image exceeds this
-         * maximum size in either one of the dimensions, it will be scaled down and centered
-         * inside the bounding box while preserving the aspect ratio.
+         * To minimize scaling artifacts across a wide range of car screens, apps should provide
+         * images targeting a 500 x 74 dp bounding box. If the image exceeds this maximum size in
+         * either one of the dimensions, it will be scaled down to be centered inside the
+         * bounding box while preserving its aspect ratio.
          *
          * <p>See {@link CarIcon} for more details related to providing icon and image resources
          * that work with different car screen pixel densities.
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/TravelEstimate.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/TravelEstimate.java
index 832ffe7..16ff2cf6 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/TravelEstimate.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/TravelEstimate.java
@@ -247,7 +247,8 @@
         /**
          * Sets the color of the remaining time text.
          *
-         * <p>The host may ignore this color depending on the capabilities of the target screen.
+         * <p>Depending on contrast requirements, capabilities of the vehicle screens, or other
+         * factors, the color may be ignored by the host or overridden by the vehicle system.
          *
          * <p>If not set, {@link CarColor#DEFAULT} will be used.
          *
@@ -266,7 +267,8 @@
         /**
          * Sets the color of the remaining distance text.
          *
-         * <p>The host may ignore this color depending on the capabilities of the target screen.
+         * <p>Depending on contrast requirements, capabilities of the vehicle screens, or other
+         * factors, the color may be ignored by the host or overridden by the vehicle system.
          *
          * <p>If not set, {@link CarColor#DEFAULT} will be used.
          *
diff --git a/car/app/app/src/test/java/androidx/car/app/model/LongMessageTemplateTest.java b/car/app/app/src/test/java/androidx/car/app/model/LongMessageTemplateTest.java
index aa7de93..2e20f55 100644
--- a/car/app/app/src/test/java/androidx/car/app/model/LongMessageTemplateTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/model/LongMessageTemplateTest.java
@@ -57,6 +57,15 @@
     }
 
     @Test
+    public void moreThanTwoActions_throws() {
+        assertThrows(IllegalArgumentException.class,
+                () -> new LongMessageTemplate.Builder(mMessage)
+                        .addAction(mAction)
+                        .addAction(mAction)
+                        .addAction(mAction));
+    }
+
+    @Test
     public void createDefault_valuesAreNull() {
         LongMessageTemplate template = new LongMessageTemplate.Builder(mMessage)
                 .setTitle(mTitle)
diff --git a/car/app/app/src/test/java/androidx/car/app/model/MessageTemplateTest.java b/car/app/app/src/test/java/androidx/car/app/model/MessageTemplateTest.java
index 515daca..01ff47c 100644
--- a/car/app/app/src/test/java/androidx/car/app/model/MessageTemplateTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/model/MessageTemplateTest.java
@@ -47,6 +47,7 @@
     private final String mMessage = "foo";
     private final Action mAction = Action.BACK;
     private final CarIcon mIcon = CarIcon.ALERT;
+    private final ActionStrip mActionStrip = new ActionStrip.Builder().addAction(mAction).build();
 
     @Test
     public void emptyMessage_throws() {
@@ -68,6 +69,13 @@
     }
 
     @Test
+    public void isLoadingWithIcon_throws() {
+        assertThrows(
+                IllegalStateException.class,
+                () -> new MessageTemplate.Builder("hello").setLoading(true).setIcon(mIcon).build());
+    }
+
+    @Test
     public void noHeaderTitleOrAction_throws() {
         assertThrows(IllegalStateException.class,
                 () -> new MessageTemplate.Builder(mMessage).build());
@@ -78,6 +86,15 @@
     }
 
     @Test
+    public void moreThanTwoActions_throws() {
+        assertThrows(IllegalArgumentException.class,
+                () -> new MessageTemplate.Builder(mMessage)
+                        .addAction(mAction)
+                        .addAction(mAction)
+                        .addAction(mAction));
+    }
+
+    @Test
     public void createDefault_valuesAreNull() {
         MessageTemplate template = new MessageTemplate.Builder(mMessage).setTitle(mTitle).build();
         assertThat(template.getMessage().toString()).isEqualTo(mMessage);
@@ -85,6 +102,7 @@
         assertThat(template.getIcon()).isNull();
         assertThat(template.getHeaderAction()).isNull();
         assertThat(template.getActions()).isEmpty();
+        assertThat(template.getActionStrip()).isNull();
         assertThat(template.getDebugMessage()).isNull();
     }
 
@@ -115,6 +133,7 @@
                         .setDebugMessage(exception)
                         .setIcon(icon)
                         .addAction(action)
+                        .setActionStrip(mActionStrip)
                         .build();
 
         assertThat(template.getMessage().toString()).isEqualTo(mMessage);
@@ -124,6 +143,7 @@
         assertThat(template.getIcon()).isEqualTo(icon);
         assertThat(template.getHeaderAction()).isEqualTo(Action.BACK);
         assertThat(template.getActions()).containsExactly(action);
+        assertThat(template.getActionStrip()).isEqualTo(mActionStrip);
     }
 
     @Test
@@ -154,6 +174,7 @@
                         .setDebugMessage(mCause)
                         .setHeaderAction(Action.BACK)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(mIcon)
                         .build();
         MessageTemplate template2 =
@@ -163,6 +184,7 @@
                         .setDebugMessage(mCause)
                         .setHeaderAction(Action.BACK)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(mIcon)
                         .build();
 
@@ -177,6 +199,7 @@
                         .setDebugMessage(mDebugMessage)
                         .setDebugMessage(mCause)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(mIcon)
                         .build();
         MessageTemplate template2 =
@@ -185,6 +208,7 @@
                         .setDebugMessage("yo")
                         .setDebugMessage(mCause)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(mIcon)
                         .build();
 
@@ -199,6 +223,7 @@
                         .setDebugMessage(mDebugMessage)
                         .setDebugMessage(mCause)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(mIcon)
                         .build();
         MessageTemplate template2 =
@@ -207,6 +232,7 @@
                         .setDebugMessage(mDebugMessage)
                         .setDebugMessage(new IllegalStateException("something else bad"))
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(mIcon)
                         .build();
 
@@ -221,6 +247,7 @@
                         .setDebugMessage(mDebugMessage)
                         .setDebugMessage(mCause)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(mIcon)
                         .build();
         MessageTemplate template2 =
@@ -229,6 +256,7 @@
                         .setDebugMessage(mDebugMessage)
                         .setDebugMessage(mCause)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(mIcon)
                         .build();
 
@@ -244,6 +272,7 @@
                         .setDebugMessage(mCause)
                         .setHeaderAction(Action.BACK)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(mIcon)
                         .build();
         MessageTemplate template2 =
@@ -253,6 +282,7 @@
                         .setDebugMessage(mCause)
                         .setHeaderAction(Action.APP_ICON)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(mIcon)
                         .build();
 
@@ -267,6 +297,7 @@
                         .setDebugMessage(mDebugMessage)
                         .setDebugMessage(mCause)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(mIcon)
                         .build();
         MessageTemplate template2 =
@@ -276,6 +307,34 @@
                         .setDebugMessage(mCause)
                         .addAction(mAction)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
+                        .setIcon(mIcon)
+                        .build();
+
+        assertThat(template1).isNotEqualTo(template2);
+    }
+
+    @Test
+    public void notEquals_differentActionStrip() {
+        MessageTemplate template1 =
+                new MessageTemplate.Builder(mMessage)
+                        .setTitle(mTitle)
+                        .setDebugMessage(mDebugMessage)
+                        .setDebugMessage(mCause)
+                        .addAction(mAction)
+                        .setActionStrip(mActionStrip)
+                        .setIcon(mIcon)
+                        .build();
+        MessageTemplate template2 =
+                new MessageTemplate.Builder(mMessage)
+                        .setTitle(mTitle)
+                        .setDebugMessage(mDebugMessage)
+                        .setDebugMessage(mCause)
+                        .addAction(mAction)
+                        .setActionStrip(new ActionStrip.Builder()
+                                .addAction(Action.BACK)
+                                .addAction(Action.APP_ICON)
+                                .build())
                         .setIcon(mIcon)
                         .build();
 
@@ -290,6 +349,7 @@
                         .setDebugMessage(mDebugMessage)
                         .setDebugMessage(mCause)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(mIcon)
                         .build();
         MessageTemplate template2 =
@@ -298,6 +358,7 @@
                         .setDebugMessage(mDebugMessage)
                         .setDebugMessage(mCause)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(CarIcon.ERROR)
                         .build();
 
@@ -312,6 +373,7 @@
                         .setDebugMessage(mDebugMessage)
                         .setDebugMessage(mCause)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(mIcon)
                         .build();
         MessageTemplate template2 =
@@ -320,6 +382,7 @@
                         .setDebugMessage(mDebugMessage)
                         .setDebugMessage(mCause)
                         .addAction(mAction)
+                        .setActionStrip(mActionStrip)
                         .setIcon(mIcon)
                         .build();
 
diff --git a/car/app/app/src/test/java/androidx/car/app/model/signin/InputSignInMethodTest.java b/car/app/app/src/test/java/androidx/car/app/model/signin/InputSignInMethodTest.java
index eeeaa4e..dc23b8b 100644
--- a/car/app/app/src/test/java/androidx/car/app/model/signin/InputSignInMethodTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/model/signin/InputSignInMethodTest.java
@@ -27,6 +27,8 @@
 import static org.mockito.Mockito.verify;
 
 import androidx.car.app.OnDoneCallback;
+import androidx.car.app.model.InputCallback;
+import androidx.car.app.model.InputCallbackDelegate;
 import androidx.car.app.model.OnInputCompletedDelegate;
 import androidx.car.app.model.OnInputCompletedListener;
 
@@ -48,6 +50,8 @@
 
     @Mock
     OnInputCompletedListener mListener;
+    @Mock
+    InputCallback mCallback;
 
     @Test
     public void create_defaultValues() {
@@ -68,6 +72,30 @@
     }
 
     @Test
+    public void inputSubmittedCallback() {
+        InputSignInMethod signIn = new InputSignInMethod.Builder(mCallback).build();
+
+        InputCallbackDelegate delegate = signIn.getInputCallbackDelegate();
+        OnDoneCallback onDoneCallback = mock(OnDoneCallback.class);
+        delegate.sendInputSubmitted("ABC", onDoneCallback);
+
+        verify(mCallback).onInputSubmitted("ABC");
+        verify(onDoneCallback).onSuccess(null);
+    }
+
+    @Test
+    public void inputTextChangedCallback() {
+        InputSignInMethod signIn = new InputSignInMethod.Builder(mCallback).build();
+
+        InputCallbackDelegate delegate = signIn.getInputCallbackDelegate();
+        OnDoneCallback onDoneCallback = mock(OnDoneCallback.class);
+        delegate.sendInputTextChanged("ABC", onDoneCallback);
+
+        verify(mCallback).onInputTextChanged("ABC");
+        verify(onDoneCallback).onSuccess(null);
+    }
+
+    @Test
     public void create_withInputType() {
         InputSignInMethod signIn = new InputSignInMethod.Builder(mListener)
                 .setInputType(INPUT_TYPE_PASSWORD)
diff --git a/car/app/app/src/test/java/androidx/car/app/model/signin/SignInTemplateTest.java b/car/app/app/src/test/java/androidx/car/app/model/signin/SignInTemplateTest.java
index cdf6e5d..680d9e2 100644
--- a/car/app/app/src/test/java/androidx/car/app/model/signin/SignInTemplateTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/model/signin/SignInTemplateTest.java
@@ -50,6 +50,16 @@
     }
 
     @Test
+    public void moreThanTwoActions_throws() {
+        PinSignInMethod signInMethod = new PinSignInMethod.Builder("ABC").build();
+        assertThrows(IllegalArgumentException.class,
+                () -> new SignInTemplate.Builder(signInMethod)
+                        .addAction(mAction)
+                        .addAction(mAction)
+                        .addAction(mAction));
+    }
+
+    @Test
     public void createInstance_defaultValues() {
         PinSignInMethod signInMethod = new PinSignInMethod.Builder("ABC").build();
         SignInTemplate template = new SignInTemplate.Builder(signInMethod)
diff --git a/collection/collection/lint-baseline.xml b/collection/collection/lint-baseline.xml
index ec399b3..6d3f9db 100644
--- a/collection/collection/lint-baseline.xml
+++ b/collection/collection/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
@@ -114,105 +114,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E valueAt(int index) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/ArraySet.java"
-            line="395"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E removeAt(int index) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/ArraySet.java"
-            line="518"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void addFirst(E e) {"
-        errorLine2="                         ~">
-        <location
-            file="src/main/java/androidx/collection/CircularArray.java"
-            line="85"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void addLast(E e) {"
-        errorLine2="                        ~">
-        <location
-            file="src/main/java/androidx/collection/CircularArray.java"
-            line="97"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E popFirst() {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/CircularArray.java"
-            line="110"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E popLast() {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/CircularArray.java"
-            line="125"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E getFirst() {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/CircularArray.java"
-            line="216"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E getLast() {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/CircularArray.java"
-            line="228"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E get(int n) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/CircularArray.java"
-            line="241"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public LongSparseArray&lt;E> clone() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~">
         <location
@@ -224,28 +125,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E get(long key, E valueIfKeyNotFound) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/LongSparseArray.java"
-            line="117"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E get(long key, E valueIfKeyNotFound) {"
-        errorLine2="                           ~">
-        <location
-            file="src/main/java/androidx/collection/LongSparseArray.java"
-            line="117"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public boolean remove(long key, Object value) {"
         errorLine2="                                    ~~~~~~">
         <location
@@ -257,116 +136,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E replace(long key, E value) {"
-        errorLine2="                               ~">
-        <location
-            file="src/main/java/androidx/collection/LongSparseArray.java"
-            line="185"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public boolean replace(long key, E oldValue, E newValue) {"
-        errorLine2="                                     ~">
-        <location
-            file="src/main/java/androidx/collection/LongSparseArray.java"
-            line="203"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public boolean replace(long key, E oldValue, E newValue) {"
-        errorLine2="                                                 ~">
-        <location
-            file="src/main/java/androidx/collection/LongSparseArray.java"
-            line="203"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void put(long key, E value) {"
-        errorLine2="                              ~">
-        <location
-            file="src/main/java/androidx/collection/LongSparseArray.java"
-            line="248"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E putIfAbsent(long key, E value) {"
-        errorLine2="                                   ~">
-        <location
-            file="src/main/java/androidx/collection/LongSparseArray.java"
-            line="315"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E valueAt(int index) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/LongSparseArray.java"
-            line="373"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void setValueAt(int index, E value) {"
-        errorLine2="                                      ~">
-        <location
-            file="src/main/java/androidx/collection/LongSparseArray.java"
-            line="386"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public int indexOfValue(E value) {"
-        errorLine2="                            ~">
-        <location
-            file="src/main/java/androidx/collection/LongSparseArray.java"
-            line="415"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public boolean containsValue(E value) {"
-        errorLine2="                                 ~">
-        <location
-            file="src/main/java/androidx/collection/LongSparseArray.java"
-            line="433"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void append(long key, E value) {"
-        errorLine2="                                 ~">
-        <location
-            file="src/main/java/androidx/collection/LongSparseArray.java"
-            line="456"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public synchronized final Map&lt;K, V> snapshot() {"
         errorLine2="                              ~~~~~~~~~">
         <location
@@ -412,17 +181,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public V getOrDefault(Object key, V defaultValue) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="380"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V getOrDefault(Object key, V defaultValue) {"
         errorLine2="                          ~~~~~~">
         <location
             file="src/main/java/androidx/collection/SimpleArrayMap.java"
@@ -433,105 +191,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V getOrDefault(Object key, V defaultValue) {"
-        errorLine2="                                      ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="380"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public K keyAt(int index) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="391"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V valueAt(int index) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="401"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V setValueAt(int index, V value) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="412"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V setValueAt(int index, V value) {"
-        errorLine2="                                   ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="412"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V put(K key, V value) {"
-        errorLine2="                 ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="436"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V put(K key, V value) {"
-        errorLine2="                        ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="436"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V putIfAbsent(K key, V value) {"
-        errorLine2="                         ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="527"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V putIfAbsent(K key, V value) {"
-        errorLine2="                                ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="527"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public V remove(Object key) {"
         errorLine2="                    ~~~~~~">
         <location
@@ -565,72 +224,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V removeAt(int index) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="575"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V replace(K key, V value) {"
-        errorLine2="                     ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="638"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public V replace(K key, V value) {"
-        errorLine2="                            ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="638"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public boolean replace(K key, V oldValue, V newValue) {"
-        errorLine2="                           ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="654"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public boolean replace(K key, V oldValue, V newValue) {"
-        errorLine2="                                  ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="654"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public boolean replace(K key, V oldValue, V newValue) {"
-        errorLine2="                                              ~">
-        <location
-            file="src/main/java/androidx/collection/SimpleArrayMap.java"
-            line="654"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public SparseArrayCompat&lt;E> clone() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -642,28 +235,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E get(int key, E valueIfKeyNotFound) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/SparseArrayCompat.java"
-            line="117"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E get(int key, E valueIfKeyNotFound) {"
-        errorLine2="                          ~">
-        <location
-            file="src/main/java/androidx/collection/SparseArrayCompat.java"
-            line="117"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public boolean remove(int key, Object value) {"
         errorLine2="                                   ~~~~~~">
         <location
@@ -672,114 +243,4 @@
             column="36"/>
     </issue>
 
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E replace(int key, E value) {"
-        errorLine2="                              ~">
-        <location
-            file="src/main/java/androidx/collection/SparseArrayCompat.java"
-            line="198"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public boolean replace(int key, E oldValue, E newValue) {"
-        errorLine2="                                    ~">
-        <location
-            file="src/main/java/androidx/collection/SparseArrayCompat.java"
-            line="216"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public boolean replace(int key, E oldValue, E newValue) {"
-        errorLine2="                                                ~">
-        <location
-            file="src/main/java/androidx/collection/SparseArrayCompat.java"
-            line="216"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void put(int key, E value) {"
-        errorLine2="                             ~">
-        <location
-            file="src/main/java/androidx/collection/SparseArrayCompat.java"
-            line="261"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E putIfAbsent(int key, E value) {"
-        errorLine2="                                  ~">
-        <location
-            file="src/main/java/androidx/collection/SparseArrayCompat.java"
-            line="328"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public E valueAt(int index) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/collection/SparseArrayCompat.java"
-            line="375"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void setValueAt(int index, E value) {"
-        errorLine2="                                      ~">
-        <location
-            file="src/main/java/androidx/collection/SparseArrayCompat.java"
-            line="388"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public int indexOfValue(E value) {"
-        errorLine2="                            ~">
-        <location
-            file="src/main/java/androidx/collection/SparseArrayCompat.java"
-            line="419"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public boolean containsValue(E value) {"
-        errorLine2="                                 ~">
-        <location
-            file="src/main/java/androidx/collection/SparseArrayCompat.java"
-            line="437"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void append(int key, E value) {"
-        errorLine2="                                ~">
-        <location
-            file="src/main/java/androidx/collection/SparseArrayCompat.java"
-            line="460"
-            column="33"/>
-    </issue>
-
 </issues>
diff --git a/collection/collection2/build.gradle b/collection/collection2/build.gradle
new file mode 100644
index 0000000..2960a65
--- /dev/null
+++ b/collection/collection2/build.gradle
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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("AndroidXPlugin")
+    id("org.jetbrains.kotlin.multiplatform")
+}
+
+kotlin {
+    jvm {
+        withJava()
+    }
+
+    sourceSets {
+        commonMain {
+            dependencies {
+                api(KOTLIN_STDLIB_COMMON)
+            }
+        }
+        jvmMain {
+            dependencies {
+                api(KOTLIN_STDLIB)
+                api("androidx.annotation:annotation:1.1.0")
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/collection/collection2/src/commonMain/kotlin/androidx/collection/ArrayMap.kt b/collection/collection2/src/commonMain/kotlin/androidx/collection/ArrayMap.kt
new file mode 100644
index 0000000..3ed7812
--- /dev/null
+++ b/collection/collection2/src/commonMain/kotlin/androidx/collection/ArrayMap.kt
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/** Avoid conflict (and R8 dup. classes failures) with collection-ktx. */
+// TODO: Remove this after collection-ktx is merged
+@file:JvmName("ArrayMap_Ext")
+
+package androidx.collection
+
+import kotlin.collections.MutableMap.MutableEntry
+import kotlin.jvm.JvmName
+
+internal class EntrySet<K, V>(private val map: SimpleArrayMap<K, V>) :
+    AbstractMutableSet<MutableEntry<K, V>>() {
+    override fun iterator(): MutableIterator<MutableEntry<K, V>> {
+        return EntryIterator(map)
+    }
+
+    override val size: Int get() = map.size
+
+    override fun add(element: MutableEntry<K, V>): Boolean {
+        // This is the only correct answer, because there is no good answer to what should
+        // happen when you add an entry to the set with the same key as an existing entry.
+        throw UnsupportedOperationException()
+    }
+}
+
+internal class EntryIterator<K, V>(private val map: SimpleArrayMap<K, V>) :
+    IndexBasedMutableIterator<MutableEntry<K, V>>(map.size), MutableEntry<K, V> {
+    override fun get(index: Int): MutableEntry<K, V> = this
+    override fun remove(index: Int) {
+        map.removeAt(index)
+    }
+
+    override val key: K get() = map.keyAt(index)
+    override val value: V get() = map.valueAt(index)
+    override fun setValue(newValue: V): V {
+        return map.setValueAt(index, newValue)
+    }
+}
+
+internal fun <T> equalsSetHelper(set: Set<T>, other: Any?): Boolean {
+    if (set === other) {
+        return true
+    }
+    if (other is Set<*>) {
+        val s = other
+        try {
+            return set.size == s.size && set.containsAll(s)
+        } catch (ignored: NullPointerException) {
+        } catch (ignored: ClassCastException) {
+        }
+    }
+    return false
+}
+
+internal class KeySet<K, V>(private val map: SimpleArrayMap<K, V>) : MutableSet<K> {
+    override fun add(element: K): Boolean {
+        throw UnsupportedOperationException()
+    }
+
+    override fun addAll(elements: Collection<K>): Boolean {
+        throw UnsupportedOperationException()
+    }
+
+    override fun clear() {
+        map.clear()
+    }
+
+    override fun iterator(): MutableIterator<K> {
+        return KeyIterator(map)
+    }
+
+    override fun remove(element: K): Boolean {
+        val index = map.indexOfKey(element)
+        if (index >= 0) {
+            map.removeAt(index)
+            return true
+        }
+        return false
+    }
+
+    override fun removeAll(elements: Collection<K>): Boolean {
+        val oldSize = map.size
+        for (element in elements) {
+            map.remove(element)
+        }
+        return oldSize != map.size
+    }
+
+    override fun retainAll(elements: Collection<K>): Boolean {
+        val oldSize = map.size
+        for (i in oldSize - 1 downTo 0) {
+            if (map.keyAt(i) !in elements) {
+                map.removeAt(i)
+            }
+        }
+        return oldSize != map.size
+    }
+
+    override val size: Int get() = map.size
+
+    override fun contains(element: K): Boolean {
+        return map.containsKey(element)
+    }
+
+    override fun containsAll(elements: Collection<K>): Boolean {
+        return elements.all { map.containsKey(it) }
+    }
+
+    override fun isEmpty(): Boolean {
+        return map.isEmpty()
+    }
+
+    override fun equals(other: Any?): Boolean {
+        return equalsSetHelper<K>(this, other)
+    }
+
+    override fun hashCode(): Int {
+        var result = 0
+        for (i in map.size - 1 downTo 0) {
+            val obj: K = map.keyAt(i)
+            result += obj?.hashCode() ?: 0
+        }
+        return result
+    }
+}
+
+internal class KeyIterator<K, V>(private val map: SimpleArrayMap<K, V>) :
+    IndexBasedMutableIterator<K>(map.size) {
+
+    override fun get(index: Int): K = map.keyAt(index)
+    override fun remove(index: Int) {
+        map.removeAt(index)
+    }
+}
+
+internal class ValueCollection<K, V>(private val map: SimpleArrayMap<K, V>) : MutableCollection<V> {
+    override val size: Int get() = map.size
+
+    override fun contains(element: V): Boolean {
+        return map.containsValue(element)
+    }
+
+    override fun containsAll(elements: Collection<V>): Boolean {
+        return elements.all(map::containsValue)
+    }
+
+    override fun isEmpty(): Boolean {
+        return map.isEmpty()
+    }
+
+    override fun add(element: V): Boolean {
+        throw UnsupportedOperationException()
+    }
+
+    override fun addAll(elements: Collection<V>): Boolean {
+        throw UnsupportedOperationException()
+    }
+
+    override fun clear() {
+        map.clear()
+    }
+
+    override fun iterator(): MutableIterator<V> {
+        return ValueIterator(map)
+    }
+
+    override fun remove(element: V): Boolean {
+        val index = map.indexOfValue(element)
+        if (index >= 0) {
+            map.removeAt(index)
+            return true
+        }
+        return false
+    }
+
+    override fun removeAll(elements: Collection<V>): Boolean {
+        val oldSize = map.size
+        for (element in elements) {
+            remove(element)
+        }
+        return oldSize != map.size
+    }
+
+    override fun retainAll(elements: Collection<V>): Boolean {
+        val oldSize = map.size
+        for (i in oldSize - 1 downTo 0) {
+            if (map.valueAt(i) !in elements) {
+                map.removeAt(i)
+            }
+        }
+        return oldSize != map.size
+    }
+}
+
+internal class ValueIterator<K, V>(private val map: SimpleArrayMap<K, V>) :
+    IndexBasedMutableIterator<V>(map.size) {
+
+    override fun get(index: Int): V = map.valueAt(index)
+    override fun remove(index: Int) {
+        map.removeAt(index)
+    }
+}
diff --git a/collection/collection2/src/commonMain/kotlin/androidx/collection/ContainerHelpers.kt b/collection/collection2/src/commonMain/kotlin/androidx/collection/ContainerHelpers.kt
new file mode 100644
index 0000000..ea0996d
--- /dev/null
+++ b/collection/collection2/src/commonMain/kotlin/androidx/collection/ContainerHelpers.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.collection
+
+import kotlin.jvm.JvmField
+import kotlin.native.concurrent.SharedImmutable
+
+@JvmField
+@SharedImmutable
+internal val DELETED = Any()
+
+@JvmField
+@SharedImmutable
+internal val EMPTY_INTS = IntArray(0)
+
+@JvmField
+@SharedImmutable
+internal val EMPTY_LONGS = LongArray(0)
+
+@JvmField
+@SharedImmutable
+internal val EMPTY_OBJECTS = arrayOfNulls<Any>(0)
+
+internal fun idealIntArraySize(need: Int): Int {
+    return idealByteArraySize(need * 4) / 4
+}
+
+internal fun idealLongArraySize(need: Int): Int {
+    return idealByteArraySize(need * 8) / 8
+}
+
+internal fun idealByteArraySize(need: Int): Int {
+    for (i in 4..31) {
+        val test = (1 shl i) - 12
+        if (need <= test) {
+            return test
+        }
+    }
+    return need
+}
+
+// This is Arrays.binarySearch(), but doesn't do any argument validation.
+internal fun IntArray.binarySearch(size: Int, value: Int): Int {
+    var lo = 0
+    var hi = size - 1
+    while (lo <= hi) {
+        val mid = lo + hi ushr 1
+        val midVal = this[mid]
+        if (midVal < value) {
+            lo = mid + 1
+        } else if (midVal > value) {
+            hi = mid - 1
+        } else {
+            return mid // value found
+        }
+    }
+    return lo.inv() // value not present
+}
+
+internal fun LongArray.binarySearch(size: Int, value: Long): Int {
+    var lo = 0
+    var hi = size - 1
+    while (lo <= hi) {
+        val mid = lo + hi ushr 1
+        val midVal = this[mid]
+        if (midVal < value) {
+            lo = mid + 1
+        } else if (midVal > value) {
+            hi = mid - 1
+        } else {
+            return mid // value found
+        }
+    }
+    return lo.inv() // value not present
+}
diff --git a/collection/collection2/src/commonMain/kotlin/androidx/collection/IndexBasedMutableIterator.kt b/collection/collection2/src/commonMain/kotlin/androidx/collection/IndexBasedMutableIterator.kt
new file mode 100644
index 0000000..0d7979e
--- /dev/null
+++ b/collection/collection2/src/commonMain/kotlin/androidx/collection/IndexBasedMutableIterator.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.collection
+
+internal abstract class IndexBasedMutableIterator<E>(
+    size: Int
+) : MutableIterator<E> {
+    protected var index = -1
+    private var end = size - 1
+    private var canRemove = false
+
+    abstract fun get(index: Int): E
+    abstract fun remove(index: Int)
+
+    override fun hasNext() = index < end
+
+    override fun next(): E {
+        if (!hasNext()) {
+            throw NoSuchElementException()
+        }
+        val value = get(++index)
+        canRemove = true
+        return value
+    }
+
+    override fun remove() {
+        check(canRemove)
+
+        // Attempt removal first so an UnsupportedOperationException retains a valid state.
+        remove(index--)
+        end--
+        canRemove = false
+    }
+}
diff --git a/collection/collection2/src/commonMain/kotlin/androidx/collection/SimpleArrayMap.kt b/collection/collection2/src/commonMain/kotlin/androidx/collection/SimpleArrayMap.kt
new file mode 100644
index 0000000..da4523a7
--- /dev/null
+++ b/collection/collection2/src/commonMain/kotlin/androidx/collection/SimpleArrayMap.kt
@@ -0,0 +1,648 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.collection
+
+import kotlin.jvm.JvmName
+import kotlin.jvm.JvmOverloads
+
+private const val DEBUG = false
+private const val TAG = "SimpleArrayMap"
+
+/**
+ * Attempt to spot concurrent modifications to this data structure.
+ *
+ * It's best-effort, but any time we can throw something more diagnostic than an
+ * ArrayIndexOutOfBoundsException deep in the ArrayMap internals it's going to
+ * save a lot of development time.
+ *
+ * Good times to look for CME include after any array allocations/copyOf calls
+ * and at the end of functions that change size (put/remove/clear).
+ */
+private const val CONCURRENT_MODIFICATION_EXCEPTIONS = true
+
+/**
+ * The minimum amount by which the capacity of a ArrayMap will increase.
+ * This is tuned to be relatively space-efficient.
+ */
+private const val BASE_SIZE = 4
+
+open class SimpleArrayMap<K, V> {
+
+    private var hashes: IntArray
+    private var keyValues: Array<Any?>
+    protected var _size = 0
+
+    // Suppression necessary, see KT-43542.
+    @Suppress("INAPPLICABLE_JVM_NAME")
+    @get:JvmName("size")
+    open val size: Int get() = _size
+
+    protected open fun indexOf(key: Any, hash: Int): Int {
+        val N = _size
+
+        // Important fast case: if nothing is in here, nothing to look for.
+        if (N == 0) {
+            return 0.inv()
+        }
+        val index: Int = hashes.binarySearch(N, hash)
+
+        // If the hash code wasn't found, then we have no entry for this key.
+        if (index < 0) {
+            return index
+        }
+
+        // If the key at the returned index matches, that's what we want.
+        if (key == keyValues[index shl 1]) {
+            return index
+        }
+
+        // Search for a matching key after the index.
+        var end: Int
+        end = index + 1
+        while (end < N && hashes[end] == hash) {
+            if (key == keyValues[end shl 1]) return end
+            end++
+        }
+
+        // Search for a matching key before the index.
+        var i = index - 1
+        while (i >= 0 && hashes[i] == hash) {
+            if (key == keyValues[i shl 1]) return i
+            i--
+        }
+
+        // Key not found -- return negative value indicating where a
+        // new entry for this key should go.  We use the end of the
+        // hash chain to reduce the number of array entries that will
+        // need to be copied when inserting.
+        return end.inv()
+    }
+
+    protected open fun indexOfNull(): Int {
+        val N = _size
+
+        // Important fast case: if nothing is in here, nothing to look for.
+        if (N == 0) {
+            return 0.inv()
+        }
+        val index: Int = hashes.binarySearch(N, 0)
+
+        // If the hash code wasn't found, then we have no entry for this key.
+        if (index < 0) {
+            return index
+        }
+
+        // If the key at the returned index matches, that's what we want.
+        if (null == keyValues[index shl 1]) {
+            return index
+        }
+
+        // Search for a matching key after the index.
+        var end: Int
+        end = index + 1
+        while (end < N && hashes[end] == 0) {
+            if (null == keyValues[end shl 1]) return end
+            end++
+        }
+
+        // Search for a matching key before the index.
+        var i = index - 1
+        while (i >= 0 && hashes[i] == 0) {
+            if (null == keyValues[i shl 1]) return i
+            i--
+        }
+
+        // Key not found -- return negative value indicating where a
+        // new entry for this key should go.  We use the end of the
+        // hash chain to reduce the number of array entries that will
+        // need to be copied when inserting.
+        return end.inv()
+    }
+
+    /**
+     * Create a new ArrayMap with a given initial capacity.
+     */
+    @JvmOverloads
+    constructor(capacity: Int = 0) {
+        if (capacity == 0) {
+            hashes = EMPTY_INTS
+            keyValues = EMPTY_OBJECTS
+        } else {
+            hashes = IntArray(capacity)
+            keyValues = arrayOfNulls<Any?>(capacity shl 1)
+        }
+        _size = 0
+    }
+
+    /**
+     * Create a new ArrayMap with the mappings from the given ArrayMap.
+     */
+    constructor(map: SimpleArrayMap<K, V>?) : this() {
+        if (map != null) {
+            putAll(map)
+        }
+    }
+
+    /**
+     * Make the array map empty.  All storage is released.
+     *
+     * @throws ConcurrentModificationException if the map has been concurrently modified.
+     */
+    open fun clear() {
+        if (_size > 0) {
+            hashes = EMPTY_INTS
+            keyValues = EMPTY_OBJECTS
+            _size = 0
+        }
+        if (CONCURRENT_MODIFICATION_EXCEPTIONS && _size > 0) {
+            throw ConcurrentModificationException()
+        }
+    }
+
+    /**
+     * Ensure the array map can hold at least <var>minimumCapacity</var>
+     * items.
+     *
+     * @throws ConcurrentModificationException if the map has been concurrently modified.
+     */
+    open fun ensureCapacity(minimumCapacity: Int) {
+        val osize = _size
+        if (hashes.size < minimumCapacity) {
+            hashes = hashes.copyOf(minimumCapacity)
+            keyValues = keyValues.copyOf(minimumCapacity shl 1)
+        }
+        if (CONCURRENT_MODIFICATION_EXCEPTIONS && _size != osize) {
+            throw ConcurrentModificationException()
+        }
+    }
+
+    /**
+     * Check whether a key exists in the array.
+     *
+     * @param key The key to search for.
+     * @return Returns true if the key exists, else false.
+     */
+    open fun containsKey(key: K): Boolean = indexOfKey(key) >= 0
+
+    /**
+     * Returns the index of a key in the set.
+     *
+     * @param key The key to search for.
+     * @return Returns the index of the key if it exists, else a negative integer.
+     */
+    open fun indexOfKey(key: Any?): Int =
+        if (key == null) indexOfNull() else indexOf(key, key.hashCode())
+
+    internal open fun indexOfValue(value: V): Int {
+        val N = _size shl 1
+        val array = keyValues
+        if (value == null) {
+            var i = 1
+            while (i < N) {
+                if (array[i] == null) {
+                    return i shr 1
+                }
+                i += 2
+            }
+        } else {
+            var i = 1
+            while (i < N) {
+                if (value == array[i]) {
+                    return i shr 1
+                }
+                i += 2
+            }
+        }
+        return -1
+    }
+
+    /**
+     * Check whether a value exists in the array.  This requires a linear search
+     * through the entire array.
+     *
+     * @param value The value to search for.
+     * @return Returns true if the value exists, else false.
+     */
+    open fun containsValue(value: V): Boolean = indexOfValue(value) >= 0
+
+    /**
+     * Retrieve a value from the array.
+     * @param key The key of the value to retrieve.
+     * @return Returns the value associated with the given key,
+     * or null if there is no such key.
+     */
+    @Suppress("UNCHECKED_CAST")
+    open fun get(key: K): V? {
+        // TODO: Explain why re-impl instead of using getOrDefault()
+        val index = indexOfKey(key)
+        return if (index >= 0) keyValues[(index shl 1) + 1] as V else null
+    }
+
+    /**
+     * Retrieve a value from the array, or {@code defaultValue} if there is no mapping for the key.
+     * @param key The key of the value to retrieve.
+     * @param defaultValue The default mapping of the key
+     * @return Returns the value associated with the given key,
+     * or {@code defaultValue} if there is no mapping for the key.
+     */
+    @Suppress("UNCHECKED_CAST")
+    open fun getOrDefault(key: K, defaultValue: V): V {
+        val index = indexOfKey(key)
+        return if (index >= 0) keyValues[(index shl 1) + 1] as V else defaultValue
+    }
+
+    /**
+     * Return the key at the given index in the array.
+     * @param index The desired index, must be between 0 and {@link #size()}-1.
+     * @return Returns the key stored at the given index.
+     */
+    @Suppress("UNCHECKED_CAST")
+    open fun keyAt(index: Int): K = keyValues[index shl 1] as K
+
+    /**
+     * Return the value at the given index in the array.
+     * @param index The desired index, must be between 0 and {@link #size()}-1.
+     * @return Returns the value stored at the given index.
+     */
+    @Suppress("UNCHECKED_CAST")
+    open fun valueAt(index: Int): V = keyValues[(index shl 1) + 1] as V
+
+    /**
+     * Set the value at a given index in the array.
+     * @param index The desired index, must be between 0 and {@link #size()}-1.
+     * @param value The new value to store at this index.
+     * @return Returns the previous value at the given index.
+     */
+    @Suppress("UNCHECKED_CAST")
+    open fun setValueAt(index: Int, value: V): V {
+        val actualIndex = (index shl 1) + 1
+        val old = keyValues[actualIndex] as V
+        keyValues[actualIndex] = value
+        return old
+    }
+
+    /**
+     * Return true if the array map contains no items.
+     */
+    open fun isEmpty(): Boolean = _size <= 0
+
+    /**
+     * Add a new value to the array map.
+     * @param key The key under which to store the value.  <b>Must not be null.</b>  If
+     * this key already exists in the array, its value will be replaced.
+     * @param value The value to store for the given key.
+     * @return Returns the old value that was stored for the given key, or null if there
+     * was no such key.
+     * @throws ConcurrentModificationException if the map has been concurrently modified.
+     */
+    @Suppress("UNCHECKED_CAST")
+    open fun put(key: K, value: V): V? {
+        val osize = _size
+        val hash: Int
+        var index: Int
+
+        if (key == null) {
+            hash = 0
+            index = indexOfNull()
+        } else {
+            hash = key.hashCode()
+            index = indexOf(key, hash)
+        }
+        if (index >= 0) {
+            index = (index shl 1) + 1
+            val old = keyValues[index] as V
+            keyValues[index] = value
+            return old
+        }
+
+        index = index.inv()
+        if (osize >= hashes.size) {
+            val n = when {
+                osize >= BASE_SIZE * 2 -> osize + (osize shr 1)
+                osize >= BASE_SIZE -> BASE_SIZE * 2
+                else -> BASE_SIZE
+            }
+            if (DEBUG) {
+                println("$TAG put: grow from $hashes.size to $n")
+            }
+            hashes = hashes.copyOf(n)
+            keyValues = keyValues.copyOf(n shl 1)
+
+            if (CONCURRENT_MODIFICATION_EXCEPTIONS && osize != _size) {
+                throw ConcurrentModificationException()
+            }
+        }
+
+        if (index < osize) {
+            if (DEBUG) {
+                println("$TAG put: move $index-${osize - index} to ${index + 1}")
+            }
+            hashes.copyInto(hashes, index + 1, index, osize)
+            keyValues.copyInto(keyValues, (index + 1) shl 1, index shl 1, _size shl 1)
+        }
+
+        if (CONCURRENT_MODIFICATION_EXCEPTIONS) {
+            if (osize != _size || index >= hashes.size) {
+                throw ConcurrentModificationException()
+            }
+        }
+
+        hashes[index] = hash
+        keyValues[index shl 1] = key
+        keyValues[(index shl 1) + 1] = value
+        _size++
+        return null
+    }
+
+    /**
+     * Perform a {@link #put(Object, Object)} of all key/value pairs in <var>array</var>
+     * @param array The array whose contents are to be retrieved.
+     */
+    open fun putAll(array: SimpleArrayMap<out K, out V>) {
+        val N = array._size
+        ensureCapacity(_size + N)
+        if (_size == 0) {
+            if (N > 0) {
+                array.hashes.copyInto(hashes, 0, 0, N)
+                array.keyValues.copyInto(keyValues, 0, 0, N shl 1)
+                _size = N
+            }
+        } else {
+            for (i in 0 until N) {
+                put(array.keyAt(i), array.valueAt(i))
+            }
+        }
+    }
+
+    /**
+     * Add a new value to the array map only if the key does not already have a value or it is
+     * mapped to {@code null}.
+     * @param key The key under which to store the value.
+     * @param value The value to store for the given key.
+     * @return Returns the value that was stored for the given key, or null if there
+     * was no such key.
+     */
+    open fun putIfAbsent(key: K, value: V): V? {
+        var mapValue = get(key)
+        if (mapValue == null) {
+            mapValue = put(key, value)
+        }
+        return mapValue
+    }
+
+    /**
+     * Remove an existing key from the array map.
+     * @param key The key of the mapping to remove.
+     * @return Returns the value that was stored under the key, or null if there
+     * was no such key.
+     */
+    open fun remove(key: K): V? {
+        val index = indexOfKey(key)
+        return if (index >= 0) removeAt(index) else null
+    }
+
+    /**
+     * Remove an existing key from the array map only if it is currently mapped to {@code value}.
+     * @param key The key of the mapping to remove.
+     * @param value The value expected to be mapped to the key.
+     * @return Returns true if the mapping was removed.
+     */
+    open fun remove(key: K, value: V): Boolean {
+        val index = indexOfKey(key)
+        if (index >= 0) {
+            val mapValue = valueAt(index)
+            if (value == mapValue) {
+                removeAt(index)
+                return true
+            }
+        }
+        return false
+    }
+
+    /**
+     * Remove the key/value mapping at the given index.
+     * @param index The desired index, must be between 0 and {@link #size()}-1.
+     * @return Returns the value that was stored at this index.
+     * @throws ConcurrentModificationException if the map has been concurrently modified.
+     */
+    @Suppress("UNCHECKED_CAST")
+    open fun removeAt(index: Int): V? {
+        val old = keyValues[(index shl 1) + 1]
+        val osize = _size
+        if (osize <= 1) {
+            // Now empty.
+            if (DEBUG) {
+                println("$TAG remove: shrink from $hashes.size to 0")
+            }
+            clear()
+        } else {
+            val nsize = osize - 1
+            if (hashes.size > BASE_SIZE * 2 && osize < hashes.size / 3) {
+                // Shrunk enough to reduce size of arrays.  We don't allow it to
+                // shrink smaller than (BASE_SIZE*2) to avoid flapping between
+                // that and BASE_SIZE.
+                val n =
+                    if (osize > BASE_SIZE * 2) osize + (osize shr 1) else BASE_SIZE * 2
+                if (DEBUG) {
+                    println("$TAG remove: shrink from $hashes.size to $n")
+                }
+                val ohashes = hashes
+                val oarray: Array<Any?> = keyValues
+
+                hashes = IntArray(n)
+                keyValues = arrayOfNulls<Any?>(n shl 1)
+
+                if (CONCURRENT_MODIFICATION_EXCEPTIONS && osize != _size) {
+                    throw ConcurrentModificationException()
+                }
+                if (index > 0) {
+                    if (DEBUG) {
+                        println("$TAG remove: copy from 0-$index to 0")
+                    }
+                    ohashes.copyInto(hashes, 0, 0, index)
+                    oarray.copyInto(keyValues, 0, 0, index shl 1)
+                }
+                if (index < nsize) {
+                    if (DEBUG) {
+                        println("$TAG remove: copy from ${index + 1}-$nsize to $index")
+                    }
+                    ohashes.copyInto(hashes, index, index + 1, nsize + 1)
+                    oarray.copyInto(keyValues, index shl 1, (index + 1) shl 1, (nsize + 1) shl 1)
+                }
+            } else {
+                if (index < nsize) {
+                    if (DEBUG) println("$TAG remove: move ${index + 1}-$nsize to $index")
+                    hashes.copyInto(hashes, index, index + 1, nsize + 1)
+                    keyValues.copyInto(keyValues, index shl 1, (index + 1) shl 1, (nsize + 1) shl 1)
+                }
+                keyValues[nsize shl 1] = null
+                keyValues[(nsize shl 1) + 1] = null
+            }
+            if (CONCURRENT_MODIFICATION_EXCEPTIONS && osize != _size) {
+                throw ConcurrentModificationException()
+            }
+            _size = nsize
+        }
+        return old as V
+    }
+
+    /**
+     * Replace the mapping for {@code key} only if it is already mapped to a value.
+     * @param key The key of the mapping to replace.
+     * @param value The value to store for the given key.
+     * @return Returns the previous mapped value or null.
+     */
+    open fun replace(key: K, value: V): V? {
+        val index = indexOfKey(key)
+        return if (index >= 0) setValueAt(index, value) else null
+    }
+
+    /**
+     * Replace the mapping for {@code key} only if it is already mapped to a value.
+     *
+     * @param key The key of the mapping to replace.
+     * @param oldValue The value expected to be mapped to the key.
+     * @param newValue The value to store for the given key.
+     * @return Returns true if the value was replaced.
+     */
+    open fun replace(key: K, oldValue: V, newValue: V): Boolean {
+        val index = indexOfKey(key)
+        if (index >= 0) {
+            val mapValue = valueAt(index)
+            if (mapValue === oldValue) {
+                setValueAt(index, newValue)
+                return true
+            }
+        }
+        return false
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p>This implementation returns false if the object is not a Map or
+     * SimpleArrayMap, or if the maps have different sizes. Otherwise, for each
+     * key in this map, values of both maps are compared. If the values for any
+     * key are not equal, the method returns false, otherwise it returns true.
+     */
+    @Suppress("UNCHECKED_CAST")
+    open override fun equals(other: Any?): Boolean {
+        if (this === other) {
+            return true
+        }
+
+        try {
+            if (other is SimpleArrayMap<*, *>) {
+                val map = other as SimpleArrayMap<in Any?, in Any?>
+                if (_size != map._size) {
+                    return false
+                }
+
+                for (i in 0 until _size) {
+                    val key = keyAt(i)
+                    val mine: V? = valueAt(i)
+                    // TODO use index-based ops for this
+                    val theirs = map.get(key)
+                    if (mine == null) {
+                        if (theirs != null || !map.containsKey(key)) {
+                            return false
+                        }
+                    } else if (mine != theirs) {
+                        return false
+                    }
+                }
+                return true
+            } else if (other is Map<*, *>) {
+                val map = other
+                if (_size != map.size) {
+                    return false
+                }
+                for (i in 0 until _size) {
+                    val key = keyAt(i)
+                    val mine: V? = valueAt(i)
+                    val theirs = map[key]
+                    if (mine == null) {
+                        if (theirs != null || !map.containsKey(key)) {
+                            return false
+                        }
+                    } else if (mine != theirs) {
+                        return false
+                    }
+                }
+                return true
+            }
+        } catch (ignored: NullPointerException) {
+        } catch (ignored: ClassCastException) {
+        }
+        return false
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    open override fun hashCode(): Int {
+        val hashes = hashes
+        val array: Array<Any?> = keyValues
+        var result = 0
+        var i = 0
+        var v = 1
+        val s = _size
+        while (i < s) {
+            val value = array[v]
+            result += hashes[i] xor (value?.hashCode() ?: 0)
+            i++
+            v += 2
+        }
+        return result
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p>This implementation composes a string by iterating over its mappings. If
+     * this map contains itself as a key or a value, the string "(this Map)"
+     * will appear in its place.
+     */
+    open override fun toString(): String {
+        if (isEmpty()) {
+            return "{}"
+        }
+
+        val buffer = StringBuilder(_size * 28)
+        buffer.append('{')
+        for (i in 0 until _size) {
+            if (i > 0) {
+                buffer.append(", ")
+            }
+            val key = keyAt(i)
+            if (key !== this) {
+                buffer.append(key)
+            } else {
+                buffer.append("(this Map)")
+            }
+            buffer.append('=')
+            val value = valueAt(i)
+            if (value !== this) {
+                buffer.append(value)
+            } else {
+                buffer.append("(this Map)")
+            }
+        }
+        buffer.append('}')
+        return buffer.toString()
+    }
+}
diff --git a/collection/collection2/src/jvmMain/java/androidx/collection/ArrayMap.java b/collection/collection2/src/jvmMain/java/androidx/collection/ArrayMap.java
new file mode 100644
index 0000000..86d45c9
--- /dev/null
+++ b/collection/collection2/src/jvmMain/java/androidx/collection/ArrayMap.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.collection;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Memory-efficient map of keys to values with list-style random-access semantics.
+ *
+ * @param <K> the type of keys maintained by this map
+ * @param <V> the type of mapped values
+ */
+public class ArrayMap<K, V> extends SimpleArrayMap<K, V> implements Map<K, V> {
+    @Nullable EntrySet<K, V> mEntrySet;
+    @Nullable KeySet<K, V> mKeySet;
+    @Nullable ValueCollection<K, V> mValues;
+
+    public ArrayMap() {
+        super();
+    }
+
+    /**
+     * Create a new ArrayMap with a given initial capacity.
+     */
+    public ArrayMap(int capacity) {
+        super(capacity);
+    }
+
+    /**
+     * Create a new ArrayMap with the mappings from the given ArrayMap.
+     */
+    @SuppressWarnings("unchecked")
+    public ArrayMap(@NonNull SimpleArrayMap<K, V> map) {
+        super(map);
+    }
+
+    @Override
+    @Nullable
+    @SuppressWarnings("unchecked")
+    public V get(@NonNull Object key) {
+        return super.get((K) key);
+    }
+
+    @Override
+    @Nullable
+    @SuppressWarnings("unchecked")
+    public V remove(@NonNull Object key) {
+        return super.remove((K) key);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public boolean containsKey(@Nullable Object value) {
+        return super.containsKey((K) value);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public boolean containsValue(@NonNull Object value) {
+        return super.containsValue((V) value);
+    }
+
+    /**
+     * Determine if the array map contains all of the keys in the given collection.
+     * @param collection The collection whose contents are to be checked against.
+     * @return Returns true if this array map contains a key for every entry
+     * in <var>collection</var>, else returns false.
+     */
+    public boolean containsAll(@NonNull Collection<?> collection) {
+        for (Object o : collection) {
+            if (!containsKey(o)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Perform a {@link #put(Object, Object)} of all key/value pairs in <var>map</var>
+     * @param map The map whose contents are to be retrieved.
+     */
+    @Override
+    public void putAll(@NonNull Map<? extends K, ? extends V> map) {
+        ensureCapacity(size() + map.size());
+        for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) {
+            put(entry.getKey(), entry.getValue());
+        }
+    }
+
+    /**
+     * Remove all keys in the array map that exist in the given collection.
+     * @param collection The collection whose contents are to be used to remove keys.
+     * @return Returns true if any keys were removed from the array map, else false.
+     */
+    public boolean removeAll(@NonNull Collection<?> collection) {
+        int oldSize = size();
+        for (Object o : collection) {
+            remove(o);
+        }
+        return oldSize != size();
+    }
+
+    /**
+     * Remove all keys in the array map that do <b>not</b> exist in the given collection.
+     * @param collection The collection whose contents are to be used to determine which
+     * keys to keep.
+     * @return Returns true if any keys were removed from the array map, else false.
+     */
+    public boolean retainAll(@NonNull Collection<?> collection) {
+        int oldSize = size();
+        for (int i = size() - 1; i >= 0; i--) {
+            if (!collection.contains(keyAt(i))) {
+                removeAt(i);
+            }
+        }
+        return oldSize != size();
+    }
+
+    /**
+     * Return a {@link java.util.Set} for iterating over and interacting with all mappings
+     * in the array map.
+     *
+     * <p><b>Note:</b> this is a very inefficient way to access the array contents, it
+     * requires generating a number of temporary objects.</p>
+     *
+     * <p><b>Note:</b></p> the semantics of this
+     * Set are subtly different than that of a {@link java.util.HashMap}: most important,
+     * the {@link java.util.Map.Entry Map.Entry} object returned by its iterator is a single
+     * object that exists for the entire iterator, so you can <b>not</b> hold on to it
+     * after calling {@link java.util.Iterator#next() Iterator.next}.</p>
+     */
+    @NonNull
+    @Override
+    public Set<Entry<K, V>> entrySet() {
+        Set<Entry<K, V>> entrySet = mEntrySet;
+        if (entrySet == null) {
+            entrySet = mEntrySet = new EntrySet<K, V>(this);
+        }
+        return entrySet;
+    }
+
+    /**
+     * Return a {@link java.util.Set} for iterating over and interacting with all keys
+     * in the array map.
+     *
+     * <p><b>Note:</b> this is a fairly inefficient way to access the array contents, it
+     * requires generating a number of temporary objects.</p>
+     */
+    @NonNull
+    @Override
+    public Set<K> keySet() {
+        Set<K> keySet = mKeySet;
+        if (keySet == null) {
+            keySet = mKeySet = new KeySet<K, V>(this);
+        }
+        return keySet;
+    }
+
+    /**
+     * Return a {@link java.util.Collection} for iterating over and interacting with all values
+     * in the array map.
+     *
+     * <p><b>Note:</b> this is a fairly inefficient way to access the array contents, it
+     * requires generating a number of temporary objects.</p>
+     */
+    @NonNull
+    @Override
+    public Collection<V> values() {
+        Collection<V> values = mValues;
+        if (values == null) {
+            values = mValues = new ValueCollection<K, V>(this);
+        }
+        return values;
+    }
+}
diff --git a/compose/androidview/androidview/integration-tests/androidview-demos/src/main/java/androidx/compose/androidview/demos/FocusTransferDemo.kt b/compose/androidview/androidview/integration-tests/androidview-demos/src/main/java/androidx/compose/androidview/demos/FocusTransferDemo.kt
index 8cb03ca..94db5fc 100644
--- a/compose/androidview/androidview/integration-tests/androidview-demos/src/main/java/androidx/compose/androidview/demos/FocusTransferDemo.kt
+++ b/compose/androidview/androidview/integration-tests/androidview-demos/src/main/java/androidx/compose/androidview/demos/FocusTransferDemo.kt
@@ -28,7 +28,6 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusModifier
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.input.pointer.pointerInput
@@ -40,6 +39,7 @@
 import androidx.recyclerview.widget.RecyclerView.ViewHolder
 import androidx.recyclerview.widget.RecyclerView.VERTICAL
 import androidx.compose.runtime.mutableStateOf
+import androidx.compose.ui.focus.focusTarget
 import androidx.compose.ui.focus.onFocusEvent
 import androidx.compose.ui.unit.sp
 
@@ -101,7 +101,7 @@
             .background(color)
             .focusRequester(focusRequester)
             .onFocusEvent { color = if (it.isFocused) Color.LightGray else Color.Unspecified }
-            .focusModifier()
+            .focusTarget()
             .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } },
         text = text,
         fontSize = 30.sp
diff --git a/compose/androidview/androidview/lint-baseline.xml b/compose/androidview/androidview/lint-baseline.xml
index 35f9352..42a176b 100644
--- a/compose/androidview/androidview/lint-baseline.xml
+++ b/compose/androidview/androidview/lint-baseline.xml
@@ -1,37 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling Method.invoke without an SDK check"
-        errorLine1="        val lp = prev ?: genDefaultLayoutParams.invoke(parent) as? ViewGroup.LayoutParams"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/androidview/adapters/LayoutBuilder.kt"
-            line="96"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Should explicitly declare type here since implicit type does not specify nullness"
-        errorLine1="    override fun getValue() = view.isChecked"
-        errorLine2="                 ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/androidview/adapters/CompoundButtonInputController.kt"
-            line="28"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Should explicitly declare type here since implicit type does not specify nullness"
-        errorLine1="    override fun getValue() = view.checkedRadioButtonId"
-        errorLine2="                 ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/androidview/adapters/RadioGroupInputController.kt"
-            line="24"
-            column="18"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
 </issues>
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimateEnterExitDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimateEnterExitDemo.kt
new file mode 100644
index 0000000..c7b78e3
--- /dev/null
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimateEnterExitDemo.kt
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.animation.demos
+
+import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.EnterExitState
+import androidx.compose.animation.ExitTransition
+import androidx.compose.animation.ExperimentalAnimationApi
+import androidx.compose.animation.core.ExperimentalTransitionApi
+import androidx.compose.animation.core.MutableTransitionState
+import androidx.compose.animation.core.Spring
+import androidx.compose.animation.core.animateFloat
+import androidx.compose.animation.core.spring
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
+import androidx.compose.animation.slideInVertically
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.Button
+import androidx.compose.material.FloatingActionButton
+import androidx.compose.material.Icon
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.dp
+
+/*
+ * This demo shows how to create a custom enter/exit animation for children of AnimatedVisibility
+ * using `AnimatedVisibilityScope.transition` combined with different `Enter/ExitTransition`
+ * for children of `AnimatedVisibility` using `Modifier.animateEnterExit`.
+ *
+ *  APIs used:
+ * - MutableTransitionState
+ * - EnterExitState
+ * - AnimatedVisibility
+ * - AnimatedVisibilityScope
+ * - Modifier.animateEnterExit
+ */
+@OptIn(ExperimentalAnimationApi::class, ExperimentalTransitionApi::class)
+@Composable
+fun AnimateEnterExitDemo() {
+    Box {
+        Column(Modifier.fillMaxSize()) {
+            Spacer(Modifier.size(40.dp))
+            val mainContentVisible = remember { MutableTransitionState(true) }
+            Button(
+                modifier = Modifier.align(Alignment.CenterHorizontally),
+                onClick = { mainContentVisible.targetState = !mainContentVisible.targetState },
+            ) {
+                Text("Toggle Visibility")
+            }
+            Spacer(Modifier.size(40.dp))
+            AnimatedVisibility(
+                visibleState = mainContentVisible,
+                modifier = Modifier.fillMaxSize(),
+                enter = fadeIn(),
+                exit = fadeOut()
+            ) {
+                Box {
+                    Column(Modifier.fillMaxSize()) {
+                        colors.forEachIndexed { index, color ->
+                            // Creates a custom enter/exit animation on scale using
+                            // `AnimatedVisibilityScope.transition`
+                            val scale by transition.animateFloat { enterExitState ->
+                                when (enterExitState) {
+                                    EnterExitState.PreEnter -> 0.9f
+                                    EnterExitState.Visible -> 1.0f
+                                    EnterExitState.PostExit -> 0.5f
+                                }
+                            }
+                            val staggeredSpring = remember {
+                                spring<IntOffset>(
+                                    stiffness = Spring.StiffnessLow * (1f - index * 0.2f)
+                                )
+                            }
+                            Box(
+                                Modifier.weight(1f).animateEnterExit(
+                                    // Staggered slide-in from bottom, while the parent
+                                    // AnimatedVisibility fades in everything (including this child)
+                                    enter = slideInVertically(
+                                        initialOffsetY = { it },
+                                        animationSpec = staggeredSpring
+                                    ),
+                                    // No built-in exit transition will be applied. It'll be
+                                    // faded out by parent AnimatedVisibility while scaling down
+                                    // by the scale animation.
+                                    exit = ExitTransition.None
+                                ).fillMaxWidth().padding(5.dp).graphicsLayer {
+                                    scaleX = scale
+                                    scaleY = scale
+                                }.clip(RoundedCornerShape(20.dp)).background(color)
+                            ) {}
+                        }
+                    }
+                    // This gets faded in/out by the parent AnimatedVisibility
+                    FloatingActionButton(
+                        onClick = {},
+                        modifier = Modifier.align(Alignment.BottomEnd).padding(20.dp),
+                        backgroundColor = MaterialTheme.colors.primary
+                    ) {
+                        Icon(Icons.Default.Favorite, contentDescription = null)
+                    }
+                }
+            }
+        }
+    }
+}
+
+private val colors = listOf(
+    Color(0xffff6f69),
+    Color(0xffffcc5c),
+    Color(0xff2a9d84),
+    Color(0xff264653)
+)
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimationDemos.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimationDemos.kt
index 1160261..44f797a 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimationDemos.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimationDemos.kt
@@ -45,9 +45,7 @@
                 },
                 ComposableDemo("Cross Fade") { CrossfadeDemo() },
                 ComposableDemo("Enter/ExitTransition Combo Demo") { EnterExitCombinationDemo() },
-                ComposableDemo("Sequential Enter/Exit Demo") {
-                    SequentialEnterExitDemo()
-                },
+                ComposableDemo("Modifier.animateEnterExit Demo") { AnimateEnterExitDemo() },
             )
         ),
         DemoCategory(
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SequentialEnterExitDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SequentialEnterExitDemo.kt
deleted file mode 100644
index e769f8b..0000000
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SequentialEnterExitDemo.kt
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.compose.animation.demos
-
-import androidx.compose.animation.AnimatedVisibility
-import androidx.compose.animation.AnimatedVisibilityScope
-import androidx.compose.animation.EnterExitState
-import androidx.compose.animation.ExitTransition
-import androidx.compose.animation.ExperimentalAnimationApi
-import androidx.compose.animation.core.ExperimentalTransitionApi
-import androidx.compose.animation.core.MutableTransitionState
-import androidx.compose.animation.core.animateFloat
-import androidx.compose.animation.core.tween
-import androidx.compose.animation.expandVertically
-import androidx.compose.animation.fadeIn
-import androidx.compose.animation.fadeOut
-import androidx.compose.animation.slideInVertically
-import androidx.compose.foundation.background
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material.Button
-import androidx.compose.material.FloatingActionButton
-import androidx.compose.material.Icon
-import androidx.compose.material.MaterialTheme
-import androidx.compose.material.Text
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.Favorite
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.clip
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.text.font.FontWeight.Companion.Bold
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.sp
-
-/*
- * This demo shows how to create a Transition<EnterExitState> with MutableTransitionState, and
- * use the Transition<EnterExitState> to animate a few enter/exit transitions together. The
- * MutableTransitionState is then used to add sequential enter/exit transitions.
- *
- *  APIs used:
- * - updateTransition
- * - MutableTransitionState
- * - EnterExitState
- */
-@OptIn(ExperimentalAnimationApi::class, ExperimentalTransitionApi::class)
-@Composable
-fun SequentialEnterExitDemo() {
-    Box {
-        var mainContentVisible by remember {
-            mutableStateOf(MutableTransitionState(true))
-        }
-        Column(Modifier.fillMaxSize()) {
-            Spacer(Modifier.size(40.dp))
-            Row(
-                modifier = Modifier.fillMaxWidth(),
-                horizontalArrangement = Arrangement.SpaceAround
-            ) {
-                // New MutableTransitionState instance here. This should reset the animation.
-                Button(onClick = { mainContentVisible = MutableTransitionState(false) }) {
-                    Text("Reset")
-                }
-
-                Button(
-                    onClick = { mainContentVisible.targetState = !mainContentVisible.targetState },
-                ) {
-                    Text("Toggle Visibility")
-                }
-            }
-            Spacer(Modifier.size(40.dp))
-            AnimatedVisibility(
-                visibleState = mainContentVisible,
-                modifier = Modifier.fillMaxSize(),
-                enter = fadeIn(),
-                exit = fadeOut()
-            ) {
-                Box {
-                    Column(Modifier.fillMaxSize()) {
-                        Item(Modifier.weight(1f), backgroundColor = Color(0xffff6f69))
-                        Item(Modifier.weight(1f), backgroundColor = Color(0xffffcc5c))
-                    }
-                    FloatingActionButton(
-                        onClick = {},
-                        modifier = Modifier.align(Alignment.BottomEnd).padding(20.dp),
-                        backgroundColor = MaterialTheme.colors.primary
-                    ) {
-                        Icon(Icons.Default.Favorite, contentDescription = null)
-                    }
-                }
-            }
-        }
-        AnimatedVisibility(
-            visible = mainContentVisible.targetState && mainContentVisible.isIdle,
-            modifier = Modifier.align(Alignment.Center),
-            enter = expandVertically(),
-            exit = fadeOut(animationSpec = tween(50))
-        ) {
-            Text("Transition Finished", color = Color.White, fontSize = 40.sp, fontWeight = Bold)
-        }
-    }
-}
-
-@OptIn(ExperimentalAnimationApi::class)
-@Composable
-private fun AnimatedVisibilityScope.Item(
-    modifier: Modifier,
-    backgroundColor: Color
-) {
-    val scale by transition.animateFloat { enterExitState ->
-        when (enterExitState) {
-            EnterExitState.PreEnter -> 0.9f
-            EnterExitState.Visible -> 1.0f
-            EnterExitState.PostExit -> 0.5f
-        }
-    }
-    Box(
-        modifier.fillMaxWidth().padding(5.dp).animateEnterExit(
-            enter = slideInVertically(initialOffsetY = { it }),
-            exit = ExitTransition.None
-        ).graphicsLayer {
-            scaleX = scale
-            scaleY = scale
-        }.clip(RoundedCornerShape(20.dp)).background(backgroundColor).fillMaxSize()
-    ) {}
-}
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SpringChainDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SpringChainDemo.kt
index 8ba6ba8..60b7658 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SpringChainDemo.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SpringChainDemo.kt
@@ -44,7 +44,6 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.input.pointer.consumeAllChanges
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.dp
@@ -55,8 +54,7 @@
     var leader by remember { mutableStateOf(Offset(200f, 200f)) }
     Box(
         Modifier.fillMaxSize().pointerInput(Unit) {
-            detectDragGestures { change, dragAmount ->
-                change.consumeAllChanges()
+            detectDragGestures { _, dragAmount ->
                 leader += dragAmount
             }
         }
diff --git a/compose/benchmark-utils/lint-baseline.xml b/compose/benchmark-utils/lint-baseline.xml
index 6773bc2..42a176b 100644
--- a/compose/benchmark-utils/lint-baseline.xml
+++ b/compose/benchmark-utils/lint-baseline.xml
@@ -1,74 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt`. Referenced from `com.sun.jna.Native.AWT`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna/5.5.0/jna-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.datatransfer`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.dnd`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.event`. Referenced from `com.sun.jna.platform.WindowUtils.NativeWindowUtils.1`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.geom`. Referenced from `com.sun.jna.platform.WindowUtils.NativeWindowUtils`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.image`. Referenced from `com.sun.jna.platform.RasterRangesUtils`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `javax.swing.text`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `javax.swing`. Referenced from `com.sun.jna.platform.WindowUtils.MacWindowUtils`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.lang.instrument`. Referenced from `kotlinx.coroutines.repackaged.net.bytebuddy.agent.ByteBuddyAgent`.">
-        <location
-            file="../../../../prebuilts/androidx/external/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.4.3/kotlinx-coroutines-debug-1.4.3.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.lang.management`. Referenced from `kotlinx.coroutines.repackaged.net.bytebuddy.agent.ByteBuddyAgent.ProcessProvider.ForCurrentVm.ForLegacyVm`.">
-        <location
-            file="../../../../prebuilts/androidx/external/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.4.3/kotlinx-coroutines-debug-1.4.3.jar"/>
-    </issue>
-
 </issues>
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
index 943df22..159fae8 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
@@ -3845,4 +3845,33 @@
             fun Text(text: String) { }
         """
     )
+
+    @Test
+    fun testReadOnlyComposableWithEarlyReturn() = controlFlow(
+        source = """
+            import androidx.compose.runtime.ReadOnlyComposable
+
+            @ReadOnlyComposable
+            @Composable
+            fun getSomeValue(a: Int): Int {
+                if (a < 100) return 0
+                return 1
+            }
+        """,
+        """
+            @ReadOnlyComposable
+            @Composable
+            fun getSomeValue(a: Int, %composer: Composer?, %changed: Int): Int {
+              sourceInformationMarkerStart(%composer, <>, "C(getSomeValue):Test.kt")
+              if (a < 100) {
+                val tmp1_return = 0
+                sourceInformationMarkerEnd(%composer)
+                return tmp1_return
+              }
+              val tmp0 = 1
+              sourceInformationMarkerEnd(%composer)
+              return tmp0
+            }
+        """
+    )
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
index 08e3fe9..e17879b 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
@@ -159,7 +159,7 @@
             project: Project,
             configuration: CompilerConfiguration
         ) {
-            val KOTLIN_VERSION_EXPECTATION = "1.5.0"
+            val KOTLIN_VERSION_EXPECTATION = "1.5.10"
             KotlinCompilerVersion.getVersion()?.let { version ->
                 val suppressKotlinVersionCheck = configuration.get(
                     ComposeConfiguration.SUPPRESS_KOTLIN_VERSION_COMPATIBILITY_CHECK,
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
index 4164418..5ef38c8 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
@@ -846,6 +846,15 @@
                 returnVar?.let { irReturn(declaration.symbol, irGet(it)) }
             )
         )
+        if (
+            elideGroups &&
+            collectSourceInformation &&
+            !declaration.descriptor.hasExplicitGroupsAnnotation()
+        ) {
+            scope.realizeEndCalls {
+                irSourceInformationMarkerEnd(body)
+            }
+        }
 
         return declaration
     }
@@ -3572,7 +3581,7 @@
                 }
             }
 
-            protected open fun realizeEndCalls(makeEnd: () -> IrExpression) {
+            open fun realizeEndCalls(makeEnd: () -> IrExpression) {
                 extraEndLocations.forEach {
                     it(makeEnd())
                 }
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt
index 701b519..55405aca 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt
@@ -87,6 +87,7 @@
 import androidx.compose.ui.input.pointer.PointerInputFilter
 import androidx.compose.ui.input.pointer.PointerInputModifier
 import androidx.compose.ui.input.pointer.pointerMoveFilter
+import androidx.compose.ui.platform.LocalUriHandler
 import androidx.compose.ui.res.imageResource
 import androidx.compose.ui.res.svgResource
 import androidx.compose.ui.res.vectorXmlResource
@@ -120,6 +121,7 @@
 
 @Composable
 private fun App() {
+    val uriHandler = LocalUriHandler.current
     DesktopMaterialTheme {
         Scaffold(
             topBar = {
@@ -137,9 +139,9 @@
             },
             floatingActionButton = {
                 ExtendedFloatingActionButton(
-                    text = { Text("BUTTON") },
+                    text = { Text("Open URL") },
                     onClick = {
-                        println("Floating button clicked")
+                        uriHandler.openUri("https://google.com")
                     }
                 )
             },
@@ -496,16 +498,16 @@
 private fun RightColumn(modifier: Modifier) = Box {
     val state = rememberLazyListState()
     val itemCount = 100000
-    val itemHeight = 20.dp
 
     LazyColumn(modifier.graphicsLayer(alpha = 0.5f), state = state) {
         items((1..itemCount).toList()) { x ->
+            val itemHeight = 20.dp + 20.dp * Math.random().toFloat()
             Text(x.toString(), Modifier.graphicsLayer(alpha = 0.5f).height(itemHeight))
         }
     }
 
     VerticalScrollbar(
-        rememberScrollbarAdapter(state, itemCount, itemHeight),
+        rememberScrollbarAdapter(state),
         Modifier.align(Alignment.CenterEnd)
     )
 }
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt
index c6a8e02..dc84d26 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt
@@ -415,8 +415,7 @@
 
     Surface(
         modifier = Modifier
-            .padding(start = 4.dp, top = 2.dp)
-            .clickable(onClick = { showMenu.value = true }),
+            .padding(start = 4.dp, top = 2.dp),
         color = Color(255, 255, 255, 40),
         shape = RoundedCornerShape(4.dp)
     ) {
@@ -425,6 +424,7 @@
             modifier = Modifier
                 .height(35.dp)
                 .padding(start = 4.dp, end = 4.dp)
+                .clickable(onClick = { showMenu.value = true })
         )
         ContextMenu(
             expanded = showMenu.value,
diff --git a/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/ui/window/WindowDraggableArea.jvm.kt b/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/ui/window/WindowDraggableArea.jvm.kt
index f07f39b..d39924f 100644
--- a/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/ui/window/WindowDraggableArea.jvm.kt
+++ b/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/ui/window/WindowDraggableArea.jvm.kt
@@ -14,71 +14,78 @@
  * limitations under the License.
  */
 
-@file:Suppress("DEPRECATION")
-
 package androidx.compose.ui.window
 
-import androidx.compose.desktop.AppFrame
-import androidx.compose.desktop.AppManager
+import androidx.compose.desktop.AppWindow
+import androidx.compose.desktop.LocalAppWindow
+import androidx.compose.foundation.gestures.awaitFirstDown
+import androidx.compose.foundation.gestures.drag
+import androidx.compose.foundation.gestures.forEachGesture
 import androidx.compose.foundation.layout.Box
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.unit.IntOffset
+import java.awt.event.MouseAdapter
+import java.awt.event.MouseEvent
+import java.awt.event.MouseMotionAdapter
 import java.awt.MouseInfo
+import java.awt.Point
 
+/**
+ * WindowDraggableArea is a component that allows you to drag the window using the mouse.
+ *
+ * @param modifier The modifier to be applied to the layout.
+ */
 @Composable
 fun WindowDraggableArea(
     modifier: Modifier = Modifier,
     content: @Composable() () -> Unit = {}
 ) {
+    val window = LocalAppWindow.current
+    val handler = remember { DragHandler(window) }
+
     Box(
-        modifier = modifier.dragGestureFilter(
-            dragObserver = remember { DragHandler() },
-            startDragImmediately = true
-        )
+        modifier = modifier.pointerInput(Unit) {
+            forEachGesture {
+                awaitPointerEventScope {
+                    awaitFirstDown()
+                    handler.register()
+                }
+            }
+        }
     ) {
         content()
     }
 }
 
-private class DragHandler : DragObserver {
+private class DragHandler(private val window: AppWindow) {
+    private var location = window.window.location.toComposeOffset()
+    private var pointStart = MouseInfo.getPointerInfo().location.toComposeOffset()
 
-    private var location = Offset.Zero
-    private var cursor = Offset.Zero
-    private lateinit var window: AppFrame
-
-    override fun onStart(downPosition: Offset) {
-        if (!this::window.isInitialized) {
-            window = AppManager.focusedWindow!!
+    private val dragListener = object : MouseMotionAdapter() {
+        override fun mouseDragged(event: MouseEvent) = drag()
+    }
+    private val removeListener = object : MouseAdapter() {
+        override fun mouseReleased(event: MouseEvent) {
+            window.removeMouseMotionListener(dragListener)
+            window.removeMouseListener(this)
         }
-        location = Offset(
-            window.x.toFloat(),
-            window.y.toFloat()
-        )
-        val point = MouseInfo.getPointerInfo().getLocation()
-        cursor = Offset(
-            point.x.toFloat(),
-            point.y.toFloat()
-        )
     }
 
-    override fun onStop(velocity: Offset) {
-        location = Offset.Zero
+    fun register() {
+        location = window.window.location.toComposeOffset()
+        pointStart = MouseInfo.getPointerInfo().location.toComposeOffset()
+        window.addMouseListener(removeListener)
+        window.addMouseMotionListener(dragListener)
     }
 
-    override fun onCancel() {
-        location = Offset.Zero
+    private fun drag() {
+        val point = MouseInfo.getPointerInfo().location.toComposeOffset()
+        val location = location + (point - pointStart)
+        window.setLocation(location.x, location.y)
     }
 
-    override fun onDrag(dragDistance: Offset): Offset {
-        val point = MouseInfo.getPointerInfo().getLocation()
-
-        window.setLocation(
-            (location.x - (cursor.x - point.x)).toInt(),
-            (location.y - (cursor.y - point.y)).toInt()
-        )
-
-        return dragDistance
-    }
+    private fun Point.toComposeOffset() = IntOffset(x, y)
 }
diff --git a/compose/foundation/foundation/api/1.0.0-beta08.txt b/compose/foundation/foundation/api/1.0.0-beta08.txt
index 7187ced..534cd03 100644
--- a/compose/foundation/foundation/api/1.0.0-beta08.txt
+++ b/compose/foundation/foundation/api/1.0.0-beta08.txt
@@ -36,6 +36,9 @@
     method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
   }
 
+  public final class Clickable_androidKt {
+  }
+
   public final class DarkTheme_androidKt {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
   }
@@ -649,6 +652,9 @@
   public final class StringHelpersKt {
   }
 
+  public final class StringHelpers_androidKt {
+  }
+
   public final class StringHelpers_jvmKt {
   }
 
@@ -685,6 +691,12 @@
   public final class TouchMode_androidKt {
   }
 
+  public final class UndoManagerKt {
+  }
+
+  public final class UndoManager_jvmKt {
+  }
+
 }
 
 package androidx.compose.foundation.text.selection {
diff --git a/compose/foundation/foundation/api/current.txt b/compose/foundation/foundation/api/current.txt
index 7187ced..534cd03 100644
--- a/compose/foundation/foundation/api/current.txt
+++ b/compose/foundation/foundation/api/current.txt
@@ -36,6 +36,9 @@
     method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
   }
 
+  public final class Clickable_androidKt {
+  }
+
   public final class DarkTheme_androidKt {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
   }
@@ -649,6 +652,9 @@
   public final class StringHelpersKt {
   }
 
+  public final class StringHelpers_androidKt {
+  }
+
   public final class StringHelpers_jvmKt {
   }
 
@@ -685,6 +691,12 @@
   public final class TouchMode_androidKt {
   }
 
+  public final class UndoManagerKt {
+  }
+
+  public final class UndoManager_jvmKt {
+  }
+
 }
 
 package androidx.compose.foundation.text.selection {
diff --git a/compose/foundation/foundation/api/public_plus_experimental_1.0.0-beta08.txt b/compose/foundation/foundation/api/public_plus_experimental_1.0.0-beta08.txt
index 5c3058e..7e9d3c0 100644
--- a/compose/foundation/foundation/api/public_plus_experimental_1.0.0-beta08.txt
+++ b/compose/foundation/foundation/api/public_plus_experimental_1.0.0-beta08.txt
@@ -38,6 +38,9 @@
     method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier combinedClickable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
   }
 
+  public final class Clickable_androidKt {
+  }
+
   public final class DarkTheme_androidKt {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
   }
@@ -685,6 +688,9 @@
   public final class StringHelpersKt {
   }
 
+  public final class StringHelpers_androidKt {
+  }
+
   public final class StringHelpers_jvmKt {
   }
 
@@ -721,6 +727,12 @@
   public final class TouchMode_androidKt {
   }
 
+  public final class UndoManagerKt {
+  }
+
+  public final class UndoManager_jvmKt {
+  }
+
 }
 
 package androidx.compose.foundation.text.selection {
diff --git a/compose/foundation/foundation/api/public_plus_experimental_current.txt b/compose/foundation/foundation/api/public_plus_experimental_current.txt
index 5c3058e..7e9d3c0 100644
--- a/compose/foundation/foundation/api/public_plus_experimental_current.txt
+++ b/compose/foundation/foundation/api/public_plus_experimental_current.txt
@@ -38,6 +38,9 @@
     method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier combinedClickable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
   }
 
+  public final class Clickable_androidKt {
+  }
+
   public final class DarkTheme_androidKt {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
   }
@@ -685,6 +688,9 @@
   public final class StringHelpersKt {
   }
 
+  public final class StringHelpers_androidKt {
+  }
+
   public final class StringHelpers_jvmKt {
   }
 
@@ -721,6 +727,12 @@
   public final class TouchMode_androidKt {
   }
 
+  public final class UndoManagerKt {
+  }
+
+  public final class UndoManager_jvmKt {
+  }
+
 }
 
 package androidx.compose.foundation.text.selection {
diff --git a/compose/foundation/foundation/api/restricted_1.0.0-beta08.txt b/compose/foundation/foundation/api/restricted_1.0.0-beta08.txt
index 7187ced..534cd03 100644
--- a/compose/foundation/foundation/api/restricted_1.0.0-beta08.txt
+++ b/compose/foundation/foundation/api/restricted_1.0.0-beta08.txt
@@ -36,6 +36,9 @@
     method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
   }
 
+  public final class Clickable_androidKt {
+  }
+
   public final class DarkTheme_androidKt {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
   }
@@ -649,6 +652,9 @@
   public final class StringHelpersKt {
   }
 
+  public final class StringHelpers_androidKt {
+  }
+
   public final class StringHelpers_jvmKt {
   }
 
@@ -685,6 +691,12 @@
   public final class TouchMode_androidKt {
   }
 
+  public final class UndoManagerKt {
+  }
+
+  public final class UndoManager_jvmKt {
+  }
+
 }
 
 package androidx.compose.foundation.text.selection {
diff --git a/compose/foundation/foundation/api/restricted_current.txt b/compose/foundation/foundation/api/restricted_current.txt
index 7187ced..534cd03 100644
--- a/compose/foundation/foundation/api/restricted_current.txt
+++ b/compose/foundation/foundation/api/restricted_current.txt
@@ -36,6 +36,9 @@
     method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
   }
 
+  public final class Clickable_androidKt {
+  }
+
   public final class DarkTheme_androidKt {
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
   }
@@ -649,6 +652,9 @@
   public final class StringHelpersKt {
   }
 
+  public final class StringHelpers_androidKt {
+  }
+
   public final class StringHelpers_jvmKt {
   }
 
@@ -685,6 +691,12 @@
   public final class TouchMode_androidKt {
   }
 
+  public final class UndoManagerKt {
+  }
+
+  public final class UndoManager_jvmKt {
+  }
+
 }
 
 package androidx.compose.foundation.text.selection {
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/SuspendingGesturesDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/SuspendingGesturesDemo.kt
index 2490b34..786b6ed 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/SuspendingGesturesDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/SuspendingGesturesDemo.kt
@@ -57,8 +57,6 @@
 import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.input.pointer.PointerInputScope
 import androidx.compose.ui.input.pointer.PointerType
-import androidx.compose.ui.input.pointer.consumeAllChanges
-import androidx.compose.ui.input.pointer.consumePositionChange
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.layout.onSizeChanged
 import androidx.compose.ui.unit.IntOffset
@@ -228,13 +226,12 @@
                     .requiredSize(50.dp)
                     .background(Color.Blue)
                     .pointerInput(Unit) {
-                        detectHorizontalDragGestures { change, dragDistance ->
+                        detectHorizontalDragGestures { _, dragDistance ->
                             val offsetPx = offset.toPx()
                             val newOffset =
                                 (offsetPx + dragDistance).coerceIn(0f, width - 50.dp.toPx())
                             val consumed = newOffset - offsetPx
                             if (consumed != 0f) {
-                                change.consumePositionChange()
                                 offset = newOffset.toDp()
                             }
                         }
@@ -256,13 +253,12 @@
                         .requiredSize(50.dp)
                         .background(Color.Red)
                         .pointerInput(Unit) {
-                            detectVerticalDragGestures { change, dragDistance ->
+                            detectVerticalDragGestures { _, dragDistance ->
                                 val offsetPx = offset.toPx()
                                 val newOffset = (offsetPx + dragDistance)
                                     .coerceIn(0f, height - 50.dp.toPx())
                                 val consumed = newOffset - offsetPx
                                 if (consumed != 0f) {
-                                    change.consumePositionChange()
                                     offset = newOffset.toDp()
                                 }
                             }
@@ -296,8 +292,7 @@
         Modifier.onSizeChanged {
             size = it
         }.pointerInput(Unit) {
-            detectVerticalDragGestures { change, dragAmount ->
-                change.consumePositionChange()
+            detectVerticalDragGestures { _, dragAmount ->
                 offsetY = (offsetY.toPx() + dragAmount)
                     .coerceIn(0f, size.height.toFloat() - 50.dp.toPx()).toDp()
             }
@@ -310,8 +305,7 @@
                 .requiredWidth(50.dp)
                 .fillMaxHeight()
                 .pointerInput(Unit) {
-                    detectHorizontalDragGestures { change, dragAmount ->
-                        change.consumePositionChange()
+                    detectHorizontalDragGestures { _, dragAmount ->
                         offsetX = (offsetX.toPx() + dragAmount)
                             .coerceIn(0f, size.width.toFloat() - 50.dp.toPx()).toDp()
                     }
@@ -346,8 +340,7 @@
                 .background(Color.Blue)
                 .requiredSize(50.dp)
                 .pointerInput(Unit) {
-                    detectDragGestures { change, dragAmount ->
-                        change.consumeAllChanges()
+                    detectDragGestures { _, dragAmount ->
                         offsetX.value = (offsetX.value + dragAmount.x)
                             .coerceIn(0f, size.width.toFloat() - 50.dp.toPx())
 
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragGestureDetectorSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragGestureDetectorSamples.kt
index 5578724..3342805 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragGestureDetectorSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/DragGestureDetectorSamples.kt
@@ -162,10 +162,9 @@
                 .width(50.dp)
                 .background(Color.Blue)
                 .pointerInput(Unit) {
-                    detectHorizontalDragGestures { change, dragAmount ->
+                    detectHorizontalDragGestures { _, dragAmount ->
                         val originalX = offsetX.value
                         val newValue = (originalX + dragAmount).coerceIn(0f, width - 50.dp.toPx())
-                        change.consumePositionChange()
                         offsetX.value = newValue
                     }
                 }
@@ -276,10 +275,9 @@
                 .height(50.dp)
                 .background(Color.Blue)
                 .pointerInput(Unit) {
-                    detectVerticalDragGestures { change, dragAmount ->
+                    detectVerticalDragGestures { _, dragAmount ->
                         val originalY = offsetY.value
                         val newValue = (originalY + dragAmount).coerceIn(0f, height - 50.dp.toPx())
-                        change.consumePositionChange()
                         offsetY.value = newValue
                     }
                 }
@@ -401,14 +399,13 @@
                 .size(50.dp)
                 .background(Color.Blue)
                 .pointerInput(Unit) {
-                    detectDragGestures { change, dragAmount ->
+                    detectDragGestures { _, dragAmount ->
                         val original = Offset(offsetX.value, offsetY.value)
                         val summed = original + dragAmount
                         val newValue = Offset(
                             x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
                             y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
                         )
-                        change.consumePositionChange()
                         offsetX.value = newValue.x
                         offsetY.value = newValue.y
                     }
@@ -432,14 +429,13 @@
                 .size(50.dp)
                 .background(Color.Blue)
                 .pointerInput(Unit) {
-                    detectDragGesturesAfterLongPress { change, dragAmount ->
+                    detectDragGesturesAfterLongPress { _, dragAmount ->
                         val original = Offset(offsetX.value, offsetY.value)
                         val summed = original + dragAmount
                         val newValue = Offset(
                             x = summed.x.coerceIn(0f, size.width - 50.dp.toPx()),
                             y = summed.y.coerceIn(0f, size.height - 50.dp.toPx())
                         )
-                        change.consumePositionChange()
                         offsetX.value = newValue.x
                         offsetY.value = newValue.y
                     }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt
index 4e5a7a8..dad4bc2 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt
@@ -16,7 +16,10 @@
 
 package androidx.compose.foundation
 
+import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.gestures.detectTapGestures
+import androidx.compose.foundation.gestures.draggable
+import androidx.compose.foundation.gestures.rememberDraggableState
 import androidx.compose.foundation.interaction.Interaction
 import androidx.compose.foundation.interaction.MutableInteractionSource
 import androidx.compose.foundation.interaction.PressInteraction
@@ -42,11 +45,14 @@
 import androidx.compose.ui.test.assertIsNotEnabled
 import androidx.compose.ui.test.cancel
 import androidx.compose.ui.test.center
+import androidx.compose.ui.test.centerLeft
+import androidx.compose.ui.test.centerRight
 import androidx.compose.ui.test.click
 import androidx.compose.ui.test.doubleClick
 import androidx.compose.ui.test.down
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.longClick
+import androidx.compose.ui.test.moveTo
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.performClick
@@ -426,6 +432,8 @@
 
         var scope: CoroutineScope? = null
 
+        rule.mainClock.autoAdvance = false
+
         rule.setContent {
             scope = rememberCoroutineScope()
             Box {
@@ -454,6 +462,18 @@
         rule.onNodeWithTag("myClickable")
             .performGesture { down(center) }
 
+        val halfTapIndicationDelay = TapIndicationDelay / 2
+
+        rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
+
+        // Haven't reached the tap delay yet, so we shouldn't have started a press
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        // Advance past the tap delay
+        rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
+
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
@@ -472,11 +492,224 @@
     }
 
     @Test
+    fun clickableTest_interactionSource_immediateRelease() {
+        val interactionSource = MutableInteractionSource()
+
+        var scope: CoroutineScope? = null
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box {
+                BasicText(
+                    "ClickableText",
+                    modifier = Modifier
+                        .testTag("myClickable")
+                        .combinedClickable(
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope!!.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performGesture {
+                down(center)
+                up()
+            }
+
+        // We haven't reached the tap delay, but we have finished a press so we should have
+        // emitted both press and release
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Release::class.java)
+            assertThat((interactions[1] as PressInteraction.Release).press)
+                .isEqualTo(interactions[0])
+        }
+    }
+
+    @Test
+    fun clickableTest_interactionSource_immediateCancel() {
+        val interactionSource = MutableInteractionSource()
+
+        var scope: CoroutineScope? = null
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box {
+                BasicText(
+                    "ClickableText",
+                    modifier = Modifier
+                        .testTag("myClickable")
+                        .combinedClickable(
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope!!.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performGesture {
+                down(center)
+                cancel()
+            }
+
+        // We haven't reached the tap delay, and a cancel was emitted, so no press should ever be
+        // shown
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+    }
+
+    @Test
+    fun clickableTest_interactionSource_immediateDrag() {
+        val interactionSource = MutableInteractionSource()
+
+        var scope: CoroutineScope? = null
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box {
+                BasicText(
+                    "ClickableText",
+                    modifier = Modifier
+                        .testTag("myClickable")
+                        .draggable(
+                            state = rememberDraggableState {},
+                            orientation = Orientation.Horizontal
+                        )
+                        .combinedClickable(
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope!!.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performGesture {
+                down(centerLeft)
+                moveTo(centerRight)
+            }
+
+        rule.mainClock.advanceTimeBy(TapIndicationDelay)
+
+        // We started a drag before the timeout, so no press should be emitted
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+    }
+
+    @Test
+    fun clickableTest_interactionSource_dragAfterTimeout() {
+        val interactionSource = MutableInteractionSource()
+
+        var scope: CoroutineScope? = null
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box {
+                BasicText(
+                    "ClickableText",
+                    modifier = Modifier
+                        .testTag("myClickable")
+                        .draggable(
+                            state = rememberDraggableState {},
+                            orientation = Orientation.Horizontal
+                        )
+                        .combinedClickable(
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope!!.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performGesture {
+                down(centerLeft)
+            }
+
+        rule.mainClock.advanceTimeBy(TapIndicationDelay)
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performGesture {
+                moveTo(centerRight)
+            }
+
+        // The drag should cancel the press
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Cancel::class.java)
+            assertThat((interactions[1] as PressInteraction.Cancel).press)
+                .isEqualTo(interactions[0])
+        }
+    }
+
+    @Test
     fun clickableTest_interactionSource_cancelledGesture() {
         val interactionSource = MutableInteractionSource()
 
         var scope: CoroutineScope? = null
 
+        rule.mainClock.autoAdvance = false
+
         rule.setContent {
             scope = rememberCoroutineScope()
             Box {
@@ -505,6 +738,8 @@
         rule.onNodeWithTag("myClickable")
             .performGesture { down(center) }
 
+        rule.mainClock.advanceTimeBy(TapIndicationDelay)
+
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
@@ -529,6 +764,8 @@
 
         var scope: CoroutineScope? = null
 
+        rule.mainClock.autoAdvance = false
+
         rule.setContent {
             scope = rememberCoroutineScope()
             Box {
@@ -559,6 +796,8 @@
         rule.onNodeWithTag("myClickable")
             .performGesture { down(center) }
 
+        rule.mainClock.advanceTimeBy(TapIndicationDelay)
+
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
@@ -569,6 +808,8 @@
             emitClickableText = false
         }
 
+        rule.mainClock.advanceTimeByFrame()
+
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
@@ -578,6 +819,158 @@
         }
     }
 
+    /**
+     * Regression test for b/186223077
+     *
+     * Tests that if a long click causes the long click lambda to change instances, we will still
+     * correctly wait for the up event and emit [PressInteraction.Release].
+     */
+    @Test
+    @LargeTest
+    fun clickableTest_longClick_interactionSource_continuesTrackingPressAfterLambdasChange() {
+        val interactionSource = MutableInteractionSource()
+
+        var onLongClick by mutableStateOf({})
+        val finalLongClick = {}
+        val initialLongClick = { onLongClick = finalLongClick }
+        // Simulate the long click causing a recomposition, and changing the lambda instance
+        onLongClick = initialLongClick
+
+        var scope: CoroutineScope? = null
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box {
+                BasicText(
+                    "ClickableText",
+                    modifier = Modifier
+                        .testTag("myClickable")
+                        .combinedClickable(
+                            onLongClick = onLongClick,
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope!!.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+            assertThat(onLongClick).isEqualTo(initialLongClick)
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performGesture { down(center) }
+
+        // Simulate a long click
+        rule.mainClock.advanceTimeBy(1000)
+        // Run another frame to trigger recomposition caused by the long click
+        rule.mainClock.advanceTimeByFrame()
+
+        // We should have a press interaction, with no release, even though the lambda instance
+        // has changed
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(onLongClick).isEqualTo(finalLongClick)
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performGesture { up() }
+
+        // The up should now cause a release
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Release::class.java)
+            assertThat((interactions[1] as PressInteraction.Release).press)
+                .isEqualTo(interactions[0])
+        }
+    }
+
+    /**
+     * Regression test for b/186223077
+     *
+     * Tests that if a long click causes the long click lambda to become null, we will emit
+     * [PressInteraction.Cancel].
+     */
+    @Test
+    @LargeTest
+    fun clickableTest_longClick_interactionSource_cancelsIfLongClickBecomesNull() {
+        val interactionSource = MutableInteractionSource()
+
+        var onLongClick: (() -> Unit)? by mutableStateOf(null)
+        val initialLongClick = { onLongClick = null }
+        // Simulate the long click causing a recomposition, and changing the lambda to be null
+        onLongClick = initialLongClick
+
+        var scope: CoroutineScope? = null
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box {
+                BasicText(
+                    "ClickableText",
+                    modifier = Modifier
+                        .testTag("myClickable")
+                        .combinedClickable(
+                            onLongClick = onLongClick,
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope!!.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+            assertThat(onLongClick).isEqualTo(initialLongClick)
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performGesture { down(center) }
+
+        // Initial press
+        rule.mainClock.advanceTimeBy(100)
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(onLongClick).isEqualTo(initialLongClick)
+        }
+
+        // Long click
+        rule.mainClock.advanceTimeBy(1000)
+        // Run another frame to trigger recomposition caused by the long click
+        rule.mainClock.advanceTimeByFrame()
+
+        // The new onLongClick lambda should be null, and so we should cancel the existing press.
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Cancel::class.java)
+            assertThat((interactions[1] as PressInteraction.Cancel).press)
+                .isEqualTo(interactions[0])
+            assertThat(onLongClick).isNull()
+        }
+    }
+
     @Test
     @LargeTest
     fun clickableTest_click_withDoubleClick_andLongClick_disabled() {
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ImageTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ImageTest.kt
index 7213320..26f5646 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ImageTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ImageTest.kt
@@ -51,6 +51,7 @@
 import androidx.compose.ui.semantics.SemanticsProperties
 import androidx.compose.ui.test.SemanticsMatcher
 import androidx.compose.ui.test.assert
+import androidx.compose.ui.test.assertContentDescriptionEquals
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
@@ -576,7 +577,7 @@
         }
         rule.onNodeWithTag(testTag)
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Image))
-            .assert(SemanticsMatcher.expectValue(SemanticsProperties.ContentDescription, "asdf"))
+            .assertContentDescriptionEquals("asdf")
     }
 
     @Test
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/IndicationTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/IndicationTest.kt
index 0887889..8332d6f 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/IndicationTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/IndicationTest.kt
@@ -98,6 +98,8 @@
 
         var scope: CoroutineScope? = null
 
+        rule.mainClock.autoAdvance = false
+
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(
@@ -121,9 +123,14 @@
             .performGesture {
                 down(center)
             }
+
+        // Advance past the tap timeout
+        rule.mainClock.advanceTimeBy(TapIndicationDelay)
+
         rule.runOnIdle {
             assertThat(countDownLatch.count).isEqualTo(1)
         }
+
         rule.onNodeWithTag(testTag)
             .assertExists()
             .performGesture {
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollTest.kt
index ed52e33..cd74198 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollTest.kt
@@ -15,6 +15,7 @@
  */
 package androidx.compose.foundation
 
+import android.os.Build
 import android.os.Handler
 import android.os.Looper
 import androidx.annotation.RequiresApi
@@ -24,16 +25,23 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.text.BasicText
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.testutils.assertPixels
+import androidx.compose.testutils.assertShape
 import androidx.compose.testutils.runBlockingWithManualClock
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.drawBehind
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.platform.InspectableValue
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
@@ -822,4 +830,73 @@
             )
         }
     }
+
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun horizontalScroller_doesNotClipVerticalOverdraw() {
+        rule.setContent {
+            Box(Modifier.size(60.dp).testTag("container").background(Color.Gray)) {
+                Row(
+                    Modifier
+                        .padding(20.dp)
+                        .fillMaxSize()
+                        .horizontalScroll(rememberScrollState(20))
+                ) {
+                    repeat(4) {
+                        Box(Modifier.size(20.dp).drawOutsideOfBounds())
+                    }
+                }
+            }
+        }
+
+        rule.onNodeWithTag("container")
+            .captureToImage()
+            .assertShape(
+                density = rule.density,
+                shape = RectangleShape,
+                shapeColor = Color.Red,
+                backgroundColor = Color.Gray,
+                horizontalPadding = 20.dp,
+                verticalPadding = 0.dp
+            )
+    }
+
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun verticalScroller_doesNotClipHorizontalOverdraw() {
+        rule.setContent {
+            Box(Modifier.size(60.dp).testTag("container").background(Color.Gray)) {
+                Column(
+                    Modifier
+                        .padding(20.dp)
+                        .fillMaxSize()
+                        .verticalScroll(rememberScrollState(20))
+                ) {
+                    repeat(4) {
+                        Box(Modifier.size(20.dp).drawOutsideOfBounds())
+                    }
+                }
+            }
+        }
+
+        rule.onNodeWithTag("container")
+            .captureToImage()
+            .assertShape(
+                density = rule.density,
+                shape = RectangleShape,
+                shapeColor = Color.Red,
+                backgroundColor = Color.Gray,
+                horizontalPadding = 0.dp,
+                verticalPadding = 20.dp
+            )
+    }
+
+    private fun Modifier.drawOutsideOfBounds() = drawBehind {
+        val inflate = 20.dp.roundToPx().toFloat()
+        drawRect(
+            Color.Red,
+            Offset(-inflate, -inflate),
+            Size(size.width + inflate * 2, size.height + inflate * 2)
+        )
+    }
 }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
index 2100042..ab56755 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
@@ -136,6 +136,8 @@
 
         var scope: CoroutineScope? = null
 
+        rule.mainClock.autoAdvance = false
+
         rule.setContent {
             scope = rememberCoroutineScope()
             Box {
@@ -165,6 +167,9 @@
         rule.onNodeWithText("SelectableText")
             .performGesture { down(center) }
 
+        // Advance past the tap timeout
+        rule.mainClock.advanceTimeBy(TapIndicationDelay)
+
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
@@ -189,6 +194,8 @@
 
         var scope: CoroutineScope? = null
 
+        rule.mainClock.autoAdvance = false
+
         rule.setContent {
             scope = rememberCoroutineScope()
             Box {
@@ -220,6 +227,9 @@
         rule.onNodeWithText("SelectableText")
             .performGesture { down(center) }
 
+        // Advance past the tap timeout
+        rule.mainClock.advanceTimeBy(TapIndicationDelay)
+
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
@@ -230,6 +240,8 @@
             emitSelectableText = false
         }
 
+        rule.mainClock.advanceTimeByFrame()
+
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt
index 096b95f..ae8fb8e 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt
@@ -221,6 +221,8 @@
 
         var scope: CoroutineScope? = null
 
+        rule.mainClock.autoAdvance = false
+
         rule.setContent {
             scope = rememberCoroutineScope()
             Box {
@@ -250,6 +252,9 @@
         rule.onNodeWithText("ToggleableText")
             .performGesture { down(center) }
 
+        // Advance past the tap timeout
+        rule.mainClock.advanceTimeBy(TapIndicationDelay)
+
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
@@ -274,6 +279,8 @@
 
         var scope: CoroutineScope? = null
 
+        rule.mainClock.autoAdvance = false
+
         rule.setContent {
             scope = rememberCoroutineScope()
             Box {
@@ -305,6 +312,9 @@
         rule.onNodeWithText("ToggleableText")
             .performGesture { down(center) }
 
+        // Advance past the tap timeout
+        rule.mainClock.advanceTimeBy(TapIndicationDelay)
+
         rule.runOnIdle {
             assertThat(interactions).hasSize(1)
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
@@ -315,6 +325,8 @@
             emitToggleableText = false
         }
 
+        rule.mainClock.advanceTimeByFrame()
+
         rule.runOnIdle {
             assertThat(interactions).hasSize(2)
             assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt
index c9037c3..5803e10 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt
@@ -29,6 +29,7 @@
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.requiredHeight
 import androidx.compose.foundation.layout.requiredSize
 import androidx.compose.foundation.layout.requiredSizeIn
@@ -44,12 +45,15 @@
 import androidx.compose.testutils.WithTouchSlop
 import androidx.compose.testutils.assertIsEqualTo
 import androidx.compose.testutils.assertPixels
+import androidx.compose.testutils.assertShape
 import androidx.compose.testutils.runBlockingWithManualClock
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.drawBehind
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
@@ -1440,6 +1444,36 @@
             .assertTopPositionInRootIsEqualTo(containerSize - itemSizeDp)
     }
 
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun lazyColumnDoesNotClipHorizontalOverdraw() {
+        rule.setContent {
+            Box(Modifier.size(60.dp).testTag("container").background(Color.Gray)) {
+                LazyColumn(
+                    Modifier
+                        .padding(20.dp)
+                        .fillMaxSize(),
+                    rememberLazyListState(1)
+                ) {
+                    items(4) {
+                        Box(Modifier.size(20.dp).drawOutsideOfBounds())
+                    }
+                }
+            }
+        }
+
+        rule.onNodeWithTag("container")
+            .captureToImage()
+            .assertShape(
+                density = rule.density,
+                shape = RectangleShape,
+                shapeColor = Color.Red,
+                backgroundColor = Color.Gray,
+                horizontalPadding = 0.dp,
+                verticalPadding = 20.dp
+            )
+    }
+
     private fun SemanticsNodeInteraction.assertTopPositionIsAlmost(expected: Dp) {
         getUnclippedBoundsInRoot().top.assertIsEqualTo(expected, tolerance = 1.dp)
     }
@@ -1486,3 +1520,12 @@
             )
         }
     }
+
+internal fun Modifier.drawOutsideOfBounds() = drawBehind {
+    val inflate = 20.dp.roundToPx().toFloat()
+    drawRect(
+        Color.Red,
+        Offset(-inflate, -inflate),
+        Size(size.width + inflate * 2, size.height + inflate * 2)
+    )
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt
index ecd3cba..e2b6fc5 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.foundation.lazy
 
+import android.os.Build
 import androidx.compose.animation.core.snap
 import androidx.compose.foundation.AutoTestFrameClock
 import androidx.compose.foundation.background
@@ -24,6 +25,8 @@
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.requiredHeight
 import androidx.compose.foundation.layout.requiredSize
 import androidx.compose.foundation.layout.requiredSizeIn
@@ -35,11 +38,13 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
 import androidx.compose.testutils.assertIsEqualTo
+import androidx.compose.testutils.assertShape
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.drawBehind
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.SemanticsNodeInteraction
@@ -49,6 +54,7 @@
 import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
 import androidx.compose.ui.test.assertPositionInRootIsEqualTo
 import androidx.compose.ui.test.assertWidthIsEqualTo
+import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.center
 import androidx.compose.ui.test.down
 import androidx.compose.ui.test.getUnclippedBoundsInRoot
@@ -63,6 +69,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.Dispatchers
@@ -1132,6 +1139,36 @@
             .assertLeftPositionInRootIsEqualTo(containerSize - itemSizeDp)
     }
 
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun lazyRowDoesNotClipHorizontalOverdraw() {
+        rule.setContent {
+            Box(Modifier.size(60.dp).testTag("container").background(Color.Gray)) {
+                LazyRow(
+                    Modifier
+                        .padding(20.dp)
+                        .fillMaxSize(),
+                    rememberLazyListState(1)
+                ) {
+                    items(4) {
+                        Box(Modifier.size(20.dp).drawOutsideOfBounds())
+                    }
+                }
+            }
+        }
+
+        rule.onNodeWithTag("container")
+            .captureToImage()
+            .assertShape(
+                density = rule.density,
+                shape = RectangleShape,
+                shapeColor = Color.Red,
+                backgroundColor = Color.Gray,
+                horizontalPadding = 20.dp,
+                verticalPadding = 0.dp
+            )
+    }
+
     private fun LazyListState.scrollBy(offset: Dp) {
         runBlocking(Dispatchers.Main + AutoTestFrameClock()) {
             animateScrollBy(with(rule.density) { offset.roundToPx().toFloat() }, snap())
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/shape/CutCornerShapeTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/shape/CutCornerShapeTest.kt
index 1dea097..6bfffcf 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/shape/CutCornerShapeTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/shape/CutCornerShapeTest.kt
@@ -249,8 +249,8 @@
     val diff = Path()
     val reverseDiff = Path()
     Assert.assertTrue(
-        diff.op(path1, path2, PathOperation.difference) &&
-            reverseDiff.op(path2, path1, PathOperation.difference) &&
+        diff.op(path1, path2, PathOperation.Difference) &&
+            reverseDiff.op(path2, path1, PathOperation.Difference) &&
             diff.isEmpty &&
             reverseDiff.isEmpty
     )
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
index c5c91e6..6feb1eb 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
@@ -546,7 +546,7 @@
 
         rule.onNodeWithTag(Tag)
             .assertEditableTextEquals("")
-            .assertTextEquals("label")
+            .assertTextEquals("label", includeEditableText = false)
             .assertHasClickAction()
             .assert(hasSetTextAction())
             .assert(hasImeAction(ImeAction.Default))
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Clickable.android.kt
similarity index 62%
copy from camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
copy to compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Clickable.android.kt
index bfc1884..8a0a070 100644
--- a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Clickable.android.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,8 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+package androidx.compose.foundation
 
-import static org.junit.Assert.assertNotNull;
+import android.view.ViewConfiguration
 
-import org.junit.Test;
-
-public class VersionNameTest {
-    @Test
-    public void testCurrentVersion_shouldNotEmpty() {
-        assertNotNull(VersionName.getCurrentVersion().getVersion());
-    }
-}
+internal actual val TapIndicationDelay: Long = ViewConfiguration.getTapTimeout().toLong()
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/StringHelpers.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/StringHelpers.android.kt
new file mode 100644
index 0000000..7d434a5
--- /dev/null
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/StringHelpers.android.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.foundation.text
+
+import java.text.BreakIterator
+
+internal actual fun String.findPrecedingBreak(index: Int): Int {
+    val it = BreakIterator.getCharacterInstance()
+    it.setText(this)
+    return it.preceding(index)
+}
+
+internal actual fun String.findFollowingBreak(index: Int): Int {
+    val it = BreakIterator.getCharacterInstance()
+    it.setText(this)
+    return it.following(index)
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
index 04c9bddb..ea8439bd 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
@@ -38,6 +38,10 @@
 import androidx.compose.ui.semantics.onLongClick
 import androidx.compose.ui.semantics.role
 import androidx.compose.ui.semantics.semantics
+import kotlinx.coroutines.cancelAndJoin
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
 
 /**
  * Configure component to receive clicks via input or accessibility "click" event.
@@ -257,18 +261,33 @@
 ) = composed(
     factory = {
         val onClickState = rememberUpdatedState(onClick)
+        val onLongClickState = rememberUpdatedState(onLongClick)
+        val onDoubleClickState = rememberUpdatedState(onDoubleClick)
+        val hasLongClick = onLongClick != null
+        val hasDoubleClick = onDoubleClick != null
         val pressedInteraction = remember { mutableStateOf<PressInteraction.Press?>(null) }
         val gesture = if (enabled) {
+            // Handles the case where a long click causes a null onLongClick lambda to be passed,
+            // so we can cancel the existing press.
+            DisposableEffect(hasLongClick) {
+                onDispose {
+                    pressedInteraction.value?.let { oldValue ->
+                        val interaction = PressInteraction.Cancel(oldValue)
+                        interactionSource.tryEmit(interaction)
+                        pressedInteraction.value = null
+                    }
+                }
+            }
             PressedInteractionSourceDisposableEffect(interactionSource, pressedInteraction)
-            Modifier.pointerInput(onDoubleClick, onLongClick, interactionSource) {
+            Modifier.pointerInput(interactionSource, hasLongClick, hasDoubleClick) {
                 detectTapGestures(
-                    onDoubleTap = if (onDoubleClick != null) {
-                        { onDoubleClick() }
+                    onDoubleTap = if (hasDoubleClick) {
+                        { onDoubleClickState.value?.invoke() }
                     } else {
                         null
                     },
-                    onLongPress = if (onLongClick != null) {
-                        { onLongClick() }
+                    onLongPress = if (hasLongClick) {
+                        { onLongClickState.value?.invoke() }
                     } else {
                         null
                     },
@@ -329,20 +348,51 @@
     interactionSource: MutableInteractionSource,
     pressedInteraction: MutableState<PressInteraction.Press?>
 ) {
-    val pressInteraction = PressInteraction.Press(pressPoint)
-    interactionSource.emit(pressInteraction)
-    pressedInteraction.value = pressInteraction
-    val success = tryAwaitRelease()
-    val endInteraction =
-        if (success) {
-            PressInteraction.Release(pressInteraction)
-        } else {
-            PressInteraction.Cancel(pressInteraction)
+    coroutineScope {
+        val delayJob = launch {
+            delay(TapIndicationDelay)
+            val pressInteraction = PressInteraction.Press(pressPoint)
+            interactionSource.emit(pressInteraction)
+            pressedInteraction.value = pressInteraction
         }
-    interactionSource.emit(endInteraction)
-    pressedInteraction.value = null
+        val success = tryAwaitRelease()
+        if (delayJob.isActive) {
+            delayJob.cancelAndJoin()
+            // The press released successfully, before the timeout duration - emit the press
+            // interaction instantly. No else branch - if the press was cancelled before the
+            // timeout, we don't want to emit a press interaction.
+            if (success) {
+                val pressInteraction = PressInteraction.Press(pressPoint)
+                val releaseInteraction = PressInteraction.Release(pressInteraction)
+                interactionSource.emit(pressInteraction)
+                interactionSource.emit(releaseInteraction)
+            }
+        } else {
+            pressedInteraction.value?.let { pressInteraction ->
+                val endInteraction = if (success) {
+                    PressInteraction.Release(pressInteraction)
+                } else {
+                    PressInteraction.Cancel(pressInteraction)
+                }
+                interactionSource.emit(endInteraction)
+            }
+        }
+        pressedInteraction.value = null
+    }
 }
 
+/**
+ * How long to wait before appearing 'pressed' (emitting [PressInteraction.Press]) - if a touch
+ * down will quickly become a drag / scroll, this timeout means that we don't show a press effect.
+ *
+ * TODO: b/168524931 currently this delay is always used since we will require API changes to
+ * allow clickable to know whether it 'is in a scrollable container' - ideally this delay should
+ * only be used if there is the possibility of a scroll / drag. We should also expose this /
+ * [handlePressInteraction] in some similar form, to make it easy for developers to also use this
+ * delay when handling presses.
+ */
+internal expect val TapIndicationDelay: Long
+
 @Composable
 @Suppress("ComposableModifierFactory")
 internal fun Modifier.genericClickableWithoutGesture(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Focusable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Focusable.kt
index 44cc30e..78aae1b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Focusable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Focusable.kt
@@ -26,7 +26,7 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
-import androidx.compose.ui.focus.focusModifier
+import androidx.compose.ui.focus.focusTarget
 import androidx.compose.ui.focus.onFocusChanged
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.semantics.focused
@@ -107,7 +107,7 @@
                     }
                 }
             }
-            .focusModifier()
+            .focusTarget()
     } else {
         Modifier
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
index 55f1ee3..4b7f5ee 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
@@ -40,7 +40,11 @@
 import androidx.compose.runtime.structuralEqualityPolicy
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
-import androidx.compose.ui.draw.clipToBounds
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.Outline
+import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.layout.LayoutModifier
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasureResult
@@ -53,7 +57,9 @@
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.semantics.verticalScrollAxisRange
 import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.launch
 import kotlin.math.roundToInt
 
@@ -294,7 +300,7 @@
             state = state
         )
         val layout = ScrollingLayoutModifier(state, reverseScrolling, isVertical)
-        semantics.then(scrolling).clipToBounds().then(layout)
+        semantics.then(scrolling).clipScrollableContainer(isVertical).then(layout)
     },
     inspectorInfo = debugInspectorInfo {
         name = "scroll"
@@ -340,19 +346,76 @@
 internal fun Constraints.assertNotNestingScrollableContainers(isVertical: Boolean) {
     if (isVertical) {
         check(maxHeight != Constraints.Infinity) {
-            "Nesting scrollable in the same direction layouts like ScrollableContainer and " +
-                "LazyColumn is not allowed. If you want to add a header before the list of" +
-                " items please take a look on LazyColumn component which has a DSL api which" +
+            "Nesting scrollable in the same direction layouts like LazyColumn and Column(Modifier" +
+                ".verticalScroll()) is not allowed. If you want to add a header before the list " +
+                "of items please take a look on LazyColumn component which has a DSL api which" +
                 " allows to first add a header via item() function and then the list of " +
                 "items via items()."
         }
     } else {
         check(maxWidth != Constraints.Infinity) {
-            "Nesting scrollable in the same direction layouts like ScrollableRow and " +
-                "LazyRow is not allowed. If you want to add a header before the list of " +
-                "items please take a look on LazyRow component which has a DSL api which " +
+            "Nesting scrollable in the same direction layouts like LazyRow and Row(Modifier" +
+                ".horizontalScroll() is not allowed. If you want to add a header before the list " +
+                "of items please take a look on LazyRow component which has a DSL api which " +
                 "allows to first add a fixed element via item() function and then the " +
                 "list of items via items()."
         }
     }
 }
+
+/**
+ * In the scrollable containers we want to clip the main axis sides in order to not display the
+ * content which is scrolled out. But once we apply clipToBounds() modifier on such containers it
+ * causes unexpected behavior as we also clip the content on the cross axis sides. It is
+ * unexpected as Compose components are not clipping by default. The most common case how it
+ * could be reproduced is a horizontally scrolling list of Cards. Cards have the elevation by
+ * default and such Cards will be drawn with clipped shadows on top and bottom. This was harder
+ * to reproduce in the Views system as usually scrolling containers like RecyclerView didn't have
+ * an opaque background which means the ripple was drawn on the surface on the first parent with
+ * background. In Compose as we don't clip by default we draw shadows right in place.
+ * We faced similar issue in Compose already with Androids Popups and Dialogs where we decided to
+ * just predefine some constant with a maximum elevation size we are not going to clip. We are
+ * going to reuse this technique here. This will improve how it works in most common cases. If the
+ * user will need to have a larger unclipped area for some reason they can always add the needed
+ * padding inside the scrollable area.
+ */
+internal fun Modifier.clipScrollableContainer(isVertical: Boolean) =
+    then(if (isVertical) VerticalScrollableClipModifier else HorizontalScrollableClipModifier)
+
+private val MaxSupportedElevation = 30.dp
+
+private val HorizontalScrollableClipModifier = Modifier.clip(object : Shape {
+    override fun createOutline(
+        size: Size,
+        layoutDirection: LayoutDirection,
+        density: Density
+    ): Outline {
+        val inflateSize = with(density) { MaxSupportedElevation.roundToPx().toFloat() }
+        return Outline.Rectangle(
+            Rect(
+                left = 0f,
+                top = -inflateSize,
+                right = size.width,
+                bottom = size.height + inflateSize
+            )
+        )
+    }
+})
+
+private val VerticalScrollableClipModifier = Modifier.clip(object : Shape {
+    override fun createOutline(
+        size: Size,
+        layoutDirection: LayoutDirection,
+        density: Density
+    ): Outline {
+        val inflateSize = with(density) { MaxSupportedElevation.roundToPx().toFloat() }
+        return Outline.Rectangle(
+            Rect(
+                left = -inflateSize,
+                top = 0f,
+                right = size.width + inflateSize,
+                bottom = size.height
+            )
+        )
+    }
+})
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
index 91c9ce7..7771b2c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
@@ -27,6 +27,7 @@
 import androidx.compose.ui.input.pointer.positionChangeConsumed
 import androidx.compose.ui.input.pointer.changedToUpIgnoreConsumed
 import androidx.compose.ui.input.pointer.consumeDownChange
+import androidx.compose.ui.input.pointer.consumePositionChange
 import androidx.compose.ui.input.pointer.isOutOfBounds
 import androidx.compose.ui.input.pointer.positionChange
 import androidx.compose.ui.input.pointer.positionChangeIgnoreConsumed
@@ -178,11 +179,11 @@
 /**
  * Gesture detector that waits for pointer down and touch slop in any direction and then
  * calls [onDrag] for each drag event. It follows the touch slop detection of
- * [awaitTouchSlopOrCancellation], so [onDrag] must consume the position change
- * if it wants to accept the drag motion. [onDragStart] will be called when touch slop in passed
+ * [awaitTouchSlopOrCancellation] but will consume the position change automatically
+ * once the touch slop has been crossed. [onDragStart] will be called when touch slop in passed
  * with the last known pointer position provided. [onDragEnd] is called after all pointers are up
- * and [onDragCancel] is called if another gesture has consumed pointer input, canceling
- * this gesture.
+ * and [onDragCancel] is called if another gesture has consumed pointer input, canceling this
+ * gesture.
  *
  * Example Usage:
  * @sample androidx.compose.foundation.samples.DetectDragGesturesSample
@@ -201,14 +202,20 @@
         awaitPointerEventScope {
             val down = awaitFirstDown(requireUnconsumed = false)
             var drag: PointerInputChange?
+            var overSlop = Offset.Zero
             do {
-                drag = awaitTouchSlopOrCancellation(down.id, onDrag)
+                drag = awaitTouchSlopOrCancellation(down.id) { change, over ->
+                    change.consumePositionChange()
+                    overSlop = over
+                }
             } while (drag != null && !drag.positionChangeConsumed())
             if (drag != null) {
                 onDragStart.invoke(drag.position)
+                onDrag(drag, overSlop)
                 if (
                     !drag(drag.id) {
                         onDrag(it, it.positionChange())
+                        it.consumePositionChange()
                     }
                 ) {
                     onDragCancel()
@@ -222,10 +229,10 @@
 
 /**
  * Gesture detector that waits for pointer down and long press, after which it calls [onDrag] for
- * each drag event. [onDrag] must consume the position change if it wants to accept the drag
- * motion. [onDragStart] will be called when long press in detected with the last known pointer
- * position provided. [onDragEnd] is called after all pointers are up and [onDragCancel] is
- * called if another gesture has consumed pointer input, canceling this gesture.
+ * each drag event. [onDragStart] will be called when long press in detected with the last known
+ * pointer position provided. [onDragEnd] is called after all pointers are up and [onDragCancel] is
+ * called if another gesture has consumed pointer input, canceling this gesture. This function
+ * will automatically consume all the position change after the long press.
  *
  * Example Usage:
  * @sample androidx.compose.foundation.samples.DetectDragWithLongPressGesturesSample
@@ -250,7 +257,12 @@
                 onDragStart.invoke(drag.position)
 
                 awaitPointerEventScope {
-                    if (drag(drag.id) { onDrag(it, it.positionChange()) }) {
+                    if (
+                        drag(drag.id) {
+                            onDrag(it, it.positionChange())
+                            it.consumePositionChange()
+                        }
+                    ) {
                         // consume up if we quit drag gracefully with the up
                         currentEvent.changes.fastForEach {
                             if (it.changedToUp()) {
@@ -358,11 +370,11 @@
 /**
  * Gesture detector that waits for pointer down and touch slop in the vertical direction and then
  * calls [onVerticalDrag] for each vertical drag event. It follows the touch slop detection of
- * [awaitVerticalTouchSlopOrCancellation], so [onVerticalDrag] must consume the position change
- * if it wants to accept the drag motion. [onDragStart] will be called when touch slop in passed
- * with the last known pointer position provided. [onDragEnd] is called after all pointers are up
- * and [onDragCancel] is called if another gesture has consumed pointer input, canceling
- * this gesture.
+ * [awaitVerticalTouchSlopOrCancellation], but will consume the position change automatically
+ * once the touch slop has been crossed. [onDragStart] will be called when
+ * touch slop in passed with the last known pointer position provided. [onDragEnd] is called
+ * after all pointers are up and [onDragCancel] is called if another gesture has consumed pointer
+ * input, canceling this gesture.
  *
  * This gesture detector will coordinate with [detectHorizontalDragGestures] and
  * [awaitHorizontalTouchSlopOrCancellation] to ensure only vertical or horizontal dragging
@@ -383,12 +395,18 @@
     forEachGesture {
         awaitPointerEventScope {
             val down = awaitFirstDown(requireUnconsumed = false)
-            val drag = awaitVerticalTouchSlopOrCancellation(down.id, onVerticalDrag)
+            var overSlop = 0f
+            val drag = awaitVerticalTouchSlopOrCancellation(down.id) { change, over ->
+                change.consumePositionChange()
+                overSlop = over
+            }
             if (drag != null) {
                 onDragStart.invoke(drag.position)
+                onVerticalDrag.invoke(drag, overSlop)
                 if (
                     verticalDrag(drag.id) {
                         onVerticalDrag(it, it.positionChange().y)
+                        it.consumePositionChange()
                     }
                 ) {
                     onDragEnd()
@@ -484,11 +502,11 @@
 /**
  * Gesture detector that waits for pointer down and touch slop in the horizontal direction and
  * then calls [onHorizontalDrag] for each horizontal drag event. It follows the touch slop
- * detection of [awaitHorizontalTouchSlopOrCancellation], so [onHorizontalDrag] must consume the position
- * change if it wants to accept the drag motion. [onDragStart] will be called when touch slop in
- * passed with the last known pointer position provided. [onDragEnd] is called after all pointers
- * are up and [onDragCancel] is called if another gesture has consumed pointer input, canceling
- * this gesture.
+ * detection of [awaitHorizontalTouchSlopOrCancellation], but will consume the position change
+ * automatically once the touch slop has been crossed. [onDragStart] will be called when touch
+ * slop in passed with the last known pointer position provided. [onDragEnd] is called after all
+ * pointers are up and [onDragCancel] is called if another gesture has consumed pointer input,
+ * canceling this gesture.
  *
  * This gesture detector will coordinate with [detectVerticalDragGestures] and
  * [awaitVerticalTouchSlopOrCancellation] to ensure only vertical or horizontal dragging is locked,
@@ -509,12 +527,18 @@
     forEachGesture {
         awaitPointerEventScope {
             val down = awaitFirstDown(requireUnconsumed = false)
-            val drag = awaitHorizontalTouchSlopOrCancellation(down.id, onHorizontalDrag)
+            var overSlop = 0f
+            val drag = awaitHorizontalTouchSlopOrCancellation(down.id) { change, over ->
+                change.consumePositionChange()
+                overSlop = over
+            }
             if (drag != null) {
                 onDragStart.invoke(drag.position)
+                onHorizontalDrag(drag, overSlop)
                 if (
                     horizontalDrag(drag.id) {
                         onHorizontalDrag(it, it.positionChange().x)
+                        it.consumePositionChange()
                     }
                 ) {
                     onDragEnd()
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
index 141341d..f8d7ba5 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
@@ -17,6 +17,7 @@
 package androidx.compose.foundation.lazy
 
 import androidx.compose.foundation.assertNotNestingScrollableContainers
+import androidx.compose.foundation.clipScrollableContainer
 import androidx.compose.foundation.gestures.FlingBehavior
 import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.gestures.scrollable
@@ -31,7 +32,6 @@
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.clipToBounds
 import androidx.compose.ui.layout.SubcomposeLayout
 import androidx.compose.ui.layout.SubcomposeLayoutState
 import androidx.compose.ui.platform.LocalLayoutDirection
@@ -89,7 +89,7 @@
                 flingBehavior = flingBehavior,
                 state = state
             )
-            .clipToBounds()
+            .clipScrollableContainer(isVertical)
             .padding(contentPadding)
             .then(state.remeasurementModifier)
     ) { constraints ->
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
index 1116439..55cb987 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
@@ -237,7 +237,10 @@
     // notify the EditProcessor of value every recomposition
     state.processor.reset(value, state.inputSession)
 
-    val manager = remember { TextFieldSelectionManager() }
+    val undoManager = remember { UndoManager() }
+    undoManager.snapshotIfNeeded(value)
+
+    val manager = remember { TextFieldSelectionManager(undoManager) }
     manager.offsetMapping = offsetMapping
     manager.visualTransformation = visualTransformation
     manager.onValueChange = onValueChangeWrapper
@@ -450,7 +453,8 @@
             value = value,
             editable = !readOnly,
             singleLine = maxLines == 1,
-            offsetMapping = offsetMapping
+            offsetMapping = offsetMapping,
+            undoManager = undoManager
         )
 
     // Modifiers that should be applied to the outer text field container. Usually those include
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyCommand.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyCommand.kt
index 3b76844..5b8d48d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyCommand.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyCommand.kt
@@ -84,5 +84,8 @@
     DESELECT(false),
 
     NEW_LINE(true),
-    TAB(true)
+    TAB(true),
+
+    UNDO(true),
+    REDO(true)
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyMapping.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyMapping.kt
index 5d393a5..d31dff4 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyMapping.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/KeyMapping.kt
@@ -37,12 +37,18 @@
     return object : KeyMapping {
         override fun map(event: KeyEvent): KeyCommand? {
             return when {
+                shortcutModifier(event) && event.isShiftPressed ->
+                    when (event.key) {
+                        Key.Z -> KeyCommand.REDO
+                        else -> null
+                    }
                 shortcutModifier(event) ->
                     when (event.key) {
                         Key.C, Key.Insert -> KeyCommand.COPY
                         Key.V -> KeyCommand.PASTE
                         Key.X -> KeyCommand.CUT
                         Key.A -> KeyCommand.SELECT_ALL
+                        Key.Z -> KeyCommand.UNDO
                         else -> null
                     }
                 event.isCtrlPressed -> null
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/LongPressTextDragObserver.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/LongPressTextDragObserver.kt
index 81c0edc..0d9075d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/LongPressTextDragObserver.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/LongPressTextDragObserver.kt
@@ -20,7 +20,6 @@
 import androidx.compose.foundation.gestures.detectDragGesturesAfterLongPress
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.input.pointer.PointerInputScope
-import androidx.compose.ui.input.pointer.consumeAllChanges
 
 internal interface TextDragObserver {
     fun onStart(startPoint: Offset)
@@ -36,8 +35,7 @@
     observer: TextDragObserver
 ) = detectDragGesturesAfterLongPress(
     onDragEnd = { observer.onStop() },
-    onDrag = { change, offset ->
-        change.consumeAllChanges()
+    onDrag = { _, offset ->
         observer.onDrag(offset)
     },
     onDragStart = {
@@ -50,8 +48,7 @@
     observer: TextDragObserver
 ) = detectDragGestures(
     onDragEnd = { observer.onStop() },
-    onDrag = { change, offset ->
-        change.consumeAllChanges()
+    onDrag = { _, offset ->
         observer.onDrag(offset)
     },
     onDragStart = {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.kt
index 9281ab6..a3a29cd 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.kt
@@ -52,6 +52,7 @@
     val singleLine: Boolean = false,
     val preparedSelectionState: TextPreparedSelectionState,
     val offsetMapping: OffsetMapping = OffsetMapping.Identity,
+    val undoManager: UndoManager? = null,
     private val keyMapping: KeyMapping = platformDefaultKeyMapping,
 ) {
     private fun EditCommand.apply() {
@@ -161,8 +162,16 @@
                 KeyCommand.SELECT_HOME -> moveCursorToHome().selectMovement()
                 KeyCommand.SELECT_END -> moveCursorToEnd().selectMovement()
                 KeyCommand.DESELECT -> deselect()
+                KeyCommand.UNDO -> {
+                    undoManager?.makeSnapshot(value)
+                    undoManager?.undo()?.let { [email protected](it) }
+                }
+                KeyCommand.REDO -> {
+                    undoManager?.redo()?.let { [email protected](it) }
+                }
             }
         }
+        undoManager?.forceNextSnapshot()
         return consumed
     }
 
@@ -189,7 +198,8 @@
     value: TextFieldValue,
     editable: Boolean,
     singleLine: Boolean,
-    offsetMapping: OffsetMapping
+    offsetMapping: OffsetMapping,
+    undoManager: UndoManager
 ) = composed {
     val preparedSelectionState = remember { TextPreparedSelectionState() }
     val processor = TextFieldKeyInput(
@@ -199,7 +209,8 @@
         editable = editable,
         singleLine = singleLine,
         offsetMapping = offsetMapping,
-        preparedSelectionState = preparedSelectionState
+        preparedSelectionState = preparedSelectionState,
+        undoManager = undoManager
     )
     Modifier.onKeyEvent(processor::process)
-}
\ No newline at end of file
+}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/UndoManager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/UndoManager.kt
new file mode 100644
index 0000000..d8f38fb
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/UndoManager.kt
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.foundation.text
+
+import androidx.compose.ui.text.input.TextFieldValue
+
+internal val SNAPSHOTS_INTERVAL_MILLIS = 5000
+
+internal expect fun timeNowMillis(): Long
+
+/**
+ * It keeps last snapshots of [TextFieldValue]. The total number of kept snapshots is limited but
+ * total number of characters in them and should not be more than [maxStoredCharacters]
+ * We add a new [TextFieldValue] to the chain in one of three conditions:
+ * 1. Keyboard command was executed (something was pasted, word was deleted etc.)
+ * 2. Before undo
+ * 3. If the last "snapshot" is older than [SNAPSHOTS_INTERVAL_MILLIS]
+ *
+ * In any case, we are not adding [TextFieldValue] if the content is the same. If text is the same
+ * but selection is changed we are not adding a new entry to the chain but update the selection for
+ * the last one.
+ */
+internal class UndoManager(
+    val maxStoredCharacters: Int = 100_000
+) {
+    private class Entry(
+        var next: Entry? = null,
+        var value: TextFieldValue
+    )
+
+    private var undoStack: Entry? = null
+    private var redoStack: Entry? = null
+    private var storedCharacters: Int = 0
+    private var lastSnapshot: Long? = null
+    private var forceNextSnapshot = false
+
+    /**
+     * It gives an undo manager a chance to save a snapshot if needed because either it's time
+     * for periodic snapshotting or snapshot was previously forced via [forceNextSnapshot]. It
+     * can be called during every TextField recomposition.
+     */
+    fun snapshotIfNeeded(value: TextFieldValue, now: Long = timeNowMillis()) {
+        if (forceNextSnapshot || now > (lastSnapshot ?: 0) + SNAPSHOTS_INTERVAL_MILLIS) {
+            lastSnapshot = now
+            makeSnapshot(value)
+        }
+    }
+
+    /**
+     * It forces making a snapshot during the next [snapshotIfNeeded] call
+     */
+    fun forceNextSnapshot() {
+        forceNextSnapshot = true
+    }
+
+    /**
+     * Unconditionally makes a new snapshot (if a value differs from the last one)
+     */
+    fun makeSnapshot(value: TextFieldValue) {
+        forceNextSnapshot = false
+        if (value == undoStack?.value) {
+            return
+        } else if (value.text == undoStack?.value?.text) {
+            // if text is the same, but selection / composition is different we a not making a
+            // new record, but update the last one
+            undoStack?.value = value
+            return
+        }
+        undoStack = Entry(
+            value = value,
+            next = undoStack
+        )
+        redoStack = null
+        storedCharacters += value.text.length
+
+        if (storedCharacters > maxStoredCharacters) {
+            removeLastUndo()
+        }
+    }
+
+    private fun removeLastUndo() {
+        var entry = undoStack
+        if (entry?.next == null) return
+        while (entry?.next?.next != null) {
+            entry = entry.next
+        }
+        entry?.next = null
+    }
+
+    fun undo(): TextFieldValue? {
+        return undoStack?.let { undoEntry ->
+            undoEntry.next?.let { nextEntry ->
+                undoStack = nextEntry
+                storedCharacters -= undoEntry.value.text.length
+                redoStack = Entry(
+                    value = undoEntry.value,
+                    next = redoStack
+                )
+                nextEntry.value
+            }
+        }
+    }
+
+    fun redo(): TextFieldValue? {
+        return redoStack?.let { redoEntry ->
+            redoStack = redoEntry.next
+            undoStack = Entry(
+                value = redoEntry.value,
+                next = undoStack
+            )
+            storedCharacters += redoEntry.value.text.length
+            redoEntry.value
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt
index 356d1ae..f5394fd 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt
@@ -19,6 +19,7 @@
 import androidx.compose.foundation.text.InternalFoundationTextApi
 import androidx.compose.foundation.text.TextDragObserver
 import androidx.compose.foundation.text.TextFieldState
+import androidx.compose.foundation.text.UndoManager
 import androidx.compose.foundation.text.detectDragGesturesWithObserver
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
@@ -53,7 +54,9 @@
 /**
  * A bridge class between user interaction to the text field selection.
  */
-internal class TextFieldSelectionManager {
+internal class TextFieldSelectionManager(
+    val undoManager: UndoManager? = null
+) {
 
     /**
      * The current [OffsetMapping] for text field.
@@ -443,6 +446,7 @@
         )
         onValueChange(newValue)
         setSelectionStatus(false)
+        undoManager?.forceNextSnapshot()
     }
 
     /**
@@ -470,6 +474,7 @@
         )
         onValueChange(newValue)
         setSelectionStatus(false)
+        undoManager?.forceNextSnapshot()
     }
 
     /*@VisibleForTesting*/
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Clickable.desktop.kt
similarity index 62%
copy from camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
copy to compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Clickable.desktop.kt
index bfc1884..dc4b353 100644
--- a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Clickable.desktop.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+package androidx.compose.foundation
 
-import static org.junit.Assert.assertNotNull;
-
-import org.junit.Test;
-
-public class VersionNameTest {
-    @Test
-    public void testCurrentVersion_shouldNotEmpty() {
-        assertNotNull(VersionName.getCurrentVersion().getVersion());
-    }
-}
+// TODO: b/168524931 - should this depend on the input device?
+internal actual val TapIndicationDelay: Long = 0L
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
index cbacbb1..926af66 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
@@ -22,6 +22,7 @@
 import androidx.compose.foundation.gestures.detectTapAndPress
 import androidx.compose.foundation.gestures.drag
 import androidx.compose.foundation.gestures.forEachGesture
+import androidx.compose.foundation.gestures.scrollBy
 import androidx.compose.foundation.interaction.DragInteraction
 import androidx.compose.foundation.interaction.MutableInteractionSource
 import androidx.compose.foundation.layout.Box
@@ -59,6 +60,7 @@
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.runBlocking
+import kotlin.math.abs
 import kotlin.math.roundToInt
 import kotlin.math.sign
 
@@ -117,6 +119,10 @@
  *
  * @param adapter [ScrollbarAdapter] that will be used to communicate with scrollable component
  * @param modifier the modifier to apply to this layout
+ * @param reverseLayout reverse the direction of scrolling and layout, when `true`
+ * and [LazyListState.firstVisibleItemIndex] == 0 then scrollbar
+ * will be at the bottom of the container.
+ * It is usually used in pair with `LazyColumn(reverseLayout = true)`
  * @param style [ScrollbarStyle] to define visual style of scrollbar
  * @param interactionSource [MutableInteractionSource] that will be used to dispatch
  * [DragInteraction.Start] when this Scrollbar is being dragged.
@@ -125,11 +131,13 @@
 fun VerticalScrollbar(
     adapter: ScrollbarAdapter,
     modifier: Modifier = Modifier,
+    reverseLayout: Boolean = false,
     style: ScrollbarStyle = LocalScrollbarStyle.current,
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
 ) = Scrollbar(
     adapter,
     modifier,
+    reverseLayout,
     style,
     interactionSource,
     isVertical = true
@@ -157,6 +165,10 @@
  *
  * @param adapter [ScrollbarAdapter] that will be used to communicate with scrollable component
  * @param modifier the modifier to apply to this layout
+ * @param reverseLayout reverse the direction of scrolling and layout, when `true`
+ * and [LazyListState.firstVisibleItemIndex] == 0 then scrollbar
+ * will be at the end of the container.
+ * It is usually used in pair with `LazyRow(reverseLayout = true)`
  * @param style [ScrollbarStyle] to define visual style of scrollbar
  * @param interactionSource [MutableInteractionSource] that will be used to dispatch
  * [DragInteraction.Start] when this Scrollbar is being dragged.
@@ -165,11 +177,13 @@
 fun HorizontalScrollbar(
     adapter: ScrollbarAdapter,
     modifier: Modifier = Modifier,
+    reverseLayout: Boolean = false,
     style: ScrollbarStyle = LocalScrollbarStyle.current,
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
 ) = Scrollbar(
     adapter,
     modifier,
+    reverseLayout,
     style,
     interactionSource,
     isVertical = false
@@ -181,6 +195,7 @@
 private fun Scrollbar(
     adapter: ScrollbarAdapter,
     modifier: Modifier = Modifier,
+    reverseLayout: Boolean,
     style: ScrollbarStyle,
     interactionSource: MutableInteractionSource,
     isVertical: Boolean
@@ -205,8 +220,8 @@
     }
 
     val minimalHeight = style.minimalHeight.toPx()
-    val sliderAdapter = remember(adapter, containerSize, minimalHeight) {
-        SliderAdapter(adapter, containerSize, minimalHeight)
+    val sliderAdapter = remember(adapter, containerSize, minimalHeight, reverseLayout) {
+        SliderAdapter(adapter, containerSize, minimalHeight, reverseLayout)
     }
 
     val scrollThickness = style.thickness.roundToPx()
@@ -335,18 +350,34 @@
  * Create and [remember] [ScrollbarAdapter] for lazy scrollable container and current instance of
  * [scrollState] and item configuration
  */
+@Suppress("UNUSED_PARAMETER")
 @ExperimentalFoundationApi
 @Composable
+@Deprecated(
+    "itemCount and averageItemSize are calculated automatically. Use " +
+        "another overload rememberScrollbarAdapter without passing them",
+    ReplaceWith("rememberScrollbarAdapter(scrollState)")
+)
 fun rememberScrollbarAdapter(
     scrollState: LazyListState,
     itemCount: Int,
     averageItemSize: Dp
 ): ScrollbarAdapter {
-    val averageItemSizePx = with(LocalDensity.current) {
-        averageItemSize.toPx()
+    return remember(scrollState) {
+        ScrollbarAdapter(scrollState)
     }
-    return remember(scrollState, itemCount, averageItemSizePx) {
-        ScrollbarAdapter(scrollState, itemCount, averageItemSizePx)
+}
+
+/**
+ * Create and [remember] [ScrollbarAdapter] for lazy scrollable container and current instance of
+ * [scrollState]
+ */
+@Composable
+fun rememberScrollbarAdapter(
+    scrollState: LazyListState,
+): ScrollbarAdapter {
+    return remember(scrollState) {
+        ScrollbarAdapter(scrollState)
     }
 }
 
@@ -386,22 +417,16 @@
         scrollState.maxValue.toFloat()
 }
 
-// TODO(demin): if item height is different then slider will have wrong
-//  position when we dragging it (we can drag it to the beginning, but content will not be at the
-//  beginning). We can implement adaptive scrollbar height after b/170472532
-
 /**
- * Experimental ScrollbarAdapter for lazy lists. Doesn't work stable with non-fixed item height.
+ * ScrollbarAdapter for lazy lists.
  *
  * [scrollState] is instance of [LazyListState] which is used by scrollable component
  *
- * Scrollbar size and position will be calculated by passed [itemCount] and [averageItemSize]
+ * Scrollbar size and position will be dynamically changed on the current visible content.
  *
  * Example:
  *     Box(Modifier.fillMaxSize()) {
  *         val state = rememberLazyListState()
- *         val itemCount = 100
- *         val itemHeight = 20.dp
  *
  *         LazyColumn(state = state) {
  *             ...
@@ -409,49 +434,77 @@
  *
  *         VerticalScrollbar(
  *             Modifier.align(Alignment.CenterEnd),
- *             rememberScrollbarAdapter(state, itemCount, itemHeight)
+ *             rememberScrollbarAdapter(state)
  *         )
  *     }
  */
-@ExperimentalFoundationApi
 fun ScrollbarAdapter(
-    scrollState: LazyListState,
-    itemCount: Int,
-    averageItemSize: Float
+    scrollState: LazyListState
 ): ScrollbarAdapter = LazyScrollbarAdapter(
-    scrollState, itemCount, averageItemSize
+    scrollState
 )
 
 private class LazyScrollbarAdapter(
-    private val scrollState: LazyListState,
-    private val itemCount: Int,
-    private val averageItemSize: Float
+    private val scrollState: LazyListState
 ) : ScrollbarAdapter {
-    init {
-        require(itemCount >= 0f) { "itemCount should be non-negative ($itemCount)" }
-        require(averageItemSize > 0f) { "averageItemSize should be positive ($averageItemSize)" }
-    }
-
     override val scrollOffset: Float
         get() = scrollState.firstVisibleItemIndex * averageItemSize +
             scrollState.firstVisibleItemScrollOffset
 
     override suspend fun scrollTo(containerSize: Int, scrollOffset: Float) {
-        val scrollOffsetCoerced = scrollOffset.coerceIn(0f, maxScrollOffset(containerSize))
+        val distance = scrollOffset - [email protected]
+
+        // if we scroll less than containerSize we need to use scrollBy function to avoid
+        // undesirable scroll jumps (when an item size is different)
+        //
+        // if we scroll more than containerSize we should immediately jump to this position
+        // without recreating all items between the current and the new position
+        if (abs(distance) <= containerSize) {
+            scrollState.scrollBy(distance)
+        } else {
+            snapTo(containerSize, scrollOffset)
+        }
+    }
+
+    private suspend fun snapTo(containerSize: Int, scrollOffset: Float) {
+        // In case of very big values, we can catch an overflow, so convert values to double and
+        // coerce them
+//        val averageItemSize = 26.000002f
+//        val scrollOffsetCoerced = 2.54490608E8.toFloat()
+//        val index = (scrollOffsetCoerced / averageItemSize).toInt() // 9788100
+//        val offset = (scrollOffsetCoerced - index * averageItemSize) // -16.0
+//        println(offset)
+
+        val maximumValue = maxScrollOffset(containerSize).toDouble()
+        val scrollOffsetCoerced = scrollOffset.toDouble().coerceIn(0.0, maximumValue)
+        val averageItemSize = averageItemSize.toDouble()
 
         val index = (scrollOffsetCoerced / averageItemSize)
             .toInt()
             .coerceAtLeast(0)
             .coerceAtMost(itemCount - 1)
 
-        scrollState.scrollToItem(
-            index = index,
-            scrollOffset = (scrollOffsetCoerced - index * averageItemSize).toInt()
-        )
+        val offset = (scrollOffsetCoerced - index * averageItemSize)
+            .toInt()
+            .coerceAtLeast(0)
+
+        scrollState.scrollToItem(index = index, scrollOffset = offset)
     }
 
     override fun maxScrollOffset(containerSize: Int) =
         averageItemSize * itemCount - containerSize
+
+    private val itemCount get() = scrollState.layoutInfo.totalItemsCount
+
+    private val averageItemSize by derivedStateOf {
+        scrollState
+            .layoutInfo
+            .visibleItemsInfo
+            .asSequence()
+            .map { it.size }
+            .average()
+            .toFloat()
+    }
 }
 
 /**
@@ -486,7 +539,8 @@
 private class SliderAdapter(
     val adapter: ScrollbarAdapter,
     val containerSize: Int,
-    val minHeight: Float
+    val minHeight: Float,
+    val reverseLayout: Boolean
 ) {
     private val contentSize get() = adapter.maxScrollOffset(containerSize) + containerSize
     private val visiblePart get() = containerSize.toFloat() / contentSize
@@ -503,7 +557,7 @@
             return if (extraContentSpace == 0f) 1f else extraScrollbarSpace / extraContentSpace
         }
 
-    var position: Float
+    private var rawPosition: Float
         get() = scrollScale * adapter.scrollOffset
         set(value) {
             runBlocking {
@@ -511,6 +565,16 @@
             }
         }
 
+    var position: Float
+        get() = if (reverseLayout) containerSize - size - rawPosition else rawPosition
+        set(value) {
+            rawPosition = if (reverseLayout) {
+                containerSize - size - value
+            } else {
+                value
+            }
+        }
+
     val bounds get() = position..position + size
 }
 
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/StringHelpers.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/StringHelpers.desktop.kt
new file mode 100644
index 0000000..c82e59b
--- /dev/null
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/StringHelpers.desktop.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.foundation.text
+
+import org.jetbrains.skija.BreakIterator
+
+internal actual fun String.findPrecedingBreak(index: Int): Int {
+    val it = BreakIterator.makeCharacterInstance()
+    it.setText(this)
+    return it.preceding(index)
+}
+
+internal actual fun String.findFollowingBreak(index: Int): Int {
+    val it = BreakIterator.makeCharacterInstance()
+    it.setText(this)
+    return it.following(index)
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
index 4b1be7e..02ac894 100644
--- a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
+++ b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
@@ -314,6 +314,35 @@
     @Suppress("SameParameterValue")
     @OptIn(ExperimentalFoundationApi::class)
     @Test(timeout = 3000)
+    fun `scroll in reversed lazy list`() {
+        runBlocking(Dispatchers.Main) {
+            lateinit var state: LazyListState
+
+            rule.setContent {
+                state = rememberLazyListState()
+                LazyTestBox(
+                    state,
+                    size = 100.dp,
+                    childSize = 20.dp,
+                    childCount = 20,
+                    scrollbarWidth = 10.dp,
+                    reverseLayout = true
+                )
+            }
+            rule.awaitIdle()
+
+            rule.onNodeWithTag("scrollbar").performGesture {
+                instantSwipe(start = Offset(0f, 99f), end = Offset(0f, 88f))
+            }
+            rule.awaitIdle()
+            assertEquals(2, state.firstVisibleItemIndex)
+            assertEquals(4, state.firstVisibleItemScrollOffset)
+        }
+    }
+
+    @Suppress("SameParameterValue")
+    @OptIn(ExperimentalFoundationApi::class)
+    @Test(timeout = 3000)
     fun `scroll by more than one page in lazy list`() {
         runBlocking(Dispatchers.Main) {
             lateinit var state: LazyListState
@@ -456,11 +485,13 @@
         childSize: Dp,
         childCount: Int,
         scrollbarWidth: Dp,
+        reverseLayout: Boolean = false
     ) = withTestEnvironment {
         Box(Modifier.size(size)) {
             LazyColumn(
                 Modifier.fillMaxSize().testTag("column"),
-                state
+                state,
+                reverseLayout = reverseLayout
             ) {
                 items((0 until childCount).toList()) {
                     Box(Modifier.size(childSize).testTag("box$it"))
@@ -468,7 +499,8 @@
             }
 
             VerticalScrollbar(
-                adapter = rememberScrollbarAdapter(state, childCount, childSize),
+                adapter = rememberScrollbarAdapter(state),
+                reverseLayout = reverseLayout,
                 modifier = Modifier
                     .width(scrollbarWidth)
                     .fillMaxHeight()
diff --git a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/text/selection/StringHelpersTest.kt b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/text/selection/StringHelpersTest.kt
new file mode 100644
index 0000000..650354d
--- /dev/null
+++ b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/text/selection/StringHelpersTest.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.foundation.text.selection
+
+import androidx.compose.foundation.text.findFollowingBreak
+import androidx.compose.foundation.text.findPrecedingBreak
+import com.google.common.truth.Truth.assertThat
+
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class StringHelpersTest {
+    val complexString = "\uD83E\uDDD1\uD83C\uDFFF\u200D\uD83E\uDDB0"
+
+    @Test
+    fun StringHelpersTest_findFollowingBreak() {
+        val result = complexString.findFollowingBreak(0)
+        assertThat(result).isEqualTo(7)
+    }
+
+    @Test
+    fun StringHelpersTest_findPrecedingBreak() {
+        val result = complexString.findPrecedingBreak(7)
+        assertThat(result).isEqualTo(0)
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/jvmMain/kotlin/androidx/compose/foundation/text/StringHelpers.jvm.kt b/compose/foundation/foundation/src/jvmMain/kotlin/androidx/compose/foundation/text/StringHelpers.jvm.kt
index 83d6794..410519b 100644
--- a/compose/foundation/foundation/src/jvmMain/kotlin/androidx/compose/foundation/text/StringHelpers.jvm.kt
+++ b/compose/foundation/foundation/src/jvmMain/kotlin/androidx/compose/foundation/text/StringHelpers.jvm.kt
@@ -16,19 +16,5 @@
 
 package androidx.compose.foundation.text
 
-import java.text.BreakIterator
-
 internal actual fun StringBuilder.appendCodePointX(codePoint: Int): StringBuilder =
-    this.appendCodePoint(codePoint)
-
-internal actual fun String.findPrecedingBreak(index: Int): Int {
-    val it = BreakIterator.getCharacterInstance()
-    it.setText(this)
-    return it.preceding(index)
-}
-
-internal actual fun String.findFollowingBreak(index: Int): Int {
-    val it = BreakIterator.getCharacterInstance()
-    it.setText(this)
-    return it.following(index)
-}
\ No newline at end of file
+    this.appendCodePoint(codePoint)
\ No newline at end of file
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java b/compose/foundation/foundation/src/jvmMain/kotlin/androidx/compose/foundation/text/UndoManager.jvm.kt
similarity index 62%
copy from camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
copy to compose/foundation/foundation/src/jvmMain/kotlin/androidx/compose/foundation/text/UndoManager.jvm.kt
index bfc1884..973b6c9a 100644
--- a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
+++ b/compose/foundation/foundation/src/jvmMain/kotlin/androidx/compose/foundation/text/UndoManager.jvm.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,6 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+package androidx.compose.foundation.text
 
-import static org.junit.Assert.assertNotNull;
-
-import org.junit.Test;
-
-public class VersionNameTest {
-    @Test
-    public void testCurrentVersion_shouldNotEmpty() {
-        assertNotNull(VersionName.getCurrentVersion().getVersion());
-    }
-}
+internal actual fun timeNowMillis(): Long = System.currentTimeMillis()
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/gestures/DragGestureDetectorTest.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/gestures/DragGestureDetectorTest.kt
index 7635daa..87de79a 100644
--- a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/gestures/DragGestureDetectorTest.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/gestures/DragGestureDetectorTest.kt
@@ -28,6 +28,7 @@
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
 import org.junit.runners.Parameterized
 
 @RunWith(Parameterized::class)
@@ -55,14 +56,29 @@
     private var gestureCanceled = false
     private var consumePositiveOnly = false
     private var sloppyDetector = false
+    private var startOrder = -1
+    private var endOrder = -1
+    private var cancelOrder = -1
+    private var dragOrder = -1
 
     private val DragTouchSlopUtil = SuspendingGestureTestUtil(width = 100, height = 100) {
+        var count = 0
         detectDragGestures(
-            onDragStart = { gestureStarted = true },
-            onDragEnd = { gestureEnded = true },
-            onDragCancel = { gestureCanceled = true }
+            onDragStart = {
+                gestureStarted = true
+                startOrder = count++
+            },
+            onDragEnd = {
+                gestureEnded = true
+                endOrder = count++
+            },
+            onDragCancel = {
+                gestureCanceled = true
+                cancelOrder = count++
+            }
         ) { change, dragAmount ->
             val positionChange = change.positionChange()
+            dragOrder = count++
             if (positionChange.x > 0f || positionChange.y > 0f || !consumePositiveOnly) {
                 change.consumeAllChanges()
                 dragged = true
@@ -72,13 +88,23 @@
     }
 
     private val VerticalTouchSlopUtil = SuspendingGestureTestUtil(width = 100, height = 100) {
+        var count = 0
         detectVerticalDragGestures(
-            onDragStart = { gestureStarted = true },
-            onDragEnd = { gestureEnded = true },
-            onDragCancel = { gestureCanceled = true }
+            onDragStart = {
+                gestureStarted = true
+                startOrder = count++
+            },
+            onDragEnd = {
+                gestureEnded = true
+                endOrder = count++
+            },
+            onDragCancel = {
+                gestureCanceled = true
+                cancelOrder = count++
+            }
         ) { change, dragAmount ->
+            dragOrder = count++
             if (change.positionChange().y > 0f || !consumePositiveOnly) {
-                change.consumePositionChange()
                 dragged = true
                 dragDistance += dragAmount
             }
@@ -86,13 +112,23 @@
     }
 
     private val HorizontalTouchSlopUtil = SuspendingGestureTestUtil(width = 100, height = 100) {
+        var count = 0
         detectHorizontalDragGestures(
-            onDragStart = { gestureStarted = true },
-            onDragEnd = { gestureEnded = true },
-            onDragCancel = { gestureCanceled = true }
+            onDragStart = {
+                gestureStarted = true
+                startOrder = count++
+            },
+            onDragEnd = {
+                gestureEnded = true
+                endOrder = count++
+            },
+            onDragCancel = {
+                gestureCanceled = true
+                cancelOrder = count++
+            }
         ) { change, dragAmount ->
+            dragOrder = count++
             if (change.positionChange().x > 0f || !consumePositiveOnly) {
-                change.consumePositionChange()
                 dragged = true
                 dragDistance += dragAmount
             }
@@ -377,19 +413,21 @@
      */
     @Test
     fun dragBackAndForth() = util.executeInComposition {
-        try {
-            consumePositiveOnly = true
+        if (supportsSloppyGesture) {
+            try {
+                consumePositiveOnly = true
 
-            val back = down().moveBy(-dragMotion)
+                val back = down().moveBy(-dragMotion)
 
-            assertFalse(gestureStarted)
-            assertFalse(dragged)
-            back.moveBy(dragMotion).up()
+                assertFalse(gestureStarted)
+                assertFalse(dragged)
+                back.moveBy(dragMotion).up()
 
-            assertTrue(gestureStarted)
-            assertTrue(dragged)
-        } finally {
-            consumePositiveOnly = false
+                assertTrue(gestureStarted)
+                assertTrue(dragged)
+            } finally {
+                consumePositiveOnly = false
+            }
         }
     }
 
@@ -415,4 +453,51 @@
             }
         }
     }
+
+    @Test
+    fun dragGestureCallbackOrder_normalFinish() = util.executeInComposition {
+        if (!supportsSloppyGesture) {
+            val progress = down().moveBy(Offset(50f, 50f))
+            assertTrue(startOrder < dragOrder)
+            progress.up()
+            assertTrue(startOrder < dragOrder)
+            assertTrue(dragOrder < endOrder)
+            assertTrue(cancelOrder == -1)
+        }
+    }
+
+    @Test
+    fun dragGestureCallbackOrder_cancel() = util.executeInComposition {
+        if (!supportsSloppyGesture) {
+            down().moveBy(dragMotion).moveBy(dragMotion) { consumeAllChanges() }
+            assertTrue(startOrder < dragOrder)
+            assertTrue(dragOrder < cancelOrder)
+            assertTrue(endOrder == -1)
+        }
+    }
+}
+
+@RunWith(JUnit4::class)
+class DragGestureOrderTest {
+    var startCount = -1
+    var stopCount = -1
+    var dragCount = -1
+    private val DragOrderUtil = SuspendingGestureTestUtil(width = 100, height = 100) {
+        var counter = 0
+        detectDragGestures(
+            onDragStart = { startCount = counter++ },
+            onDragEnd = { stopCount = counter++ }
+        ) { _, _ ->
+            dragCount = counter++
+        }
+    }
+
+    @Test
+    fun dragGestureCallbackOrder() = DragOrderUtil.executeInComposition {
+        val progress = down().moveBy(Offset(50f, 50f))
+        assertTrue(startCount < dragCount)
+        progress.up()
+        assertTrue(startCount < dragCount)
+        assertTrue(dragCount < stopCount)
+    }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/UndoManagerTest.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/UndoManagerTest.kt
new file mode 100644
index 0000000..0887d89
--- /dev/null
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/UndoManagerTest.kt
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.foundation.text
+
+import androidx.compose.ui.text.input.TextFieldValue
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class UndoManagerTest {
+    @Test
+    fun basic_undo_redo() {
+        val manager = UndoManager(10)
+        manager.makeSnapshot(TextFieldValue("hi"))
+        manager.makeSnapshot(TextFieldValue("hello"))
+        assertThat(manager.undo()).isEqualTo(
+            TextFieldValue("hi")
+        )
+        assertThat(manager.undo()).isNull()
+        assertThat(manager.redo()).isEqualTo(
+            TextFieldValue("hello")
+        )
+        assertThat(manager.redo()).isNull()
+        assertThat(manager.undo()).isEqualTo(
+            TextFieldValue("hi")
+        )
+        manager.makeSnapshot(TextFieldValue("hola"))
+        assertThat(manager.undo()).isEqualTo(
+            TextFieldValue("hi")
+        )
+        assertThat(manager.redo()).isEqualTo(
+            TextFieldValue("hola")
+        )
+    }
+
+    @Test
+    fun max_size_too_small() {
+        val manager = UndoManager(10)
+        manager.makeSnapshot(TextFieldValue("hi"))
+        manager.makeSnapshot(TextFieldValue("hello"))
+        manager.makeSnapshot(TextFieldValue("hola"))
+        assertThat(manager.undo()).isEqualTo(
+            TextFieldValue("hello")
+        )
+        assertThat(manager.undo()).isNull()
+        assertThat(manager.redo()).isEqualTo(
+            TextFieldValue("hola")
+        )
+    }
+
+    @Test
+    fun max_size_enough() {
+        val manager = UndoManager(11)
+        manager.makeSnapshot(TextFieldValue("hi"))
+        manager.makeSnapshot(TextFieldValue("hello"))
+        manager.makeSnapshot(TextFieldValue("hola"))
+        assertThat(manager.undo()).isEqualTo(
+            TextFieldValue("hello")
+        )
+        assertThat(manager.undo()).isEqualTo(
+            TextFieldValue("hi")
+        )
+    }
+}
\ No newline at end of file
diff --git a/compose/integration-tests/docs-snippets/lint-baseline.xml b/compose/integration-tests/docs-snippets/lint-baseline.xml
index e00ecce..42a176b 100644
--- a/compose/integration-tests/docs-snippets/lint-baseline.xml
+++ b/compose/integration-tests/docs-snippets/lint-baseline.xml
@@ -1,74 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt`. Referenced from `com.sun.jna.Native.AWT`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/net/java/dev/jna/jna/5.5.0/jna-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.datatransfer`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.dnd`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.event`. Referenced from `com.sun.jna.platform.WindowUtils.NativeWindowUtils.1`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.geom`. Referenced from `com.sun.jna.platform.WindowUtils.NativeWindowUtils`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.image`. Referenced from `com.sun.jna.platform.RasterRangesUtils`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `javax.swing.text`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `javax.swing`. Referenced from `com.sun.jna.platform.WindowUtils.MacWindowUtils`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.lang.instrument`. Referenced from `kotlinx.coroutines.repackaged.net.bytebuddy.agent.ByteBuddyAgent`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.4.3/kotlinx-coroutines-debug-1.4.3.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.lang.management`. Referenced from `kotlinx.coroutines.repackaged.net.bytebuddy.agent.ByteBuddyAgent.ProcessProvider.ForCurrentVm.ForLegacyVm`.">
-        <location
-            file="../../../../../prebuilts/androidx/external/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.4.3/kotlinx-coroutines-debug-1.4.3.jar"/>
-    </issue>
-
 </issues>
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/gestures/Gestures.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/gestures/Gestures.kt
index 2b55af8..c8ebe05 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/gestures/Gestures.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/gestures/Gestures.kt
@@ -59,7 +59,6 @@
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.input.pointer.consumeAllChanges
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.tooling.preview.Preview
@@ -286,8 +285,7 @@
                 .background(Color.Blue)
                 .size(50.dp)
                 .pointerInput(Unit) {
-                    detectDragGestures { change, dragAmount ->
-                        change.consumeAllChanges()
+                    detectDragGestures { _, dragAmount ->
                         offsetX += dragAmount.x
                         offsetY += dragAmount.y
                     }
diff --git a/compose/integration-tests/lint-baseline.xml b/compose/integration-tests/lint-baseline.xml
index 6773bc2..42a176b 100644
--- a/compose/integration-tests/lint-baseline.xml
+++ b/compose/integration-tests/lint-baseline.xml
@@ -1,74 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt`. Referenced from `com.sun.jna.Native.AWT`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna/5.5.0/jna-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.datatransfer`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.dnd`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.event`. Referenced from `com.sun.jna.platform.WindowUtils.NativeWindowUtils.1`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.geom`. Referenced from `com.sun.jna.platform.WindowUtils.NativeWindowUtils`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.image`. Referenced from `com.sun.jna.platform.RasterRangesUtils`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `javax.swing.text`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `javax.swing`. Referenced from `com.sun.jna.platform.WindowUtils.MacWindowUtils`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.lang.instrument`. Referenced from `kotlinx.coroutines.repackaged.net.bytebuddy.agent.ByteBuddyAgent`.">
-        <location
-            file="../../../../prebuilts/androidx/external/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.4.3/kotlinx-coroutines-debug-1.4.3.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.lang.management`. Referenced from `kotlinx.coroutines.repackaged.net.bytebuddy.agent.ByteBuddyAgent.ProcessProvider.ForCurrentVm.ForLegacyVm`.">
-        <location
-            file="../../../../prebuilts/androidx/external/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.4.3/kotlinx-coroutines-debug-1.4.3.jar"/>
-    </issue>
-
 </issues>
diff --git a/compose/lint/common/src/main/java/androidx/compose/lint/KotlinMetadataUtils.kt b/compose/lint/common/src/main/java/androidx/compose/lint/KotlinMetadataUtils.kt
index 8b20f3e..c9da754 100644
--- a/compose/lint/common/src/main/java/androidx/compose/lint/KotlinMetadataUtils.kt
+++ b/compose/lint/common/src/main/java/androidx/compose/lint/KotlinMetadataUtils.kt
@@ -92,7 +92,6 @@
 
     val kind = attributes["k"]?.parseInt()
     val metadataVersion = attributes["mv"]?.parseIntArray()
-    val bytecodeVersion = attributes["bv"]?.parseIntArray()
     val data1 = attributes["d1"]?.parseStringArray()
     val data2 = attributes["d2"]?.parseStringArray()
     val extraString = attributes["xs"]?.parseString()
@@ -102,7 +101,6 @@
     return KotlinClassHeader(
         kind,
         metadataVersion,
-        bytecodeVersion,
         data1,
         data2,
         extraString,
diff --git a/compose/material/material-icons-core/api/1.0.0-beta08.txt b/compose/material/material-icons-core/api/1.0.0-beta08.txt
index a6db2fd..79e6709 100644
--- a/compose/material/material-icons-core/api/1.0.0-beta08.txt
+++ b/compose/material/material-icons-core/api/1.0.0-beta08.txt
@@ -29,7 +29,7 @@
 
   public final class IconsKt {
     method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
-    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional androidx.compose.ui.graphics.PathFillType pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath-E-tN-BY(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
   }
 
 }
diff --git a/compose/material/material-icons-core/api/current.ignore b/compose/material/material-icons-core/api/current.ignore
new file mode 100644
index 0000000..8be7c32
--- /dev/null
+++ b/compose/material/material-icons-core/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedMethod: androidx.compose.material.icons.IconsKt#materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, float, float, androidx.compose.ui.graphics.PathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit>):
+    Removed method androidx.compose.material.icons.IconsKt.materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder,float,float,androidx.compose.ui.graphics.PathFillType,kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit>)
diff --git a/compose/material/material-icons-core/api/current.txt b/compose/material/material-icons-core/api/current.txt
index a6db2fd..79e6709 100644
--- a/compose/material/material-icons-core/api/current.txt
+++ b/compose/material/material-icons-core/api/current.txt
@@ -29,7 +29,7 @@
 
   public final class IconsKt {
     method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
-    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional androidx.compose.ui.graphics.PathFillType pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath-E-tN-BY(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
   }
 
 }
diff --git a/compose/material/material-icons-core/api/public_plus_experimental_1.0.0-beta08.txt b/compose/material/material-icons-core/api/public_plus_experimental_1.0.0-beta08.txt
index a6db2fd..79e6709 100644
--- a/compose/material/material-icons-core/api/public_plus_experimental_1.0.0-beta08.txt
+++ b/compose/material/material-icons-core/api/public_plus_experimental_1.0.0-beta08.txt
@@ -29,7 +29,7 @@
 
   public final class IconsKt {
     method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
-    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional androidx.compose.ui.graphics.PathFillType pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath-E-tN-BY(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
   }
 
 }
diff --git a/compose/material/material-icons-core/api/public_plus_experimental_current.txt b/compose/material/material-icons-core/api/public_plus_experimental_current.txt
index a6db2fd..79e6709 100644
--- a/compose/material/material-icons-core/api/public_plus_experimental_current.txt
+++ b/compose/material/material-icons-core/api/public_plus_experimental_current.txt
@@ -29,7 +29,7 @@
 
   public final class IconsKt {
     method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
-    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional androidx.compose.ui.graphics.PathFillType pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath-E-tN-BY(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
   }
 
 }
diff --git a/compose/material/material-icons-core/api/restricted_1.0.0-beta08.txt b/compose/material/material-icons-core/api/restricted_1.0.0-beta08.txt
index 0ea558f..39a04a5 100644
--- a/compose/material/material-icons-core/api/restricted_1.0.0-beta08.txt
+++ b/compose/material/material-icons-core/api/restricted_1.0.0-beta08.txt
@@ -29,7 +29,7 @@
 
   public final class IconsKt {
     method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
-    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional androidx.compose.ui.graphics.PathFillType pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath-E-tN-BY(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
     field @kotlin.PublishedApi internal static final float MaterialIconDimension = 24.0f;
   }
 
diff --git a/compose/material/material-icons-core/api/restricted_current.ignore b/compose/material/material-icons-core/api/restricted_current.ignore
new file mode 100644
index 0000000..8be7c32
--- /dev/null
+++ b/compose/material/material-icons-core/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedMethod: androidx.compose.material.icons.IconsKt#materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, float, float, androidx.compose.ui.graphics.PathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit>):
+    Removed method androidx.compose.material.icons.IconsKt.materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder,float,float,androidx.compose.ui.graphics.PathFillType,kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit>)
diff --git a/compose/material/material-icons-core/api/restricted_current.txt b/compose/material/material-icons-core/api/restricted_current.txt
index 0ea558f..39a04a5 100644
--- a/compose/material/material-icons-core/api/restricted_current.txt
+++ b/compose/material/material-icons-core/api/restricted_current.txt
@@ -29,7 +29,7 @@
 
   public final class IconsKt {
     method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
-    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional androidx.compose.ui.graphics.PathFillType pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath-E-tN-BY(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
     field @kotlin.PublishedApi internal static final float MaterialIconDimension = 24.0f;
   }
 
diff --git a/compose/material/material-ripple/api/1.0.0-beta08.txt b/compose/material/material-ripple/api/1.0.0-beta08.txt
index 171df53..3e18f6d 100644
--- a/compose/material/material-ripple/api/1.0.0-beta08.txt
+++ b/compose/material/material-ripple/api/1.0.0-beta08.txt
@@ -35,8 +35,5 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
   }
 
-  public final class Ripple_androidKt {
-  }
-
 }
 
diff --git a/compose/material/material-ripple/api/current.ignore b/compose/material/material-ripple/api/current.ignore
new file mode 100644
index 0000000..41f1904
--- /dev/null
+++ b/compose/material/material-ripple/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.material.ripple.Ripple_androidKt:
+    Removed class androidx.compose.material.ripple.Ripple_androidKt
diff --git a/compose/material/material-ripple/api/current.txt b/compose/material/material-ripple/api/current.txt
index 171df53..3e18f6d 100644
--- a/compose/material/material-ripple/api/current.txt
+++ b/compose/material/material-ripple/api/current.txt
@@ -35,8 +35,5 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
   }
 
-  public final class Ripple_androidKt {
-  }
-
 }
 
diff --git a/compose/material/material-ripple/api/public_plus_experimental_1.0.0-beta08.txt b/compose/material/material-ripple/api/public_plus_experimental_1.0.0-beta08.txt
index 9c82a47..3e18f6d 100644
--- a/compose/material/material-ripple/api/public_plus_experimental_1.0.0-beta08.txt
+++ b/compose/material/material-ripple/api/public_plus_experimental_1.0.0-beta08.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.compose.material.ripple {
 
-  @kotlin.RequiresOptIn(message="This ripple API is experimental and may change / be removed in the future.") public @interface ExperimentalRippleApi {
-  }
-
   @androidx.compose.runtime.Immutable public final class RippleAlpha {
     ctor public RippleAlpha(float draggedAlpha, float focusedAlpha, float hoveredAlpha, float pressedAlpha);
     method public float getDraggedAlpha();
@@ -38,9 +35,5 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
   }
 
-  public final class Ripple_androidKt {
-    method @androidx.compose.material.ripple.ExperimentalRippleApi public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalRippleNativeRendering();
-  }
-
 }
 
diff --git a/compose/material/material-ripple/api/public_plus_experimental_current.txt b/compose/material/material-ripple/api/public_plus_experimental_current.txt
index 9c82a47..3e18f6d 100644
--- a/compose/material/material-ripple/api/public_plus_experimental_current.txt
+++ b/compose/material/material-ripple/api/public_plus_experimental_current.txt
@@ -1,9 +1,6 @@
 // Signature format: 4.0
 package androidx.compose.material.ripple {
 
-  @kotlin.RequiresOptIn(message="This ripple API is experimental and may change / be removed in the future.") public @interface ExperimentalRippleApi {
-  }
-
   @androidx.compose.runtime.Immutable public final class RippleAlpha {
     ctor public RippleAlpha(float draggedAlpha, float focusedAlpha, float hoveredAlpha, float pressedAlpha);
     method public float getDraggedAlpha();
@@ -38,9 +35,5 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
   }
 
-  public final class Ripple_androidKt {
-    method @androidx.compose.material.ripple.ExperimentalRippleApi public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalRippleNativeRendering();
-  }
-
 }
 
diff --git a/compose/material/material-ripple/api/restricted_1.0.0-beta08.txt b/compose/material/material-ripple/api/restricted_1.0.0-beta08.txt
index 171df53..3e18f6d 100644
--- a/compose/material/material-ripple/api/restricted_1.0.0-beta08.txt
+++ b/compose/material/material-ripple/api/restricted_1.0.0-beta08.txt
@@ -35,8 +35,5 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
   }
 
-  public final class Ripple_androidKt {
-  }
-
 }
 
diff --git a/compose/material/material-ripple/api/restricted_current.ignore b/compose/material/material-ripple/api/restricted_current.ignore
new file mode 100644
index 0000000..41f1904
--- /dev/null
+++ b/compose/material/material-ripple/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.material.ripple.Ripple_androidKt:
+    Removed class androidx.compose.material.ripple.Ripple_androidKt
diff --git a/compose/material/material-ripple/api/restricted_current.txt b/compose/material/material-ripple/api/restricted_current.txt
index 171df53..3e18f6d 100644
--- a/compose/material/material-ripple/api/restricted_current.txt
+++ b/compose/material/material-ripple/api/restricted_current.txt
@@ -35,8 +35,5 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
   }
 
-  public final class Ripple_androidKt {
-  }
-
 }
 
diff --git a/compose/material/material-ripple/src/androidAndroidTest/kotlin/androidx/compose/material/ripple/LocalRippleNativeRenderingTest.kt b/compose/material/material-ripple/src/androidAndroidTest/kotlin/androidx/compose/material/ripple/LocalRippleNativeRenderingTest.kt
deleted file mode 100644
index d376ebd..0000000
--- a/compose/material/material-ripple/src/androidAndroidTest/kotlin/androidx/compose/material/ripple/LocalRippleNativeRenderingTest.kt
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.compose.material.ripple
-
-import androidx.compose.foundation.IndicationInstance
-import androidx.compose.foundation.interaction.MutableInteractionSource
-import androidx.compose.runtime.CompositionLocalProvider
-import androidx.compose.runtime.remember
-import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.MediumTest
-import com.google.common.truth.Truth
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Test for [LocalRippleNativeRendering]
- */
-@MediumTest
-@RunWith(AndroidJUnit4::class)
-class LocalRippleNativeRenderingTest {
-
-    @get:Rule
-    val rule = createComposeRule()
-
-    @Test
-    fun usesNativeRipplesByDefault() {
-        lateinit var instance: IndicationInstance
-        rule.setContent {
-            val ripple = rememberRipple()
-            val interactionSource = remember { MutableInteractionSource() }
-            instance = ripple.rememberUpdatedInstance(interactionSource)
-        }
-
-        rule.runOnIdle {
-            Truth.assertThat(instance).isInstanceOf(AndroidRippleIndicationInstance::class.java)
-        }
-    }
-
-    @OptIn(ExperimentalRippleApi::class)
-    @Test
-    fun usesCommonRipples_whenLocalNativeRippleRenderIsSet() {
-        lateinit var instance: IndicationInstance
-        rule.setContent {
-            CompositionLocalProvider(LocalRippleNativeRendering provides false) {
-                val ripple = rememberRipple()
-                val interactionSource = remember { MutableInteractionSource() }
-                instance = ripple.rememberUpdatedInstance(interactionSource)
-            }
-        }
-
-        rule.runOnIdle {
-            Truth.assertThat(instance).isInstanceOf(CommonRippleIndicationInstance::class.java)
-        }
-    }
-}
diff --git a/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/Ripple.android.kt b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/Ripple.android.kt
index 326c385..2c574e4 100644
--- a/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/Ripple.android.kt
+++ b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/Ripple.android.kt
@@ -22,8 +22,6 @@
 import androidx.compose.foundation.interaction.InteractionSource
 import androidx.compose.foundation.interaction.PressInteraction
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.CompositionLocal
-import androidx.compose.runtime.ProvidableCompositionLocal
 import androidx.compose.runtime.RememberObserver
 import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
@@ -31,7 +29,6 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.drawscope.ContentDrawScope
@@ -57,7 +54,6 @@
     radius: Dp,
     color: State<Color>
 ) : Ripple(bounded, radius, color) {
-    @OptIn(ExperimentalRippleApi::class)
     @Composable
     override fun rememberUpdatedRippleInstance(
         interactionSource: InteractionSource,
@@ -67,9 +63,8 @@
         rippleAlpha: State<RippleAlpha>
     ): RippleIndicationInstance {
         val view = findNearestViewGroup()
-        // Fallback to drawing inside Compose if needed, using the common implementation
         // TODO(b/188112048): Remove isInEditMode once RenderThread support is fixed in Layoutlib.
-        if (!LocalRippleNativeRendering.current || view.isInEditMode) {
+        if (view.isInEditMode) {
             return remember(interactionSource, this) {
                 CommonRippleIndicationInstance(bounded, radius, color, rippleAlpha)
             }
@@ -108,34 +103,21 @@
      */
     @Composable
     private fun findNearestViewGroup(): ViewGroup {
-        var view: View? = LocalView.current
+        var view: View = LocalView.current
         while (view !is ViewGroup) {
+            val parent = view.parent
             // We should never get to a ViewParent that isn't a View, without finding a ViewGroup
-            // first
-            view = view?.parent as View
+            // first - throw an exception if we do.
+            require(parent is View) {
+                "Couldn't find a valid parent for $view. Are you overriding LocalView and " +
+                    "providing a View that is not attached to the view hierarchy?"
+            }
+            view = parent
         }
         return view
     }
 }
 
-@RequiresOptIn(
-    "This ripple API is experimental and may change / be removed in the future."
-)
-public annotation class ExperimentalRippleApi
-
-/**
- * [CompositionLocal] that configures whether native ripples are used to draw the ripple effect
- * inside components. If set to false, the ripples will be drawn inside Compose, consistent with
- * the behavior in previous Compose releases. This is a temporary API, and will be removed when
- * native ripples are stable in Compose.
- *
- * If you use this to avoid a bug with native ripples, please [file a bug](https://issuetracker.google.com/issues/new?component=612128)
- */
-@get:ExperimentalRippleApi
-@ExperimentalRippleApi
-public val LocalRippleNativeRendering: ProvidableCompositionLocal<Boolean> =
-    staticCompositionLocalOf { true }
-
 /**
  * Android specific [RippleIndicationInstance]. This uses a [RippleHostView] provided by
  * [rippleContainer] to draw ripples in the drawing bounds provided within [drawIndication].
diff --git a/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleContainer.android.kt b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleContainer.android.kt
index 840f932..6571a8c 100644
--- a/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleContainer.android.kt
+++ b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleContainer.android.kt
@@ -18,6 +18,7 @@
 
 import android.content.Context
 import android.view.ViewGroup
+import androidx.compose.ui.R
 
 /**
  * A root-level container [ViewGroup] that manages creating and assigning [RippleHostView]s used
@@ -64,6 +65,9 @@
         // Since we now have an unused ripple host, the next index should be 1 - the unused host
         // will be used first.
         nextHostIndex = 1
+
+        // Hide this view and its children in tools:
+        setTag(R.id.hide_in_inspector_tag, true)
     }
 
     override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
diff --git a/compose/material/material/api/1.0.0-beta08.txt b/compose/material/material/api/1.0.0-beta08.txt
index 7cedeb6..ff9ea09 100644
--- a/compose/material/material/api/1.0.0-beta08.txt
+++ b/compose/material/material/api/1.0.0-beta08.txt
@@ -250,9 +250,22 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
   }
 
-  public enum FabPosition {
-    enum_constant public static final androidx.compose.material.FabPosition Center;
-    enum_constant public static final androidx.compose.material.FabPosition End;
+  public final inline class FabPosition {
+    ctor public FabPosition();
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.material.FabPosition.Companion Companion;
+  }
+
+  public static final class FabPosition.Companion {
+    method public int getCenter-5ygKITE();
+    method public int getEnd-5ygKITE();
+    property public final int Center;
+    property public final int End;
   }
 
   public final class FloatingActionButtonDefaults {
@@ -366,7 +379,7 @@
   }
 
   public final class ScaffoldKt {
-    method @androidx.compose.runtime.Composable public static void Scaffold-axyFlp8(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional androidx.compose.material.FabPosition floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Scaffold-axyFlp8(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
   }
 
diff --git a/compose/material/material/api/current.ignore b/compose/material/material/api/current.ignore
new file mode 100644
index 0000000..ae87caf
--- /dev/null
+++ b/compose/material/material/api/current.ignore
@@ -0,0 +1,13 @@
+// Baseline format: 1.0
+ChangedSuperclass: androidx.compose.material.FabPosition:
+    Class androidx.compose.material.FabPosition superclass changed from java.lang.Enum to java.lang.Object
+
+
+RemovedField: androidx.compose.material.FabPosition#Center:
+    Removed enum constant androidx.compose.material.FabPosition.Center
+RemovedField: androidx.compose.material.FabPosition#End:
+    Removed enum constant androidx.compose.material.FabPosition.End
+
+
+RemovedMethod: androidx.compose.material.ScaffoldKt#Scaffold-axyFlp8(androidx.compose.ui.Modifier, androidx.compose.material.ScaffoldState, kotlin.jvm.functions.Function0<kotlin.Unit>, kotlin.jvm.functions.Function0<kotlin.Unit>, kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit>, kotlin.jvm.functions.Function0<kotlin.Unit>, androidx.compose.material.FabPosition, boolean, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>, boolean, androidx.compose.ui.graphics.Shape, float, long, long, long, long, long, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit>):
+    Removed method androidx.compose.material.ScaffoldKt.Scaffold-axyFlp8(androidx.compose.ui.Modifier,androidx.compose.material.ScaffoldState,kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit>,kotlin.jvm.functions.Function0<kotlin.Unit>,androidx.compose.material.FabPosition,boolean,kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>,boolean,androidx.compose.ui.graphics.Shape,float,long,long,long,long,long,kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit>)
diff --git a/compose/material/material/api/current.txt b/compose/material/material/api/current.txt
index 7cedeb6..ff9ea09 100644
--- a/compose/material/material/api/current.txt
+++ b/compose/material/material/api/current.txt
@@ -250,9 +250,22 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
   }
 
-  public enum FabPosition {
-    enum_constant public static final androidx.compose.material.FabPosition Center;
-    enum_constant public static final androidx.compose.material.FabPosition End;
+  public final inline class FabPosition {
+    ctor public FabPosition();
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.material.FabPosition.Companion Companion;
+  }
+
+  public static final class FabPosition.Companion {
+    method public int getCenter-5ygKITE();
+    method public int getEnd-5ygKITE();
+    property public final int Center;
+    property public final int End;
   }
 
   public final class FloatingActionButtonDefaults {
@@ -366,7 +379,7 @@
   }
 
   public final class ScaffoldKt {
-    method @androidx.compose.runtime.Composable public static void Scaffold-axyFlp8(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional androidx.compose.material.FabPosition floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Scaffold-axyFlp8(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
   }
 
diff --git a/compose/material/material/api/public_plus_experimental_1.0.0-beta08.txt b/compose/material/material/api/public_plus_experimental_1.0.0-beta08.txt
index 5dd28c8..57df28b 100644
--- a/compose/material/material/api/public_plus_experimental_1.0.0-beta08.txt
+++ b/compose/material/material/api/public_plus_experimental_1.0.0-beta08.txt
@@ -115,7 +115,7 @@
   }
 
   public final class BottomSheetScaffoldKt {
-    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void BottomSheetScaffold-0Ttp7_s(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> sheetContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.BottomSheetScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit>? topBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional androidx.compose.material.FabPosition floatingActionButtonPosition, optional boolean sheetGesturesEnabled, optional androidx.compose.ui.graphics.Shape sheetShape, optional float sheetElevation, optional long sheetBackgroundColor, optional long sheetContentColor, optional float sheetPeekHeight, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void BottomSheetScaffold-0Ttp7_s(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> sheetContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.BottomSheetScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit>? topBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional int floatingActionButtonPosition, optional boolean sheetGesturesEnabled, optional androidx.compose.ui.graphics.Shape sheetShape, optional float sheetElevation, optional long sheetBackgroundColor, optional long sheetContentColor, optional float sheetPeekHeight, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
     method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.BottomSheetScaffoldState rememberBottomSheetScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.BottomSheetState bottomSheetState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
     method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.BottomSheetState rememberBottomSheetState(androidx.compose.material.BottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomSheetValue,java.lang.Boolean> confirmStateChange);
   }
@@ -357,9 +357,22 @@
   @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") public @interface ExperimentalMaterialApi {
   }
 
-  public enum FabPosition {
-    enum_constant public static final androidx.compose.material.FabPosition Center;
-    enum_constant public static final androidx.compose.material.FabPosition End;
+  public final inline class FabPosition {
+    ctor public FabPosition();
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.material.FabPosition.Companion Companion;
+  }
+
+  public static final class FabPosition.Companion {
+    method public int getCenter-5ygKITE();
+    method public int getEnd-5ygKITE();
+    property public final int Center;
+    property public final int End;
   }
 
   @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Immutable public final class FixedThreshold implements androidx.compose.material.ThresholdConfig {
@@ -506,7 +519,7 @@
   }
 
   public final class ScaffoldKt {
-    method @androidx.compose.runtime.Composable public static void Scaffold-axyFlp8(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional androidx.compose.material.FabPosition floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Scaffold-axyFlp8(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
   }
 
diff --git a/compose/material/material/api/public_plus_experimental_current.txt b/compose/material/material/api/public_plus_experimental_current.txt
index 5dd28c8..57df28b 100644
--- a/compose/material/material/api/public_plus_experimental_current.txt
+++ b/compose/material/material/api/public_plus_experimental_current.txt
@@ -115,7 +115,7 @@
   }
 
   public final class BottomSheetScaffoldKt {
-    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void BottomSheetScaffold-0Ttp7_s(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> sheetContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.BottomSheetScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit>? topBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional androidx.compose.material.FabPosition floatingActionButtonPosition, optional boolean sheetGesturesEnabled, optional androidx.compose.ui.graphics.Shape sheetShape, optional float sheetElevation, optional long sheetBackgroundColor, optional long sheetContentColor, optional float sheetPeekHeight, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void BottomSheetScaffold-0Ttp7_s(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> sheetContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.BottomSheetScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit>? topBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional int floatingActionButtonPosition, optional boolean sheetGesturesEnabled, optional androidx.compose.ui.graphics.Shape sheetShape, optional float sheetElevation, optional long sheetBackgroundColor, optional long sheetContentColor, optional float sheetPeekHeight, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
     method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.BottomSheetScaffoldState rememberBottomSheetScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.BottomSheetState bottomSheetState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
     method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.BottomSheetState rememberBottomSheetState(androidx.compose.material.BottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomSheetValue,java.lang.Boolean> confirmStateChange);
   }
@@ -357,9 +357,22 @@
   @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") public @interface ExperimentalMaterialApi {
   }
 
-  public enum FabPosition {
-    enum_constant public static final androidx.compose.material.FabPosition Center;
-    enum_constant public static final androidx.compose.material.FabPosition End;
+  public final inline class FabPosition {
+    ctor public FabPosition();
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.material.FabPosition.Companion Companion;
+  }
+
+  public static final class FabPosition.Companion {
+    method public int getCenter-5ygKITE();
+    method public int getEnd-5ygKITE();
+    property public final int Center;
+    property public final int End;
   }
 
   @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Immutable public final class FixedThreshold implements androidx.compose.material.ThresholdConfig {
@@ -506,7 +519,7 @@
   }
 
   public final class ScaffoldKt {
-    method @androidx.compose.runtime.Composable public static void Scaffold-axyFlp8(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional androidx.compose.material.FabPosition floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Scaffold-axyFlp8(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
   }
 
diff --git a/compose/material/material/api/restricted_1.0.0-beta08.txt b/compose/material/material/api/restricted_1.0.0-beta08.txt
index 7cedeb6..ff9ea09 100644
--- a/compose/material/material/api/restricted_1.0.0-beta08.txt
+++ b/compose/material/material/api/restricted_1.0.0-beta08.txt
@@ -250,9 +250,22 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
   }
 
-  public enum FabPosition {
-    enum_constant public static final androidx.compose.material.FabPosition Center;
-    enum_constant public static final androidx.compose.material.FabPosition End;
+  public final inline class FabPosition {
+    ctor public FabPosition();
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.material.FabPosition.Companion Companion;
+  }
+
+  public static final class FabPosition.Companion {
+    method public int getCenter-5ygKITE();
+    method public int getEnd-5ygKITE();
+    property public final int Center;
+    property public final int End;
   }
 
   public final class FloatingActionButtonDefaults {
@@ -366,7 +379,7 @@
   }
 
   public final class ScaffoldKt {
-    method @androidx.compose.runtime.Composable public static void Scaffold-axyFlp8(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional androidx.compose.material.FabPosition floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Scaffold-axyFlp8(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
   }
 
diff --git a/compose/material/material/api/restricted_current.ignore b/compose/material/material/api/restricted_current.ignore
new file mode 100644
index 0000000..ae87caf
--- /dev/null
+++ b/compose/material/material/api/restricted_current.ignore
@@ -0,0 +1,13 @@
+// Baseline format: 1.0
+ChangedSuperclass: androidx.compose.material.FabPosition:
+    Class androidx.compose.material.FabPosition superclass changed from java.lang.Enum to java.lang.Object
+
+
+RemovedField: androidx.compose.material.FabPosition#Center:
+    Removed enum constant androidx.compose.material.FabPosition.Center
+RemovedField: androidx.compose.material.FabPosition#End:
+    Removed enum constant androidx.compose.material.FabPosition.End
+
+
+RemovedMethod: androidx.compose.material.ScaffoldKt#Scaffold-axyFlp8(androidx.compose.ui.Modifier, androidx.compose.material.ScaffoldState, kotlin.jvm.functions.Function0<kotlin.Unit>, kotlin.jvm.functions.Function0<kotlin.Unit>, kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit>, kotlin.jvm.functions.Function0<kotlin.Unit>, androidx.compose.material.FabPosition, boolean, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>, boolean, androidx.compose.ui.graphics.Shape, float, long, long, long, long, long, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit>):
+    Removed method androidx.compose.material.ScaffoldKt.Scaffold-axyFlp8(androidx.compose.ui.Modifier,androidx.compose.material.ScaffoldState,kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit>,kotlin.jvm.functions.Function0<kotlin.Unit>,androidx.compose.material.FabPosition,boolean,kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>,boolean,androidx.compose.ui.graphics.Shape,float,long,long,long,long,long,kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit>)
diff --git a/compose/material/material/api/restricted_current.txt b/compose/material/material/api/restricted_current.txt
index 7cedeb6..ff9ea09 100644
--- a/compose/material/material/api/restricted_current.txt
+++ b/compose/material/material/api/restricted_current.txt
@@ -250,9 +250,22 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
   }
 
-  public enum FabPosition {
-    enum_constant public static final androidx.compose.material.FabPosition Center;
-    enum_constant public static final androidx.compose.material.FabPosition End;
+  public final inline class FabPosition {
+    ctor public FabPosition();
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.material.FabPosition.Companion Companion;
+  }
+
+  public static final class FabPosition.Companion {
+    method public int getCenter-5ygKITE();
+    method public int getEnd-5ygKITE();
+    property public final int Center;
+    property public final int End;
   }
 
   public final class FloatingActionButtonDefaults {
@@ -366,7 +379,7 @@
   }
 
   public final class ScaffoldKt {
-    method @androidx.compose.runtime.Composable public static void Scaffold-axyFlp8(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional androidx.compose.material.FabPosition floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Scaffold-axyFlp8(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
   }
 
diff --git a/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/Names.kt b/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/Names.kt
index a569e36..7482adb 100644
--- a/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/Names.kt
+++ b/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/Names.kt
@@ -34,7 +34,7 @@
 object ClassNames {
     val Icons = PackageNames.MaterialIconsPackage.className("Icons")
     val ImageVector = PackageNames.VectorPackage.className("ImageVector")
-    val PathFillType = PackageNames.GraphicsPackage.className("PathFillType")
+    val PathFillType = PackageNames.GraphicsPackage.className("PathFillType", "Companion")
 }
 
 /**
diff --git a/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/tasks/IconSourceTasks.kt b/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/tasks/IconSourceTasks.kt
index 45b4797..a3e4971 100644
--- a/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/tasks/IconSourceTasks.kt
+++ b/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/tasks/IconSourceTasks.kt
@@ -44,7 +44,13 @@
                 variant
             )
             // Multiplatform
-            if (variant == null) registerIconGenerationTask(project, task, buildDirectory)
+            if (variant == null) {
+                registerIconGenerationTask(project, task, buildDirectory)
+                project.afterEvaluate {
+                    // Workaround: https://github.com/gradle/gradle/issues/17250
+                    project.getTasksByName("sourceJarRelease", false).single().dependsOn(task)
+                }
+            }
             // AGP
             else variant.registerIconGenerationTask(task, buildDirectory)
         }
@@ -70,7 +76,13 @@
                 variant
             )
             // Multiplatform
-            if (variant == null) registerIconGenerationTask(project, task, buildDirectory)
+            if (variant == null) {
+                registerIconGenerationTask(project, task, buildDirectory)
+                project.afterEvaluate {
+                    // Workaround: https://github.com/gradle/gradle/issues/17250
+                    project.getTasksByName("sourceJarRelease", false).single().dependsOn(task)
+                }
+            }
             // AGP
             else variant.registerIconGenerationTask(task, buildDirectory)
         }
diff --git a/compose/material/material/icons/generator/src/test/kotlin/androidx/compose/material/icons/generator/ImageVectorGeneratorTest.kt b/compose/material/material/icons/generator/src/test/kotlin/androidx/compose/material/icons/generator/ImageVectorGeneratorTest.kt
index bb05273..f557385 100644
--- a/compose/material/material/icons/generator/src/test/kotlin/androidx/compose/material/icons/generator/ImageVectorGeneratorTest.kt
+++ b/compose/material/material/icons/generator/src/test/kotlin/androidx/compose/material/icons/generator/ImageVectorGeneratorTest.kt
@@ -68,7 +68,7 @@
     import androidx.compose.material.icons.Icons
     import androidx.compose.material.icons.materialIcon
     import androidx.compose.material.icons.materialPath
-    import androidx.compose.ui.graphics.PathFillType.EvenOdd
+    import androidx.compose.ui.graphics.PathFillType.Companion.EvenOdd
     import androidx.compose.ui.graphics.vector.ImageVector
     import androidx.compose.ui.graphics.vector.group
 
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt
index 9097e2c..b2f34f4 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt
@@ -79,6 +79,8 @@
 
     @Test
     fun ripple() {
+        rule.mainClock.autoAdvance = false
+
         rule.setMaterialContent {
             Box(Modifier.requiredSize(200.dp, 100.dp).wrapContentSize()) {
                 Button(onClick = { }) { }
@@ -89,6 +91,9 @@
         rule.onNode(hasClickAction())
             .performGesture { down(center) }
 
+        // Advance past the tap timeout
+        rule.mainClock.advanceTimeBy(100)
+
         rule.waitForIdle()
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't
         // properly wait for synchronization. Instead just wait until after the ripples are
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt
index 91bf388..20abb24 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt
@@ -188,6 +188,8 @@
 
         var scope: CoroutineScope? = null
 
+        rule.mainClock.autoAdvance = false
+
         rule.setContent {
             scope = rememberCoroutineScope()
             Card(
@@ -212,6 +214,9 @@
         rule.onNodeWithTag("card")
             .performGesture { down(center) }
 
+        // Advance past the tap timeout
+        rule.mainClock.advanceTimeBy(100)
+
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(1)
             Truth.assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/IconTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/IconTest.kt
index 5285f60..77af7e3 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/IconTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/IconTest.kt
@@ -35,6 +35,7 @@
 import androidx.compose.ui.semantics.SemanticsProperties
 import androidx.compose.ui.test.SemanticsMatcher
 import androidx.compose.ui.test.assert
+import androidx.compose.ui.test.assertContentDescriptionEquals
 import androidx.compose.ui.test.assertHeightIsEqualTo
 import androidx.compose.ui.test.assertWidthIsEqualTo
 import androidx.compose.ui.test.captureToImage
@@ -247,7 +248,7 @@
         }
 
         rule.onNodeWithTag(testTag)
-            .assert(SemanticsMatcher.expectValue(SemanticsProperties.ContentDescription, "qwerty"))
+            .assertContentDescriptionEquals("qwerty")
             .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Image))
     }
 
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SliderTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SliderTest.kt
index dbda4a7..c8d1bd0 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SliderTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SliderTest.kt
@@ -20,6 +20,7 @@
 import androidx.compose.foundation.interaction.MutableInteractionSource
 import androidx.compose.foundation.interaction.PressInteraction
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.requiredSize
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
@@ -369,6 +370,23 @@
     }
 
     @Test
+    fun slider_min_size() {
+        rule.setMaterialContent {
+            Box(Modifier.requiredSize(0.dp)) {
+                Slider(
+                    modifier = Modifier.testTag(tag),
+                    value = 0f,
+                    onValueChange = { }
+                )
+            }
+        }
+
+        rule.onNodeWithTag(tag)
+            .assertWidthIsEqualTo(ThumbRadius * 2)
+            .assertHeightIsEqualTo(ThumbRadius * 2)
+    }
+
+    @Test
     fun slider_noUnwantedCallbackCalls() {
         val state = mutableStateOf(0f)
         val callCount = mutableStateOf(0f)
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt
index c4a31bc..65ed164 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt
@@ -281,6 +281,8 @@
 
         var scope: CoroutineScope? = null
 
+        rule.mainClock.autoAdvance = false
+
         rule.setContent {
             scope = rememberCoroutineScope()
             Surface(
@@ -305,6 +307,9 @@
         rule.onNodeWithTag("surface")
             .performGesture { down(center) }
 
+        // Advance past the tap timeout
+        rule.mainClock.advanceTimeBy(100)
+
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(1)
             Truth.assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
index 070fc5d..d4584035 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
@@ -139,6 +139,8 @@
 
     @Test
     fun switchTest_pressed() {
+        rule.mainClock.autoAdvance = false
+
         rule.setMaterialContent {
             Box(wrapperModifier) {
                 Switch(checked = false, enabled = true, onCheckedChange = { })
@@ -149,6 +151,9 @@
             down(center)
         }
 
+        // Advance past the tap timeout
+        rule.mainClock.advanceTimeBy(100)
+
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't wait for
         // synchronization. Instead just wait until after the ripples are finished animating.
         Thread.sleep(300)
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
index e7b17bd..337cd6b 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
@@ -55,8 +55,8 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusModifier
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.focus.focusTarget
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.RectangleShape
@@ -282,7 +282,7 @@
                 TextField(
                     modifier = Modifier
                         .focusRequester(parentFocusRequester)
-                        .focusModifier()
+                        .focusTarget()
                         .focusRequester(focusRequester)
                         .testTag(TextfieldTag),
                     value = "input",
@@ -314,7 +314,7 @@
                 TextField(
                     modifier = Modifier
                         .focusRequester(parentFocusRequester)
-                        .focusModifier()
+                        .focusTarget()
                         .focusRequester(focusRequester)
                         .testTag(TextfieldTag),
                     value = "input",
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AppBar.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AppBar.kt
index 8396e24..6dd4c9c 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AppBar.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AppBar.kt
@@ -276,7 +276,7 @@
         val path = Path().apply {
             addCutoutShape(layoutDirection, density)
             // Subtract this path from the bounding rectangle
-            op(boundingRectangle, this, PathOperation.difference)
+            op(boundingRectangle, this, PathOperation.Difference)
         }
         return Outline.Generic(path)
     }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
index acce578..ad8e5d9 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
@@ -406,7 +406,7 @@
 
             val fabOffsetX = when (floatingActionButtonPosition) {
                 FabPosition.Center -> (placeable.width - fabPlaceable.width) / 2
-                FabPosition.End -> placeable.width - fabPlaceable.width - FabEndSpacing.roundToPx()
+                else -> placeable.width - fabPlaceable.width - FabEndSpacing.roundToPx()
             }
             val fabOffsetY = sheetOffsetY - fabPlaceable.height / 2
 
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt
index c261b7d..0c38d82 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt
@@ -69,19 +69,28 @@
 /**
  * The possible positions for a [FloatingActionButton] attached to a [Scaffold].
  */
-enum class FabPosition {
-    /**
-     * Position FAB at the bottom of the screen in the center, above the [BottomAppBar] (if it
-     * exists)
-     */
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+inline class FabPosition internal constructor(val value: Int) {
+    companion object {
+        /**
+         * Position FAB at the bottom of the screen in the center, above the [BottomAppBar] (if it
+         * exists)
+         */
+        val Center = FabPosition(0)
 
-    Center,
+        /**
+         * Position FAB at the bottom of the screen at the end, above the [BottomAppBar] (if it
+         * exists)
+         */
+        val End = FabPosition(1)
+    }
 
-    /**
-     * Position FAB at the bottom of the screen at the end, above the [BottomAppBar] (if it
-     * exists)
-     */
-    End
+    override fun toString(): String {
+        return when (this) {
+            Center -> "FabPosition.Center"
+            else -> "FabPosition.End"
+        }
+    }
 }
 
 /**
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
index f2a1a77..090084f 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
@@ -39,6 +39,7 @@
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.heightIn
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.requiredSizeIn
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.widthIn
 import androidx.compose.foundation.progressSemantics
@@ -140,7 +141,9 @@
         if (steps == 0) emptyList() else List(steps + 2) { it.toFloat() / (steps + 1) }
     }
     BoxWithConstraints(
-        modifier.sliderSemantics(value, tickFractions, enabled, onValueChange, valueRange, steps)
+        modifier
+            .requiredSizeIn(minWidth = ThumbRadius * 2, minHeight = ThumbRadius * 2)
+            .sliderSemantics(value, tickFractions, enabled, onValueChange, valueRange, steps)
     ) {
         val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
         val maxPx = constraints.maxWidth.toFloat()
diff --git a/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/DesktopMenu.desktop.kt b/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/DesktopMenu.desktop.kt
index f220c36..f0d1633 100644
--- a/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/DesktopMenu.desktop.kt
+++ b/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/DesktopMenu.desktop.kt
@@ -29,7 +29,6 @@
 import androidx.compose.ui.graphics.TransformOrigin
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.DpOffset
-import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.window.Popup
 
@@ -156,11 +155,8 @@
     expanded: Boolean,
     onDismissRequest: () -> Unit,
     modifier: Modifier = Modifier,
-    offset: DpOffset = DpOffset(0.dp, 0.dp),
     content: @Composable ColumnScope.() -> Unit
 ) {
-    val contextMenuPaddingOffset = IntOffset(0, DropdownMenuVerticalPadding.value.toInt())
-
     val expandedStates = remember { MutableTransitionState(false) }
     expandedStates.targetState = expanded
 
@@ -168,7 +164,7 @@
         val transformOriginState = remember { mutableStateOf(TransformOrigin.Center) }
         val density = LocalDensity.current
         val popupPositionProvider = DropdownMenuPositionProvider(
-            offset,
+            DpOffset(0.dp, 0.dp),
             density
         ) { parentBounds, menuBounds ->
             transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)
@@ -177,7 +173,6 @@
         Popup(
             focusable = true,
             contextMenu = true,
-            offset = contextMenuPaddingOffset,
             onDismissRequest = onDismissRequest,
             popupPositionProvider = popupPositionProvider
         ) {
diff --git a/compose/runtime/runtime/api/1.0.0-beta08.txt b/compose/runtime/runtime/api/1.0.0-beta08.txt
index e8b9d71..0370447 100644
--- a/compose/runtime/runtime/api/1.0.0-beta08.txt
+++ b/compose/runtime/runtime/api/1.0.0-beta08.txt
@@ -497,6 +497,47 @@
 
 }
 
+package androidx.compose.runtime.external.kotlinx.collections.immutable {
+
+  public final class ExtensionsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
+
+  public final class PersistentHashMapContentIteratorsKt {
+  }
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
+
+  public final class CommonFunctionsKt {
+  }
+
+  public final class ForEachOneBitKt {
+  }
+
+}
+
 package androidx.compose.runtime.internal {
 
   @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
diff --git a/compose/runtime/runtime/api/current.txt b/compose/runtime/runtime/api/current.txt
index e8b9d71..0370447 100644
--- a/compose/runtime/runtime/api/current.txt
+++ b/compose/runtime/runtime/api/current.txt
@@ -497,6 +497,47 @@
 
 }
 
+package androidx.compose.runtime.external.kotlinx.collections.immutable {
+
+  public final class ExtensionsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
+
+  public final class PersistentHashMapContentIteratorsKt {
+  }
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
+
+  public final class CommonFunctionsKt {
+  }
+
+  public final class ForEachOneBitKt {
+  }
+
+}
+
 package androidx.compose.runtime.internal {
 
   @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta08.txt b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta08.txt
index 8ede192..4abdf8c 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta08.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta08.txt
@@ -515,6 +515,47 @@
 
 }
 
+package androidx.compose.runtime.external.kotlinx.collections.immutable {
+
+  public final class ExtensionsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
+
+  public final class PersistentHashMapContentIteratorsKt {
+  }
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
+
+  public final class CommonFunctionsKt {
+  }
+
+  public final class ForEachOneBitKt {
+  }
+
+}
+
 package androidx.compose.runtime.internal {
 
   @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
diff --git a/compose/runtime/runtime/api/public_plus_experimental_current.txt b/compose/runtime/runtime/api/public_plus_experimental_current.txt
index 8ede192..4abdf8c 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_current.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_current.txt
@@ -515,6 +515,47 @@
 
 }
 
+package androidx.compose.runtime.external.kotlinx.collections.immutable {
+
+  public final class ExtensionsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
+
+  public final class PersistentHashMapContentIteratorsKt {
+  }
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
+
+  public final class CommonFunctionsKt {
+  }
+
+  public final class ForEachOneBitKt {
+  }
+
+}
+
 package androidx.compose.runtime.internal {
 
   @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
diff --git a/compose/runtime/runtime/api/restricted_1.0.0-beta08.txt b/compose/runtime/runtime/api/restricted_1.0.0-beta08.txt
index b68e3b4..c84ecf6 100644
--- a/compose/runtime/runtime/api/restricted_1.0.0-beta08.txt
+++ b/compose/runtime/runtime/api/restricted_1.0.0-beta08.txt
@@ -525,6 +525,47 @@
 
 }
 
+package androidx.compose.runtime.external.kotlinx.collections.immutable {
+
+  public final class ExtensionsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
+
+  public final class PersistentHashMapContentIteratorsKt {
+  }
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
+
+  public final class CommonFunctionsKt {
+  }
+
+  public final class ForEachOneBitKt {
+  }
+
+}
+
 package androidx.compose.runtime.internal {
 
   @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
diff --git a/compose/runtime/runtime/api/restricted_current.txt b/compose/runtime/runtime/api/restricted_current.txt
index b68e3b4..c84ecf6 100644
--- a/compose/runtime/runtime/api/restricted_current.txt
+++ b/compose/runtime/runtime/api/restricted_current.txt
@@ -525,6 +525,47 @@
 
 }
 
+package androidx.compose.runtime.external.kotlinx.collections.immutable {
+
+  public final class ExtensionsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
+
+  public final class PersistentHashMapContentIteratorsKt {
+  }
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
+
+  public final class CommonFunctionsKt {
+  }
+
+  public final class ForEachOneBitKt {
+  }
+
+}
+
 package androidx.compose.runtime.internal {
 
   @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
diff --git a/compose/runtime/runtime/build.gradle b/compose/runtime/runtime/build.gradle
index 54272bc..fa051e4 100644
--- a/compose/runtime/runtime/build.gradle
+++ b/compose/runtime/runtime/build.gradle
@@ -41,7 +41,6 @@
         api(KOTLIN_COROUTINES_ANDROID)
 
         implementation("androidx.annotation:annotation:1.1.0")
-        implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.4")
         implementation(KOTLIN_STDLIB)
 
         testImplementation(KOTLIN_TEST_JUNIT)
@@ -74,7 +73,6 @@
             commonMain.dependencies {
                 implementation(KOTLIN_STDLIB_COMMON)
                 implementation(KOTLIN_COROUTINES_CORE)
-                implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.4")
             }
             jvmMain.dependencies {
                 implementation(KOTLIN_STDLIB)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
index 2a8cb82..76af048 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
@@ -25,8 +25,8 @@
 import androidx.compose.runtime.snapshots.fastToSet
 import androidx.compose.runtime.tooling.CompositionData
 import androidx.compose.runtime.tooling.LocalInspectionTables
-import kotlinx.collections.immutable.PersistentMap
-import kotlinx.collections.immutable.persistentHashMapOf
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentMap
+import androidx.compose.runtime.external.kotlinx.collections.immutable.persistentHashMapOf
 import kotlin.coroutines.CoroutineContext
 
 internal typealias Change = (
@@ -2439,7 +2439,10 @@
         scope?.end(snapshot.id)?.let {
             record { _, _, _ -> it(composition) }
         }
-        val result = if (scope != null && (scope.used || collectParameterInformation)) {
+        val result = if (scope != null &&
+            !scope.skipped &&
+            (scope.used || collectParameterInformation)
+        ) {
             if (scope.anchor == null) {
                 scope.anchor = if (inserting) {
                     writer.anchor(writer.parent)
@@ -3078,9 +3081,10 @@
         value: Int,
         noinline block: T.(value: Int) -> Unit
     ) = with(composer) {
+        val inserting = inserting
         if (inserting || rememberedValue() != value) {
             updateRememberedValue(value)
-            composer.apply(value, block)
+            if (!inserting) apply(value, block)
         }
     }
 
@@ -3099,9 +3103,10 @@
         value: V,
         block: T.(value: V) -> Unit
     ) = with(composer) {
+        val inserting = inserting
         if (inserting || rememberedValue() != value) {
             updateRememberedValue(value)
-            composer.apply(value, block)
+            if (!inserting) apply(value, block)
         }
     }
 
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionContext.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionContext.kt
index be8174b..f0e0c19 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionContext.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/CompositionContext.kt
@@ -17,7 +17,7 @@
 package androidx.compose.runtime
 
 import androidx.compose.runtime.tooling.CompositionData
-import kotlinx.collections.immutable.persistentHashMapOf
+import androidx.compose.runtime.external.kotlinx.collections.immutable.persistentHashMapOf
 import kotlin.coroutines.CoroutineContext
 
 private val EmptyCompositionLocalMap: CompositionLocalMap = persistentHashMapOf()
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt
index 84b97df..703e383 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt
@@ -120,10 +120,15 @@
     override fun updateScope(block: (Composer, Int) -> Unit) { this.block = block }
 
     private var currentToken = 0
-    private var skipped = false
     private var trackedInstances: IdentityArrayIntMap? = null
 
     /**
+     * Indicates whether the scope was skipped (e.g. [scopeSkipped] was called.
+     */
+    internal var skipped = false
+        private set
+
+    /**
      * Called when composition start composing into this scope. The [token] is a value that is
      * unique everytime this is called. This is currently the snapshot id but that shouldn't be
      * relied on.
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
index ccda5bb..a941337 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
@@ -24,7 +24,7 @@
 import androidx.compose.runtime.snapshots.fastMap
 import androidx.compose.runtime.snapshots.fastMapNotNull
 import androidx.compose.runtime.tooling.CompositionData
-import kotlinx.collections.immutable.persistentSetOf
+import androidx.compose.runtime.external.kotlinx.collections.immutable.persistentSetOf
 import kotlinx.coroutines.CancellableContinuation
 import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.CoroutineScope
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableCollection.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableCollection.kt
new file mode 100644
index 0000000..80e90c3
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableCollection.kt
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable
+
+/**
+ * A generic immutable collection of elements. Methods in this interface support only read-only access to the collection.
+ *
+ * Modification operations are supported through the [PersistentCollection] interface.
+ *
+ * Implementors of this interface take responsibility to be immutable.
+ * Once constructed they must contain the same elements in the same order.
+ *
+ * @param E the type of elements contained in the collection. The immutable collection is covariant on its element type.
+ */
+internal interface ImmutableCollection<out E>: Collection<E>
+
+/**
+ * A generic persistent collection of elements that supports adding and removing elements.
+ *
+ * Modification operations return new instances of the persistent collection with the modification applied.
+ *
+ * @param E the type of elements contained in the collection. The persistent collection is covariant on its element type.
+ */
+internal interface PersistentCollection<out E> : ImmutableCollection<E> {
+    /**
+     * Returns the result of adding the specified [element] to this collection.
+     *
+     * @returns a new persistent collection with the specified [element] added;
+     * or this instance if this collection does not support duplicates and it already contains the element.
+     */
+    fun add(element: @UnsafeVariance E): PersistentCollection<E>
+
+    /**
+     * Returns the result of adding all elements of the specified [elements] collection to this collection.
+     *
+     * @return a new persistent collection with elements of the specified [elements] collection added;
+     * or this instance if no modifications were made in the result of this operation.
+     */
+    fun addAll(elements: Collection<@UnsafeVariance E>): PersistentCollection<E>
+
+    /**
+     * Returns the result of removing a single appearance of the specified [element] from this collection.
+     *
+     * @return a new persistent collection with a single appearance of the specified [element] removed;
+     * or this instance if there is no such element in this collection.
+     */
+    fun remove(element: @UnsafeVariance E): PersistentCollection<E>
+
+    /**
+     * Returns the result of removing all elements in this collection that are also
+     * contained in the specified [elements] collection.
+     *
+     * @return a new persistent collection with elements in this collection that are also
+     * contained in the specified [elements] collection removed;
+     * or this instance if no modifications were made in the result of this operation.
+     */
+    fun removeAll(elements: Collection<@UnsafeVariance E>): PersistentCollection<E>
+
+    /**
+     * Returns the result of removing all elements in this collection that match the specified [predicate].
+     *
+     * @return a new persistent collection with elements matching the specified [predicate] removed;
+     * or this instance if no elements match the predicate.
+     */
+    fun removeAll(predicate: (E) -> Boolean): PersistentCollection<E>
+
+    /**
+     * Returns all elements in this collection that are also
+     * contained in the specified [elements] collection.
+     *
+     * @return a new persistent set with elements in this set that are also
+     * contained in the specified [elements] collection;
+     * or this instance if no modifications were made in the result of this operation.
+     */
+    fun retainAll(elements: Collection<@UnsafeVariance E>): PersistentCollection<E>
+
+    /**
+     * Returns an empty persistent collection.
+     */
+    fun clear(): PersistentCollection<E>
+
+    /**
+     * A generic builder of the persistent collection. Builder exposes its modification operations through the [MutableCollection] interface.
+     *
+     * Builders are reusable, that is [build] method can be called multiple times with modifications between these calls.
+     * However, modifications applied do not affect previously built persistent collection instances.
+     *
+     * Builder is backed by the same underlying data structure as the persistent collection it was created from.
+     * Thus, [builder] and [build] methods take constant time consisting of passing the backing storage to the
+     * new builder and persistent collection instances, respectively.
+     *
+     * The builder tracks which nodes in the structure are shared with the persistent collection,
+     * and which are owned by it exclusively. It owns the nodes it copied during modification
+     * operations and avoids copying them on subsequent modifications.
+     *
+     * When [build] is called the builder forgets about all owned nodes it had created.
+     */
+    interface Builder<E>: MutableCollection<E> {
+        /**
+         * Returns a persistent collection with the same contents as this builder.
+         *
+         * This method can be called multiple times.
+         *
+         * If operations applied on this builder have caused no modifications:
+         * - on the first call it returns the same persistent collection instance this builder was obtained from.
+         * - on subsequent calls it returns the same previously returned persistent collection instance.
+         */
+        fun build(): PersistentCollection<E>
+    }
+
+    /**
+     * Returns a new builder with the same contents as this collection.
+     *
+     * The builder can be used to efficiently perform multiple modification operations.
+     */
+    fun builder(): Builder<@UnsafeVariance E>
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableList.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableList.kt
new file mode 100644
index 0000000..5e7bf42
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableList.kt
@@ -0,0 +1,172 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.ListImplementation
+
+/**
+ * A generic immutable ordered collection of elements. Methods in this interface support only read-only access to the immutable list.
+ *
+ * Modification operations are supported through the [PersistentList] interface.
+ *
+ * Implementors of this interface take responsibility to be immutable.
+ * Once constructed they must contain the same elements in the same order.
+ *
+ * @param E the type of elements contained in the list. The immutable list is covariant on its element type.
+ */
+internal interface ImmutableList<out E> : List<E>, ImmutableCollection<E> {
+
+    /**
+     * Returns a view of the portion of this list between the specified [fromIndex] (inclusive) and [toIndex] (exclusive).
+     *
+     * The returned list is backed by this list.
+     *
+     * @throws IndexOutOfBoundsException if [fromIndex] is less than zero or [toIndex] is greater than the size of this list.
+     * @throws IllegalArgumentException if [fromIndex] is greater than [toIndex].
+     */
+    override fun subList(fromIndex: Int, toIndex: Int): ImmutableList<E> = SubList(this, fromIndex, toIndex)
+
+    private class SubList<E>(private val source: ImmutableList<E>, private val fromIndex: Int, private val toIndex: Int) : ImmutableList<E>, AbstractList<E>() {
+        private var _size: Int = 0
+
+        init {
+            ListImplementation.checkRangeIndexes(fromIndex, toIndex, source.size)
+            this._size = toIndex - fromIndex
+        }
+
+        override fun get(index: Int): E {
+            ListImplementation.checkElementIndex(index, _size)
+
+            return source[fromIndex + index]
+        }
+
+        override val size: Int get() = _size
+
+        override fun subList(fromIndex: Int, toIndex: Int): ImmutableList<E> {
+            ListImplementation.checkRangeIndexes(fromIndex, toIndex, this._size)
+            return SubList(source, this.fromIndex + fromIndex, this.fromIndex + toIndex)
+        }
+    }
+}
+
+/**
+ * A generic persistent ordered collection of elements that supports adding and removing elements.
+ *
+ * Modification operations return new instances of the persistent list with the modification applied.
+ *
+ * @param E the type of elements contained in the list. The persistent list is covariant on its element type.
+ */
+internal interface PersistentList<out E> : ImmutableList<E>, PersistentCollection<E> {
+    /**
+     * Returns a new persistent list with the specified [element] appended.
+     */
+    override fun add(element: @UnsafeVariance E): PersistentList<E>
+
+    /**
+     * Returns the result of appending all elements of the specified [elements] collection to this list.
+     *
+     * The elements are appended in the order they appear in the specified collection.
+     *
+     * @return a new persistent list with elements of the specified [elements] collection appended;
+     * or this instance if the specified collection is empty.
+     */
+    override fun addAll(elements: Collection<@UnsafeVariance E>): PersistentList<E> // = super<ImmutableCollection>.addAll(elements) as ImmutableList
+
+    /**
+     * Returns the result of removing the first appearance of the specified [element] from this list.
+     *
+     * @return a new persistent list with the first appearance of the specified [element] removed;
+     * or this instance if there is no such element in this list.
+     */
+    override fun remove(element: @UnsafeVariance E): PersistentList<E>
+
+    /**
+     * Returns the result of removing all elements in this list that are also
+     * contained in the specified [elements] collection.
+     *
+     * @return a new persistent list with elements in this list that are also
+     * contained in the specified [elements] collection removed;
+     * or this instance if no modifications were made in the result of this operation.
+     */
+    override fun removeAll(elements: Collection<@UnsafeVariance E>): PersistentList<E>
+
+    /**
+     * Returns the result of removing all elements in this list that match the specified [predicate].
+     *
+     * @return a new persistent list with elements matching the specified [predicate] removed;
+     * or this instance if no elements match the predicate.
+     */
+    override fun removeAll(predicate: (E) -> Boolean): PersistentList<E>
+
+    /**
+     * Returns all elements in this list that are also
+     * contained in the specified [elements] collection.
+     *
+     * @return a new persistent list with elements in this list that are also
+     * contained in the specified [elements] collection;
+     * or this instance if no modifications were made in the result of this operation.
+     */
+    override fun retainAll(elements: Collection<@UnsafeVariance E>): PersistentList<E>
+
+    /**
+     * Returns an empty persistent list.
+     */
+    override fun clear(): PersistentList<E>
+
+
+    /**
+     * Returns the result of inserting the specified [c] collection at the specified [index].
+     *
+     * @return a new persistent list with the specified [c] collection inserted at the specified [index];
+     * or this instance if the specified collection is empty.
+     *
+     * @throws IndexOutOfBoundsException if [index] is out of bounds of this list.
+     */
+    fun addAll(index: Int, c: Collection<@UnsafeVariance E>): PersistentList<E> // = builder().apply { addAll(index, c.toList()) }.build()
+
+    /**
+     * Returns a new persistent list with the element at the specified [index] replaced with the specified [element].
+     *
+     * @throws IndexOutOfBoundsException if [index] is out of bounds of this list.
+     */
+    fun set(index: Int, element: @UnsafeVariance E): PersistentList<E>
+
+    /**
+     * Returns a new persistent list with the specified [element] inserted at the specified [index].
+     *
+     * @throws IndexOutOfBoundsException if [index] is out of bounds of this list.
+     */
+    fun add(index: Int, element: @UnsafeVariance E): PersistentList<E>
+
+    /**
+     * Returns a new persistent list with the element at the specified [index] removed.
+     *
+     * @throws IndexOutOfBoundsException if [index] is out of bounds of this list.
+     */
+    fun removeAt(index: Int): PersistentList<E>
+
+    /**
+     * A generic builder of the persistent list. Builder exposes its modification operations through the [MutableList] interface.
+     *
+     * Builders are reusable, that is [build] method can be called multiple times with modifications between these calls.
+     * However, modifications applied do not affect previously built persistent list instances.
+     *
+     * Builder is backed by the same underlying data structure as the persistent list it was created from.
+     * Thus, [builder] and [build] methods take constant time consisting of passing the backing storage to the
+     * new builder and persistent list instances, respectively.
+     *
+     * The builder tracks which nodes in the structure are shared with the persistent list,
+     * and which are owned by it exclusively. It owns the nodes it copied during modification
+     * operations and avoids copying them on subsequent modifications.
+     *
+     * When [build] is called the builder forgets about all owned nodes it had created.
+     */
+    interface Builder<E>: MutableList<E>, PersistentCollection.Builder<E> {
+        override fun build(): PersistentList<E>
+    }
+
+    override fun builder(): Builder<@UnsafeVariance E>
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableMap.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableMap.kt
new file mode 100644
index 0000000..c15826c
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableMap.kt
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable
+
+/**
+ * A generic immutable collection that holds pairs of objects (keys and values) and supports efficiently retrieving
+ * the value corresponding to each key. Map keys are unique; the map holds only one value for each key.
+ * Methods in this interface support only read-only access to the immutable map.
+ *
+ * Modification operations are supported through the [PersistentMap] interface.
+ *
+ * Implementors of this interface take responsibility to be immutable.
+ * Once constructed they must contain the same elements in the same order.
+ *
+ * @param K the type of map keys. The map is invariant on its key type, as it
+ *          can accept key as a parameter (of [containsKey] for example) and return it in [keys] set.
+ * @param V the type of map values. The map is covariant on its value type.
+ */
+internal interface ImmutableMap<K, out V>: Map<K, V> {
+
+    override val keys: ImmutableSet<K>
+
+    override val values: ImmutableCollection<V>
+
+    override val entries: ImmutableSet<Map.Entry<K, V>>
+}
+
+
+/**
+ * A generic persistent collection that holds pairs of objects (keys and values) and supports efficiently retrieving
+ * the value corresponding to each key. Map keys are unique; the map holds only one value for each key.
+ *
+ * Modification operations return new instances of the persistent map with the modification applied.
+ *
+ * @param K the type of map keys. The map is invariant on its key type.
+ * @param V the type of map values. The persistent map is covariant on its value type.
+ */
+internal interface PersistentMap<K, out V> : ImmutableMap<K, V> {
+    /**
+     * Returns the result of associating the specified [value] with the specified [key] in this map.
+     *
+     * If this map already contains a mapping for the key, the old value is replaced by the specified value.
+     *
+     * @return a new persistent map with the specified [value] associated with the specified [key];
+     * or this instance if no modifications were made in the result of this operation.
+     */
+    fun put(key: K, value: @UnsafeVariance V): PersistentMap<K, V>
+
+    /**
+     * Returns the result of removing the specified [key] and its corresponding value from this map.
+     *
+     * @return a new persistent map with the specified [key] and its corresponding value removed;
+     * or this instance if it contains no mapping for the key.
+     */
+    fun remove(key: K): PersistentMap<K, V>
+
+    /**
+     * Returns the result of removing the entry that maps the specified [key] to the specified [value].
+     *
+     * @return a new persistent map with the entry for the specified [key] and [value] removed;
+     * or this instance if it contains no entry with the specified key and value.
+     */
+    fun remove(key: K, value: @UnsafeVariance V): PersistentMap<K, V>
+
+    /**
+     * Returns the result of merging the specified [m] map with this map.
+     *
+     * The effect of this call is equivalent to that of calling `put(k, v)` once for each
+     * mapping from key `k` to value `v` in the specified map.
+     *
+     * @return a new persistent map with keys and values from the specified map [m] associated;
+     * or this instance if no modifications were made in the result of this operation.
+     */
+    fun putAll(m: Map<out K, @UnsafeVariance V>): PersistentMap<K, V>  // m: Iterable<Map.Entry<K, V>> or Map<out K,V> or Iterable<Pair<K, V>>
+
+    /**
+     * Returns an empty persistent map.
+     */
+    fun clear(): PersistentMap<K, V>
+
+    /**
+     * A generic builder of the persistent map. Builder exposes its modification operations through the [MutableMap] interface.
+     *
+     * Builders are reusable, that is [build] method can be called multiple times with modifications between these calls.
+     * However, modifications applied do not affect previously built persistent map instances.
+     *
+     * Builder is backed by the same underlying data structure as the persistent map it was created from.
+     * Thus, [builder] and [build] methods take constant time passing the backing storage to the
+     * new builder and persistent map instances, respectively.
+     *
+     * The builder tracks which nodes in the structure are shared with the persistent map,
+     * and which are owned by it exclusively. It owns the nodes it copied during modification
+     * operations and avoids copying them on subsequent modifications.
+     *
+     * When [build] is called the builder forgets about all owned nodes it had created.
+     */
+    interface Builder<K, V>: MutableMap<K, V> {
+        /**
+         * Returns a persistent map with the same contents as this builder.
+         *
+         * This method can be called multiple times.
+         *
+         * If operations applied on this builder have caused no modifications:
+         * - on the first call it returns the same persistent map instance this builder was obtained from.
+         * - on subsequent calls it returns the same previously returned persistent map instance.
+         */
+        fun build(): PersistentMap<K, V>
+    }
+
+    /**
+     * Returns a new builder with the same contents as this map.
+     *
+     * The builder can be used to efficiently perform multiple modification operations.
+     */
+    fun builder(): Builder<K, @UnsafeVariance V>
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableSet.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableSet.kt
new file mode 100644
index 0000000..0af6db0
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableSet.kt
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable
+
+/**
+ * A generic immutable unordered collection of elements that does not support duplicate elements.
+ * Methods in this interface support only read-only access to the immutable set.
+ *
+ * Modification operations are supported through the [PersistentSet] interface.
+ *
+ * Implementors of this interface take responsibility to be immutable.
+ * Once constructed they must contain the same elements in the same order.
+ *
+ * @param E the type of elements contained in the set. The set is covariant on its element type.
+ */
+internal interface ImmutableSet<out E>: Set<E>, ImmutableCollection<E>
+
+/**
+ * A generic persistent unordered collection of elements that does not support duplicate elements, and supports
+ * adding and removing elements.
+ *
+ * Modification operations return new instances of the persistent set with the modification applied.
+ *
+ * @param E the type of elements contained in the set. The persistent set is covariant on its element type.
+ */
+internal interface PersistentSet<out E> : ImmutableSet<E>, PersistentCollection<E> {
+    /**
+     * Returns the result of adding the specified [element] to this set.
+     *
+     * @return a new persistent set with the specified [element] added;
+     * or this instance if it already contains the element.
+     */
+    override fun add(element: @UnsafeVariance E): PersistentSet<E>
+
+    /**
+     * Returns the result of adding all elements of the specified [elements] collection to this set.
+     *
+     * @return a new persistent set with elements of the specified [elements] collection added;
+     * or this instance if it already contains every element of the specified collection.
+     */
+    override fun addAll(elements: Collection<@UnsafeVariance E>): PersistentSet<E>
+
+    /**
+     * Returns the result of removing the specified [element] from this set.
+     *
+     * @return a new persistent set with the specified [element] removed;
+     * or this instance if there is no such element in this set.
+     */
+    override fun remove(element: @UnsafeVariance E): PersistentSet<E>
+
+    /**
+     * Returns the result of removing all elements in this set that are also
+     * contained in the specified [elements] collection.
+     *
+     * @return a new persistent set with elements in this set that are also
+     * contained in the specified [elements] collection removed;
+     * or this instance if no modifications were made in the result of this operation.
+     */
+    override fun removeAll(elements: Collection<@UnsafeVariance E>): PersistentSet<E>
+
+    /**
+     * Returns the result of removing all elements in this set that match the specified [predicate].
+     *
+     * @return a new persistent set with elements matching the specified [predicate] removed;
+     * or this instance if no elements match the predicate.
+     */
+    override fun removeAll(predicate: (E) -> Boolean): PersistentSet<E>
+
+    /**
+     * Returns all elements in this set that are also
+     * contained in the specified [elements] collection.
+     *
+     * @return a new persistent set with elements in this set that are also
+     * contained in the specified [elements] collection;
+     * or this instance if no modifications were made in the result of this operation.
+     */
+    override fun retainAll(elements: Collection<@UnsafeVariance E>): PersistentSet<E>
+
+    /**
+     * Returns an empty persistent set.
+     */
+    override fun clear(): PersistentSet<E>
+
+    /**
+     * A generic builder of the persistent set. Builder exposes its modification operations through the [MutableSet] interface.
+     *
+     * Builders are reusable, that is [build] method can be called multiple times with modifications between these calls.
+     * However, modifications applied do not affect previously built persistent set instances.
+     *
+     * Builder is backed by the same underlying data structure as the persistent set it was created from.
+     * Thus, [builder] and [build] methods take constant time consisting of passing the backing storage to the
+     * new builder and persistent set instances, respectively.
+     *
+     * The builder tracks which nodes in the structure are shared with the persistent set,
+     * and which are owned by it exclusively. It owns the nodes it copied during modification
+     * operations and avoids copying them on subsequent modifications.
+     *
+     * When [build] is called the builder forgets about all owned nodes it had created.
+     */
+    interface Builder<E>: MutableSet<E>, PersistentCollection.Builder<E> {
+        override fun build(): PersistentSet<E>
+    }
+
+    override fun builder(): Builder<@UnsafeVariance E>
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/README.md b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/README.md
new file mode 100644
index 0000000..017c399
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/README.md
@@ -0,0 +1,17 @@
+Kotlinx immutable collections
+
+Imported from https://github.com/Kotlin/kotlinx.collections.immutable
+commit 75ed654e34e7111a076d87b8c075fd140e6b4cf7 (HEAD, tag: v0.3.4)
+
+At the time of this import, kotlinx.collections.immutable was unstable
+and Jetbrains raised a concern that by Compose depending upon it,
+there would be issues when breaking changes occur in upstream and users
+have conflicting versions of the library on their classpath.  JB
+requested that we shade the library in order avoid binary compat
+issues.  We don't have effective tools to shade common dependencies
+so importing the source and renaming the package ended up being
+the most reasonable strategy.
+
+This was done as a fix to: b/183400125
+
+
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/adapters/ReadOnlyCollectionAdapters.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/adapters/ReadOnlyCollectionAdapters.kt
new file mode 100644
index 0000000..928d3a3
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/adapters/ReadOnlyCollectionAdapters.kt
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.adapters
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.*
+
+
+/*
+ These classes allow to expose read-only collection as immutable, if it's actually immutable one
+ Use with caution: wrapping mutable collection as immutable is a contract violation of the latter.
+ */
+
+internal open class ImmutableCollectionAdapter<E>(private val impl: Collection<E>) : ImmutableCollection<E>, Collection<E> by impl {
+    override fun equals(other: Any?): Boolean = impl.equals(other)
+    override fun hashCode(): Int = impl.hashCode()
+    override fun toString(): String = impl.toString()
+}
+
+
+internal class ImmutableListAdapter<E>(private val impl: List<E>) : ImmutableList<E>, List<E> by impl {
+
+    override fun subList(fromIndex: Int, toIndex: Int): ImmutableList<E> = ImmutableListAdapter(impl.subList(fromIndex, toIndex))
+
+    override fun equals(other: Any?): Boolean = impl.equals(other)
+    override fun hashCode(): Int = impl.hashCode()
+    override fun toString(): String = impl.toString()
+}
+
+
+internal class ImmutableSetAdapter<E>(impl: Set<E>) : ImmutableSet<E>, ImmutableCollectionAdapter<E>(impl)
+
+
+internal class ImmutableMapAdapter<K, out V>(private val impl: Map<K, V>) : ImmutableMap<K, V>, Map<K, V> by impl {
+    // TODO: Lazy initialize these properties?
+    override val keys: ImmutableSet<K> = ImmutableSetAdapter(impl.keys)
+    override val values: ImmutableCollection<V> = ImmutableCollectionAdapter(impl.values)
+    override val entries: ImmutableSet<Map.Entry<K, V>> = ImmutableSetAdapter(impl.entries)
+
+    override fun equals(other: Any?): Boolean = impl.equals(other)
+    override fun hashCode(): Int = impl.hashCode()
+    override fun toString(): String = impl.toString()
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/extensions.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/extensions.kt
new file mode 100644
index 0000000..651144f
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/extensions.kt
@@ -0,0 +1,740 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+@file:Suppress("NOTHING_TO_INLINE")
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList.persistentVectorOf
+import androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap.PersistentHashMap
+import androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap.PersistentHashMapBuilder
+import androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet.PersistentHashSet
+import androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet.PersistentHashSetBuilder
+import androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.persistentOrderedMap.PersistentOrderedMap
+import androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.persistentOrderedMap.PersistentOrderedMapBuilder
+import androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.persistentOrderedSet.PersistentOrderedSet
+import androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.persistentOrderedSet.PersistentOrderedSetBuilder
+
+//@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
+//inline fun <T> @kotlin.internal.Exact ImmutableCollection<T>.mutate(mutator: (MutableCollection<T>) -> Unit): ImmutableCollection<T> = builder().apply(mutator).build()
+// it or this?
+/**
+ * Returns the result of applying the provided modifications on this set.
+ *
+ * The mutable set passed to the [mutator] closure has the same contents as this persistent set.
+ *
+ * @return a new persistent set with the provided modifications applied;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal inline fun <T> PersistentSet<T>.mutate(mutator: (MutableSet<T>) -> Unit): PersistentSet<T> = builder().apply(mutator).build()
+
+/**
+ * Returns the result of applying the provided modifications on this list.
+ *
+ * The mutable list passed to the [mutator] closure has the same contents as this persistent list.
+ *
+ * @return a new persistent list with the provided modifications applied;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal inline fun <T> PersistentList<T>.mutate(mutator: (MutableList<T>) -> Unit): PersistentList<T> = builder().apply(mutator).build()
+
+/**
+ * Returns the result of applying the provided modifications on this map.
+ *
+ * The mutable map passed to the [mutator] closure has the same contents as this persistent map.
+ *
+ * @return a new persistent map with the provided modifications applied;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+@Suppress("UNCHECKED_CAST")
+internal inline fun <K, V> PersistentMap<out K, V>.mutate(mutator: (MutableMap<K, V>) -> Unit): PersistentMap<K, V> =
+        (this as PersistentMap<K, V>).builder().apply(mutator).build()
+
+
+/**
+ * Returns the result of adding the specified [element] to this collection.
+ *
+ * @returns a new persistent collection with the specified [element] added;
+ * or this instance if this collection does not support duplicates and it already contains the element.
+ */
+internal inline operator fun <E> PersistentCollection<E>.plus(element: E): PersistentCollection<E> = add(element)
+
+/**
+ * Returns the result of removing a single appearance of the specified [element] from this collection.
+ *
+ * @return a new persistent collection with a single appearance of the specified [element] removed;
+ * or this instance if there is no such element in this collection.
+ */
+internal inline operator fun <E> PersistentCollection<E>.minus(element: E): PersistentCollection<E> = remove(element)
+
+
+/**
+ * Returns the result of adding all elements of the specified [elements] collection to this collection.
+ *
+ * @return a new persistent collection with elements of the specified [elements] collection added;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <E> PersistentCollection<E>.plus(elements: Iterable<E>): PersistentCollection<E>
+        = if (elements is Collection) addAll(elements) else builder().also { it.addAll(elements) }.build()
+
+/**
+ * Returns the result of adding all elements of the specified [elements] array to this collection.
+ *
+ * @return a new persistent collection with elements of the specified [elements] array added;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <E> PersistentCollection<E>.plus(elements: Array<out E>): PersistentCollection<E>
+        = builder().also { it.addAll(elements) }.build()
+
+/**
+ * Returns the result of adding all elements of the specified [elements] sequence to this collection.
+ *
+ * @return a new persistent collection with elements of the specified [elements] sequence added;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <E> PersistentCollection<E>.plus(elements: Sequence<E>): PersistentCollection<E>
+        = builder().also { it.addAll(elements) }.build()
+
+
+/**
+ * Returns the result of removing all elements in this collection that are also
+ * contained in the specified [elements] collection.
+ *
+ * @return a new persistent collection with elements in this collection that are also
+ * contained in the specified [elements] collection removed;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <E> PersistentCollection<E>.minus(elements: Iterable<E>): PersistentCollection<E>
+        = if (elements is Collection) removeAll(elements) else builder().also { it.removeAll(elements) }.build()
+
+/**
+ * Returns the result of removing all elements in this collection that are also
+ * contained in the specified [elements] array.
+ *
+ * @return a new persistent collection with elements in this collection that are also
+ * contained in the specified [elements] array removed;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <E> PersistentCollection<E>.minus(elements: Array<out E>): PersistentCollection<E>
+        = builder().also { it.removeAll(elements) }.build()
+
+/**
+ * Returns the result of removing all elements in this collection that are also
+ * contained in the specified [elements] sequence.
+ *
+ * @return a new persistent collection with elements in this collection that are also
+ * contained in the specified [elements] sequence removed;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <E> PersistentCollection<E>.minus(elements: Sequence<E>): PersistentCollection<E>
+        =  builder().also { it.removeAll(elements) }.build()
+
+
+/**
+ * Returns a new persistent list with the specified [element] appended.
+ */
+internal inline operator fun <E> PersistentList<E>.plus(element: E): PersistentList<E> = add(element)
+
+/**
+ * Returns the result of removing the first appearance of the specified [element] from this list.
+ *
+ * @return a new persistent list with the first appearance of the specified [element] removed;
+ * or this instance if there is no such element in this list.
+ */
+internal inline operator fun <E> PersistentList<E>.minus(element: E): PersistentList<E> = remove(element)
+
+
+/**
+ * Returns the result of appending all elements of the specified [elements] collection to this list.
+ *
+ * The elements are appended in the order they appear in the specified collection.
+ *
+ * @return a new persistent list with elements of the specified [elements] collection appended;
+ * or this instance if the specified collection is empty.
+ */
+internal operator fun <E> PersistentList<E>.plus(elements: Iterable<E>): PersistentList<E>
+        = if (elements is Collection) addAll(elements) else mutate { it.addAll(elements) }
+
+/**
+ * Returns the result of appending all elements of the specified [elements] array to this list.
+ *
+ * The elements are appended in the order they appear in the specified array.
+ *
+ * @return a new persistent list with elements of the specified [elements] array appended;
+ * or this instance if the specified array is empty.
+ */
+internal operator fun <E> PersistentList<E>.plus(elements: Array<out E>): PersistentList<E>
+        = mutate { it.addAll(elements) }
+
+/**
+ * Returns the result of appending all elements of the specified [elements] sequence to this list.
+ *
+ * The elements are appended in the order they appear in the specified sequence.
+ *
+ * @return a new persistent list with elements of the specified [elements] sequence appended;
+ * or this instance if the specified sequence is empty.
+ */
+internal operator fun <E> PersistentList<E>.plus(elements: Sequence<E>): PersistentList<E>
+        = mutate { it.addAll(elements) }
+
+
+/**
+ * Returns the result of removing all elements in this list that are also
+ * contained in the specified [elements] collection.
+ *
+ * @return a new persistent list with elements in this list that are also
+ * contained in the specified [elements] collection removed;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <E> PersistentList<E>.minus(elements: Iterable<E>): PersistentList<E>
+        = if (elements is Collection) removeAll(elements) else mutate { it.removeAll(elements) }
+
+/**
+ * Returns the result of removing all elements in this list that are also
+ * contained in the specified [elements] array.
+ *
+ * @return a new persistent list with elements in this list that are also
+ * contained in the specified [elements] array removed;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <E> PersistentList<E>.minus(elements: Array<out E>): PersistentList<E>
+        = mutate { it.removeAll(elements) }
+
+/**
+ * Returns the result of removing all elements in this list that are also
+ * contained in the specified [elements] sequence.
+ *
+ * @return a new persistent list with elements in this list that are also
+ * contained in the specified [elements] sequence removed;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <E> PersistentList<E>.minus(elements: Sequence<E>): PersistentList<E>
+        = mutate { it.removeAll(elements) }
+
+
+/**
+ * Returns the result of adding the specified [element] to this set.
+ *
+ * @return a new persistent set with the specified [element] added;
+ * or this instance if it already contains the element.
+ */
+internal inline operator fun <E> PersistentSet<E>.plus(element: E): PersistentSet<E> = add(element)
+
+/**
+ * Returns the result of removing the specified [element] from this set.
+ *
+ * @return a new persistent set with the specified [element] removed;
+ * or this instance if there is no such element in this set.
+ */
+internal inline operator fun <E> PersistentSet<E>.minus(element: E): PersistentSet<E> = remove(element)
+
+
+/**
+ * Returns the result of adding all elements of the specified [elements] collection to this set.
+ *
+ * @return a new persistent set with elements of the specified [elements] collection added;
+ * or this instance if it already contains every element of the specified collection.
+ */
+internal operator fun <E> PersistentSet<E>.plus(elements: Iterable<E>): PersistentSet<E>
+        = if (elements is Collection) addAll(elements) else mutate { it.addAll(elements) }
+
+/**
+ * Returns the result of adding all elements of the specified [elements] array to this set.
+ *
+ * @return a new persistent set with elements of the specified [elements] array added;
+ * or this instance if it already contains every element of the specified array.
+ */
+internal operator fun <E> PersistentSet<E>.plus(elements: Array<out E>): PersistentSet<E>
+        = mutate { it.addAll(elements) }
+
+/**
+ * Returns the result of adding all elements of the specified [elements] sequence to this set.
+ *
+ * @return a new persistent set with elements of the specified [elements] sequence added;
+ * or this instance if it already contains every element of the specified sequence.
+ */
+internal operator fun <E> PersistentSet<E>.plus(elements: Sequence<E>): PersistentSet<E>
+        = mutate { it.addAll(elements) }
+
+
+/**
+ * Returns the result of removing all elements in this set that are also
+ * contained in the specified [elements] collection.
+ *
+ * @return a new persistent set with elements in this set that are also
+ * contained in the specified [elements] collection removed;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <E> PersistentSet<E>.minus(elements: Iterable<E>): PersistentSet<E>
+        = if (elements is Collection) removeAll(elements) else mutate { it.removeAll(elements) }
+
+/**
+ * Returns the result of removing all elements in this set that are also
+ * contained in the specified [elements] array.
+ *
+ * @return a new persistent set with elements in this set that are also
+ * contained in the specified [elements] array removed;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <E> PersistentSet<E>.minus(elements: Array<out E>): PersistentSet<E>
+        = mutate { it.removeAll(elements) }
+
+/**
+ * Returns the result of removing all elements in this set that are also
+ * contained in the specified [elements] sequence.
+ *
+ * @return a new persistent set with elements in this set that are also
+ * contained in the specified [elements] sequence removed;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <E> PersistentSet<E>.minus(elements: Sequence<E>): PersistentSet<E>
+        = mutate { it.removeAll(elements) }
+
+/**
+ * Returns all elements in this set that are also
+ * contained in the specified [elements] collection.
+ *
+ * @return a new persistent set with elements in this set that are also
+ * contained in the specified [elements] collection;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal infix fun <E> PersistentSet<E>.intersect(elements: Iterable<E>): PersistentSet<E>
+        = if (elements is Collection) retainAll(elements) else mutate { it.retainAll(elements) }
+
+/**
+ * Returns all elements in this collection that are also
+ * contained in the specified [elements] collection.
+ *
+ * @return a new persistent set with elements in this collection that are also
+ * contained in the specified [elements] collection
+ */
+internal infix fun <E> PersistentCollection<E>.intersect(elements: Iterable<E>): PersistentSet<E>
+        = this.toPersistentSet().intersect(elements)
+
+/**
+ * Returns the result of adding an entry to this map from the specified key-value [pair].
+ *
+ * If this map already contains a mapping for the key,
+ * the old value is replaced by the value from the specified [pair].
+ *
+ * @return a new persistent map with an entry from the specified key-value [pair] added;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+@Suppress("UNCHECKED_CAST")
+internal inline operator fun <K, V> PersistentMap<out K, V>.plus(pair: Pair<K, V>): PersistentMap<K, V>
+        = (this as PersistentMap<K, V>).put(pair.first, pair.second)
+
+/**
+ * Returns the result of replacing or adding entries to this map from the specified key-value pairs.
+ *
+ * @return a new persistent map with entries from the specified key-value pairs added;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal inline operator fun <K, V> PersistentMap<out K, V>.plus(pairs: Iterable<Pair<K, V>>): PersistentMap<K, V> = putAll(pairs)
+
+/**
+ * Returns the result of replacing or adding entries to this map from the specified key-value pairs.
+ *
+ * @return a new persistent map with entries from the specified key-value pairs added;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal inline operator fun <K, V> PersistentMap<out K, V>.plus(pairs: Array<out Pair<K, V>>): PersistentMap<K, V> = putAll(pairs)
+
+/**
+ * Returns the result of replacing or adding entries to this map from the specified key-value pairs.
+ *
+ * @return a new persistent map with entries from the specified key-value pairs added;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal inline operator fun <K, V> PersistentMap<out K, V>.plus(pairs: Sequence<Pair<K, V>>): PersistentMap<K, V> = putAll(pairs)
+
+/**
+ * Returns the result of merging the specified [map] with this map.
+ *
+ * The effect of this call is equivalent to that of calling `put(k, v)` once for each
+ * mapping from key `k` to value `v` in the specified map.
+ *
+ * @return a new persistent map with keys and values from the specified [map] associated;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal inline operator fun <K, V> PersistentMap<out K, V>.plus(map: Map<out K, V>): PersistentMap<K, V> = putAll(map)
+
+
+/**
+ * Returns the result of merging the specified [map] with this map.
+ *
+ * The effect of this call is equivalent to that of calling `put(k, v)` once for each
+ * mapping from key `k` to value `v` in the specified map.
+ *
+ * @return a new persistent map with keys and values from the specified [map] associated;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+@Suppress("UNCHECKED_CAST")
+internal fun <K, V> PersistentMap<out K, V>.putAll(map: Map<out K, V>): PersistentMap<K, V> =
+        (this as PersistentMap<K, V>).putAll(map)
+
+/**
+ * Returns the result of replacing or adding entries to this map from the specified key-value pairs.
+ *
+ * @return a new persistent map with entries from the specified key-value pairs added;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal fun <K, V> PersistentMap<out K, V>.putAll(pairs: Iterable<Pair<K, V>>): PersistentMap<K, V>
+        = mutate { it.putAll(pairs) }
+
+/**
+ * Returns the result of replacing or adding entries to this map from the specified key-value pairs.
+ *
+ * @return a new persistent map with entries from the specified key-value pairs added;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal fun <K, V> PersistentMap<out K, V>.putAll(pairs: Array<out Pair<K, V>>): PersistentMap<K, V>
+        = mutate { it.putAll(pairs) }
+
+/**
+ * Returns the result of replacing or adding entries to this map from the specified key-value pairs.
+ *
+ * @return a new persistent map with entries from the specified key-value pairs added;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal fun <K, V> PersistentMap<out K, V>.putAll(pairs: Sequence<Pair<K, V>>): PersistentMap<K, V>
+        = mutate { it.putAll(pairs) }
+
+
+/**
+ * Returns the result of removing the specified [key] and its corresponding value from this map.
+ *
+ * @return a new persistent map with the specified [key] and its corresponding value removed;
+ * or this instance if it contains no mapping for the key.
+ */
+@Suppress("UNCHECKED_CAST")
+internal operator fun <K, V> PersistentMap<out K, V>.minus(key: K): PersistentMap<K, V>
+        = (this as PersistentMap<K, V>).remove(key)
+
+/**
+ * Returns the result of removing the specified [keys] and their corresponding values from this map.
+ *
+ * @return a new persistent map with the specified [keys] and their corresponding values removed;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <K, V> PersistentMap<out K, V>.minus(keys: Iterable<K>): PersistentMap<K, V>
+        = mutate { it.minusAssign(keys) }
+
+/**
+ * Returns the result of removing the specified [keys] and their corresponding values from this map.
+ *
+ * @return a new persistent map with the specified [keys] and their corresponding values removed;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <K, V> PersistentMap<out K, V>.minus(keys: Array<out K>): PersistentMap<K, V>
+        = mutate { it.minusAssign(keys) }
+
+/**
+ * Returns the result of removing the specified [keys] and their corresponding values from this map.
+ *
+ * @return a new persistent map with the specified [keys] and their corresponding values removed;
+ * or this instance if no modifications were made in the result of this operation.
+ */
+internal operator fun <K, V> PersistentMap<out K, V>.minus(keys: Sequence<K>): PersistentMap<K, V>
+        = mutate { it.minusAssign(keys) }
+
+
+/**
+ * Returns a new persistent list of the specified elements.
+ */
+internal fun <E> persistentListOf(vararg elements: E): PersistentList<E> = persistentVectorOf<E>().addAll(elements.asList())
+
+/**
+ * Returns an empty persistent list.
+ */
+internal fun <E> persistentListOf(): PersistentList<E> = persistentVectorOf()
+
+
+/**
+ * Returns a new persistent set with the given elements.
+ *
+ * Elements of the returned set are iterated in the order they were specified.
+ */
+internal fun <E> persistentSetOf(vararg elements: E): PersistentSet<E> = PersistentOrderedSet.emptyOf<E>().addAll(elements.asList())
+
+/**
+ * Returns an empty persistent set.
+ */
+internal fun <E> persistentSetOf(): PersistentSet<E> = PersistentOrderedSet.emptyOf<E>()
+
+
+/**
+ * Returns a new persistent set with the given elements.
+ *
+ * Order of the elements in the returned set is unspecified.
+ */
+internal fun <E> persistentHashSetOf(vararg elements: E): PersistentSet<E> = PersistentHashSet.emptyOf<E>().addAll(elements.asList())
+
+/**
+ * Returns an empty persistent set.
+ */
+internal fun <E> persistentHashSetOf(): PersistentSet<E> = PersistentHashSet.emptyOf()
+
+
+/**
+ * Returns a new persistent map with the specified contents, given as a list of pairs
+ * where the first component is the key and the second is the value.
+ *
+ * If multiple pairs have the same key, the resulting map will contain the value from the last of those pairs.
+ *
+ * Entries of the map are iterated in the order they were specified.
+ */
+internal fun <K, V> persistentMapOf(vararg pairs: Pair<K, V>): PersistentMap<K, V> = PersistentOrderedMap.emptyOf<K,V>().mutate { it += pairs }
+
+/**
+ * Returns an empty persistent map.
+ */
+internal fun <K, V> persistentMapOf(): PersistentMap<K, V> = PersistentOrderedMap.emptyOf()
+
+
+/**
+ * Returns a new persistent map with the specified contents, given as a list of pairs
+ * where the first component is the key and the second is the value.
+ *
+ * If multiple pairs have the same key, the resulting map will contain the value from the last of those pairs.
+ *
+ * Order of the entries in the returned map is unspecified.
+ */
+internal fun <K, V> persistentHashMapOf(vararg pairs: Pair<K, V>): PersistentMap<K, V> = PersistentHashMap.emptyOf<K,V>().mutate { it += pairs }
+
+/**
+ * Returns an empty persistent map.
+ */
+internal fun <K, V> persistentHashMapOf(): PersistentMap<K, V> = PersistentHashMap.emptyOf()
+
+
+/**
+ * Returns a new persistent list of the specified elements.
+ */
+@Deprecated("Use persistentListOf instead.", ReplaceWith("persistentListOf(*elements)"))
+internal fun <E> immutableListOf(vararg elements: E): PersistentList<E> = persistentListOf(*elements)
+
+/**
+ * Returns an empty persistent list.
+ */
+@Deprecated("Use persistentListOf instead.", ReplaceWith("persistentListOf()"))
+internal fun <E> immutableListOf(): PersistentList<E> = persistentListOf()
+
+
+/**
+ * Returns a new persistent set with the given elements.
+ *
+ * Elements of the returned set are iterated in the order they were specified.
+ */
+@Deprecated("Use persistentSetOf instead.", ReplaceWith("persistentSetOf(*elements)"))
+internal fun <E> immutableSetOf(vararg elements: E): PersistentSet<E> = persistentSetOf(*elements)
+
+/**
+ * Returns an empty persistent set.
+ */
+@Deprecated("Use persistentSetOf instead.", ReplaceWith("persistentSetOf()"))
+internal fun <E> immutableSetOf(): PersistentSet<E> = persistentSetOf()
+
+
+/**
+ * Returns a new persistent set with the given elements.
+ *
+ * Order of the elements in the returned set is unspecified.
+ */
+@Deprecated("Use persistentHashSetOf instead.", ReplaceWith("persistentHashSetOf(*elements)"))
+internal fun <E> immutableHashSetOf(vararg elements: E): PersistentSet<E> = persistentHashSetOf(*elements)
+
+
+/**
+ * Returns a new persistent map with the specified contents, given as a list of pairs
+ * where the first component is the key and the second is the value.
+ *
+ * If multiple pairs have the same key, the resulting map will contain the value from the last of those pairs.
+ *
+ * Entries of the map are iterated in the order they were specified.
+ */
+@Deprecated("Use persistentMapOf instead.", ReplaceWith("persistentMapOf(*pairs)"))
+internal fun <K, V> immutableMapOf(vararg pairs: Pair<K, V>): PersistentMap<K, V> = persistentMapOf(*pairs)
+
+/**
+ * Returns a new persistent map with the specified contents, given as a list of pairs
+ * where the first component is the key and the second is the value.
+ *
+ * If multiple pairs have the same key, the resulting map will contain the value from the last of those pairs.
+ *
+ * Order of the entries in the returned map is unspecified.
+ */
+@Deprecated("Use persistentHashMapOf instead.", ReplaceWith("persistentHashMapOf(*pairs)"))
+internal fun <K, V> immutableHashMapOf(vararg pairs: Pair<K, V>): PersistentMap<K, V> = persistentHashMapOf(*pairs)
+
+
+/**
+ * Returns an immutable list containing all elements of this collection.
+ *
+ * If the receiver is already an immutable list, returns it as is.
+ */
+internal fun <T> Iterable<T>.toImmutableList(): ImmutableList<T> =
+        this as? ImmutableList
+        ?: this.toPersistentList()
+
+/**
+ * Returns an immutable list containing all elements of this sequence.
+ */
+internal fun <T> Sequence<T>.toImmutableList(): ImmutableList<T> = toPersistentList()
+
+/**
+ * Returns an immutable list containing all characters.
+ */
+internal fun CharSequence.toImmutableList(): ImmutableList<Char> = toPersistentList()
+
+
+// fun <T> Array<T>.toImmutableList(): ImmutableList<T> = immutableListOf<T>() + this.asList()
+
+
+/**
+ * Returns a persistent list containing all elements of this collection.
+ *
+ * If the receiver is already a persistent list, returns it as is.
+ * If the receiver is a persistent list builder, calls `build` on it and returns the result.
+ */
+internal fun <T> Iterable<T>.toPersistentList(): PersistentList<T> =
+        this as? PersistentList
+        ?: (this as? PersistentList.Builder)?.build()
+        ?: persistentListOf<T>() + this
+
+/**
+ * Returns a persistent list containing all elements of this sequence.
+ */
+internal fun <T> Sequence<T>.toPersistentList(): PersistentList<T> = persistentListOf<T>() + this
+
+/**
+ * Returns a persistent list containing all characters.
+ */
+internal fun CharSequence.toPersistentList(): PersistentList<Char> =
+    persistentListOf<Char>().mutate { this.toCollection(it) }
+
+
+/**
+ * Returns an immutable set of all elements of this collection.
+ *
+ * If the receiver is already an immutable set, returns it as is.
+ *
+ * Elements of the returned set are iterated in the same order as in this collection.
+ */
+internal fun <T> Iterable<T>.toImmutableSet(): ImmutableSet<T> =
+        this as? ImmutableSet<T>
+        ?: (this as? PersistentSet.Builder)?.build()
+        ?: persistentSetOf<T>() + this
+
+/**
+ * Returns an immutable set of all elements of this sequence.
+ *
+ * Elements of the returned set are iterated in the same order as in this sequence.
+ */
+internal fun <T> Sequence<T>.toImmutableSet(): ImmutableSet<T> = toPersistentSet()
+
+/**
+ * Returns an immutable set of all characters.
+ *
+ * Elements of the returned set are iterated in the same order as in this char sequence.
+ */
+internal fun CharSequence.toImmutableSet(): PersistentSet<Char> = toPersistentSet()
+
+
+/**
+ * Returns a persistent set of all elements of this collection.
+ *
+ * If the receiver is already a persistent set, returns it as is.
+ * If the receiver is a persistent set builder, calls `build` on it and returns the result.
+ *
+ * Elements of the returned set are iterated in the same order as in this collection.
+ */
+internal fun <T> Iterable<T>.toPersistentSet(): PersistentSet<T> =
+        this as? PersistentOrderedSet<T>
+        ?: (this as? PersistentOrderedSetBuilder)?.build()
+        ?: PersistentOrderedSet.emptyOf<T>() + this
+
+/**
+ * Returns a persistent set of all elements of this sequence.
+ *
+ * Elements of the returned set are iterated in the same order as in this sequence.
+ */
+internal fun <T> Sequence<T>.toPersistentSet(): PersistentSet<T> = persistentSetOf<T>() + this
+
+/**
+ * Returns a persistent set of all characters.
+ *
+ * Elements of the returned set are iterated in the same order as in this char sequence.
+ */
+internal fun CharSequence.toPersistentSet(): PersistentSet<Char> =
+        persistentSetOf<Char>().mutate { this.toCollection(it) }
+
+
+/**
+ * Returns a persistent set containing all elements from this set.
+ *
+ * If the receiver is already a persistent hash set, returns it as is.
+ * If the receiver is a persistent hash set builder, calls `build` on it and returns the result.
+ *
+ * Order of the elements in the returned set is unspecified.
+ */
+internal fun <T> Iterable<T>.toPersistentHashSet(): PersistentSet<T>
+    = this as? PersistentHashSet
+        ?: (this as? PersistentHashSetBuilder<T>)?.build()
+        ?: PersistentHashSet.emptyOf<T>() + this
+
+/**
+ * Returns a persistent set of all elements of this sequence.
+ *
+ * Order of the elements in the returned set is unspecified.
+ */
+internal fun <T> Sequence<T>.toPersistentHashSet(): PersistentSet<T> = persistentHashSetOf<T>() + this
+
+/**
+ * Returns a persistent set of all characters.
+ *
+ * Order of the elements in the returned set is unspecified.
+ */
+internal fun CharSequence.toPersistentHashSet(): PersistentSet<Char> =
+        persistentHashSetOf<Char>().mutate { this.toCollection(it) }
+
+
+/**
+ * Returns an immutable map containing all entries from this map.
+ *
+ * If the receiver is already an immutable map, returns it as is.
+ *
+ * Entries of the returned map are iterated in the same order as in this map.
+ */
+internal fun <K, V> Map<K, V>.toImmutableMap(): ImmutableMap<K, V>
+    = this as? ImmutableMap
+        ?: (this as? PersistentMap.Builder)?.build()
+        ?: persistentMapOf<K, V>().putAll(this)
+
+/**
+ * Returns a persistent map containing all entries from this map.
+ *
+ * If the receiver is already a persistent map, returns it as is.
+ * If the receiver is a persistent map builder, calls `build` on it and returns the result.
+ *
+ * Entries of the returned map are iterated in the same order as in this map.
+ */
+internal fun <K, V> Map<K, V>.toPersistentMap(): PersistentMap<K, V>
+    = this as? PersistentOrderedMap<K, V>
+        ?: (this as? PersistentOrderedMapBuilder<K, V>)?.build()
+        ?: PersistentOrderedMap.emptyOf<K, V>().putAll(this)
+
+/**
+ * Returns an immutable map containing all entries from this map.
+ *
+ * If the receiver is already a persistent hash map, returns it as is.
+ * If the receiver is a persistent hash map builder, calls `build` on it and returns the result.
+ *
+ * Order of the entries in the returned map is unspecified.
+ */
+internal fun <K, V> Map<K, V>.toPersistentHashMap(): PersistentMap<K, V>
+        = this as? PersistentHashMap
+        ?: (this as? PersistentHashMapBuilder<K, V>)?.build()
+        ?: PersistentHashMap.emptyOf<K, V>().putAll(this)
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractListIterator.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractListIterator.kt
new file mode 100644
index 0000000..7f97389
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractListIterator.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList
+
+internal abstract class AbstractListIterator<out E>(var index: Int, var size: Int) : ListIterator<E> {
+    override fun hasNext(): Boolean {
+        return index < size
+    }
+
+    override fun hasPrevious(): Boolean {
+        return index > 0
+    }
+
+    override fun nextIndex(): Int {
+        return index
+    }
+
+    override fun previousIndex(): Int {
+        return index - 1
+    }
+
+    internal fun checkHasNext() {
+        if (!hasNext())
+            throw NoSuchElementException()
+    }
+
+    internal fun checkHasPrevious() {
+        if (!hasPrevious())
+            throw NoSuchElementException()
+    }
+}
+
+
+internal class SingleElementListIterator<E>(private val element: E, index: Int): AbstractListIterator<E>(index, 1) {
+    override fun next(): E {
+        checkHasNext()
+        index++
+        return element
+    }
+
+    override fun previous(): E {
+        checkHasPrevious()
+        index--
+        return element
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList.kt
new file mode 100644
index 0000000..34d01a2
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.ImmutableList
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentList
+import androidx.compose.runtime.external.kotlinx.collections.immutable.mutate
+
+internal abstract class AbstractPersistentList<E> : PersistentList<E>, AbstractList<E>() {
+    override fun subList(fromIndex: Int, toIndex: Int): ImmutableList<E> {
+        return super<PersistentList>.subList(fromIndex, toIndex)
+    }
+
+    override fun addAll(elements: Collection<E>): PersistentList<E> {
+        return mutate { it.addAll(elements) }
+    }
+
+    override fun addAll(index: Int, c: Collection<E>): PersistentList<E> {
+        return mutate { it.addAll(index, c) }
+    }
+
+    override fun remove(element: E): PersistentList<E> {
+        val index = this.indexOf(element)
+        if (index != -1) {
+            return this.removeAt(index)
+        }
+        return this
+    }
+
+    override fun removeAll(elements: Collection<E>): PersistentList<E> {
+        return removeAll { elements.contains(it) }
+    }
+
+    override fun retainAll(elements: Collection<E>): PersistentList<E> {
+        return removeAll { !elements.contains(it) }
+    }
+
+    override fun clear(): PersistentList<E> {
+        return persistentVectorOf()
+    }
+
+    override fun contains(element: E): Boolean {
+        return this.indexOf(element) != -1
+    }
+
+    override fun containsAll(elements: Collection<E>): Boolean {
+        return elements.all { this.contains(it) }
+    }
+
+    override fun iterator(): Iterator<E> {
+        return this.listIterator()
+    }
+
+    override fun listIterator(): ListIterator<E> {
+        return this.listIterator(0)
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/BufferIterator.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/BufferIterator.kt
new file mode 100644
index 0000000..c0b87c5
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/BufferIterator.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList
+
+internal class BufferIterator<out T>(
+        private val buffer: Array<T>,
+        index: Int,
+        size: Int
+) : AbstractListIterator<T>(index, size) {
+    override fun next(): T {
+        if (!hasNext()) {
+            throw NoSuchElementException()
+        }
+        return buffer[index++]
+    }
+
+    override fun previous(): T {
+        if (!hasPrevious()) {
+            throw NoSuchElementException()
+        }
+        return buffer[--index]
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/PersistentVector.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/PersistentVector.kt
new file mode 100644
index 0000000..1e95898
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/PersistentVector.kt
@@ -0,0 +1,324 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentList
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.ListImplementation.checkElementIndex
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.ListImplementation.checkPositionIndex
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.assert
+import androidx.compose.runtime.external.kotlinx.collections.immutable.mutate
+
+/**
+ * Persistent vector made of a trie of leaf buffers entirely filled with [MAX_BUFFER_SIZE] elements and a tail having
+ * from 1 to [MAX_BUFFER_SIZE] elements.
+ *
+ * @param root the root of trie part of the vector, must contain at least one leaf buffer
+ * @param tail the non-empty tail part of the vector
+ * @param size the size of the vector, must be greater than [MAX_BUFFER_SIZE]
+ * @param rootShift specifies the height of the trie structure, so that `rootShift = (height - 1) * LOG_MAX_BUFFER_SIZE`;
+ *        elements in the [root] array are indexed with bits of the index starting from `rootShift` and until `rootShift + LOG_MAX_BUFFER_SIZE`.
+ */
+internal class PersistentVector<E>(private val root: Array<Any?>,
+                                   private val tail: Array<Any?>,
+                                   override val size: Int,
+                                   private val rootShift: Int) : PersistentList<E>, AbstractPersistentList<E>() {
+
+    init {
+        require(size > MAX_BUFFER_SIZE) { "Trie-based persistent vector should have at least ${MAX_BUFFER_SIZE + 1} elements, got $size" }
+        assert(size - rootSize(size) <= tail.size.coerceAtMost(MAX_BUFFER_SIZE))
+    }
+
+    private fun rootSize(): Int = rootSize(size)
+
+    override fun add(element: E): PersistentList<E> {
+        val tailSize = size - rootSize()
+        if (tailSize < MAX_BUFFER_SIZE) {
+            val newTail = tail.copyOf(MAX_BUFFER_SIZE)
+            newTail[tailSize] = element
+            return PersistentVector(root, newTail, size + 1, rootShift)
+        }
+
+        val newTail = presizedBufferWith(element)
+        return pushFilledTail(root, tail, newTail)
+    }
+
+    /**
+     * Appends the specified entirely filled [tail] as a leaf buffer to the next free position in the [root] trie.
+     */
+    private fun pushFilledTail(root: Array<Any?>, filledTail: Array<Any?>, newTail: Array<Any?>): PersistentVector<E> {
+        if (size shr LOG_MAX_BUFFER_SIZE > 1 shl rootShift) {
+            // if the root trie is filled entirely, promote it to the next level
+            var newRoot = presizedBufferWith(root)
+            val newRootShift = rootShift + LOG_MAX_BUFFER_SIZE
+            newRoot = pushTail(newRoot, newRootShift, filledTail)
+            return PersistentVector(newRoot, newTail, size + 1, newRootShift)
+        }
+
+        val newRoot = pushTail(root, rootShift, filledTail)
+        return PersistentVector(newRoot, newTail, size + 1, rootShift)
+    }
+
+    /**
+     * Appends the specified entirely filled [tail] as a leaf buffer to the next free position in the [root] trie.
+     * The trie must not be filled entirely.
+     */
+    private fun pushTail(root: Array<Any?>?, shift: Int, tail: Array<Any?>): Array<Any?> {
+        val bufferIndex = indexSegment(size - 1, shift) // size - 1 is the index of the last element in the new trie
+        val newRootNode = root?.copyOf(MAX_BUFFER_SIZE) ?: arrayOfNulls<Any?>(MAX_BUFFER_SIZE)
+
+        if (shift == LOG_MAX_BUFFER_SIZE) {
+            newRootNode[bufferIndex] = tail
+            // don't delve into the leaf level
+        } else {
+            @Suppress("UNCHECKED_CAST")
+            newRootNode[bufferIndex] = pushTail(newRootNode[bufferIndex] as Array<Any?>?, shift - LOG_MAX_BUFFER_SIZE, tail)
+        }
+        return newRootNode
+    }
+
+    override fun add(index: Int, element: E): PersistentList<E> {
+        checkPositionIndex(index, size)
+        if (index == size) {
+            return add(element)
+        }
+
+        val rootSize = rootSize()
+        if (index >= rootSize) {
+            return insertIntoTail(root, index - rootSize, element)
+        }
+
+        val elementCarry = ObjectRef(null)
+        val newRoot = insertIntoRoot(root, rootShift, index, element, elementCarry)
+        return insertIntoTail(newRoot, 0, elementCarry.value)
+    }
+
+    private fun insertIntoTail(root: Array<Any?>, tailIndex: Int, element: Any?): PersistentVector<E> {
+        val tailSize = size - rootSize()
+        val newTail = tail.copyOf(MAX_BUFFER_SIZE)
+        if (tailSize < MAX_BUFFER_SIZE) {
+            tail.copyInto(newTail, tailIndex + 1, tailIndex, tailSize)
+            newTail[tailIndex] = element
+            return PersistentVector(root, newTail, size + 1, rootShift)
+        }
+
+        val lastElement = tail[MAX_BUFFER_SIZE_MINUS_ONE]
+        tail.copyInto(newTail, tailIndex + 1, tailIndex, tailSize - 1)
+        newTail[tailIndex] = element
+        return pushFilledTail(root, newTail, presizedBufferWith(lastElement))
+    }
+
+    /**
+     * Insert the specified [element] into the [root] trie at the specified trie [index].
+     *
+     * [elementCarry] contains the last element of this trie that was popped out by the insertion operation.
+     *
+     * @return new root trie
+     */
+    private fun insertIntoRoot(root: Array<Any?>, shift: Int, index: Int, element: Any?, elementCarry: ObjectRef): Array<Any?> {
+        val bufferIndex = indexSegment(index, shift)
+
+        if (shift == 0) {
+            val newRoot = if (bufferIndex == 0) arrayOfNulls<Any?>(MAX_BUFFER_SIZE) else root.copyOf(MAX_BUFFER_SIZE)
+            root.copyInto(newRoot, bufferIndex + 1, bufferIndex, MAX_BUFFER_SIZE_MINUS_ONE)
+            elementCarry.value = root[MAX_BUFFER_SIZE_MINUS_ONE]
+            newRoot[bufferIndex] = element
+            return newRoot
+        }
+
+        val newRoot = root.copyOf(MAX_BUFFER_SIZE)
+        val lowerLevelShift = shift - LOG_MAX_BUFFER_SIZE
+
+        @Suppress("UNCHECKED_CAST")
+        newRoot[bufferIndex] = insertIntoRoot(root[bufferIndex] as Array<Any?>, lowerLevelShift, index, element, elementCarry)
+
+        for (i in bufferIndex + 1 until MAX_BUFFER_SIZE) {
+            if (newRoot[i] == null) break
+
+            @Suppress("UNCHECKED_CAST")
+            newRoot[i] = insertIntoRoot(root[i] as Array<Any?>, lowerLevelShift, 0, elementCarry.value, elementCarry)
+        }
+
+        return newRoot
+    }
+
+    override fun removeAt(index: Int): PersistentList<E> {
+        checkElementIndex(index, size)
+        val rootSize = rootSize()
+        if (index >= rootSize) {
+            return removeFromTailAt(root, rootSize, rootShift, index - rootSize)
+        }
+        val newRoot = removeFromRootAt(root, rootShift, index, ObjectRef(tail[0]))
+        return removeFromTailAt(newRoot, rootSize, rootShift, 0)
+    }
+
+    private fun removeFromTailAt(root: Array<Any?>, rootSize: Int, shift: Int, index: Int): PersistentList<E> {
+        val tailSize = size - rootSize
+        assert(index < tailSize)
+
+        if (tailSize == 1) {
+            return pullLastBufferFromRoot(root, rootSize, shift)
+        }
+        val newTail = tail.copyOf(MAX_BUFFER_SIZE)
+        if (index < tailSize - 1) {
+            tail.copyInto(newTail, index, index + 1, tailSize)
+        }
+        newTail[tailSize - 1] = null
+        return PersistentVector(root, newTail, rootSize + tailSize - 1, shift)
+    }
+
+    /**
+     * Extracts the last entirely filled leaf buffer from the trie of this vector and makes it a tail in the returned [PersistentVector].
+     *
+     * Used when there are no elements left in current tail.
+     *
+     * Requires the trie to contain at least one leaf buffer.
+     *
+     * If the trie becomes empty after the operation, returns a tail-only vector ([SmallPersistentVector]).
+     */
+    private fun pullLastBufferFromRoot(root: Array<Any?>, rootSize: Int, shift: Int): PersistentList<E> {
+        if (shift == 0) {
+            val buffer = if (root.size == MUTABLE_BUFFER_SIZE) root.copyOf(MAX_BUFFER_SIZE) else root
+            return SmallPersistentVector(buffer)
+        }
+        val tailCarry = ObjectRef(null)
+        val newRoot = pullLastBuffer(root, shift, rootSize - 1, tailCarry)!!
+        @Suppress("UNCHECKED_CAST")
+        val newTail = tailCarry.value as Array<Any?>
+
+        // check if the new root contains only one element
+        if (newRoot[1] == null) {
+            // demote the root trie to the lower level
+            @Suppress("UNCHECKED_CAST")
+            val lowerLevelRoot = newRoot[0] as Array<Any?>
+            return PersistentVector(lowerLevelRoot, newTail, rootSize, shift - LOG_MAX_BUFFER_SIZE)
+        }
+        return PersistentVector(newRoot, newTail, rootSize, shift)
+    }
+
+    /**
+     * Extracts the last leaf buffer from trie and returns new trie without it or `null` if there's no more leaf elements in this trie.
+     *
+     * [tailCarry] on output contains the extracted leaf buffer.
+     */
+    private fun pullLastBuffer(root: Array<Any?>, shift: Int, index: Int, tailCarry: ObjectRef): Array<Any?>? {
+        val bufferIndex = indexSegment(index, shift)
+
+        val newBufferAtIndex = if (shift == LOG_MAX_BUFFER_SIZE) {
+            tailCarry.value = root[bufferIndex]
+            null
+        } else {
+            @Suppress("UNCHECKED_CAST")
+            pullLastBuffer(root[bufferIndex] as Array<Any?>, shift - LOG_MAX_BUFFER_SIZE, index, tailCarry)
+        }
+
+        if (newBufferAtIndex == null && bufferIndex == 0) {
+            return null
+        }
+
+        val newRoot = root.copyOf(MAX_BUFFER_SIZE)
+        newRoot[bufferIndex] = newBufferAtIndex
+        return newRoot
+    }
+
+    /**
+     * Removes element from trie at the specified trie [index].
+     *
+     * [tailCarry] on input contains the first element of the adjacent trie to fill the last vacant element with.
+     * [tailCarry] on output contains the first element of this trie.
+     *
+     * @return the new root of the trie.
+     */
+    private fun removeFromRootAt(root: Array<Any?>, shift: Int, index: Int, tailCarry: ObjectRef): Array<Any?> {
+        val bufferIndex = indexSegment(index, shift)
+
+        if (shift == 0) {
+            val newRoot = if (bufferIndex == 0) arrayOfNulls<Any?>(MAX_BUFFER_SIZE) else root.copyOf(MAX_BUFFER_SIZE)
+            root.copyInto(newRoot, bufferIndex, bufferIndex + 1, MAX_BUFFER_SIZE)
+            newRoot[MAX_BUFFER_SIZE - 1] = tailCarry.value
+            tailCarry.value = root[bufferIndex]
+            return newRoot
+        }
+
+        var bufferLastIndex = MAX_BUFFER_SIZE_MINUS_ONE
+        if (root[bufferLastIndex] == null) {
+            bufferLastIndex = indexSegment(rootSize() - 1, shift)
+        }
+
+        val newRoot = root.copyOf(MAX_BUFFER_SIZE)
+        val lowerLevelShift = shift - LOG_MAX_BUFFER_SIZE
+
+        for (i in bufferLastIndex downTo bufferIndex + 1) {
+            @Suppress("UNCHECKED_CAST")
+            newRoot[i] = removeFromRootAt(newRoot[i] as Array<Any?>, lowerLevelShift, 0, tailCarry)
+        }
+        @Suppress("UNCHECKED_CAST")
+        newRoot[bufferIndex] = removeFromRootAt(newRoot[bufferIndex] as Array<Any?>, lowerLevelShift, index, tailCarry)
+
+        return newRoot
+    }
+
+    override fun removeAll(predicate: (E) -> Boolean): PersistentList<E> {
+        return builder().also { it.removeAllWithPredicate(predicate) }.build()
+    }
+
+    override fun builder(): PersistentVectorBuilder<E> {
+        return PersistentVectorBuilder(this, root, tail, rootShift)
+    }
+
+    override fun listIterator(index: Int): ListIterator<E> {
+        checkPositionIndex(index, size)
+        @Suppress("UNCHECKED_CAST")
+        return PersistentVectorIterator(root, tail as Array<E>, index, size, rootShift / LOG_MAX_BUFFER_SIZE + 1)
+    }
+
+
+    /** Returns either leaf buffer of the trie or the tail, that contains element with the specified [index]. */
+    private fun bufferFor(index: Int): Array<Any?> {
+        if (rootSize() <= index) {
+            return tail
+        }
+        var buffer = root
+        var shift = rootShift
+        while (shift > 0) {
+            @Suppress("UNCHECKED_CAST")
+            buffer = buffer[indexSegment(index, shift)] as Array<Any?>
+            shift -= LOG_MAX_BUFFER_SIZE
+        }
+        return buffer
+    }
+
+    override fun get(index: Int): E {
+        checkElementIndex(index, size)
+        val buffer = bufferFor(index)
+        @Suppress("UNCHECKED_CAST")
+        return buffer[index and MAX_BUFFER_SIZE_MINUS_ONE] as E
+    }
+
+    override fun set(index: Int, element: E): PersistentList<E> {
+        checkElementIndex(index, size)
+        if (rootSize() <= index) {
+            val newTail = tail.copyOf(MAX_BUFFER_SIZE)
+            newTail[index and MAX_BUFFER_SIZE_MINUS_ONE] = element
+            return PersistentVector(root, newTail, size, rootShift)
+        }
+
+        val newRoot = setInRoot(root, rootShift, index, element)
+        return PersistentVector(newRoot, tail, size, rootShift)
+    }
+
+    private fun setInRoot(root: Array<Any?>, shift: Int, index: Int, e: Any?): Array<Any?> {
+        val bufferIndex = indexSegment(index, shift)
+        val newRoot = root.copyOf(MAX_BUFFER_SIZE)
+        if (shift == 0) {
+            newRoot[bufferIndex] = e
+        } else {
+            @Suppress("UNCHECKED_CAST")
+            newRoot[bufferIndex] = setInRoot(newRoot[bufferIndex] as Array<Any?>,
+                    shift - LOG_MAX_BUFFER_SIZE, index, e)
+        }
+        return newRoot
+    }
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/PersistentVectorBuilder.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/PersistentVectorBuilder.kt
new file mode 100644
index 0000000..690bb1f
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/PersistentVectorBuilder.kt
@@ -0,0 +1,991 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentList
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.ListImplementation.checkElementIndex
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.ListImplementation.checkPositionIndex
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.MutabilityOwnership
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.assert
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.modCount
+
+internal class PersistentVectorBuilder<E>(private var vector: PersistentList<E>,
+                                          private var vectorRoot: Array<Any?>?,
+                                          private var vectorTail: Array<Any?>,
+                                          internal var rootShift: Int) : AbstractMutableList<E>(), PersistentList.Builder<E> {
+    private var ownership = MutabilityOwnership()
+    internal var root = vectorRoot
+        private set
+    internal var tail = vectorTail
+        private set
+    override var size = vector.size
+        private set
+
+    internal fun getModCount() = modCount
+
+    override fun build(): PersistentList<E> {
+        vector = if (root === vectorRoot && tail === vectorTail) {
+            vector
+        } else {
+            ownership = MutabilityOwnership()
+            vectorRoot = root
+            vectorTail = tail
+            if (root == null) {
+                if (tail.isEmpty()) {
+                    persistentVectorOf()
+                } else {
+                    SmallPersistentVector(tail.copyOf(size))
+                }
+            } else {
+                PersistentVector(root!!, tail, size, rootShift)
+            }
+        }
+        return vector
+    }
+
+    private fun rootSize(): Int {
+        if (size <= MAX_BUFFER_SIZE) {
+            return 0
+        }
+        return rootSize(size)
+    }
+
+    private fun tailSize(size: Int): Int {
+        if (size <= MAX_BUFFER_SIZE) {
+            return size
+        }
+        return size - rootSize(size)
+    }
+
+    private fun tailSize(): Int {
+        return tailSize(size)
+    }
+
+    private fun isMutable(buffer: Array<Any?>): Boolean {
+        return buffer.size == MUTABLE_BUFFER_SIZE && buffer[MUTABLE_BUFFER_SIZE - 1] === ownership
+    }
+
+    /**
+     * Checks if [buffer] is mutable and returns it or its mutable copy.
+     */
+    private fun makeMutable(buffer: Array<Any?>?): Array<Any?> {
+        if (buffer == null) {
+            return mutableBuffer()
+        }
+        if (isMutable(buffer)) {
+            return buffer
+        }
+        return buffer.copyInto(mutableBuffer(), endIndex = buffer.size.coerceAtMost(MAX_BUFFER_SIZE))
+    }
+
+    private fun makeMutableShiftingRight(buffer: Array<Any?>, distance: Int): Array<Any?> {
+        if (isMutable(buffer)) {
+            return buffer.copyInto(buffer, distance, 0, MAX_BUFFER_SIZE - distance)
+        }
+        return buffer.copyInto(mutableBuffer(), distance, 0, MAX_BUFFER_SIZE - distance)
+    }
+
+    private fun mutableBufferWith(element: Any?): Array<Any?> {
+        val buffer = arrayOfNulls<Any?>(MUTABLE_BUFFER_SIZE)
+        buffer[0] = element
+        buffer[MUTABLE_BUFFER_SIZE - 1] = ownership
+        return buffer
+    }
+
+    private fun mutableBuffer(): Array<Any?> {
+        val buffer = arrayOfNulls<Any?>(MUTABLE_BUFFER_SIZE)
+        buffer[MUTABLE_BUFFER_SIZE - 1] = ownership
+        return buffer
+    }
+
+    override fun add(element: E): Boolean {
+        modCount += 1
+
+        val tailSize = tailSize()
+        if (tailSize < MAX_BUFFER_SIZE) {
+            val mutableTail = makeMutable(tail)
+            mutableTail[tailSize] = element
+            this.tail = mutableTail
+            this.size += 1
+        } else {
+            val newTail = mutableBufferWith(element)
+            this.pushFilledTail(root, tail, newTail)
+        }
+        return true
+    }
+
+    /**
+     * Appends the specified entirely filled [tail] as a leaf buffer to the next free position in the [root] trie.
+     */
+    private fun pushFilledTail(root: Array<Any?>?, filledTail: Array<Any?>, newTail: Array<Any?>) = when {
+        size shr LOG_MAX_BUFFER_SIZE > 1 shl rootShift -> {
+            // if the root trie is filled entirely, promote it to the next level
+            this.root = pushTail(mutableBufferWith(root), filledTail, rootShift + LOG_MAX_BUFFER_SIZE)
+            this.tail = newTail
+            this.rootShift += LOG_MAX_BUFFER_SIZE
+            this.size += 1
+        }
+        root == null -> {
+            this.root = filledTail
+            this.tail = newTail
+            this.size += 1
+        }
+        else -> {
+            this.root = pushTail(root, filledTail, rootShift)
+            this.tail = newTail
+            this.size += 1
+        }
+    }
+
+    /**
+     * Appends the specified entirely filled [tail] as a leaf buffer to the next free position in the [root] trie.
+     * The trie must not be filled entirely.
+     */
+    private fun pushTail(root: Array<Any?>?, tail: Array<Any?>, shift: Int): Array<Any?> {
+        val index = indexSegment(size - 1, shift)
+        val mutableRoot = makeMutable(root)
+
+        if (shift == LOG_MAX_BUFFER_SIZE) {
+            mutableRoot[index] = tail
+        } else {
+            @Suppress("UNCHECKED_CAST")
+            mutableRoot[index] = pushTail(mutableRoot[index] as Array<Any?>?, tail, shift - LOG_MAX_BUFFER_SIZE)
+        }
+        return mutableRoot
+    }
+
+    override fun addAll(elements: Collection<E>): Boolean {
+        if (elements.isEmpty()) {
+            return false
+        }
+
+        modCount++
+
+        val tailSize = tailSize()
+        val elementsIterator = elements.iterator()
+
+        if (MAX_BUFFER_SIZE - tailSize >= elements.size) {
+            // there is enough space in tail, add all elements to it
+            tail = copyToBuffer(makeMutable(tail), tailSize, elementsIterator)
+            size += elements.size
+        } else {
+            val buffersSize = (elements.size + tailSize - 1) / MAX_BUFFER_SIZE
+            val buffers = arrayOfNulls<Array<Any?>?>(buffersSize)
+
+            // fill remained space of tail
+            buffers[0] = copyToBuffer(makeMutable(tail), tailSize, elementsIterator)
+            // fill other buffers
+            for (index in 1 until buffersSize) {
+                buffers[index] = copyToBuffer(mutableBuffer(), 0, elementsIterator)
+            }
+
+            // add buffers to the root, rootShift is updated appropriately there
+            @Suppress("UNCHECKED_CAST")
+            root = pushBuffersIncreasingHeightIfNeeded(root, rootSize(), buffers as Array<Array<Any?>>)
+            // create new tail and copy remained elements there
+            tail = copyToBuffer(mutableBuffer(), 0, elementsIterator)
+            size += elements.size
+        }
+
+        return true
+    }
+
+    private fun copyToBuffer(buffer: Array<Any?>, bufferIndex: Int, sourceIterator: Iterator<Any?>): Array<Any?> {
+        var index = bufferIndex
+        while (index < MAX_BUFFER_SIZE && sourceIterator.hasNext()) {
+            buffer[index++] = sourceIterator.next()
+        }
+        return buffer
+    }
+
+    /**
+     * Adds all buffers from [buffers] as leaf nodes to the [root].
+     * If the [root] has less available leaves for the buffers, height of the trie is increased.
+     *
+     * Returns root of the resulting trie.
+     */
+    private fun pushBuffersIncreasingHeightIfNeeded(root: Array<Any?>?, rootSize: Int, buffers: Array<Array<Any?>>): Array<Any?> {
+        val buffersIterator = buffers.iterator()
+
+        var mutableRoot = when {
+            rootSize shr LOG_MAX_BUFFER_SIZE < 1 shl rootShift ->
+                // if the root trie is not filled entirely, fill it
+                pushBuffers(root, rootSize, rootShift, buffersIterator)
+            else ->
+                // root is filled entirely, make it mutable
+                makeMutable(root)
+        }
+
+        // here root is filled entirely or/and all buffers are already placed
+
+        while (buffersIterator.hasNext()) {
+            // some buffers left, so root is filled entirely. promote root to the next level
+            rootShift += LOG_MAX_BUFFER_SIZE
+            mutableRoot = mutableBufferWith(mutableRoot)
+
+            pushBuffers(mutableRoot, 1 shl rootShift, rootShift, buffersIterator)
+        }
+
+        return mutableRoot
+    }
+
+    /**
+     * Adds buffers from the [buffersIterator] as leaf nodes.
+     * As the result [root] is entirely filled, or all buffers are added.
+     *
+     * Returns the resulting root.
+     */
+    private fun pushBuffers(root: Array<Any?>?, rootSize: Int, shift: Int, buffersIterator: Iterator<Array<Any?>>): Array<Any?> {
+        check(buffersIterator.hasNext())
+        check(shift >= 0)
+
+        if (shift == 0) {
+            return buffersIterator.next()
+        }
+
+        val mutableRoot = makeMutable(root)
+        var index = indexSegment(rootSize, shift)
+
+        @Suppress("UNCHECKED_CAST")
+        mutableRoot[index] =
+                pushBuffers(mutableRoot[index] as Array<Any?>?, rootSize, shift - LOG_MAX_BUFFER_SIZE, buffersIterator)
+
+        while (++index < MAX_BUFFER_SIZE && buffersIterator.hasNext()) {
+            @Suppress("UNCHECKED_CAST")
+            mutableRoot[index] =
+                    pushBuffers(mutableRoot[index] as Array<Any?>?, 0, shift - LOG_MAX_BUFFER_SIZE, buffersIterator)
+        }
+        return mutableRoot
+    }
+
+    override fun add(index: Int, element: E) {
+        checkPositionIndex(index, size)
+
+        if (index == size) {
+            add(element)
+            return
+        }
+
+        modCount += 1
+
+        val rootSize = rootSize()
+        if (index >= rootSize) {
+            insertIntoTail(root, index - rootSize, element)
+            return
+        }
+
+        val elementCarry = ObjectRef(null)
+        val newRest = insertIntoRoot(root!!, rootShift, index, element, elementCarry)
+        @Suppress("UNCHECKED_CAST")
+        insertIntoTail(newRest, 0, elementCarry.value as E)
+    }
+
+    private fun insertIntoTail(root: Array<Any?>?, index: Int, element: E) {
+        val tailSize = tailSize()
+        val mutableTail = makeMutable(tail)
+        if (tailSize < MAX_BUFFER_SIZE) {
+            tail.copyInto(mutableTail, index + 1, index, tailSize)
+            mutableTail[index] = element
+            this.root = root
+            this.tail = mutableTail
+            this.size += 1
+        } else {
+            val lastElement = tail[MAX_BUFFER_SIZE_MINUS_ONE]
+            tail.copyInto(mutableTail, index + 1, index, MAX_BUFFER_SIZE_MINUS_ONE)
+            mutableTail[index] = element
+            pushFilledTail(root, mutableTail, mutableBufferWith(lastElement))
+        }
+    }
+
+    /**
+     * Insert the specified [element] into the [root] trie at the specified trie [index].
+     *
+     * [elementCarry] contains the last element of this trie that was popped out by the insertion operation.
+     *
+     * @return new root trie or this modified trie, if it's already mutable
+     */
+    private fun insertIntoRoot(root: Array<Any?>, shift: Int, index: Int, element: Any?, elementCarry: ObjectRef): Array<Any?> {
+        val bufferIndex = indexSegment(index, shift)
+
+        if (shift == 0) {
+            elementCarry.value = root[MAX_BUFFER_SIZE_MINUS_ONE]
+            val mutableRoot = root.copyInto(makeMutable(root), bufferIndex + 1, bufferIndex, MAX_BUFFER_SIZE_MINUS_ONE)
+            mutableRoot[bufferIndex] = element
+            return mutableRoot
+        }
+
+        val mutableRoot = makeMutable(root)
+        val lowerLevelShift = shift - LOG_MAX_BUFFER_SIZE
+
+        @Suppress("UNCHECKED_CAST")
+        mutableRoot[bufferIndex] =
+                insertIntoRoot(mutableRoot[bufferIndex] as Array<Any?>, lowerLevelShift, index, element, elementCarry)
+
+        for (i in bufferIndex + 1 until MAX_BUFFER_SIZE) {
+            if (mutableRoot[i] == null) break
+            @Suppress("UNCHECKED_CAST")
+            mutableRoot[i] =
+                    insertIntoRoot(mutableRoot[i] as Array<Any?>, lowerLevelShift, 0, elementCarry.value, elementCarry)
+        }
+
+        return mutableRoot
+    }
+
+    override fun addAll(index: Int, elements: Collection<E>): Boolean {
+        checkPositionIndex(index, size)
+
+        if (index == size) {
+            return addAll(elements)
+        }
+        if (elements.isEmpty()) {
+            return false
+        }
+
+        modCount++
+
+        val unaffectedElementsCount = (index shr LOG_MAX_BUFFER_SIZE) shl LOG_MAX_BUFFER_SIZE
+        val buffersSize = (size - unaffectedElementsCount + elements.size - 1) / MAX_BUFFER_SIZE
+
+        if (buffersSize == 0) {
+            assert(index >= rootSize())
+
+            val startIndex = index and MAX_BUFFER_SIZE_MINUS_ONE
+            val endIndex = (index + elements.size - 1) and MAX_BUFFER_SIZE_MINUS_ONE // inclusive
+
+            // Copy the unaffected tail prefix and shift the affected tail suffix to the end
+            val newTail = tail.copyInto(makeMutable(tail), endIndex + 1, startIndex, tailSize())
+            // Copy the specified elements to the new tail
+            copyToBuffer(newTail, startIndex, elements.iterator())
+
+            tail = newTail
+            size += elements.size
+            return true
+        }
+
+        val buffers = arrayOfNulls<Array<Any?>?>(buffersSize)
+
+        val tailSize = tailSize()
+        val newTailSize = tailSize(size + elements.size)
+
+        val newTail: Array<Any?>
+        when {
+            index >= rootSize() -> {
+                newTail = mutableBuffer()
+                splitToBuffers(elements, index, tail, tailSize, buffers, buffersSize, newTail)
+            }
+            newTailSize > tailSize -> {
+                val rightShift = newTailSize - tailSize
+                newTail = makeMutableShiftingRight(tail, rightShift)
+
+                insertIntoRoot(elements, index, rightShift, buffers, buffersSize, newTail)
+            }
+            else -> {
+                newTail = tail.copyInto(mutableBuffer(), 0, tailSize - newTailSize, tailSize)
+
+                val rightShift = MAX_BUFFER_SIZE - (tailSize - newTailSize)
+                val lastBuffer = makeMutableShiftingRight(tail, rightShift)
+
+                buffers[buffersSize - 1] = lastBuffer
+
+                insertIntoRoot(elements, index, rightShift, buffers, buffersSize - 1, lastBuffer)
+            }
+        }
+
+        @Suppress("UNCHECKED_CAST")
+        root = pushBuffersIncreasingHeightIfNeeded(root, unaffectedElementsCount, buffers as Array<Array<Any?>>)
+        tail = newTail
+        size += elements.size
+
+        return true
+    }
+
+    /**
+     * Inserts the [elements] into the [root] at the given [index].
+     *
+     * Affected elements are copied to the [buffers] split into [nullBuffers] buffers.
+     * Elements that do not fit [nullBuffers] buffers are copied to the [nextBuffer].
+     */
+    private fun insertIntoRoot(
+            elements: Collection<E>,
+            index: Int,
+            rightShift: Int,
+            buffers: Array<Array<Any?>?>,
+            nullBuffers: Int,
+            nextBuffer: Array<Any?>
+    ) {
+        checkNotNull(root)
+
+        val startLeafIndex = index shr LOG_MAX_BUFFER_SIZE
+        val startLeaf = shiftLeafBuffers(startLeafIndex, rightShift, buffers, nullBuffers, nextBuffer)
+
+        val lastLeafIndex = (rootSize() shr LOG_MAX_BUFFER_SIZE) - 1
+        val newNullBuffers = nullBuffers - (lastLeafIndex - startLeafIndex)
+        val newNextBuffer = if (newNullBuffers < nullBuffers) buffers[newNullBuffers]!! else nextBuffer
+
+        splitToBuffers(elements, index, startLeaf, MAX_BUFFER_SIZE, buffers, newNullBuffers, newNextBuffer)
+    }
+
+    /**
+     * Shifts elements in the [root] to the right by the given [rightShift] position starting from the end.
+     *
+     * Shifting stops when elements of the leaf at [startLeafIndex] are reached.
+     * Last elements whose indexes become bigger than [rootSize] are copied to the [nextBuffer].
+     * Shifted leaves are stored in the [buffers] starting from the given [nullBuffers] index.
+     *
+     * Returns leaf at the [startLeafIndex].
+     */
+    private fun shiftLeafBuffers(
+            startLeafIndex: Int,
+            rightShift: Int,
+            buffers: Array<Array<Any?>?>,
+            nullBuffers: Int,
+            nextBuffer: Array<Any?>
+    ): Array<Any?> {
+        checkNotNull(root)
+
+        val leafCount = rootSize() shr LOG_MAX_BUFFER_SIZE
+
+        val leafBufferIterator = leafBufferIterator(leafCount)   // start from the last leaf
+        var bufferIndex = nullBuffers
+        var buffer = nextBuffer
+
+        while (leafBufferIterator.previousIndex() != startLeafIndex) {
+            val currentBuffer = leafBufferIterator.previous()
+
+            currentBuffer.copyInto(buffer, 0, MAX_BUFFER_SIZE - rightShift, MAX_BUFFER_SIZE)
+            buffer = makeMutableShiftingRight(currentBuffer, rightShift)
+            buffers[--bufferIndex] = buffer
+        }
+
+        return leafBufferIterator.previous()
+    }
+
+    /**
+     * Inserts [elements] into [startBuffer] of size [startBufferSize] and splits the result into [nullBuffers] buffers.
+     *
+     * Elements that do not fit [nullBuffers] buffers are copied to the [nextBuffer].
+     */
+    private fun splitToBuffers(
+            elements: Collection<E>,
+            index: Int,
+            startBuffer: Array<Any?>,
+            startBufferSize: Int,
+            buffers: Array<Array<Any?>?>,
+            nullBuffers: Int,
+            nextBuffer: Array<Any?>
+    ) {
+        check(nullBuffers >= 1)
+
+        val firstBuffer = makeMutable(startBuffer)
+        buffers[0] = firstBuffer
+
+        var newNextBuffer = nextBuffer
+        var newNullBuffers = nullBuffers
+
+        val startBufferStartIndex = index and MAX_BUFFER_SIZE_MINUS_ONE
+        val endBufferEndIndex = (index + elements.size - 1) and MAX_BUFFER_SIZE_MINUS_ONE // inclusive
+
+        val elementsToShift = startBufferSize - startBufferStartIndex
+
+        if (endBufferEndIndex + elementsToShift < MAX_BUFFER_SIZE) {
+            firstBuffer.copyInto(newNextBuffer, endBufferEndIndex + 1, startBufferStartIndex, startBufferSize)
+        } else {
+            val toCopyToLast = endBufferEndIndex + elementsToShift - MAX_BUFFER_SIZE + 1
+            if (nullBuffers == 1) {
+                newNextBuffer = firstBuffer
+            } else {
+                newNextBuffer = mutableBuffer()
+                buffers[--newNullBuffers] = newNextBuffer
+            }
+            firstBuffer.copyInto(nextBuffer, 0, startBufferSize - toCopyToLast, startBufferSize)
+            firstBuffer.copyInto(newNextBuffer, endBufferEndIndex + 1, startBufferStartIndex, startBufferSize - toCopyToLast)
+        }
+
+        val elementsIterator = elements.iterator()
+
+        copyToBuffer(firstBuffer, startBufferStartIndex, elementsIterator)
+        for (i in 1 until newNullBuffers) {
+            buffers[i] = copyToBuffer(mutableBuffer(), 0, elementsIterator)
+        }
+        copyToBuffer(newNextBuffer, 0, elementsIterator)
+    }
+
+    override fun get(index: Int): E {
+        checkElementIndex(index, size)
+
+        val buffer = bufferFor(index)
+        @Suppress("UNCHECKED_CAST")
+        return buffer[index and MAX_BUFFER_SIZE_MINUS_ONE] as E
+    }
+
+    private fun bufferFor(index: Int): Array<Any?> {
+        if (rootSize() <= index) {
+            return tail
+        }
+        var buffer = root!!
+        var shift = rootShift
+        while (shift > 0) {
+            @Suppress("UNCHECKED_CAST")
+            buffer = buffer[indexSegment(index, shift)] as Array<Any?>
+            shift -= LOG_MAX_BUFFER_SIZE
+        }
+        return buffer
+    }
+
+    override fun removeAt(index: Int): E {
+        checkElementIndex(index, size)
+
+        modCount += 1
+
+        val rootSize = rootSize()
+        if (index >= rootSize) {
+            @Suppress("UNCHECKED_CAST")
+            return removeFromTailAt(root, rootSize, rootShift, index - rootSize) as E
+        }
+        val elementCarry = ObjectRef(tail[0])
+        val newRoot = removeFromRootAt(root!!, rootShift, index, elementCarry)
+        removeFromTailAt(newRoot, rootSize, rootShift, 0)
+        @Suppress("UNCHECKED_CAST")
+        return elementCarry.value as E
+    }
+
+    private fun removeFromTailAt(root: Array<Any?>?, rootSize: Int, shift: Int, index: Int): Any? {
+        val tailSize = size - rootSize
+        assert(index < tailSize)
+
+        val removedElement: Any?
+        if (tailSize == 1) {
+            removedElement = tail[0]
+            pullLastBufferFromRoot(root, rootSize, shift)
+        } else {
+            removedElement = tail[index]
+            val mutableTail = tail.copyInto(makeMutable(tail), index, index + 1, tailSize)
+            mutableTail[tailSize - 1] = null
+            this.root = root
+            this.tail = mutableTail
+            this.size = rootSize + tailSize - 1
+            this.rootShift = shift
+        }
+        return removedElement
+    }
+
+    /**
+     * Removes element from trie at the specified trie [index].
+     *
+     * [tailCarry] on input contains the first element of the adjacent trie to fill the last vacant element with.
+     * [tailCarry] on output contains the first element of this trie.
+     *
+     * @return the new root of the trie.
+     */
+    private fun removeFromRootAt(root: Array<Any?>, shift: Int, index: Int, tailCarry: ObjectRef): Array<Any?> {
+        val bufferIndex = indexSegment(index, shift)
+
+        if (shift == 0) {
+            val removedElement = root[bufferIndex]
+            val mutableRoot = root.copyInto(makeMutable(root), bufferIndex, bufferIndex + 1, MAX_BUFFER_SIZE)
+            mutableRoot[MAX_BUFFER_SIZE - 1] = tailCarry.value
+            tailCarry.value = removedElement
+            return mutableRoot
+        }
+
+        var bufferLastIndex = MAX_BUFFER_SIZE_MINUS_ONE
+        if (root[bufferLastIndex] == null) {
+            bufferLastIndex = indexSegment(rootSize() - 1, shift)
+        }
+
+        val mutableRoot = makeMutable(root)
+        val lowerLevelShift = shift - LOG_MAX_BUFFER_SIZE
+
+        for (i in bufferLastIndex downTo bufferIndex + 1) {
+            @Suppress("UNCHECKED_CAST")
+            mutableRoot[i] = removeFromRootAt(mutableRoot[i] as Array<Any?>, lowerLevelShift, 0, tailCarry)
+        }
+        @Suppress("UNCHECKED_CAST")
+        mutableRoot[bufferIndex] =
+                removeFromRootAt(mutableRoot[bufferIndex] as Array<Any?>, lowerLevelShift, index, tailCarry)
+
+        return mutableRoot
+    }
+
+    /**
+     * Extracts the last entirely filled leaf buffer from the trie of this vector and makes it a tail in this
+     *
+     * Used when there are no elements left in current tail.
+     *
+     * Requires the trie to contain at least one leaf buffer.
+     */
+    private fun pullLastBufferFromRoot(root: Array<Any?>?, rootSize: Int, shift: Int) {
+        if (shift == 0) {
+            this.root = null
+            this.tail = root ?: emptyArray()
+            this.size = rootSize
+            this.rootShift = shift
+            return
+        }
+
+        val tailCarry = ObjectRef(null)
+        val newRoot = pullLastBuffer(root!!, shift, rootSize, tailCarry)!!
+        @Suppress("UNCHECKED_CAST")
+        this.tail = tailCarry.value as Array<Any?>
+        this.size = rootSize
+
+        // check if the new root contains only one element
+        if (newRoot[1] == null) {
+            // demote the root trie to the lower level
+            @Suppress("UNCHECKED_CAST")
+            this.root = newRoot[0] as Array<Any?>?
+            this.rootShift = shift - LOG_MAX_BUFFER_SIZE
+        } else {
+            this.root = newRoot
+            this.rootShift = shift
+        }
+    }
+
+    /**
+     * Extracts the last leaf buffer from trie and returns new trie without it or `null` if there's no more leaf elements in this trie.
+     *
+     * [tailCarry] on output contains the extracted leaf buffer.
+     */
+    private fun pullLastBuffer(root: Array<Any?>, shift: Int, rootSize: Int, tailCarry: ObjectRef): Array<Any?>? {
+        val bufferIndex = indexSegment(rootSize - 1, shift)
+
+        val newBufferAtIndex = if (shift == LOG_MAX_BUFFER_SIZE) {
+            tailCarry.value = root[bufferIndex]
+            null
+        } else {
+            @Suppress("UNCHECKED_CAST")
+            pullLastBuffer(root[bufferIndex] as Array<Any?>, shift - LOG_MAX_BUFFER_SIZE, rootSize, tailCarry)
+        }
+        if (newBufferAtIndex == null && bufferIndex == 0) {
+            return null
+        }
+
+        val mutableRoot = makeMutable(root)
+        mutableRoot[bufferIndex] = newBufferAtIndex
+        return mutableRoot
+    }
+
+    override fun removeAll(elements: Collection<E>): Boolean {
+        return removeAllWithPredicate { elements.contains(it) }
+    }
+
+    fun removeAllWithPredicate(predicate: (E) -> Boolean): Boolean {
+        val anyRemoved = removeAll(predicate)
+        if (anyRemoved) {
+            modCount++
+        }
+        return anyRemoved
+    }
+
+    // Does not update `modCount`.
+    private fun removeAll(predicate: (E) -> Boolean): Boolean {
+        val tailSize = tailSize()
+        val bufferRef = ObjectRef(null)
+
+        if (root == null) {
+            return removeAllFromTail(predicate, tailSize, bufferRef) != tailSize
+        }
+
+        val leafIterator = leafBufferIterator(0)
+        var bufferSize = MAX_BUFFER_SIZE
+
+        // skip unaffected leaves
+        while (bufferSize == MAX_BUFFER_SIZE && leafIterator.hasNext()) {
+            bufferSize = removeAll(predicate, leafIterator.next(), MAX_BUFFER_SIZE, bufferRef)
+        }
+
+        // if no elements from the root match the predicate, check the tail
+        if (bufferSize == MAX_BUFFER_SIZE) {
+            assert(!leafIterator.hasNext())
+            val newTailSize = removeAllFromTail(predicate, tailSize, bufferRef)
+            if (newTailSize == 0) {
+                // all elements of the tail was removed, pull the last leaf from the root to make it the tail
+                pullLastBufferFromRoot(root, size, rootShift)
+            }
+            return newTailSize != tailSize
+        }
+
+        // handle affected leaves reusing mutable ones
+        val unaffectedElementsCount = leafIterator.previousIndex() shl LOG_MAX_BUFFER_SIZE
+
+        val buffers = mutableListOf<Array<Any?>>()
+        val recyclableBuffers = mutableListOf<Array<Any?>>()
+
+        while (leafIterator.hasNext()) {
+            val leaf = leafIterator.next()
+            bufferSize = recyclableRemoveAll(predicate, leaf, MAX_BUFFER_SIZE, bufferSize, bufferRef, recyclableBuffers, buffers)
+        }
+
+        // handle the tail
+        val newTailSize = recyclableRemoveAll(predicate, tail, tailSize, bufferSize, bufferRef, recyclableBuffers, buffers)
+
+        @Suppress("UNCHECKED_CAST")
+        val newTail = bufferRef.value as Array<Any?>
+        newTail.fill(null, newTailSize, MAX_BUFFER_SIZE)
+
+        // build the root
+        val newRoot = if (buffers.isEmpty()) root!! else pushBuffers(root, unaffectedElementsCount, rootShift, buffers.iterator())
+        val newRootSize = unaffectedElementsCount + (buffers.size shl LOG_MAX_BUFFER_SIZE)
+
+        root = retainFirst(newRoot, newRootSize)
+        tail = newTail
+        size = newRootSize + newTailSize
+
+        return true
+    }
+
+    /**
+     * Retains first [size] elements of the [root].
+     *
+     * If the height of the root is bigger than needed to store [size] elements, it's decreased.
+     */
+    private fun retainFirst(root: Array<Any?>, size: Int): Array<Any?>? {
+        check(size and MAX_BUFFER_SIZE_MINUS_ONE == 0)
+
+        if (size == 0) {
+            rootShift = 0
+            return null
+        }
+
+        val lastIndex = size - 1
+        var newRoot = root
+        while (lastIndex shr rootShift == 0) {
+            rootShift -= LOG_MAX_BUFFER_SIZE
+            @Suppress("UNCHECKED_CAST")
+            newRoot = newRoot[0] as Array<Any?>
+        }
+        return nullifyAfter(newRoot, lastIndex, rootShift)
+    }
+
+    /**
+     * Nullifies nodes cells after the specified [index].
+     *
+     * Used to prevent memory leaks after reusing nodes.
+     */
+    private fun nullifyAfter(root: Array<Any?>, index: Int, shift: Int): Array<Any?> {
+        check(shift >= 0)
+
+        if (shift == 0) {
+            // the `root` is a leaf buffer.
+            // As leaf buffers can't be filled partially, return the `root` as is.
+            return root
+        }
+
+        val lastIndex = indexSegment(index, shift)
+        @Suppress("UNCHECKED_CAST")
+        val newChild = nullifyAfter(root[lastIndex] as Array<Any?>, index, shift - LOG_MAX_BUFFER_SIZE)
+
+        var newRoot = root
+        if (lastIndex < MAX_BUFFER_SIZE_MINUS_ONE && newRoot[lastIndex + 1] != null) {
+            if (isMutable(newRoot)) {
+                newRoot.fill(null, lastIndex + 1, MAX_BUFFER_SIZE)
+            }
+            newRoot = newRoot.copyInto(mutableBuffer(), 0, 0, lastIndex + 1)
+        }
+        if (newChild !== newRoot[lastIndex]) {
+            newRoot = makeMutable(newRoot)
+            newRoot[lastIndex] = newChild
+        }
+
+        return newRoot
+    }
+
+    /**
+     * Copies elements of the [tail] buffer of size [tailSize] that do not match the given [predicate] to a new buffer.
+     *
+     * If the [tail] is mutable, it is reused to store non-matching elements.
+     * If non of the elements match the [predicate], no buffers are created and elements are not copied.
+     * [bufferRef] stores the newly created buffer, or the [tail] if a new buffer was not created.
+     *
+     * Returns the filled size of the buffer stored in the [bufferRef].
+     */
+    private fun removeAllFromTail(predicate: (E) -> Boolean, tailSize: Int, bufferRef: ObjectRef): Int {
+        val newTailSize = removeAll(predicate, tail, tailSize, bufferRef)
+
+        if (newTailSize == tailSize) {
+            assert(bufferRef.value === tail)
+            return tailSize
+        }
+
+        @Suppress("UNCHECKED_CAST")
+        val newTail = bufferRef.value as Array<Any?>
+        newTail.fill(null, newTailSize, tailSize)
+
+        tail = newTail
+        size -= tailSize - newTailSize
+
+        return newTailSize
+    }
+
+    /**
+     * Copies elements of the given [buffer] of size [bufferSize] that do not match the given [predicate] to a new buffer.
+     *
+     * If the [buffer] is mutable, it is reused to store non-matching elements.
+     * If non of the elements match the [predicate], no buffers are created and elements are not copied.
+     * [bufferRef] stores the newly created buffer, or the [buffer] if a new buffer was not created.
+     *
+     * Returns the filled size of the buffer stored in the [bufferRef].
+     */
+    private fun removeAll(
+            predicate: (E) -> Boolean,
+            buffer: Array<Any?>,
+            bufferSize: Int,
+            bufferRef: ObjectRef
+    ): Int {
+        var newBuffer = buffer
+        var newBufferSize = bufferSize
+
+        var anyRemoved = false
+
+        for (index in 0 until bufferSize) {
+            @Suppress("UNCHECKED_CAST")
+            val element = buffer[index] as E
+
+            if (predicate(element)) {
+                if (!anyRemoved) {
+                    newBuffer = makeMutable(buffer)
+                    newBufferSize = index
+
+                    anyRemoved = true
+                }
+            } else if (anyRemoved) {
+                newBuffer[newBufferSize++] = element
+            }
+        }
+
+        bufferRef.value = newBuffer
+
+        return newBufferSize
+    }
+
+    /**
+     * Copied elements of the given [buffer] of size [bufferSize] that do not match the given [predicate]
+     * to the buffer stored in the given [bufferRef] starting at [toBufferSize].
+     *
+     * If the buffer gets filled entirely, it is added to [buffers] and a new buffer is created or
+     * reused from the [recyclableBuffers] to hold the rest of the non-matching elements.
+     * [bufferRef] stores the newly created buffer if a new buffer was created.
+     *
+     * Returns the filled size of the buffer stored in the [bufferRef].
+     */
+    private fun recyclableRemoveAll(
+            predicate: (E) -> Boolean,
+            buffer: Array<Any?>,
+            bufferSize: Int,
+            toBufferSize: Int,
+            bufferRef: ObjectRef,
+            recyclableBuffers: MutableList<Array<Any?>>,
+            buffers: MutableList<Array<Any?>>
+    ): Int {
+        if (isMutable(buffer)) {
+            recyclableBuffers.add(buffer)
+        }
+
+        @Suppress("UNCHECKED_CAST")
+        val toBuffer = bufferRef.value as Array<Any?>
+
+        var newToBuffer = toBuffer
+        var newToBufferSize = toBufferSize
+
+        for (index in 0 until bufferSize) {
+            @Suppress("UNCHECKED_CAST")
+            val element = buffer[index] as E
+
+            if (!predicate(element)) {
+                if (newToBufferSize == MAX_BUFFER_SIZE) {
+                    newToBuffer = if (recyclableBuffers.isNotEmpty()) {
+                        recyclableBuffers.removeAt(recyclableBuffers.size - 1)
+                    } else {
+                        mutableBuffer()
+                    }
+                    newToBufferSize = 0
+                }
+
+                newToBuffer[newToBufferSize++] = element
+            }
+        }
+
+        bufferRef.value = newToBuffer
+
+        if (toBuffer !== bufferRef.value) {
+            buffers.add(toBuffer)
+        }
+
+        return newToBufferSize
+    }
+
+    override fun set(index: Int, element: E): E {
+        // TODO: Should list[i] = list[i] make it mutable?
+        checkElementIndex(index, size)
+        if (rootSize() <= index) {
+            val mutableTail = makeMutable(tail)
+
+            // Creating new tail implies structural change.
+            if (mutableTail !== tail) { modCount++ }
+
+            val tailIndex = index and MAX_BUFFER_SIZE_MINUS_ONE
+            val oldElement = mutableTail[tailIndex]
+            mutableTail[tailIndex] = element
+            this.tail = mutableTail
+            @Suppress("UNCHECKED_CAST")
+            return oldElement as E
+        }
+
+        val oldElementCarry = ObjectRef(null)
+        this.root = setInRoot(root!!, rootShift, index, element, oldElementCarry)
+        @Suppress("UNCHECKED_CAST")
+        return oldElementCarry.value as E
+    }
+
+    private fun setInRoot(root: Array<Any?>, shift: Int, index: Int, e: E, oldElementCarry: ObjectRef): Array<Any?> {
+        val bufferIndex = indexSegment(index, shift)
+        val mutableRoot = makeMutable(root)
+
+        if (shift == 0) {
+            // Creating new leaf implies structural change.
+            // Actually, while descending to this leaf several nodes could be recreated.
+            // However, this builder is exclusive owner of this leaf iff it is exclusive owner of all leaf's ancestors.
+            // Hence, checking recreation of this leaf is enough to determine if a structural change occurred.
+            if (mutableRoot !== root) { modCount++ }
+
+            oldElementCarry.value = mutableRoot[bufferIndex]
+            mutableRoot[bufferIndex] = e
+            return mutableRoot
+        }
+        @Suppress("UNCHECKED_CAST")
+        mutableRoot[bufferIndex] =
+                setInRoot(mutableRoot[bufferIndex] as Array<Any?>, shift - LOG_MAX_BUFFER_SIZE, index, e, oldElementCarry)
+        return mutableRoot
+    }
+
+    override fun iterator(): MutableIterator<E> {
+        return this.listIterator()
+    }
+
+    override fun listIterator(): MutableListIterator<E> {
+        return this.listIterator(0)
+    }
+
+    override fun listIterator(index: Int): MutableListIterator<E> {
+        checkPositionIndex(index, size)
+        return PersistentVectorMutableIterator(this, index)
+    }
+
+    private fun leafBufferIterator(index: Int): ListIterator<Array<Any?>> {
+        checkNotNull(root)
+
+        val leafCount = rootSize() shr LOG_MAX_BUFFER_SIZE
+
+        checkPositionIndex(index, leafCount)
+
+        if (rootShift == 0) {
+            return SingleElementListIterator(root!!, index)
+        }
+
+        val trieHeight = rootShift / LOG_MAX_BUFFER_SIZE
+        return TrieIterator(root!!, index, leafCount, trieHeight)
+    }
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/PersistentVectorIterator.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/PersistentVectorIterator.kt
new file mode 100644
index 0000000..71d054f
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/PersistentVectorIterator.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList
+
+internal class PersistentVectorIterator<out T>(root: Array<Any?>,
+                                               private val tail: Array<T>,
+                                               index: Int,
+                                               size: Int,
+                                               trieHeight: Int) : AbstractListIterator<T>(index, size) {
+    private val trieIterator: TrieIterator<T>
+
+    init {
+        val trieSize = rootSize(size)
+        val trieIndex = index.coerceAtMost(trieSize)
+        trieIterator = TrieIterator(root, trieIndex, trieSize, trieHeight)
+    }
+
+    override fun next(): T {
+        checkHasNext()
+        if (trieIterator.hasNext()) {
+            index++
+            return trieIterator.next()
+        }
+        return tail[index++ - trieIterator.size]
+    }
+
+    override fun previous(): T {
+        checkHasPrevious()
+        if (index > trieIterator.size) {
+            return tail[--index - trieIterator.size]
+        }
+        index--
+        return trieIterator.previous()
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/PersistentVectorMutableIterator.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/PersistentVectorMutableIterator.kt
new file mode 100644
index 0000000..973a144
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/PersistentVectorMutableIterator.kt
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList
+
+/**
+ * The class responsible for iterating over elements of the [PersistentVectorBuilder].
+ *
+ * There are two parts where the elements of the builder are located: root and tail.
+ * [TrieIterator] is responsible for iterating over elements located at root,
+ * whereas tail elements are iterated directly from this class.
+ */
+internal class PersistentVectorMutableIterator<T>(
+        private val builder: PersistentVectorBuilder<T>,
+        index: Int
+) : MutableListIterator<T>, AbstractListIterator<T>(index, builder.size) {
+
+    /**
+     * The modCount this iterator is aware of.
+     * Used to check if the [PersistentVectorBuilder] was modified outside this iterator.
+     */
+    private var expectedModCount = builder.getModCount()
+    /**
+     * Iterates over leaves of the builder.root trie.
+     * This property is equal to null if builder.root is null.
+     */
+    private var trieIterator: TrieIterator<T>? = null
+    /**
+     * Index of the element this iterator returned from last invocation of next() or previous().
+     * Used to remove or set new value at this index.
+     * This property is set to -1 when method `add(element: T)` or `remove()` gets invoked.
+     */
+    private var lastIteratedIndex = -1
+
+    init {
+        setupTrieIterator()
+    }
+
+    override fun previous(): T {
+        checkForComodification()
+        checkHasPrevious()
+
+        lastIteratedIndex = index - 1
+
+        @Suppress("UNCHECKED_CAST")
+        val trieIterator = this.trieIterator ?: return builder.tail[--index] as T
+        if (index > trieIterator.size) {
+            @Suppress("UNCHECKED_CAST")
+            return builder.tail[--index - trieIterator.size] as T
+        }
+        index--
+        return trieIterator.previous()
+    }
+
+    override fun next(): T {
+        checkForComodification()
+        checkHasNext()
+
+        lastIteratedIndex = index
+
+        @Suppress("UNCHECKED_CAST")
+        val trieIterator = this.trieIterator ?: return builder.tail[index++] as T
+        if (trieIterator.hasNext()) {
+            index++
+            return trieIterator.next()
+        }
+        @Suppress("UNCHECKED_CAST")
+        return builder.tail[index++ - trieIterator.size] as T
+    }
+
+    private fun reset() {
+        size = builder.size
+        expectedModCount = builder.getModCount()
+        lastIteratedIndex = -1
+
+        setupTrieIterator()
+    }
+
+    private fun setupTrieIterator() {
+        val root = builder.root
+        if (root == null) {
+            trieIterator = null
+            return
+        }
+
+        val trieSize = rootSize(builder.size)
+        val trieIndex = index.coerceAtMost(trieSize)
+        val trieHeight = builder.rootShift / LOG_MAX_BUFFER_SIZE + 1
+        if (trieIterator == null) {
+            trieIterator = TrieIterator(root, trieIndex, trieSize, trieHeight)
+        } else {
+            trieIterator!!.reset(root, trieIndex, trieSize, trieHeight)
+        }
+    }
+
+    override fun add(element: T) {
+        checkForComodification()
+
+        builder.add(index, element)
+        index++
+        reset()
+    }
+
+    override fun remove() {
+        checkForComodification()
+        checkHasIterated()
+
+        builder.removeAt(lastIteratedIndex)
+        if (lastIteratedIndex < index) index = lastIteratedIndex
+        reset()
+    }
+
+    override fun set(element: T) {
+        checkForComodification()
+        checkHasIterated()
+
+        builder[lastIteratedIndex] = element
+
+        expectedModCount = builder.getModCount()
+        setupTrieIterator()
+    }
+
+    private fun checkForComodification() {
+        if (expectedModCount != builder.getModCount())
+            throw ConcurrentModificationException()
+    }
+
+    private fun checkHasIterated() {
+        if (lastIteratedIndex == -1)
+            throw IllegalStateException()
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector.kt
new file mode 100644
index 0000000..17a1647
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector.kt
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.ImmutableList
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentList
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.ListImplementation.checkElementIndex
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.ListImplementation.checkPositionIndex
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.assert
+import androidx.compose.runtime.external.kotlinx.collections.immutable.mutate
+
+internal class SmallPersistentVector<E>(private val buffer: Array<Any?>) : ImmutableList<E>, AbstractPersistentList<E>() {
+
+    init {
+        assert(buffer.size <= MAX_BUFFER_SIZE)
+    }
+
+    override val size: Int
+        get() = buffer.size
+
+    private fun bufferOfSize(size: Int): Array<Any?> {
+        return arrayOfNulls<Any?>(size)
+    }
+
+    override fun add(element: E): PersistentList<E> {
+        if (size < MAX_BUFFER_SIZE) {
+            val newBuffer = buffer.copyOf(size + 1)
+            newBuffer[size] = element
+            return SmallPersistentVector(newBuffer)
+        }
+        val tail = presizedBufferWith(element)
+        return PersistentVector(buffer, tail, size + 1, 0)
+    }
+
+    override fun addAll(elements: Collection<E>): PersistentList<E> {
+        if (size + elements.size <= MAX_BUFFER_SIZE) {
+            val newBuffer = buffer.copyOf(size + elements.size)
+            // TODO: investigate performance of elements.toArray + copyInto
+            var index = size
+            for (element in elements) {
+                newBuffer[index++] = element
+            }
+            return SmallPersistentVector(newBuffer)
+        }
+        return mutate { it.addAll(elements) }
+    }
+
+    override fun removeAll(predicate: (E) -> Boolean): PersistentList<E> {
+        var newBuffer = buffer
+        var newSize = size
+
+        var anyRemoved = false
+
+        for (index in 0 until size) {
+            @Suppress("UNCHECKED_CAST")
+            val element = buffer[index] as E
+
+            if (predicate(element)) {
+                if (!anyRemoved) {
+                    newBuffer = buffer.copyOf()
+                    newSize = index
+
+                    anyRemoved = true
+                }
+            } else if (anyRemoved) {
+                newBuffer[newSize++] = element
+            }
+        }
+        return when (newSize) {
+            size -> this
+            0 -> EMPTY
+            else -> SmallPersistentVector(newBuffer.copyOfRange(0, newSize))
+        }
+    }
+
+    override fun addAll(index: Int, c: Collection<E>): PersistentList<E> {
+        checkPositionIndex(index, size)
+        if (size + c.size <= MAX_BUFFER_SIZE) {
+            val newBuffer = bufferOfSize(size + c.size)
+            buffer.copyInto(newBuffer, endIndex = index)
+            buffer.copyInto(newBuffer, index + c.size, index, size)
+            var position = index
+            for (element in c) {
+                newBuffer[position++] = element
+            }
+            return SmallPersistentVector(newBuffer)
+        }
+        return mutate { it.addAll(index, c) }
+    }
+
+    override fun add(index: Int, element: E): PersistentList<E> {
+        checkPositionIndex(index, size)
+        if (index == size) {
+            return add(element)
+        }
+
+        if (size < MAX_BUFFER_SIZE) {
+            // TODO: copyOf + one copyInto?
+            val newBuffer = bufferOfSize(size + 1)
+            buffer.copyInto(newBuffer, endIndex = index)
+            buffer.copyInto(newBuffer, index + 1, index, size)
+            newBuffer[index] = element
+            return SmallPersistentVector(newBuffer)
+        }
+
+        val root = buffer.copyOf()
+        buffer.copyInto(root, index + 1, index, size - 1)
+        root[index] = element
+        val tail = presizedBufferWith(buffer[MAX_BUFFER_SIZE_MINUS_ONE])
+        return PersistentVector(root, tail, size + 1, 0)
+    }
+
+    override fun removeAt(index: Int): PersistentList<E> {
+        checkElementIndex(index, size)
+        if (size == 1) {
+            return EMPTY
+        }
+        val newBuffer = buffer.copyOf(size - 1)
+        buffer.copyInto(newBuffer, index, index + 1, size)
+        return SmallPersistentVector(newBuffer)
+    }
+
+    override fun builder(): PersistentList.Builder<E> {
+        return PersistentVectorBuilder(this, null, buffer, 0)
+    }
+
+    override fun indexOf(element: E): Int {
+        return buffer.indexOf(element)
+    }
+
+    override fun lastIndexOf(element: E): Int {
+        return buffer.lastIndexOf(element)
+    }
+
+    override fun listIterator(index: Int): ListIterator<E> {
+        checkPositionIndex(index, size)
+        @Suppress("UNCHECKED_CAST")
+        return BufferIterator(buffer as Array<E>, index, size)
+    }
+
+    override fun get(index: Int): E {
+        // TODO: use elementAt(index)?
+        checkElementIndex(index, size)
+        @Suppress("UNCHECKED_CAST")
+        return buffer[index] as E
+    }
+
+    override fun set(index: Int, element: E): PersistentList<E> {
+        checkElementIndex(index, size)
+        val newBuffer = buffer.copyOf()
+        newBuffer[index] = element
+        return SmallPersistentVector(newBuffer)
+    }
+
+    companion object {
+        val EMPTY = SmallPersistentVector<Nothing>(emptyArray())
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/TrieIterator.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/TrieIterator.kt
new file mode 100644
index 0000000..fcd9d96
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/TrieIterator.kt
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList
+
+internal class TrieIterator<out E>(root: Array<Any?>,
+                                   index: Int,
+                                   size: Int,
+                                   private var height: Int) : AbstractListIterator<E>(index, size) {
+    private var path: Array<Any?> = arrayOfNulls<Any?>(height)
+    private var isInRightEdge = index == size
+
+    init {
+        path[0] = root
+        fillPath(index - if (isInRightEdge) 1 else 0, 1)
+    }
+
+    internal fun reset(root: Array<Any?>, index: Int, size: Int, height: Int) {
+        this.index = index
+        this.size = size
+        this.height = height
+        if (path.size < height) path = arrayOfNulls(height)
+        path[0] = root
+        isInRightEdge = index == size
+
+        fillPath(index - if (isInRightEdge) 1 else 0, 1)
+    }
+
+    private fun fillPath(index: Int, startLevel: Int) {
+        var shift = (height - startLevel) * LOG_MAX_BUFFER_SIZE
+        var i = startLevel
+        while (i < height) {
+            @Suppress("UNCHECKED_CAST")
+            path[i] = (path[i - 1] as Array<Any?>)[indexSegment(index, shift)]
+            shift -= LOG_MAX_BUFFER_SIZE
+            i += 1
+        }
+    }
+
+    // TODO: Document that it positions path to the first or the last element
+    private fun fillPathIfNeeded(indexPredicate: Int) {
+        var shift = 0
+        while (indexSegment(index, shift) == indexPredicate) {
+            shift += LOG_MAX_BUFFER_SIZE
+        }
+
+        if (shift > 0) {
+            val level = height - 1 - shift / LOG_MAX_BUFFER_SIZE
+            fillPath(index, level + 1)
+        }
+    }
+
+    private fun elementAtCurrentIndex(): E {
+        val leafBufferIndex = index and MAX_BUFFER_SIZE_MINUS_ONE
+        @Suppress("UNCHECKED_CAST")
+        return (path[height - 1] as Array<E>)[leafBufferIndex]
+    }
+
+    override fun next(): E {
+        if (!hasNext()) {
+            throw NoSuchElementException()
+        }
+
+        val result = elementAtCurrentIndex()
+        index += 1
+
+        if (index == size) {
+            isInRightEdge = true
+            return result
+        }
+
+        fillPathIfNeeded(0)
+
+        return result
+    }
+
+    override fun previous(): E {
+        if (!hasPrevious()) {
+            throw NoSuchElementException()
+        }
+
+        index -= 1
+
+        if (isInRightEdge) {
+            isInRightEdge = false
+            return elementAtCurrentIndex()
+        }
+
+        fillPathIfNeeded(MAX_BUFFER_SIZE_MINUS_ONE)
+
+        return elementAtCurrentIndex()
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/Utils.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/Utils.kt
new file mode 100644
index 0000000..e7344ba
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/Utils.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentList
+
+internal const val MAX_BUFFER_SIZE = 32
+internal const val LOG_MAX_BUFFER_SIZE = 5
+internal const val MAX_BUFFER_SIZE_MINUS_ONE = MAX_BUFFER_SIZE - 1
+internal const val MUTABLE_BUFFER_SIZE = MAX_BUFFER_SIZE + 1
+
+internal class ObjectRef(var value: Any?)
+
+internal fun <E> persistentVectorOf(): PersistentList<E> {
+    return SmallPersistentVector.EMPTY
+}
+
+
+/** Creates new buffer of [MAX_BUFFER_SIZE] capacity having first element initialized with the specified [element]. */
+internal fun presizedBufferWith(element: Any?): Array<Any?> {
+    val buffer = arrayOfNulls<Any?>(MAX_BUFFER_SIZE)
+    buffer[0] = element
+    return buffer
+}
+
+/**
+ * Gets trie index segment of the specified [index] at the level specified by [shift].
+ *
+ * `shift` equal to zero corresponds to the bottommost (leaf) level.
+ * For each upper level `shift` increments by [LOG_MAX_BUFFER_SIZE].
+ */
+internal fun indexSegment(index: Int, shift: Int): Int =
+        (index shr shift) and MAX_BUFFER_SIZE_MINUS_ONE
+
+/**
+ * Returns the size of trie part of a persistent vector of the specified [vectorSize].
+ */
+internal fun rootSize(vectorSize: Int) =
+        (vectorSize - 1) and MAX_BUFFER_SIZE_MINUS_ONE.inv()
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap.kt
new file mode 100644
index 0000000..2db51de
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.ImmutableCollection
+import androidx.compose.runtime.external.kotlinx.collections.immutable.ImmutableSet
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentMap
+import androidx.compose.runtime.external.kotlinx.collections.immutable.mutate
+
+internal class PersistentHashMap<K, V>(internal val node: TrieNode<K, V>,
+                                       override val size: Int): AbstractMap<K, V>(), PersistentMap<K, V> {
+
+    override val keys: ImmutableSet<K>
+        get() {
+            return PersistentHashMapKeys(this)
+        }
+
+    override val values: ImmutableCollection<V>
+        get() {
+            return PersistentHashMapValues(this)
+        }
+
+    override val entries: ImmutableSet<Map.Entry<K, V>>
+        get() {
+            return createEntries()
+        }
+
+    private fun createEntries(): ImmutableSet<Map.Entry<K, V>> {
+        return PersistentHashMapEntries(this)
+    }
+
+    // TODO: compiler bug: this bridge should be generated automatically
+    @PublishedApi
+    internal fun getEntries(): Set<Map.Entry<K, V>> {
+        return createEntries()
+    }
+
+    override fun containsKey(key: K): Boolean {
+        return node.containsKey(key.hashCode(), key, 0)
+    }
+
+    override fun get(key: K): V? {
+        return node.get(key.hashCode(), key, 0)
+    }
+
+    override fun put(key: K, value: @UnsafeVariance V): PersistentHashMap<K, V> {
+        val newNodeResult = node.put(key.hashCode(), key, value, 0) ?: return this
+        return PersistentHashMap(newNodeResult.node, size + newNodeResult.sizeDelta)
+    }
+
+    override fun remove(key: K): PersistentHashMap<K, V> {
+        val newNode = node.remove(key.hashCode(), key, 0)
+        if (node === newNode) { return this }
+        if (newNode == null) { return emptyOf() }
+        return PersistentHashMap(newNode, size - 1)
+    }
+
+    override fun remove(key: K, value: @UnsafeVariance V): PersistentHashMap<K, V> {
+        val newNode = node.remove(key.hashCode(), key, value, 0)
+        if (node === newNode) { return this }
+        if (newNode == null) { return emptyOf() }
+        return PersistentHashMap(newNode, size - 1)
+    }
+
+    override fun putAll(m: Map<out K, @UnsafeVariance V>): PersistentMap<K, V> {
+        return this.mutate { it.putAll(m) }
+    }
+
+    override fun clear(): PersistentMap<K, V> {
+        return PersistentHashMap.emptyOf()
+    }
+
+    override fun builder(): PersistentHashMapBuilder<K, V> {
+        return PersistentHashMapBuilder(this)
+    }
+
+    internal companion object {
+        private val EMPTY = PersistentHashMap(TrieNode.EMPTY, 0)
+        @Suppress("UNCHECKED_CAST")
+        internal fun <K, V> emptyOf(): PersistentHashMap<K, V> = EMPTY as PersistentHashMap<K, V>
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder.kt
new file mode 100644
index 0000000..bce5a73
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder.kt
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentMap
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.DeltaCounter
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.MutabilityOwnership
+
+internal class PersistentHashMapBuilder<K, V>(private var map: PersistentHashMap<K, V>) : PersistentMap.Builder<K, V>, AbstractMutableMap<K, V>() {
+    internal var ownership = MutabilityOwnership()
+        private set
+    internal var node = map.node
+    internal var operationResult: V? = null
+    internal var modCount = 0
+
+    // Size change implies structural changes.
+    override var size = map.size
+        set(value) {
+            field = value
+            modCount++
+        }
+
+    override fun build(): PersistentHashMap<K, V> {
+        map = if (node === map.node) {
+            map
+        } else {
+            ownership = MutabilityOwnership()
+            PersistentHashMap(node, size)
+        }
+        return map
+    }
+
+    override val entries: MutableSet<MutableMap.MutableEntry<K, V>>
+        get() {
+            return PersistentHashMapBuilderEntries(this)
+        }
+
+    override val keys: MutableSet<K>
+        get() {
+            return PersistentHashMapBuilderKeys(this)
+        }
+
+    override val values: MutableCollection<V>
+        get() {
+            return PersistentHashMapBuilderValues(this)
+        }
+
+    override fun containsKey(key: K): Boolean {
+        return node.containsKey(key.hashCode(), key, 0)
+    }
+
+    override fun get(key: K): V? {
+        return node.get(key.hashCode(), key, 0)
+    }
+
+    override fun put(key: K, value: @UnsafeVariance V): V? {
+        operationResult = null
+        node = node.mutablePut(key.hashCode(), key, value, 0, this)
+        return operationResult
+    }
+
+    override fun putAll(from: Map<out K, V>) {
+        val map = from as? PersistentHashMap ?: (from as? PersistentHashMapBuilder)?.build()
+        if (map != null) @Suppress("UNCHECKED_CAST") {
+            val intersectionCounter = DeltaCounter()
+            val oldSize = this.size
+            node = node.mutablePutAll(map.node as TrieNode<K, V>, 0, intersectionCounter, this)
+            val newSize = oldSize + map.size - intersectionCounter.count
+            if(oldSize != newSize) this.size = newSize
+        }
+        else super.putAll(from)
+    }
+
+    override fun remove(key: K): V? {
+        operationResult = null
+        @Suppress("UNCHECKED_CAST")
+        node = node.mutableRemove(key.hashCode(), key, 0, this) ?: TrieNode.EMPTY as TrieNode<K, V>
+        return operationResult
+    }
+
+    fun remove(key: K, value: V): Boolean {
+        val oldSize = size
+        @Suppress("UNCHECKED_CAST")
+        node = node.mutableRemove(key.hashCode(), key, value, 0, this) ?: TrieNode.EMPTY as TrieNode<K, V>
+        return oldSize != size
+    }
+
+    override fun clear() {
+        @Suppress("UNCHECKED_CAST")
+        node = TrieNode.EMPTY as TrieNode<K, V>
+        size = 0
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilderContentIterators.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilderContentIterators.kt
new file mode 100644
index 0000000..48d074f
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilderContentIterators.kt
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.assert
+
+
+internal class TrieNodeMutableEntriesIterator<K, V>(
+        private val parentIterator: PersistentHashMapBuilderEntriesIterator<K, V>
+) : TrieNodeBaseIterator<K, V, MutableMap.MutableEntry<K, V>>() {
+
+    override fun next(): MutableMap.MutableEntry<K, V> {
+        assert(hasNextKey())
+        index += 2
+        @Suppress("UNCHECKED_CAST")
+        return MutableMapEntry(parentIterator, buffer[index - 2] as K, buffer[index - 1] as V)
+    }
+}
+
+private class MutableMapEntry<K, V>(
+        private val parentIterator: PersistentHashMapBuilderEntriesIterator<K, V>,
+        key: K,
+        override var value: V
+) : MapEntry<K, V>(key, value), MutableMap.MutableEntry<K, V> {
+
+    override fun setValue(newValue: V): V {
+        val result = value
+        value = newValue
+        parentIterator.setValue(key, newValue)
+        return result
+    }
+}
+
+
+internal open class PersistentHashMapBuilderBaseIterator<K, V, T>(
+        private val builder: PersistentHashMapBuilder<K, V>,
+        path: Array<TrieNodeBaseIterator<K, V, T>>
+) : MutableIterator<T>, PersistentHashMapBaseIterator<K, V, T>(builder.node, path) {
+
+    private var lastIteratedKey: K? = null
+    private var nextWasInvoked = false
+    private var expectedModCount = builder.modCount
+
+    override fun next(): T {
+        checkForComodification()
+        lastIteratedKey = currentKey()
+        nextWasInvoked = true
+        return super.next()
+    }
+
+    override fun remove() {
+        checkNextWasInvoked()
+        if (hasNext()) {
+            val currentKey = currentKey()
+
+            builder.remove(lastIteratedKey)
+            resetPath(currentKey.hashCode(), builder.node, currentKey, 0)
+        } else {
+            builder.remove(lastIteratedKey)
+        }
+
+        lastIteratedKey = null
+        nextWasInvoked = false
+        expectedModCount = builder.modCount
+    }
+
+    fun setValue(key: K, newValue: V) {
+        if (!builder.containsKey(key)) return
+
+        if (hasNext()) {
+            val currentKey = currentKey()
+
+            builder[key] = newValue
+            resetPath(currentKey.hashCode(), builder.node, currentKey, 0)
+        } else {
+            builder[key] = newValue
+        }
+
+        expectedModCount = builder.modCount
+    }
+
+    private fun resetPath(keyHash: Int, node: TrieNode<*, *>, key: K, pathIndex: Int) {
+        val shift = pathIndex * LOG_MAX_BRANCHING_FACTOR
+
+        if (shift > MAX_SHIFT) {    // collision
+            path[pathIndex].reset(node.buffer, node.buffer.size, 0)
+            while (path[pathIndex].currentKey() != key) {
+                path[pathIndex].moveToNextKey()
+            }
+            pathLastIndex = pathIndex
+            return
+        }
+
+        val keyPositionMask = 1 shl indexSegment(keyHash, shift)
+
+        if (node.hasEntryAt(keyPositionMask)) { // key is directly in buffer
+            val keyIndex = node.entryKeyIndex(keyPositionMask)
+
+//            assert(node.keyAtIndex(keyIndex) == key)
+
+            path[pathIndex].reset(node.buffer, ENTRY_SIZE * node.entryCount(), keyIndex)
+            pathLastIndex = pathIndex
+            return
+        }
+
+//        assert(node.hasNodeAt(keyPositionMask)) // key is in node
+
+        val nodeIndex = node.nodeIndex(keyPositionMask)
+        val targetNode = node.nodeAtIndex(nodeIndex)
+        path[pathIndex].reset(node.buffer, ENTRY_SIZE * node.entryCount(), nodeIndex)
+        resetPath(keyHash, targetNode, key, pathIndex + 1)
+    }
+
+    private fun checkNextWasInvoked() {
+        if (!nextWasInvoked)
+            throw IllegalStateException()
+    }
+
+    private fun checkForComodification() {
+        if (builder.modCount != expectedModCount)
+            throw ConcurrentModificationException()
+    }
+}
+
+internal class PersistentHashMapBuilderEntriesIterator<K, V>(
+        builder: PersistentHashMapBuilder<K, V>
+) : MutableIterator<MutableMap.MutableEntry<K, V>> {
+    private val base = PersistentHashMapBuilderBaseIterator<K, V, MutableMap.MutableEntry<K, V>>(
+            builder,
+            Array(TRIE_MAX_HEIGHT + 1) { TrieNodeMutableEntriesIterator(this) }
+    )
+
+    override fun hasNext(): Boolean = base.hasNext()
+    override fun next(): MutableMap.MutableEntry<K, V> = base.next()
+    override fun remove(): Unit = base.remove()
+
+    fun setValue(key: K, newValue: V): Unit = base.setValue(key, newValue)
+}
+
+internal class PersistentHashMapBuilderKeysIterator<K, V>(builder: PersistentHashMapBuilder<K, V>)
+    : PersistentHashMapBuilderBaseIterator<K, V, K>(builder, Array(TRIE_MAX_HEIGHT + 1) { TrieNodeKeysIterator<K, V>() })
+
+internal class PersistentHashMapBuilderValuesIterator<K, V>(builder: PersistentHashMapBuilder<K, V>)
+    : PersistentHashMapBuilderBaseIterator<K, V, V>(builder, Array(TRIE_MAX_HEIGHT + 1) { TrieNodeValuesIterator<K, V>() })
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilderContentViews.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilderContentViews.kt
new file mode 100644
index 0000000..a40ac9f
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilderContentViews.kt
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap
+
+// intermediate abstract class to workaround KT-43321
+internal abstract class AbstractMapBuilderEntries<E : Map.Entry<K, V>, K, V> : AbstractMutableSet<E>() {
+    final override fun contains(element: E): Boolean {
+        // TODO: Eliminate this check after KT-30016 gets fixed.
+        @Suppress("USELESS_CAST")
+        if ((element as? Any?) !is Map.Entry<*, *>) return false
+        return containsEntry(element)
+    }
+    abstract fun containsEntry(element: Map.Entry<K, V>): Boolean
+
+    final override fun remove(element: E): Boolean {
+        // TODO: Eliminate this check after KT-30016 gets fixed.
+        @Suppress("USELESS_CAST")
+        if ((element as? Any?) !is Map.Entry<*, *>) return false
+        return removeEntry(element)
+    }
+    abstract fun removeEntry(element: Map.Entry<K, V>): Boolean
+}
+
+internal class PersistentHashMapBuilderEntries<K, V>(private val builder: PersistentHashMapBuilder<K, V>)
+    : AbstractMapBuilderEntries<MutableMap.MutableEntry<K, V>, K, V>() {
+    override fun add(element: MutableMap.MutableEntry<K, V>): Boolean {
+        throw UnsupportedOperationException()
+    }
+
+    override fun clear() {
+        builder.clear()
+    }
+
+    override fun iterator(): MutableIterator<MutableMap.MutableEntry<K, V>> {
+        return PersistentHashMapBuilderEntriesIterator(builder)
+    }
+
+    override fun removeEntry(element: Map.Entry<K, V>): Boolean {
+        return builder.remove(element.key, element.value)
+    }
+
+    override val size: Int
+        get() = builder.size
+
+    override fun containsEntry(element: Map.Entry<K, V>): Boolean {
+        return builder[element.key]?.let { candidate -> candidate == element.value }
+                ?: (element.value == null && builder.containsKey(element.key))
+    }
+}
+
+internal class PersistentHashMapBuilderKeys<K, V>(private val builder: PersistentHashMapBuilder<K, V>) : MutableSet<K>, AbstractMutableSet<K>() {
+    override fun add(element: K): Boolean {
+        throw UnsupportedOperationException()
+    }
+
+    override fun clear() {
+        builder.clear()
+    }
+
+    override fun iterator(): MutableIterator<K> {
+        return PersistentHashMapBuilderKeysIterator(builder)
+    }
+
+    override fun remove(element: K): Boolean {
+        if (builder.containsKey(element)) {
+            builder.remove(element)
+            return true
+        }
+        return false
+    }
+
+    override val size: Int
+        get() = builder.size
+
+    override fun contains(element: K): Boolean {
+        return builder.containsKey(element)
+    }
+}
+
+internal class PersistentHashMapBuilderValues<K, V>(private val builder: PersistentHashMapBuilder<K, V>) : MutableCollection<V>, AbstractMutableCollection<V>() {
+    override val size: Int
+        get() = builder.size
+
+    override fun contains(element: V): Boolean {
+        return builder.containsValue(element)
+    }
+
+    override fun add(element: V): Boolean {
+        throw UnsupportedOperationException()
+    }
+
+    override fun clear() {
+        builder.clear()
+    }
+
+    override fun iterator(): MutableIterator<V> {
+        return PersistentHashMapBuilderValuesIterator(builder)
+    }
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapContentIterators.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapContentIterators.kt
new file mode 100644
index 0000000..b10deaf
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapContentIterators.kt
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.assert
+import kotlin.js.JsName
+
+internal const val TRIE_MAX_HEIGHT = 7
+
+internal abstract class TrieNodeBaseIterator<out K, out V, out T> : Iterator<T> {
+    protected var buffer = TrieNode.EMPTY.buffer
+        private set
+    private var dataSize = 0
+    protected var index = 0
+
+    fun reset(buffer: Array<Any?>, dataSize: Int, index: Int) {
+        this.buffer = buffer
+        this.dataSize = dataSize
+        this.index = index
+    }
+
+    fun reset(buffer: Array<Any?>, dataSize: Int) {
+        reset(buffer, dataSize, 0)
+    }
+
+    fun hasNextKey(): Boolean {
+        return index < dataSize
+    }
+
+    fun currentKey(): K {
+        assert(hasNextKey())
+        @Suppress("UNCHECKED_CAST")
+        return buffer[index] as K
+    }
+
+    fun moveToNextKey() {
+        assert(hasNextKey())
+        index += 2
+    }
+
+    fun hasNextNode(): Boolean {
+        assert(index >= dataSize)
+        return index < buffer.size
+    }
+
+    fun currentNode(): TrieNode<out K, out V> {
+        assert(hasNextNode())
+        @Suppress("UNCHECKED_CAST")
+        return buffer[index] as TrieNode<K, V>
+    }
+
+    fun moveToNextNode() {
+        assert(hasNextNode())
+        index++
+    }
+
+    override fun hasNext(): Boolean {
+        return hasNextKey()
+    }
+}
+
+internal class TrieNodeKeysIterator<out K, out V> : TrieNodeBaseIterator<K, V, K>() {
+    override fun next(): K {
+        assert(hasNextKey())
+        index += 2
+        @Suppress("UNCHECKED_CAST")
+        return buffer[index - 2] as K
+    }
+}
+
+internal class TrieNodeValuesIterator<out K, out V> : TrieNodeBaseIterator<K, V, V>() {
+    override fun next(): V {
+        assert(hasNextKey())
+        index += 2
+        @Suppress("UNCHECKED_CAST")
+        return buffer[index - 1] as V
+    }
+}
+
+internal class TrieNodeEntriesIterator<out K, out V> : TrieNodeBaseIterator<K, V, Map.Entry<K, V>>() {
+    override fun next(): Map.Entry<K, V> {
+        assert(hasNextKey())
+        index += 2
+        @Suppress("UNCHECKED_CAST")
+        return MapEntry(buffer[index - 2] as K, buffer[index - 1] as V)
+    }
+}
+
+internal open class MapEntry<out K, out V>(override val key: K, override val value: V) : Map.Entry<K, V> {
+    override fun hashCode(): Int = key.hashCode() xor value.hashCode()
+    override fun equals(other: Any?): Boolean =
+            (other as? Map.Entry<*, *>)?.let { it.key == key && it.value == value } ?: false
+
+    override fun toString(): String = key.toString() + "=" + value.toString()
+}
+
+
+internal abstract class PersistentHashMapBaseIterator<K, V, T>(
+        node: TrieNode<K, V>,
+        protected val path: Array<TrieNodeBaseIterator<K, V, T>>
+) : Iterator<T> {
+
+    protected var pathLastIndex = 0
+    @JsName("_hasNext")
+    private var hasNext = true
+
+    init {
+        path[0].reset(node.buffer, ENTRY_SIZE * node.entryCount())
+        pathLastIndex = 0
+        ensureNextEntryIsReady()
+    }
+
+    private fun moveToNextNodeWithData(pathIndex: Int): Int {
+        if (path[pathIndex].hasNextKey()) {
+            return pathIndex
+        }
+        if (path[pathIndex].hasNextNode()) {
+            val node = path[pathIndex].currentNode()
+            if (pathIndex == TRIE_MAX_HEIGHT - 1) {     // collision
+                path[pathIndex + 1].reset(node.buffer, node.buffer.size)
+            } else {
+                path[pathIndex + 1].reset(node.buffer, ENTRY_SIZE * node.entryCount())
+            }
+            return moveToNextNodeWithData(pathIndex + 1)
+        }
+        return -1
+    }
+
+    private fun ensureNextEntryIsReady() {
+        if (path[pathLastIndex].hasNextKey()) {
+            return
+        }
+        for(i in pathLastIndex downTo 0) {
+            var result = moveToNextNodeWithData(i)
+
+            if (result == -1 && path[i].hasNextNode()) {
+                path[i].moveToNextNode()
+                result = moveToNextNodeWithData(i)
+            }
+            if (result != -1) {
+                pathLastIndex = result
+                return
+            }
+            if (i > 0) {
+                path[i - 1].moveToNextNode()
+            }
+            path[i].reset(TrieNode.EMPTY.buffer, 0)
+        }
+        hasNext = false
+    }
+
+    protected fun currentKey(): K {
+        checkHasNext()
+        return path[pathLastIndex].currentKey()
+    }
+
+    override fun hasNext(): Boolean {
+        return hasNext
+    }
+
+    override fun next(): T {
+        checkHasNext()
+        val result = path[pathLastIndex].next()
+        ensureNextEntryIsReady()
+        return result
+    }
+
+    private fun checkHasNext() {
+        if (!hasNext())
+            throw NoSuchElementException()
+    }
+}
+
+internal class PersistentHashMapEntriesIterator<K, V>(node: TrieNode<K, V>)
+    : PersistentHashMapBaseIterator<K, V, Map.Entry<K, V>>(node, Array(TRIE_MAX_HEIGHT + 1) { TrieNodeEntriesIterator<K, V>() })
+
+internal class PersistentHashMapKeysIterator<K, V>(node: TrieNode<K, V>)
+    : PersistentHashMapBaseIterator<K, V, K>(node, Array(TRIE_MAX_HEIGHT + 1) { TrieNodeKeysIterator<K, V>() })
+
+internal class PersistentHashMapValuesIterator<K, V>(node: TrieNode<K, V>)
+    : PersistentHashMapBaseIterator<K, V, V>(node, Array(TRIE_MAX_HEIGHT + 1) { TrieNodeValuesIterator<K, V>() })
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapContentViews.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapContentViews.kt
new file mode 100644
index 0000000..2c1f8c4
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapContentViews.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.ImmutableCollection
+import androidx.compose.runtime.external.kotlinx.collections.immutable.ImmutableSet
+
+internal class PersistentHashMapEntries<K, V>(private val map: PersistentHashMap<K, V>) : ImmutableSet<Map.Entry<K, V>>, AbstractSet<Map.Entry<K, V>>() {
+    override val size: Int get() = map.size
+
+    override fun contains(element: Map.Entry<K, V>): Boolean {
+        // TODO: Eliminate this check after KT-30016 gets fixed.
+        @Suppress("USELESS_CAST")
+        if ((element as Any?) !is Map.Entry<*, *>) return false
+        return map[element.key]?.let { candidate -> candidate == element.value }
+                ?: (element.value == null && map.containsKey(element.key))
+    }
+
+    override fun iterator(): Iterator<Map.Entry<K, V>> {
+        return PersistentHashMapEntriesIterator(map.node)
+    }
+}
+
+internal class PersistentHashMapKeys<K, V>(private val map: PersistentHashMap<K, V>) : ImmutableSet<K>, AbstractSet<K>() {
+    override val size: Int
+        get() = map.size
+
+    override fun contains(element: K): Boolean {
+        return map.containsKey(element)
+    }
+
+    override fun iterator(): Iterator<K> {
+        return PersistentHashMapKeysIterator(map.node)
+    }
+}
+
+internal class PersistentHashMapValues<K, V>(private val map: PersistentHashMap<K, V>) : ImmutableCollection<V>, AbstractCollection<V>() {
+    override val size: Int
+        get() = map.size
+
+    override fun contains(element: V): Boolean {
+        return map.containsValue(element)
+    }
+
+    override fun iterator(): Iterator<V> {
+        return PersistentHashMapValuesIterator(map.node)
+    }
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode.kt
new file mode 100644
index 0000000..259d69e
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode.kt
@@ -0,0 +1,882 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.DeltaCounter
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.MutabilityOwnership
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.assert
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.forEachOneBit
+
+
+internal const val MAX_BRANCHING_FACTOR = 32
+internal const val LOG_MAX_BRANCHING_FACTOR = 5
+internal const val MAX_BRANCHING_FACTOR_MINUS_ONE = MAX_BRANCHING_FACTOR - 1
+internal const val ENTRY_SIZE = 2
+internal const val MAX_SHIFT = 30
+
+/**
+ * Gets trie index segment of the specified [index] at the level specified by [shift].
+ *
+ * `shift` equal to zero corresponds to the root level.
+ * For each lower level `shift` increments by [LOG_MAX_BRANCHING_FACTOR].
+ */
+internal fun indexSegment(index: Int, shift: Int): Int =
+        (index shr shift) and MAX_BRANCHING_FACTOR_MINUS_ONE
+
+private fun <K, V> Array<Any?>.insertEntryAtIndex(keyIndex: Int, key: K, value: V): Array<Any?> {
+    val newBuffer = arrayOfNulls<Any?>(this.size + ENTRY_SIZE)
+    this.copyInto(newBuffer, endIndex = keyIndex)
+    this.copyInto(newBuffer, keyIndex + ENTRY_SIZE, startIndex = keyIndex, endIndex = this.size)
+    newBuffer[keyIndex] = key
+    newBuffer[keyIndex + 1] = value
+    return newBuffer
+}
+
+private fun Array<Any?>.replaceEntryWithNode(keyIndex: Int, nodeIndex: Int, newNode: TrieNode<*, *>): Array<Any?> {
+    val newNodeIndex = nodeIndex - ENTRY_SIZE  // place where to insert new node in the new buffer
+    val newBuffer = arrayOfNulls<Any?>(this.size - ENTRY_SIZE + 1)
+    this.copyInto(newBuffer, endIndex = keyIndex)
+    this.copyInto(newBuffer, keyIndex, startIndex = keyIndex + ENTRY_SIZE, endIndex = nodeIndex)
+    newBuffer[newNodeIndex] = newNode
+    this.copyInto(newBuffer, newNodeIndex + 1, startIndex = nodeIndex, endIndex = this.size)
+    return newBuffer
+}
+
+private fun <K, V> Array<Any?>.replaceNodeWithEntry(nodeIndex: Int, keyIndex: Int, key: K, value: V): Array<Any?> {
+    val newBuffer = this.copyOf(this.size + 1)
+    newBuffer.copyInto(newBuffer, nodeIndex + 2, nodeIndex + 1, this.size)
+    newBuffer.copyInto(newBuffer, keyIndex + 2, keyIndex , nodeIndex)
+    newBuffer[keyIndex] = key
+    newBuffer[keyIndex + 1] = value
+    return newBuffer
+}
+
+private fun Array<Any?>.removeEntryAtIndex(keyIndex: Int): Array<Any?> {
+    val newBuffer = arrayOfNulls<Any?>(this.size - ENTRY_SIZE)
+    this.copyInto(newBuffer, endIndex = keyIndex)
+    this.copyInto(newBuffer, keyIndex, startIndex = keyIndex + ENTRY_SIZE, endIndex = this.size)
+    return newBuffer
+}
+
+private fun Array<Any?>.removeNodeAtIndex(nodeIndex: Int): Array<Any?> {
+    val newBuffer = arrayOfNulls<Any?>(this.size - 1)
+    this.copyInto(newBuffer, endIndex = nodeIndex)
+    this.copyInto(newBuffer, nodeIndex, startIndex = nodeIndex + 1, endIndex = this.size)
+    return newBuffer
+}
+
+
+
+internal class TrieNode<K, V>(
+        private var dataMap: Int,
+        private var nodeMap: Int,
+        buffer: Array<Any?>,
+        private val ownedBy: MutabilityOwnership?
+) {
+    constructor(dataMap: Int, nodeMap: Int, buffer: Array<Any?>) : this(dataMap, nodeMap, buffer, null)
+
+    internal class ModificationResult<K, V>(var node: TrieNode<K, V>, val sizeDelta: Int) {
+        inline fun replaceNode(operation: (TrieNode<K, V>) -> TrieNode<K, V>): ModificationResult<K, V> =
+                apply { node = operation(node) }
+    }
+
+    private fun asInsertResult() = ModificationResult(this, 1)
+    private fun asUpdateResult() = ModificationResult(this, 0)
+
+    internal var buffer: Array<Any?> = buffer
+        private set
+
+    /** Returns number of entries stored in this trie node (not counting subnodes) */
+    internal fun entryCount(): Int = dataMap.countOneBits()
+
+    // here and later:
+    // positionMask — an int in form 2^n, i.e. having the single bit set, whose ordinal is a logical position in buffer
+
+
+    /** Returns true if the data bit map has the bit specified by [positionMask] set, indicating there's a data entry in the buffer at that position. */
+    internal fun hasEntryAt(positionMask: Int): Boolean {
+        return dataMap and positionMask != 0
+    }
+
+    /** Returns true if the node bit map has the bit specified by [positionMask] set, indicating there's a subtrie node in the buffer at that position. */
+    private fun hasNodeAt(positionMask: Int): Boolean {
+        return nodeMap and positionMask != 0
+    }
+
+    /** Gets the index in buffer of the data entry key corresponding to the position specified by [positionMask]. */
+    internal fun entryKeyIndex(positionMask: Int): Int {
+        return ENTRY_SIZE * (dataMap and (positionMask - 1)).countOneBits()
+    }
+
+    /** Gets the index in buffer of the subtrie node entry corresponding to the position specified by [positionMask]. */
+    internal fun nodeIndex(positionMask: Int): Int {
+        return buffer.size - 1 - (nodeMap and (positionMask - 1)).countOneBits()
+    }
+
+    /** Retrieves the buffer element at the given [keyIndex] as key of a data entry. */
+    private fun keyAtIndex(keyIndex: Int): K {
+        @Suppress("UNCHECKED_CAST")
+        return buffer[keyIndex] as K
+    }
+
+    /** Retrieves the buffer element next to the given [keyIndex] as value of a data entry. */
+    private fun valueAtKeyIndex(keyIndex: Int): V {
+        @Suppress("UNCHECKED_CAST")
+        return buffer[keyIndex + 1] as V
+    }
+
+    /** Retrieves the buffer element at the given [nodeIndex] as subtrie node. */
+    internal fun nodeAtIndex(nodeIndex: Int): TrieNode<K, V> {
+        @Suppress("UNCHECKED_CAST")
+        return buffer[nodeIndex] as TrieNode<K, V>
+    }
+
+    private fun insertEntryAt(positionMask: Int, key: K, value: V): TrieNode<K, V> {
+//        assert(!hasEntryAt(positionMask))
+
+        val keyIndex = entryKeyIndex(positionMask)
+        val newBuffer = buffer.insertEntryAtIndex(keyIndex, key, value)
+        return TrieNode(dataMap or positionMask, nodeMap, newBuffer)
+    }
+
+    private fun mutableInsertEntryAt(positionMask: Int, key: K, value: V, owner: MutabilityOwnership): TrieNode<K, V> {
+//        assert(!hasEntryAt(positionMask))
+
+        val keyIndex = entryKeyIndex(positionMask)
+        if (ownedBy === owner) {
+            buffer = buffer.insertEntryAtIndex(keyIndex, key, value)
+            dataMap = dataMap or positionMask
+            return this
+        }
+        val newBuffer = buffer.insertEntryAtIndex(keyIndex, key, value)
+        return TrieNode(dataMap or positionMask, nodeMap, newBuffer, owner)
+    }
+
+    private fun updateValueAtIndex(keyIndex: Int, value: V): TrieNode<K, V> {
+//        assert(buffer[keyIndex + 1] !== value)
+
+        val newBuffer = buffer.copyOf()
+        newBuffer[keyIndex + 1] = value
+        return TrieNode(dataMap, nodeMap, newBuffer)
+    }
+
+    private fun mutableUpdateValueAtIndex(keyIndex: Int, value: V, mutator: PersistentHashMapBuilder<K, V>): TrieNode<K, V> {
+//        assert(buffer[keyIndex + 1] !== value)
+
+        // If the [mutator] is exclusive owner of this node, update value at specified index in-place.
+        if (ownedBy === mutator.ownership) {
+            buffer[keyIndex + 1] = value
+            return this
+        }
+        // Structural change due to node replacement.
+        mutator.modCount++
+        // Create new node with updated value at specified index.
+        val newBuffer = buffer.copyOf()
+        newBuffer[keyIndex + 1] = value
+        return TrieNode(dataMap, nodeMap, newBuffer, mutator.ownership)
+    }
+
+    /** The given [newNode] must not be a part of any persistent map instance. */
+    private fun updateNodeAtIndex(nodeIndex: Int, positionMask: Int, newNode: TrieNode<K, V>): TrieNode<K, V> {
+//        assert(buffer[nodeIndex] !== newNode)
+        val newNodeBuffer = newNode.buffer
+        if (newNodeBuffer.size == 2 && newNode.nodeMap == 0) {
+            if (buffer.size == 1) {
+//                assert(dataMap == 0 && nodeMap xor positionMask == 0)
+                newNode.dataMap = nodeMap
+                return newNode
+            }
+
+            val keyIndex = entryKeyIndex(positionMask)
+            val newBuffer = buffer.replaceNodeWithEntry(nodeIndex, keyIndex, newNodeBuffer[0], newNodeBuffer[1])
+            return TrieNode(dataMap xor positionMask, nodeMap xor positionMask, newBuffer)
+        }
+
+        val newBuffer = buffer.copyOf(buffer.size)
+        newBuffer[nodeIndex] = newNode
+        return TrieNode(dataMap, nodeMap, newBuffer)
+    }
+
+    /** The given [newNode] must not be a part of any persistent map instance. */
+    private fun mutableUpdateNodeAtIndex(nodeIndex: Int, newNode: TrieNode<K, V>, owner: MutabilityOwnership): TrieNode<K, V> {
+//        assert(buffer[nodeIndex] !== newNode)
+
+        // nodes (including collision nodes) that have only one entry are upped if they have no siblings
+        if (buffer.size == 1 && newNode.buffer.size == ENTRY_SIZE && newNode.nodeMap == 0) {
+//          assert(dataMap == 0 && nodeMap xor positionMask == 0)
+            newNode.dataMap = nodeMap
+            return newNode
+        }
+
+        if (ownedBy === owner) {
+            buffer[nodeIndex] = newNode
+            return this
+        }
+        val newBuffer = buffer.copyOf()
+        newBuffer[nodeIndex] = newNode
+        return TrieNode(dataMap, nodeMap, newBuffer, owner)
+    }
+
+    private fun removeNodeAtIndex(nodeIndex: Int, positionMask: Int): TrieNode<K, V>? {
+//        assert(hasNodeAt(positionMask))
+        if (buffer.size == 1) return null
+
+        val newBuffer = buffer.removeNodeAtIndex(nodeIndex)
+        return TrieNode(dataMap, nodeMap xor positionMask, newBuffer)
+    }
+
+    private fun mutableRemoveNodeAtIndex(nodeIndex: Int, positionMask: Int, owner: MutabilityOwnership): TrieNode<K, V>? {
+//        assert(hasNodeAt(positionMask))
+        if (buffer.size == 1) return null
+
+        if (ownedBy === owner) {
+            buffer = buffer.removeNodeAtIndex(nodeIndex)
+            nodeMap = nodeMap xor positionMask
+            return this
+        }
+        val newBuffer = buffer.removeNodeAtIndex(nodeIndex)
+        return TrieNode(dataMap, nodeMap xor positionMask, newBuffer, owner)
+    }
+
+
+    private fun bufferMoveEntryToNode(keyIndex: Int, positionMask: Int, newKeyHash: Int,
+                                      newKey: K, newValue: V, shift: Int, owner: MutabilityOwnership?): Array<Any?> {
+        val storedKey = keyAtIndex(keyIndex)
+        val storedKeyHash = storedKey.hashCode()
+        val storedValue = valueAtKeyIndex(keyIndex)
+        val newNode = makeNode(storedKeyHash, storedKey, storedValue,
+                newKeyHash, newKey, newValue, shift + LOG_MAX_BRANCHING_FACTOR, owner)
+
+        val nodeIndex = nodeIndex(positionMask) + 1 // place where to insert new node in the current buffer
+
+        return buffer.replaceEntryWithNode(keyIndex, nodeIndex, newNode)
+    }
+
+
+    private fun moveEntryToNode(keyIndex: Int, positionMask: Int, newKeyHash: Int,
+                                newKey: K, newValue: V, shift: Int): TrieNode<K, V> {
+//        assert(hasEntryAt(positionMask))
+//        assert(!hasNodeAt(positionMask))
+
+        val newBuffer = bufferMoveEntryToNode(keyIndex, positionMask, newKeyHash, newKey, newValue, shift, null)
+        return TrieNode(dataMap xor positionMask, nodeMap or positionMask, newBuffer)
+    }
+
+    private fun mutableMoveEntryToNode(keyIndex: Int, positionMask: Int, newKeyHash: Int,
+                                       newKey: K, newValue: V, shift: Int, owner: MutabilityOwnership): TrieNode<K, V> {
+//        assert(hasEntryAt(positionMask))
+//        assert(!hasNodeAt(positionMask))
+
+        if (ownedBy === owner) {
+            buffer = bufferMoveEntryToNode(keyIndex, positionMask, newKeyHash, newKey, newValue, shift, owner)
+            dataMap = dataMap xor positionMask
+            nodeMap = nodeMap or positionMask
+            return this
+        }
+        val newBuffer = bufferMoveEntryToNode(keyIndex, positionMask, newKeyHash, newKey, newValue, shift, owner)
+        return TrieNode(dataMap xor positionMask, nodeMap or positionMask, newBuffer, owner)
+    }
+
+    /** Creates a new TrieNode for holding two given key value entries */
+    private fun makeNode(keyHash1: Int, key1: K, value1: V,
+                         keyHash2: Int, key2: K, value2: V, shift: Int, owner: MutabilityOwnership?): TrieNode<K, V> {
+        if (shift > MAX_SHIFT) {
+//            assert(key1 != key2)
+            // when two key hashes are entirely equal: the last level subtrie node stores them just as unordered list
+            return TrieNode(0, 0, arrayOf(key1, value1, key2, value2), owner)
+        }
+
+        val setBit1 = indexSegment(keyHash1, shift)
+        val setBit2 = indexSegment(keyHash2, shift)
+
+        if (setBit1 != setBit2) {
+            val nodeBuffer = if (setBit1 < setBit2) {
+                arrayOf(key1, value1, key2, value2)
+            } else {
+                arrayOf(key2, value2, key1, value1)
+            }
+            return TrieNode((1 shl setBit1) or (1 shl setBit2), 0, nodeBuffer, owner)
+        }
+        // hash segments at the given shift are equal: move these entries into the subtrie
+        val node = makeNode(keyHash1, key1, value1, keyHash2, key2, value2, shift + LOG_MAX_BRANCHING_FACTOR, owner)
+        return TrieNode(0, 1 shl setBit1, arrayOf<Any?>(node), owner)
+    }
+
+    private fun removeEntryAtIndex(keyIndex: Int, positionMask: Int): TrieNode<K, V>? {
+//        assert(hasEntryAt(positionMask))
+        if (buffer.size == ENTRY_SIZE) return null
+        val newBuffer = buffer.removeEntryAtIndex(keyIndex)
+        return TrieNode(dataMap xor positionMask, nodeMap, newBuffer)
+    }
+
+    private fun mutableRemoveEntryAtIndex(keyIndex: Int, positionMask: Int, mutator: PersistentHashMapBuilder<K, V>): TrieNode<K, V>? {
+//        assert(hasEntryAt(positionMask))
+        mutator.size--
+        mutator.operationResult = valueAtKeyIndex(keyIndex)
+        if (buffer.size == ENTRY_SIZE) return null
+
+        if (ownedBy === mutator.ownership) {
+            buffer = buffer.removeEntryAtIndex(keyIndex)
+            dataMap = dataMap xor positionMask
+            return this
+        }
+        val newBuffer = buffer.removeEntryAtIndex(keyIndex)
+        return TrieNode(dataMap xor positionMask, nodeMap, newBuffer, mutator.ownership)
+    }
+
+    private fun collisionRemoveEntryAtIndex(i: Int): TrieNode<K, V>? {
+        if (buffer.size == ENTRY_SIZE) return null
+        val newBuffer = buffer.removeEntryAtIndex(i)
+        return TrieNode(0, 0, newBuffer)
+    }
+
+    private fun mutableCollisionRemoveEntryAtIndex(i: Int, mutator: PersistentHashMapBuilder<K, V>): TrieNode<K, V>? {
+        mutator.size--
+        mutator.operationResult = valueAtKeyIndex(i)
+        if (buffer.size == ENTRY_SIZE) return null
+
+        if (ownedBy === mutator.ownership) {
+            buffer = buffer.removeEntryAtIndex(i)
+            return this
+        }
+        val newBuffer = buffer.removeEntryAtIndex(i)
+        return TrieNode(0, 0, newBuffer, mutator.ownership)
+    }
+
+    private fun collisionContainsKey(key: K): Boolean {
+        for (i in 0 until buffer.size step ENTRY_SIZE) {
+            if (key == buffer[i]) return true
+        }
+        return false
+    }
+
+    private fun collisionGet(key: K): V? {
+        for (i in 0 until buffer.size step ENTRY_SIZE) {
+            if (key == keyAtIndex(i)) {
+                return valueAtKeyIndex(i)
+            }
+        }
+        return null
+    }
+
+    private fun collisionPut(key: K, value: V): ModificationResult<K, V>? {
+        for (i in 0 until buffer.size step ENTRY_SIZE) {
+            if (key == keyAtIndex(i)) {
+                if (value === valueAtKeyIndex(i)) {
+                    return null
+                }
+                val newBuffer = buffer.copyOf()
+                newBuffer[i + 1] = value
+                return TrieNode<K, V>(0, 0, newBuffer).asUpdateResult()
+            }
+        }
+        val newBuffer = buffer.insertEntryAtIndex(0, key, value)
+        return TrieNode<K, V>(0, 0, newBuffer).asInsertResult()
+    }
+
+    private fun mutableCollisionPut(key: K, value: V, mutator: PersistentHashMapBuilder<K, V>): TrieNode<K, V> {
+        // Check if there is an entry with the specified key.
+        for (i in 0 until buffer.size step ENTRY_SIZE) {
+            if (key == keyAtIndex(i)) { // found entry with the specified key
+                mutator.operationResult = valueAtKeyIndex(i)
+
+                // If the [mutator] is exclusive owner of this node, update value of the entry in-place.
+                if (ownedBy === mutator.ownership) {
+                    buffer[i + 1] = value
+                    return this
+                }
+
+                // Structural change due to node replacement.
+                mutator.modCount++
+                // Create new node with updated entry value.
+                val newBuffer = buffer.copyOf()
+                newBuffer[i + 1] = value
+                return TrieNode(0, 0, newBuffer, mutator.ownership)
+            }
+        }
+        // Create new collision node with the specified entry added to it.
+        mutator.size++
+        val newBuffer = buffer.insertEntryAtIndex(0, key, value)
+        return TrieNode(0, 0, newBuffer, mutator.ownership)
+    }
+
+    private fun collisionRemove(key: K): TrieNode<K, V>? {
+        for (i in 0 until buffer.size step ENTRY_SIZE) {
+            if (key == keyAtIndex(i)) {
+                return collisionRemoveEntryAtIndex(i)
+            }
+        }
+        return this
+    }
+
+    private fun mutableCollisionRemove(key: K, mutator: PersistentHashMapBuilder<K, V>): TrieNode<K, V>? {
+        for (i in 0 until buffer.size step ENTRY_SIZE) {
+            if (key == keyAtIndex(i)) {
+                return mutableCollisionRemoveEntryAtIndex(i, mutator)
+            }
+        }
+        return this
+    }
+
+    private fun collisionRemove(key: K, value: V): TrieNode<K, V>? {
+        for (i in 0 until buffer.size step ENTRY_SIZE) {
+            if (key == keyAtIndex(i) && value == valueAtKeyIndex(i)) {
+                return collisionRemoveEntryAtIndex(i)
+            }
+        }
+        return this
+    }
+
+    private fun mutableCollisionRemove(key: K, value: V, mutator: PersistentHashMapBuilder<K, V>): TrieNode<K, V>? {
+        for (i in 0 until buffer.size step ENTRY_SIZE) {
+            if (key == keyAtIndex(i) && value == valueAtKeyIndex(i)) {
+                return mutableCollisionRemoveEntryAtIndex(i, mutator)
+            }
+        }
+        return this
+    }
+
+    private fun mutableCollisionPutAll(otherNode: TrieNode<K, V>,
+                                       intersectionCounter: DeltaCounter,
+                                       owner: MutabilityOwnership): TrieNode<K, V> {
+        assert(nodeMap == 0)
+        assert(dataMap == 0)
+        assert(otherNode.nodeMap == 0)
+        assert(otherNode.dataMap == 0)
+        val tempBuffer = this.buffer.copyOf(newSize = this.buffer.size + otherNode.buffer.size)
+        var i = this.buffer.size
+        for (j in 0 until otherNode.buffer.size step ENTRY_SIZE) {
+            @Suppress("UNCHECKED_CAST")
+            if (!this.collisionContainsKey(otherNode.buffer[j] as K)) {
+                tempBuffer[i] = otherNode.buffer[j]
+                tempBuffer[i + 1] = otherNode.buffer[j + 1]
+                i += ENTRY_SIZE
+            } else intersectionCounter.count++
+        }
+
+        return when (val newSize = i) {
+            this.buffer.size -> this
+            otherNode.buffer.size -> otherNode
+            tempBuffer.size -> TrieNode(0, 0, tempBuffer, owner)
+            else -> TrieNode(0, 0, tempBuffer.copyOf(newSize), owner)
+        }
+    }
+
+    private fun mutablePutAllFromOtherNodeCell(other: TrieNode<K, V>,
+                                               positionMask: Int,
+                                               shift: Int,
+                                               intersectionCounter: DeltaCounter,
+                                               mutator: PersistentHashMapBuilder<K, V>): TrieNode<K, V> {
+        return when {
+            other.hasNodeAt(positionMask) -> {
+                mutablePutAll(
+                        other.nodeAtIndex(other.nodeIndex(positionMask)),
+                        shift + LOG_MAX_BRANCHING_FACTOR,
+                        intersectionCounter,
+                        mutator
+                )
+            }
+            other.hasEntryAt(positionMask) -> {
+                val keyIndex = other.entryKeyIndex(positionMask)
+                val key = other.keyAtIndex(keyIndex)
+                val value = other.valueAtKeyIndex(keyIndex)
+                val oldSize = mutator.size
+                val newNode = mutablePut(
+                        key.hashCode(),
+                        key,
+                        value,
+                        shift + LOG_MAX_BRANCHING_FACTOR,
+                        mutator
+                )
+                if (mutator.size == oldSize) {
+                    intersectionCounter.count++
+                }
+                newNode
+            }
+            else -> this
+        }
+    }
+
+    private fun calculateSize(): Int {
+        if (nodeMap == 0) return buffer.size / ENTRY_SIZE
+        val numValues = dataMap.countOneBits()
+        var result = numValues
+        for(i in (numValues * ENTRY_SIZE) until buffer.size) {
+            result += nodeAtIndex(i).calculateSize()
+        }
+        return result
+    }
+
+    private fun elementsIdentityEquals(otherNode: TrieNode<K, V>): Boolean {
+        if (this === otherNode) return true
+        if (nodeMap != otherNode.nodeMap) return false
+        if (dataMap != otherNode.dataMap) return false
+        for (i in 0 until buffer.size) {
+            if(buffer[i] !== otherNode.buffer[i]) return false
+        }
+        return true
+    }
+
+    fun containsKey(keyHash: Int, key: K, shift: Int): Boolean {
+        val keyPositionMask = 1 shl indexSegment(keyHash, shift)
+
+        if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
+            return key == keyAtIndex(entryKeyIndex(keyPositionMask))
+        }
+        if (hasNodeAt(keyPositionMask)) { // key is in node
+            val targetNode = nodeAtIndex(nodeIndex(keyPositionMask))
+            if (shift == MAX_SHIFT) {
+                return targetNode.collisionContainsKey(key)
+            }
+            return targetNode.containsKey(keyHash, key, shift + LOG_MAX_BRANCHING_FACTOR)
+        }
+
+        // key is absent
+        return false
+    }
+
+    fun get(keyHash: Int, key: K, shift: Int): V? {
+        val keyPositionMask = 1 shl indexSegment(keyHash, shift)
+
+        if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
+            val keyIndex = entryKeyIndex(keyPositionMask)
+
+            if (key == keyAtIndex(keyIndex)) {
+                return valueAtKeyIndex(keyIndex)
+            }
+            return null
+        }
+        if (hasNodeAt(keyPositionMask)) { // key is in node
+            val targetNode = nodeAtIndex(nodeIndex(keyPositionMask))
+            if (shift == MAX_SHIFT) {
+                return targetNode.collisionGet(key)
+            }
+            return targetNode.get(keyHash, key, shift + LOG_MAX_BRANCHING_FACTOR)
+        }
+
+        // key is absent
+        return null
+    }
+
+    fun mutablePutAll(otherNode: TrieNode<K, V>,
+                      shift: Int,
+                      intersectionCounter: DeltaCounter,
+                      mutator: PersistentHashMapBuilder<K, V>): TrieNode<K, V> {
+        if (this === otherNode) {
+            intersectionCounter += calculateSize()
+            return this
+        }
+        // the collision case
+        if (shift > MAX_SHIFT) {
+            return mutableCollisionPutAll(otherNode, intersectionCounter, mutator.ownership)
+        }
+
+        // new nodes are where either of the old ones were
+        var newNodeMap = nodeMap or otherNode.nodeMap
+        // entries stay being entries only if one bits were in exactly one of input nodes
+        // but not in the new data nodes
+        var newDataMap = dataMap xor otherNode.dataMap and newNodeMap.inv()
+        // (**) now, this is tricky: we have a number of entry-entry pairs and we don't know yet whether
+        // they result in an entry (if they are equal) or a new node (if they are not)
+        // but we want to keep it to single allocation, so we check and mark equal ones here
+        (dataMap and otherNode.dataMap).forEachOneBit { positionMask, _ ->
+            val leftKey = this.keyAtIndex(this.entryKeyIndex(positionMask))
+            val rightKey = otherNode.keyAtIndex(otherNode.entryKeyIndex(positionMask))
+            // if they are equal, put them in the data map
+            if (leftKey == rightKey) newDataMap = newDataMap or positionMask
+            // if they are not, put them in the node map
+            else newNodeMap = newNodeMap or positionMask
+            // we can use this later to skip calling equals() again
+        }
+        assert(newNodeMap and newDataMap == 0)
+        val mutableNode = when {
+            this.ownedBy == mutator.ownership && this.dataMap == newDataMap && this.nodeMap == newNodeMap -> this
+            else -> {
+                val newBuffer = arrayOfNulls<Any>(newDataMap.countOneBits() * ENTRY_SIZE + newNodeMap.countOneBits())
+                TrieNode(newDataMap, newNodeMap, newBuffer)
+            }
+        }
+        newNodeMap.forEachOneBit { positionMask, index ->
+            val newNodeIndex = mutableNode.buffer.size - 1 - index
+            mutableNode.buffer[newNodeIndex] = when {
+                hasNodeAt(positionMask) -> {
+                    val before = nodeAtIndex(nodeIndex(positionMask))
+                    before.mutablePutAllFromOtherNodeCell(otherNode, positionMask, shift, intersectionCounter, mutator)
+                }
+
+                otherNode.hasNodeAt(positionMask) -> {
+                    val before = otherNode.nodeAtIndex(otherNode.nodeIndex(positionMask))
+                    before.mutablePutAllFromOtherNodeCell(this, positionMask, shift, intersectionCounter, mutator)
+                }
+
+                else -> { // two entries, and they are not equal by key (see ** above)
+                    val thisKeyIndex = this.entryKeyIndex(positionMask)
+                    val thisKey = this.keyAtIndex(thisKeyIndex)
+                    val thisValue = this.valueAtKeyIndex(thisKeyIndex)
+                    val otherKeyIndex = otherNode.entryKeyIndex(positionMask)
+                    val otherKey = otherNode.keyAtIndex(otherKeyIndex)
+                    val otherValue = otherNode.valueAtKeyIndex(otherKeyIndex)
+                    makeNode(
+                            thisKey.hashCode(),
+                            thisKey,
+                            thisValue,
+                            otherKey.hashCode(),
+                            otherKey,
+                            otherValue,
+                            shift + LOG_MAX_BRANCHING_FACTOR,
+                            mutator.ownership
+                    )
+                }
+            }
+        }
+        newDataMap.forEachOneBit { positionMask, index ->
+            val newKeyIndex = index * ENTRY_SIZE
+            when {
+                !otherNode.hasEntryAt(positionMask) -> {
+                    val oldKeyIndex = this.entryKeyIndex(positionMask)
+                    mutableNode.buffer[newKeyIndex] = this.keyAtIndex(oldKeyIndex)
+                    mutableNode.buffer[newKeyIndex + 1] = this.valueAtKeyIndex(oldKeyIndex)
+                }
+                // there is either only one entry in otherNode, or
+                // both entries are here => they are equal, see ** above
+                // so just overwrite that
+                else -> {
+                    val oldKeyIndex = otherNode.entryKeyIndex(positionMask)
+                    mutableNode.buffer[newKeyIndex] = otherNode.keyAtIndex(oldKeyIndex)
+                    mutableNode.buffer[newKeyIndex + 1] = otherNode.valueAtKeyIndex(oldKeyIndex)
+                    if (this.hasEntryAt(positionMask)) intersectionCounter.count++
+                }
+            }
+        }
+        return when {
+            this.elementsIdentityEquals(mutableNode) -> this
+            otherNode.elementsIdentityEquals(mutableNode) -> otherNode
+            else -> mutableNode
+        }
+    }
+
+    fun put(keyHash: Int, key: K, value: @UnsafeVariance V, shift: Int): ModificationResult<K, V>? {
+        val keyPositionMask = 1 shl indexSegment(keyHash, shift)
+
+        if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
+            val keyIndex = entryKeyIndex(keyPositionMask)
+
+            if (key == keyAtIndex(keyIndex)) {
+                if (valueAtKeyIndex(keyIndex) === value) return null
+
+                return updateValueAtIndex(keyIndex, value).asUpdateResult()
+            }
+            return moveEntryToNode(keyIndex, keyPositionMask, keyHash, key, value, shift).asInsertResult()
+        }
+        if (hasNodeAt(keyPositionMask)) { // key is in node
+            val nodeIndex = nodeIndex(keyPositionMask)
+
+            val targetNode = nodeAtIndex(nodeIndex)
+            val putResult = if (shift == MAX_SHIFT) {
+                targetNode.collisionPut(key, value) ?: return null
+            } else {
+                targetNode.put(keyHash, key, value, shift + LOG_MAX_BRANCHING_FACTOR) ?: return null
+            }
+            return putResult.replaceNode { node -> updateNodeAtIndex(nodeIndex, keyPositionMask, node) }
+        }
+
+        // no entry at this key hash segment
+        return insertEntryAt(keyPositionMask, key, value).asInsertResult()
+    }
+
+    fun mutablePut(keyHash: Int, key: K, value: @UnsafeVariance V, shift: Int, mutator: PersistentHashMapBuilder<K, V>): TrieNode<K, V> {
+        val keyPositionMask = 1 shl indexSegment(keyHash, shift)
+
+        if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
+            val keyIndex = entryKeyIndex(keyPositionMask)
+
+            if (key == keyAtIndex(keyIndex)) {
+                mutator.operationResult = valueAtKeyIndex(keyIndex)
+                if (valueAtKeyIndex(keyIndex) === value) {
+                    return this
+                }
+
+                return mutableUpdateValueAtIndex(keyIndex, value, mutator)
+            }
+            mutator.size++
+            return mutableMoveEntryToNode(keyIndex, keyPositionMask, keyHash, key, value, shift, mutator.ownership)
+        }
+        if (hasNodeAt(keyPositionMask)) { // key is in node
+            val nodeIndex = nodeIndex(keyPositionMask)
+
+            val targetNode = nodeAtIndex(nodeIndex)
+            val newNode = if (shift == MAX_SHIFT) {
+                targetNode.mutableCollisionPut(key, value, mutator)
+            } else {
+                targetNode.mutablePut(keyHash, key, value, shift + LOG_MAX_BRANCHING_FACTOR, mutator)
+            }
+            if (targetNode === newNode) {
+                return this
+            }
+            return mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.ownership)
+        }
+
+        // key is absent
+        mutator.size++
+        return mutableInsertEntryAt(keyPositionMask, key, value, mutator.ownership)
+    }
+
+    fun remove(keyHash: Int, key: K, shift: Int): TrieNode<K, V>? {
+        val keyPositionMask = 1 shl indexSegment(keyHash, shift)
+
+        if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
+            val keyIndex = entryKeyIndex(keyPositionMask)
+
+            if (key == keyAtIndex(keyIndex)) {
+                return removeEntryAtIndex(keyIndex, keyPositionMask)
+            }
+            return this
+        }
+        if (hasNodeAt(keyPositionMask)) { // key is in node
+            val nodeIndex = nodeIndex(keyPositionMask)
+
+            val targetNode = nodeAtIndex(nodeIndex)
+            val newNode = if (shift == MAX_SHIFT) {
+                targetNode.collisionRemove(key)
+            } else {
+                targetNode.remove(keyHash, key, shift + LOG_MAX_BRANCHING_FACTOR)
+            }
+            return replaceNode(targetNode, newNode, nodeIndex, keyPositionMask)
+        }
+
+        // key is absent
+        return this
+    }
+
+    private fun replaceNode(targetNode: TrieNode<K, V>, newNode: TrieNode<K, V>?, nodeIndex: Int, positionMask: Int) = when {
+        newNode == null ->
+            removeNodeAtIndex(nodeIndex, positionMask)
+        targetNode !== newNode ->
+            updateNodeAtIndex(nodeIndex, positionMask, newNode)
+        else ->
+            this
+    }
+
+    fun mutableRemove(keyHash: Int, key: K, shift: Int, mutator: PersistentHashMapBuilder<K, V>): TrieNode<K, V>? {
+        val keyPositionMask = 1 shl indexSegment(keyHash, shift)
+
+        if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
+            val keyIndex = entryKeyIndex(keyPositionMask)
+
+            if (key == keyAtIndex(keyIndex)) {
+                return mutableRemoveEntryAtIndex(keyIndex, keyPositionMask, mutator)
+            }
+            return this
+        }
+        if (hasNodeAt(keyPositionMask)) { // key is in node
+            val nodeIndex = nodeIndex(keyPositionMask)
+
+            val targetNode = nodeAtIndex(nodeIndex)
+            val newNode = if (shift == MAX_SHIFT) {
+                targetNode.mutableCollisionRemove(key, mutator)
+            } else {
+                targetNode.mutableRemove(keyHash, key, shift + LOG_MAX_BRANCHING_FACTOR, mutator)
+            }
+            return mutableReplaceNode(targetNode, newNode, nodeIndex, keyPositionMask, mutator.ownership)
+        }
+
+        // key is absent
+        return this
+    }
+
+    private fun mutableReplaceNode(targetNode: TrieNode<K, V>, newNode: TrieNode<K, V>?, nodeIndex: Int, positionMask: Int, owner: MutabilityOwnership) = when {
+        newNode == null ->
+            mutableRemoveNodeAtIndex(nodeIndex, positionMask, owner)
+        ownedBy === owner || targetNode !== newNode ->
+            mutableUpdateNodeAtIndex(nodeIndex, newNode, owner)
+        else ->
+            this
+    }
+
+    fun remove(keyHash: Int, key: K, value: @UnsafeVariance V, shift: Int): TrieNode<K, V>? {
+        val keyPositionMask = 1 shl indexSegment(keyHash, shift)
+
+        if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
+            val keyIndex = entryKeyIndex(keyPositionMask)
+
+            if (key == keyAtIndex(keyIndex) && value == valueAtKeyIndex(keyIndex)) {
+                return removeEntryAtIndex(keyIndex, keyPositionMask)
+            }
+            return this
+        }
+        if (hasNodeAt(keyPositionMask)) { // key is in node
+            val nodeIndex = nodeIndex(keyPositionMask)
+
+            val targetNode = nodeAtIndex(nodeIndex)
+            val newNode = if (shift == MAX_SHIFT) {
+                targetNode.collisionRemove(key, value)
+            } else {
+                targetNode.remove(keyHash, key, value, shift + LOG_MAX_BRANCHING_FACTOR)
+            }
+            return replaceNode(targetNode, newNode, nodeIndex, keyPositionMask)
+        }
+
+        // key is absent
+        return this
+    }
+
+    fun mutableRemove(keyHash: Int, key: K, value: @UnsafeVariance V, shift: Int, mutator: PersistentHashMapBuilder<K, V>): TrieNode<K, V>? {
+        val keyPositionMask = 1 shl indexSegment(keyHash, shift)
+
+        if (hasEntryAt(keyPositionMask)) { // key is directly in buffer
+            val keyIndex = entryKeyIndex(keyPositionMask)
+
+            if (key == keyAtIndex(keyIndex) && value == valueAtKeyIndex(keyIndex)) {
+                return mutableRemoveEntryAtIndex(keyIndex, keyPositionMask, mutator)
+            }
+            return this
+        }
+        if (hasNodeAt(keyPositionMask)) { // key is in node
+            val nodeIndex = nodeIndex(keyPositionMask)
+
+            val targetNode = nodeAtIndex(nodeIndex)
+            val newNode = if (shift == MAX_SHIFT) {
+                targetNode.mutableCollisionRemove(key, value, mutator)
+            } else {
+                targetNode.mutableRemove(keyHash, key, value, shift + LOG_MAX_BRANCHING_FACTOR, mutator)
+            }
+            return mutableReplaceNode(targetNode, newNode, nodeIndex, keyPositionMask, mutator.ownership)
+        }
+
+        // key is absent
+        return this
+    }
+
+    // For testing trie structure
+    internal fun accept(visitor: (node: TrieNode<K, V>, shift: Int, hash: Int, dataMap: Int, nodeMap: Int) -> Unit) {
+        accept(visitor, 0, 0)
+    }
+
+    private fun accept(
+            visitor: (node: TrieNode<K, V>, shift: Int, hash: Int, dataMap: Int, nodeMap: Int) -> Unit,
+            hash: Int,
+            shift: Int
+    ) {
+        visitor(this, shift, hash, dataMap, nodeMap)
+
+        var nodePositions = nodeMap
+        while (nodePositions != 0) {
+            val mask = nodePositions.takeLowestOneBit()
+//            assert(hasNodeAt(mask))
+
+            val hashSegment = mask.countTrailingZeroBits()
+
+            val childNode = nodeAtIndex(nodeIndex(mask))
+            childNode.accept(visitor, hash + (hashSegment shl shift), shift + LOG_MAX_BRANCHING_FACTOR)
+
+            nodePositions -= mask
+        }
+    }
+
+    internal companion object {
+        internal val EMPTY = TrieNode<Nothing, Nothing>(0, 0, emptyArray())
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/PersistentHashSet.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/PersistentHashSet.kt
new file mode 100644
index 0000000..df8390f
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/PersistentHashSet.kt
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentSet
+import androidx.compose.runtime.external.kotlinx.collections.immutable.mutate
+
+internal class PersistentHashSet<E>(internal val node: TrieNode<E>,
+                                    override val size: Int): AbstractSet<E>(), PersistentSet<E> {
+    override fun contains(element: E): Boolean {
+        return node.contains(element.hashCode(), element, 0)
+    }
+
+    override fun add(element: E): PersistentSet<E> {
+        val newNode = node.add(element.hashCode(), element, 0)
+        if (node === newNode) { return this }
+        return PersistentHashSet(newNode, size + 1)
+    }
+
+    override fun addAll(elements: Collection<E>): PersistentSet<E> {
+        return this.mutate { it.addAll(elements) }
+    }
+
+    override fun remove(element: E): PersistentSet<E> {
+        val newNode = node.remove(element.hashCode(), element, 0)
+        if (node === newNode) { return this }
+        return PersistentHashSet(newNode, size - 1)
+    }
+
+    override fun removeAll(elements: Collection<E>): PersistentSet<E> {
+        return mutate { it.removeAll(elements) }
+    }
+
+    override fun removeAll(predicate: (E) -> Boolean): PersistentSet<E> {
+        return mutate { it.removeAll(predicate) }
+    }
+
+    override fun retainAll(elements: Collection<E>): PersistentSet<E> {
+        return mutate { it.retainAll(elements) }
+    }
+
+    override fun containsAll(elements: Collection<E>): Boolean {
+        if (elements is PersistentHashSet) {
+            return node.containsAll(elements.node, 0)
+        }
+        if (elements is PersistentHashSetBuilder) {
+            return node.containsAll(elements.node, 0)
+        }
+        return super.containsAll(elements)
+    }
+
+    override fun clear(): PersistentSet<E> {
+        return PersistentHashSet.emptyOf()
+    }
+
+    override fun iterator(): Iterator<E> {
+        return PersistentHashSetIterator(node)
+    }
+
+    override fun builder(): PersistentSet.Builder<E> {
+        return PersistentHashSetBuilder(this)
+    }
+
+    internal companion object {
+        private val EMPTY = PersistentHashSet(TrieNode.EMPTY, 0)
+        internal fun <E> emptyOf(): PersistentSet<E> = PersistentHashSet.EMPTY
+    }
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/PersistentHashSetBuilder.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/PersistentHashSetBuilder.kt
new file mode 100644
index 0000000..869691a
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/PersistentHashSetBuilder.kt
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentSet
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.DeltaCounter
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.MutabilityOwnership
+
+internal class PersistentHashSetBuilder<E>(private var set: PersistentHashSet<E>) : AbstractMutableSet<E>(), PersistentSet.Builder<E> {
+    internal var ownership = MutabilityOwnership()
+        private set
+    internal var node = set.node
+        private set
+    internal var modCount = 0
+        private set
+
+    // Size change implies structural changes.
+    override var size = set.size
+        set(value) {
+            field = value
+            modCount++
+        }
+
+    override fun build(): PersistentHashSet<E> {
+        set = if (node === set.node) {
+            set
+        } else {
+            ownership = MutabilityOwnership()
+            PersistentHashSet(node, size)
+        }
+        return set
+    }
+
+    override fun contains(element: E): Boolean {
+        return node.contains(element.hashCode(), element, 0)
+    }
+
+    override fun add(element: E): Boolean {
+        val size = this.size
+        node = node.mutableAdd(element.hashCode(), element, 0, this)
+        return size != this.size
+    }
+
+    override fun addAll(elements: Collection<E>): Boolean {
+        val set = elements as? PersistentHashSet ?: (elements as? PersistentHashSetBuilder)?.build()
+        if (set !== null) {
+            val deltaCounter = DeltaCounter()
+            val size = this.size
+            val result = node.mutableAddAll(set.node, 0, deltaCounter, this)
+            val newSize = size + elements.size - deltaCounter.count
+            if (size != newSize) {
+                this.node = result
+                this.size = newSize
+            }
+            return size != this.size
+        }
+        return super.addAll(elements)
+    }
+
+    override fun retainAll(elements: Collection<E>): Boolean {
+        val set = elements as? PersistentHashSet ?: (elements as? PersistentHashSetBuilder)?.build()
+        if (set !== null) {
+            val deltaCounter = DeltaCounter()
+            val size = this.size
+            val result = node.mutableRetainAll(set.node, 0, deltaCounter, this)
+            when (val newSize = deltaCounter.count) {
+                0 -> clear()
+                size -> {}
+                else -> {
+                    @Suppress("UNCHECKED_CAST")
+                    this.node = result as TrieNode<E>
+                    this.size = newSize
+                }
+            }
+            return size != this.size
+        }
+        return super.retainAll(elements)
+    }
+
+    override fun removeAll(elements: Collection<E>): Boolean {
+        val set = elements as? PersistentHashSet ?: (elements as? PersistentHashSetBuilder)?.build()
+        if (set !== null) {
+            val counter = DeltaCounter()
+            val size = this.size
+            val result = node.mutableRemoveAll(set.node, 0, counter, this)
+
+            when (val newSize = size - counter.count) {
+                0 -> clear()
+                size -> {}
+                else -> {
+                    @Suppress("UNCHECKED_CAST")
+                    this.node = result as TrieNode<E>
+                    this.size = newSize
+                }
+            }
+            return size != this.size
+        }
+        return super.removeAll(elements)
+    }
+
+    override fun containsAll(elements: Collection<E>): Boolean {
+        if (elements is PersistentHashSet) {
+            return node.containsAll(elements.node, 0)
+        }
+        if (elements is PersistentHashSetBuilder) {
+            return node.containsAll(elements.node, 0)
+        }
+        return super.containsAll(elements)
+    }
+
+    override fun remove(element: E): Boolean {
+        val size = this.size
+        @Suppress("UNCHECKED_CAST")
+        node = node.mutableRemove(element.hashCode(), element, 0, this)
+        return size != this.size
+    }
+
+    override fun clear() {
+        @Suppress("UNCHECKED_CAST")
+        node = TrieNode.EMPTY as TrieNode<E>
+        size = 0
+    }
+
+    override fun iterator(): MutableIterator<E> {
+        return PersistentHashSetMutableIterator(this)
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/PersistentHashSetIterator.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/PersistentHashSetIterator.kt
new file mode 100644
index 0000000..8810019
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/PersistentHashSetIterator.kt
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.assert
+import kotlin.js.JsName
+
+internal open class PersistentHashSetIterator<E>(node: TrieNode<E>) : Iterator<E> {
+    protected val path = mutableListOf(TrieNodeIterator<E>())
+    protected var pathLastIndex = 0
+    @JsName("_hasNext")
+    private var hasNext = true
+
+    init {
+        path[0].reset(node.buffer)
+        pathLastIndex = 0
+        ensureNextElementIsReady()
+    }
+
+    private fun moveToNextNodeWithData(pathIndex: Int): Int {
+        if (path[pathIndex].hasNextElement()) {
+            return pathIndex
+        }
+        if (path[pathIndex].hasNextNode()) {
+            val node = path[pathIndex].currentNode()
+
+            if (pathIndex + 1 == path.size) {
+                path.add(TrieNodeIterator())
+            }
+            path[pathIndex + 1].reset(node.buffer)
+            return moveToNextNodeWithData(pathIndex + 1)
+        }
+        return -1
+    }
+
+    private fun ensureNextElementIsReady() {
+        if (path[pathLastIndex].hasNextElement()) {
+            return
+        }
+        for(i in pathLastIndex downTo 0) {
+            var result = moveToNextNodeWithData(i)
+
+            if (result == -1 && path[i].hasNextCell()) {
+                path[i].moveToNextCell()
+                result = moveToNextNodeWithData(i)
+            }
+            if (result != -1) {
+                pathLastIndex = result
+                return
+            }
+            if (i > 0) {
+                path[i - 1].moveToNextCell()
+            }
+            path[i].reset(TrieNode.EMPTY.buffer, 0)
+        }
+        hasNext = false
+    }
+
+    override fun hasNext(): Boolean {
+        return hasNext
+    }
+
+    override fun next(): E {
+        if (!hasNext)
+            throw NoSuchElementException()
+
+        val result = path[pathLastIndex].nextElement()
+        ensureNextElementIsReady()
+        return result
+    }
+
+    protected fun currentElement(): E {
+        assert(hasNext())
+        return path[pathLastIndex].currentElement()
+    }
+}
+
+internal class TrieNodeIterator<out E> {
+    private var buffer = TrieNode.EMPTY.buffer
+    private var index = 0
+
+    fun reset(buffer: Array<Any?>, index: Int = 0) {
+        this.buffer = buffer
+        this.index = index
+    }
+
+    fun hasNextCell(): Boolean {
+        return index < buffer.size
+    }
+
+    fun moveToNextCell() {
+        assert(hasNextCell())
+        index++
+    }
+
+    fun hasNextElement(): Boolean {
+        return hasNextCell() && buffer[index] !is TrieNode<*>
+    }
+
+    fun currentElement(): E {
+        assert(hasNextElement())
+        @Suppress("UNCHECKED_CAST")
+        return buffer[index] as E
+    }
+
+    fun nextElement(): E {
+        assert(hasNextElement())
+        @Suppress("UNCHECKED_CAST")
+        return buffer[index++] as E
+    }
+
+    fun hasNextNode(): Boolean {
+        return hasNextCell() && buffer[index] is TrieNode<*>
+    }
+
+    fun currentNode(): TrieNode<out E> {
+        assert(hasNextNode())
+        @Suppress("UNCHECKED_CAST")
+        return buffer[index] as TrieNode<E>
+    }
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/PersistentHashSetMutableIterator.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/PersistentHashSetMutableIterator.kt
new file mode 100644
index 0000000..0b56034
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/PersistentHashSetMutableIterator.kt
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.assert
+
+internal class PersistentHashSetMutableIterator<E>(private val builder: PersistentHashSetBuilder<E>)
+    : PersistentHashSetIterator<E>(builder.node), MutableIterator<E> {
+    private var lastIteratedElement: E? = null
+    private var nextWasInvoked = false
+    private var expectedModCount = builder.modCount
+
+    override fun next(): E {
+        checkForComodification()
+        val next = super.next()
+        lastIteratedElement = next
+        nextWasInvoked = true
+        return next
+    }
+
+    override fun remove() {
+        checkNextWasInvoked()
+        if (hasNext()) {
+            val currentElement = currentElement()
+
+            builder.remove(lastIteratedElement)
+            resetPath(currentElement.hashCode(), builder.node, currentElement, 0)
+        } else {
+            builder.remove(lastIteratedElement)
+        }
+
+        lastIteratedElement = null
+        nextWasInvoked = false
+        expectedModCount = builder.modCount
+    }
+
+    private fun resetPath(hashCode: Int, node: TrieNode<*>, element: E, pathIndex: Int) {
+        if (isCollision(node)) {
+            val index = node.buffer.indexOf(element)
+            assert(index != -1)
+            path[pathIndex].reset(node.buffer, index)
+            pathLastIndex = pathIndex
+            return
+        }
+
+        val position = 1 shl indexSegment(hashCode, pathIndex * LOG_MAX_BRANCHING_FACTOR)
+        val index = node.indexOfCellAt(position)
+
+        path[pathIndex].reset(node.buffer, index)
+
+        val cell = node.buffer[index]
+        if (cell is TrieNode<*>) {
+            resetPath(hashCode, cell, element, pathIndex + 1)
+        } else {
+//            assert(cell == element)
+            pathLastIndex = pathIndex
+        }
+    }
+
+    private fun isCollision(node: TrieNode<*>): Boolean {
+        return node.bitmap == 0
+    }
+
+    private fun checkNextWasInvoked() {
+        if (!nextWasInvoked)
+            throw IllegalStateException()
+    }
+
+    private fun checkForComodification() {
+        if (builder.modCount != expectedModCount)
+            throw ConcurrentModificationException()
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/TrieNode.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/TrieNode.kt
new file mode 100644
index 0000000..9bc1540
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableSet/TrieNode.kt
@@ -0,0 +1,851 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.DeltaCounter
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.MutabilityOwnership
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.assert
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.forEachOneBit
+
+
+internal const val MAX_BRANCHING_FACTOR = 32
+internal const val LOG_MAX_BRANCHING_FACTOR = 5
+internal const val MAX_BRANCHING_FACTOR_MINUS_ONE = MAX_BRANCHING_FACTOR - 1
+internal const val MAX_SHIFT = 30
+
+/**
+ * Gets trie index segment of the specified [index] at the level specified by [shift].
+ *
+ * `shift` equal to zero corresponds to the root level.
+ * For each lower level `shift` increments by [LOG_MAX_BRANCHING_FACTOR].
+ */
+internal fun indexSegment(index: Int, shift: Int): Int =
+        (index shr shift) and MAX_BRANCHING_FACTOR_MINUS_ONE
+
+
+private fun <E> Array<Any?>.addElementAtIndex(index: Int, element: E): Array<Any?> {
+    val newBuffer = arrayOfNulls<Any?>(this.size + 1)
+    this.copyInto(newBuffer, endIndex = index)
+    this.copyInto(newBuffer, index + 1, index, this.size)
+    newBuffer[index] = element
+    return newBuffer
+}
+
+private fun Array<Any?>.removeCellAtIndex(cellIndex: Int): Array<Any?> {
+    val newBuffer = arrayOfNulls<Any?>(this.size - 1)
+    this.copyInto(newBuffer, endIndex = cellIndex)
+    this.copyInto(newBuffer, cellIndex, cellIndex + 1, this.size)
+    return newBuffer
+}
+
+/**
+ * Writes all elements from [this] to [newArray], starting with [newArrayOffset], filtering
+ * on the fly using [predicate]. By default filters out [TrieNode.EMPTY] instances
+ *
+ * return number of elements written to [newArray]
+ **/
+private inline fun Array<Any?>.filterTo(
+        newArray: Array<Any?>,
+        newArrayOffset: Int = 0,
+        predicate: (Any?) -> Boolean = { it !== TrieNode.EMPTY }): Int {
+    var i = 0
+    var j = 0
+    while (i < size) {
+        assert(j <= i) // this is extremely important if newArray === this
+        val e = this[i]
+        if (predicate(e)) {
+            newArray[newArrayOffset + j] = this[i]
+            ++j
+            assert(newArrayOffset + j <= newArray.size)
+        }
+        ++i
+    }
+    return j
+}
+
+internal class TrieNode<E>(
+        var bitmap: Int,
+        var buffer: Array<Any?>,
+        var ownedBy: MutabilityOwnership?
+) {
+
+    constructor(bitmap: Int, buffer: Array<Any?>) : this(bitmap, buffer, null)
+
+    // here and later:
+    // positionMask — an int in form 2^n, i.e. having the single bit set, whose ordinal is a logical position in buffer
+
+    private fun hasNoCellAt(positionMask: Int): Boolean {
+        return bitmap and positionMask == 0
+    }
+
+    internal fun indexOfCellAt(positionMask: Int): Int {
+        return (bitmap and (positionMask - 1)).countOneBits()
+    }
+
+    private fun elementAtIndex(index: Int): E {
+        @Suppress("UNCHECKED_CAST")
+        return buffer[index] as E
+    }
+
+    private fun nodeAtIndex(index: Int): TrieNode<E> {
+        @Suppress("UNCHECKED_CAST")
+        return buffer[index] as TrieNode<E>
+    }
+
+    private fun addElementAt(positionMask: Int, element: E): TrieNode<E> {
+//        assert(hasNoCellAt(positionMask))
+
+        val index = indexOfCellAt(positionMask)
+        val newBuffer = buffer.addElementAtIndex(index, element)
+        return TrieNode(bitmap or positionMask, newBuffer)
+    }
+
+    private fun mutableAddElementAt(positionMask: Int, element: E, owner: MutabilityOwnership): TrieNode<E> {
+//        assert(hasNoCellAt(positionMask))
+
+        val index = indexOfCellAt(positionMask)
+        if (ownedBy === owner) {
+            buffer = buffer.addElementAtIndex(index, element)
+            bitmap = bitmap or positionMask
+            return this
+        }
+        val newBuffer = buffer.addElementAtIndex(index, element)
+        return TrieNode(bitmap or positionMask, newBuffer, owner)
+    }
+
+    /** The given [newNode] must not be a part of any persistent set instance. */
+    private fun updateNodeAtIndex(nodeIndex: Int, newNode: TrieNode<E>): TrieNode<E> {
+//        assert(buffer[nodeIndex] !== newNode)
+        val cell: Any?
+
+        val newNodeBuffer = newNode.buffer
+        if (newNodeBuffer.size == 1 && newNodeBuffer[0] !is TrieNode<*>) {
+            if (buffer.size == 1) {
+                newNode.bitmap = bitmap
+                return newNode
+            }
+            cell = newNodeBuffer[0]
+        } else {
+            cell = newNode
+        }
+
+        val newBuffer = buffer.copyOf()
+        newBuffer[nodeIndex] = cell
+        return TrieNode(bitmap, newBuffer)
+    }
+
+    /** The given [newNode] must not be a part of any persistent set instance. */
+    private fun mutableUpdateNodeAtIndex(nodeIndex: Int, newNode: TrieNode<E>, owner: MutabilityOwnership): TrieNode<E> {
+//        assert(buffer[nodeIndex] !== newNode)
+
+        val cell: Any?
+
+        val newNodeBuffer = newNode.buffer
+        if (newNodeBuffer.size == 1 && newNodeBuffer[0] !is TrieNode<*>) {
+            if (buffer.size == 1) {
+                newNode.bitmap = bitmap
+                return newNode
+            }
+            cell = newNodeBuffer[0]
+        } else {
+            cell = newNode
+        }
+
+        if (ownedBy === owner) {
+            buffer[nodeIndex] = cell
+            return this
+        }
+        val newBuffer = buffer.copyOf()
+        newBuffer[nodeIndex] = cell
+        return TrieNode(bitmap, newBuffer, owner)
+    }
+
+    private fun makeNodeAtIndex(elementIndex: Int, newElementHash: Int, newElement: E,
+                                shift: Int, owner: MutabilityOwnership?): TrieNode<E> {
+        val storedElement = elementAtIndex(elementIndex)
+        return makeNode(storedElement.hashCode(), storedElement,
+                newElementHash, newElement, shift + LOG_MAX_BRANCHING_FACTOR, owner)
+    }
+
+    private fun moveElementToNode(elementIndex: Int, newElementHash: Int, newElement: E,
+                                  shift: Int): TrieNode<E> {
+        val newBuffer = buffer.copyOf()
+        newBuffer[elementIndex] = makeNodeAtIndex(elementIndex, newElementHash, newElement, shift, null)
+        return TrieNode(bitmap, newBuffer)
+    }
+
+    private fun mutableMoveElementToNode(elementIndex: Int, newElementHash: Int, newElement: E,
+                                         shift: Int, owner: MutabilityOwnership): TrieNode<E> {
+        if (ownedBy === owner) {
+            buffer[elementIndex] = makeNodeAtIndex(elementIndex, newElementHash, newElement, shift, owner)
+            return this
+        }
+        val newBuffer = buffer.copyOf()
+        newBuffer[elementIndex] = makeNodeAtIndex(elementIndex, newElementHash, newElement, shift, owner)
+        return TrieNode(bitmap, newBuffer, owner)
+    }
+
+    private fun makeNode(elementHash1: Int, element1: E, elementHash2: Int, element2: E,
+                         shift: Int, owner: MutabilityOwnership?): TrieNode<E> {
+        if (shift > MAX_SHIFT) {
+//            assert(element1 != element2)
+            // when two element hashes are entirely equal: the last level subtrie node stores them just as unordered list
+            return TrieNode<E>(0, arrayOf(element1, element2), owner)
+        }
+
+        val setBit1 = indexSegment(elementHash1, shift)
+        val setBit2 = indexSegment(elementHash2, shift)
+
+        if (setBit1 != setBit2) {
+            val nodeBuffer = if (setBit1 < setBit2) {
+                arrayOf<Any?>(element1, element2)
+            } else {
+                arrayOf<Any?>(element2, element1)
+            }
+            return TrieNode((1 shl setBit1) or (1 shl setBit2), nodeBuffer, owner)
+        }
+        // hash segments at the given shift are equal: move these elements into the subtrie
+        val node = makeNode(elementHash1, element1, elementHash2, element2, shift + LOG_MAX_BRANCHING_FACTOR, owner)
+        return TrieNode<E>(1 shl setBit1, arrayOf(node), owner)
+    }
+
+
+    private fun removeCellAtIndex(cellIndex: Int, positionMask: Int): TrieNode<E> {
+//        assert(!hasNoCellAt(positionMask))
+//        assert(buffer.size > 1) can be false only for the root node
+
+        val newBuffer = buffer.removeCellAtIndex(cellIndex)
+        return TrieNode(bitmap xor positionMask, newBuffer)
+    }
+
+    private fun mutableRemoveCellAtIndex(cellIndex: Int, positionMask: Int, owner: MutabilityOwnership): TrieNode<E> {
+//        assert(!hasNoCellAt(positionMask))
+//        assert(buffer.size > 1)
+
+        if (ownedBy === owner) {
+            buffer = buffer.removeCellAtIndex(cellIndex)
+            bitmap = bitmap xor positionMask
+            return this
+        }
+        val newBuffer = buffer.removeCellAtIndex(cellIndex)
+        return TrieNode(bitmap xor positionMask, newBuffer, owner)
+    }
+
+    private fun collisionRemoveElementAtIndex(i: Int): TrieNode<E> {
+        val newBuffer = buffer.removeCellAtIndex(i)
+        return TrieNode(0, newBuffer)
+    }
+
+    private fun mutableCollisionRemoveElementAtIndex(i: Int, owner: MutabilityOwnership): TrieNode<E> {
+        if (ownedBy === owner) {
+            buffer = buffer.removeCellAtIndex(i)
+            return this
+        }
+        val newBuffer = buffer.removeCellAtIndex(i)
+        return TrieNode(0, newBuffer, owner)
+    }
+
+    private fun collisionContainsElement(element: E): Boolean {
+        return buffer.contains(element)
+    }
+
+    private fun collisionAdd(element: E): TrieNode<E> {
+        if (collisionContainsElement(element)) return this
+        val newBuffer = buffer.addElementAtIndex(0, element)
+        return TrieNode(0, newBuffer)
+    }
+
+    private fun mutableCollisionAdd(element: E, mutator: PersistentHashSetBuilder<*>): TrieNode<E> {
+        if (collisionContainsElement(element)) return this
+        mutator.size++
+        if (ownedBy === mutator.ownership) {
+            buffer = buffer.addElementAtIndex(0, element)
+            return this
+        }
+        val newBuffer = buffer.addElementAtIndex(0, element)
+        return TrieNode(0, newBuffer, mutator.ownership)
+    }
+
+    private fun collisionRemove(element: E): TrieNode<E> {
+        val index = buffer.indexOf(element)
+        if (index != -1) {
+            return collisionRemoveElementAtIndex(index)
+        }
+        return this
+    }
+
+    private fun mutableCollisionRemove(element: E, mutator: PersistentHashSetBuilder<*>): TrieNode<E> {
+        val index = buffer.indexOf(element)
+        if (index != -1) {
+            mutator.size--
+            return mutableCollisionRemoveElementAtIndex(index, mutator.ownership)
+        }
+        return this
+    }
+
+    private fun mutableCollisionAddAll(otherNode: TrieNode<E>,
+                                       intersectionSizeRef: DeltaCounter,
+                                       owner: MutabilityOwnership): TrieNode<E> {
+        if (this === otherNode) {
+            intersectionSizeRef += buffer.size
+            return this
+        }
+        val tempBuffer = this.buffer.copyOf(newSize = this.buffer.size + otherNode.buffer.size)
+        val totalWritten = otherNode.buffer.filterTo(tempBuffer, newArrayOffset = this.buffer.size) {
+            @Suppress("UNCHECKED_CAST")
+            !this.collisionContainsElement(it as E)
+        }
+        val totalSize = totalWritten + this.buffer.size
+        intersectionSizeRef += (tempBuffer.size - totalSize)
+        if (totalSize == this.buffer.size) return this
+        if (totalSize == otherNode.buffer.size) return otherNode
+
+        val newBuffer = if (totalSize == tempBuffer.size) tempBuffer else tempBuffer.copyOf(newSize = totalSize)
+        return if (ownedBy == owner) {
+            this.buffer = newBuffer
+            this
+        } else {
+            TrieNode(0, newBuffer, owner)
+        }
+    }
+
+    private fun mutableCollisionRetainAll(otherNode: TrieNode<E>, intersectionSizeRef: DeltaCounter,
+                                          owner: MutabilityOwnership): Any? {
+        if (this === otherNode) {
+            intersectionSizeRef += buffer.size
+            return this
+        }
+        val tempBuffer =
+                if (owner == ownedBy) buffer
+                else arrayOfNulls<Any?>(minOf(buffer.size, otherNode.buffer.size))
+        val totalWritten = buffer.filterTo(tempBuffer) {
+            @Suppress("UNCHECKED_CAST")
+            otherNode.collisionContainsElement(it as E)
+        }
+        intersectionSizeRef += totalWritten
+        return when (totalWritten) {
+            0 -> EMPTY
+            1 -> tempBuffer[0]
+            this.buffer.size -> this
+            otherNode.buffer.size -> otherNode
+            tempBuffer.size -> TrieNode<E>(0, tempBuffer, owner)
+            else -> TrieNode<E>(0, tempBuffer.copyOf(newSize = totalWritten), owner)
+        }
+    }
+
+    private fun mutableCollisionRemoveAll(otherNode: TrieNode<E>,
+                                          intersectionSizeRef: DeltaCounter,
+                                          owner: MutabilityOwnership): Any? {
+        if (this === otherNode) {
+            intersectionSizeRef += buffer.size
+            return EMPTY
+        }
+        val tempBuffer = if (owner == ownedBy) buffer else arrayOfNulls<Any?>(buffer.size)
+        val totalWritten = buffer.filterTo(tempBuffer) {
+            @Suppress("UNCHECKED_CAST")
+            !otherNode.collisionContainsElement(it as E)
+        }
+        intersectionSizeRef += (buffer.size - totalWritten)
+        return when (totalWritten) {
+            0 -> EMPTY
+            1 -> tempBuffer[0]
+            this.buffer.size -> this
+            tempBuffer.size -> TrieNode<E>(0, tempBuffer, owner)
+            else -> TrieNode<E>(0, tempBuffer.copyOf(newSize = totalWritten), owner)
+        }
+    }
+
+    private fun calculateSize(): Int {
+        if (bitmap == 0) return buffer.size
+        var result = 0
+        for (e in buffer) {
+            result += when (e) {
+                is TrieNode<*> -> e.calculateSize()
+                else -> 1
+            }
+        }
+        return result
+    }
+
+    private fun elementsIdentityEquals(otherNode: TrieNode<E>): Boolean {
+        if (this === otherNode) return true
+        if (bitmap != otherNode.bitmap) return false
+        for (i in 0 until buffer.size) {
+            if (buffer[i] !== otherNode.buffer[i]) return false
+        }
+        return true
+    }
+
+    fun contains(elementHash: Int, element: E, shift: Int): Boolean {
+        val cellPositionMask = 1 shl indexSegment(elementHash, shift)
+
+        if (hasNoCellAt(cellPositionMask)) { // element is absent
+            return false
+        }
+
+        val cellIndex = indexOfCellAt(cellPositionMask)
+        if (buffer[cellIndex] is TrieNode<*>) { // element may be in node
+            val targetNode = nodeAtIndex(cellIndex)
+            if (shift == MAX_SHIFT) {
+                return targetNode.collisionContainsElement(element)
+            }
+            return targetNode.contains(elementHash, element, shift + LOG_MAX_BRANCHING_FACTOR)
+        }
+        // element is directly in buffer
+        return element == buffer[cellIndex]
+    }
+
+    fun mutableAddAll(otherNode: TrieNode<E>,
+                      shift: Int,
+                      intersectionSizeRef: DeltaCounter,
+                      mutator: PersistentHashSetBuilder<*>): TrieNode<E> {
+        if (this === otherNode) {
+            intersectionSizeRef.count += this.calculateSize()
+            return this
+        }
+        if (shift > MAX_SHIFT) {
+            return mutableCollisionAddAll(otherNode, intersectionSizeRef, mutator.ownership)
+        }
+        // union mask contains all the bits from input masks
+        val newBitMap = bitmap or otherNode.bitmap
+        // first allocate the node and then fill it in
+        // we are doing a union, so all the array elements are guaranteed to exist
+        val mutableNode = when {
+            newBitMap == bitmap && ownedBy == mutator.ownership -> this
+            else -> TrieNode<E>(newBitMap, arrayOfNulls<Any?>(newBitMap.countOneBits()), mutator.ownership)
+        }
+        // for each bit set in the resulting mask,
+        // either left, right or both masks contain the same bit
+        // Note: we shouldn't overrun MAX_SHIFT because both sides are correct TrieNodes, right?
+        newBitMap.forEachOneBit { positionMask, newNodeIndex ->
+            val thisIndex = indexOfCellAt(positionMask)
+            val otherNodeIndex = otherNode.indexOfCellAt(positionMask)
+            mutableNode.buffer[newNodeIndex] = when {
+                // no element on left -> pick right
+                hasNoCellAt(positionMask) -> otherNode.buffer[otherNodeIndex]
+                // no element on right -> pick left
+                otherNode.hasNoCellAt(positionMask) -> buffer[thisIndex]
+                // both nodes contain something at the masked bit
+                else -> {
+                    val thisCell = buffer[thisIndex]
+                    val otherNodeCell = otherNode.buffer[otherNodeIndex]
+                    val thisIsNode = thisCell is TrieNode<*>
+                    val otherIsNode = otherNodeCell is TrieNode<*>
+                    when {
+                        // both are nodes -> merge them recursively
+                        thisIsNode && otherIsNode -> @Suppress("UNCHECKED_CAST") {
+                            thisCell as TrieNode<E>
+                            otherNodeCell as TrieNode<E>
+                            thisCell.mutableAddAll(
+                                    otherNodeCell,
+                                    shift + LOG_MAX_BRANCHING_FACTOR,
+                                    intersectionSizeRef,
+                                    mutator
+                            )
+                        }
+                        // one of them is a node -> add the other one to it
+                        thisIsNode -> @Suppress("UNCHECKED_CAST") {
+                            thisCell as TrieNode<E>
+                            otherNodeCell as E
+                            val oldSize = mutator.size
+                            thisCell.mutableAdd(
+                                    otherNodeCell.hashCode(),
+                                    otherNodeCell,
+                                    shift + LOG_MAX_BRANCHING_FACTOR,
+                                    mutator
+                            ).also {
+                                if (mutator.size == oldSize) intersectionSizeRef.count++
+                            }
+                        }
+                        // same as last case, but reversed
+                        otherIsNode -> @Suppress("UNCHECKED_CAST") {
+                            otherNodeCell as TrieNode<E>
+                            thisCell as E
+                            val oldSize = mutator.size
+                            otherNodeCell.mutableAdd(
+                                    thisCell.hashCode(),
+                                    thisCell,
+                                    shift + LOG_MAX_BRANCHING_FACTOR,
+                                    mutator
+                            ).also {
+                                if (mutator.size == oldSize) intersectionSizeRef.count++
+                            }
+                        }
+                        // both are just E => compare them
+                        thisCell == otherNodeCell -> thisCell.also { intersectionSizeRef.count++ }
+                        // both are just E, but different => make a collision-ish node
+                        else -> @Suppress("UNCHECKED_CAST") {
+                            thisCell as E
+                            otherNodeCell as E
+                            makeNode(
+                                    thisCell.hashCode(),
+                                    thisCell,
+                                    otherNodeCell.hashCode(),
+                                    otherNodeCell,
+                                    shift + LOG_MAX_BRANCHING_FACTOR,
+                                    mutator.ownership
+                            )
+                        }
+                    }
+                }
+            }
+        }
+        return when {
+            this.elementsIdentityEquals(mutableNode) -> this
+            otherNode.elementsIdentityEquals(mutableNode) -> otherNode
+            else -> mutableNode
+        }
+    }
+
+    fun mutableRetainAll(otherNode: TrieNode<E>,
+                         shift: Int,
+                         intersectionSizeRef: DeltaCounter,
+                         mutator: PersistentHashSetBuilder<*>): Any? {
+        if (this === otherNode) {
+            intersectionSizeRef += calculateSize();
+            return this
+        }
+        if (shift > MAX_SHIFT) {
+            return mutableCollisionRetainAll(otherNode, intersectionSizeRef, mutator.ownership)
+        }
+        // intersection mask contains bits that are set in both inputs
+        // this mask is not final 'cos some children may have no intersection
+        val newBitMap = bitmap and otherNode.bitmap
+        // zero means no nodes intersect
+        if (newBitMap == 0) return EMPTY
+        val mutableNode =
+                if (ownedBy == mutator.ownership && newBitMap == bitmap) this
+                else TrieNode<E>(newBitMap, arrayOfNulls<Any?>(newBitMap.countOneBits()), mutator.ownership)
+        // we need to keep track of the real mask 'cos some of the children may intersect to nothing
+        var realBitMap = 0
+        // for each bit in intersection mask, try to intersect children
+        newBitMap.forEachOneBit { positionMask, newNodeIndex ->
+            val thisIndex = indexOfCellAt(positionMask)
+            val otherNodeIndex = otherNode.indexOfCellAt(positionMask)
+            val newValue = run {
+                val thisCell = buffer[thisIndex]
+                val otherNodeCell = otherNode.buffer[otherNodeIndex]
+                val thisIsNode = thisCell is TrieNode<*>
+                val otherIsNode = otherNodeCell is TrieNode<*>
+                when {
+                    // both are nodes -> merge them recursively
+                    thisIsNode && otherIsNode -> @Suppress("UNCHECKED_CAST") {
+                        thisCell as TrieNode<E>
+                        otherNodeCell as TrieNode<E>
+                        thisCell.mutableRetainAll(
+                                otherNodeCell,
+                                shift + LOG_MAX_BRANCHING_FACTOR,
+                                intersectionSizeRef,
+                                mutator
+                        )
+                    }
+                    // one of them is a node -> check containment
+                    thisIsNode -> @Suppress("UNCHECKED_CAST") {
+                        thisCell as TrieNode<E>
+                        otherNodeCell as E
+                        if (thisCell.contains(otherNodeCell.hashCode(), otherNodeCell, shift + LOG_MAX_BRANCHING_FACTOR)) {
+                            intersectionSizeRef += 1
+                            otherNodeCell
+                        } else EMPTY
+                    }
+                    // same as last case, but reversed
+                    otherIsNode -> @Suppress("UNCHECKED_CAST") {
+                        otherNodeCell as TrieNode<E>
+                        thisCell as E
+                        if (otherNodeCell.contains(thisCell.hashCode(), thisCell, shift + LOG_MAX_BRANCHING_FACTOR)) {
+                            intersectionSizeRef += 1
+                            thisCell
+                        } else EMPTY
+                    }
+                    // both are just E => compare them
+                    thisCell == otherNodeCell -> thisCell.also { intersectionSizeRef += 1 }
+                    // both are just E, but different => return nothing
+                    else -> EMPTY
+                }
+            }
+            if (newValue !== EMPTY) {
+                // elements that are not in realBitMap will be removed later
+                realBitMap = realBitMap or positionMask
+            }
+            mutableNode.buffer[newNodeIndex] = newValue
+        }
+        // resulting array's size is the popcount of resulting mask
+        val realSize = realBitMap.countOneBits()
+        return when {
+            realBitMap == 0 -> EMPTY
+            realBitMap == newBitMap -> {
+                when {
+                    mutableNode.elementsIdentityEquals(this) -> this
+                    mutableNode.elementsIdentityEquals(otherNode) -> otherNode
+                    else -> mutableNode
+                }
+            }
+            // single values are kept only on root level
+            realSize == 1 && shift != 0 -> when (val single = mutableNode.buffer[mutableNode.indexOfCellAt(realBitMap)]) {
+                is TrieNode<*> -> TrieNode<E>(realBitMap, arrayOf(single), mutator.ownership)
+                else -> single
+            }
+            else -> {
+                // clean up all the EMPTYs in the resulting buffer
+                val realBuffer = arrayOfNulls<Any>(realSize)
+                mutableNode.buffer.filterTo(realBuffer)
+                TrieNode<E>(realBitMap, realBuffer, mutator.ownership)
+            }
+        }
+    }
+
+    fun mutableRemoveAll(otherNode: TrieNode<E>, shift: Int,
+                         intersectionSizeRef: DeltaCounter,
+                         mutator: PersistentHashSetBuilder<*>): Any? {
+        if (this === otherNode) {
+            intersectionSizeRef += calculateSize();
+            return EMPTY
+        }
+        if (shift > MAX_SHIFT) {
+            return mutableCollisionRemoveAll(otherNode, intersectionSizeRef, mutator.ownership)
+        }
+        // same as with intersection, only children of both nodes are considered
+        // this mask is not final 'cos some children may have no intersection
+        val removalBitmap = bitmap and otherNode.bitmap
+        // zero means no intersection => nothing to remove
+        if (removalBitmap == 0) return this
+        // node here is either us (if we are mutable) or a mutable copy
+        val mutableNode =
+                if (ownedBy == mutator.ownership) this
+                else TrieNode<E>(bitmap, buffer.copyOf(), mutator.ownership)
+        // keep track of the real mask
+        var realBitMap = bitmap
+        removalBitmap.forEachOneBit { positionMask, _ ->
+            val thisIndex = indexOfCellAt(positionMask)
+            val otherNodeIndex = otherNode.indexOfCellAt(positionMask)
+            val newValue = run {
+                val thisCell = buffer[thisIndex]
+                val otherNodeCell = otherNode.buffer[otherNodeIndex]
+                val thisIsNode = thisCell is TrieNode<*>
+                val otherIsNode = otherNodeCell is TrieNode<*>
+                when {
+                    // both are nodes -> merge them recursively
+                    thisIsNode && otherIsNode -> @Suppress("UNCHECKED_CAST") {
+                        thisCell as TrieNode<E>
+                        otherNodeCell as TrieNode<E>
+                        thisCell.mutableRemoveAll(
+                                otherNodeCell,
+                                shift + LOG_MAX_BRANCHING_FACTOR,
+                                intersectionSizeRef,
+                                mutator
+                        )
+                    }
+                    // one of them is a node -> remove single element
+                    thisIsNode -> @Suppress("UNCHECKED_CAST") {
+                        thisCell as TrieNode<E>
+                        otherNodeCell as E
+                        val oldSize = mutator.size
+                        val removed = thisCell.mutableRemove(
+                                otherNodeCell.hashCode(),
+                                otherNodeCell,
+                                shift + LOG_MAX_BRANCHING_FACTOR,
+                                mutator)
+                        // additional check needed for removal
+                        if (oldSize != mutator.size) {
+                            intersectionSizeRef += 1
+                            if (removed.buffer.size == 1 && removed.buffer[0] !is TrieNode<*>) removed.buffer[0]
+                            else removed
+                        } else thisCell
+                    }
+                    // same as last case, but reversed
+                    otherIsNode -> @Suppress("UNCHECKED_CAST") {
+                        otherNodeCell as TrieNode<E>
+                        thisCell as E
+                        // "removing" a node from a value is basically checking if the value is contained in the node
+                        if (otherNodeCell.contains(thisCell.hashCode(), thisCell, shift + LOG_MAX_BRANCHING_FACTOR)) {
+                            intersectionSizeRef += 1
+                            EMPTY
+                        } else thisCell
+                    }
+                    // both are just E => compare them
+                    thisCell == otherNodeCell -> {
+                        intersectionSizeRef += 1
+                        EMPTY
+                    }
+                    // both are just E, but different => nothing to remove, return left
+                    else -> thisCell
+                }
+            }
+            if (newValue === EMPTY) {
+                // if we removed something, keep track
+                realBitMap = realBitMap xor positionMask
+            }
+            mutableNode.buffer[thisIndex] = newValue
+        }
+        // resulting size is popcount of the resulting mask
+        val realSize = realBitMap.countOneBits()
+        return when {
+            realBitMap == 0 -> EMPTY
+            realBitMap == bitmap -> {
+                when {
+                    mutableNode.elementsIdentityEquals(this) -> this
+                    else -> mutableNode
+                }
+            }
+            // single values are kept only on root level
+            realSize == 1 && shift != 0 -> when (val single = mutableNode.buffer[mutableNode.indexOfCellAt(realBitMap)]) {
+                is TrieNode<*> -> TrieNode<E>(realBitMap, arrayOf(single), mutator.ownership)
+                else -> single
+            }
+            else -> {
+                // clean up all the EMPTYs in the resulting buffer
+                val realBuffer = arrayOfNulls<Any>(realSize)
+                mutableNode.buffer.filterTo(realBuffer)
+                TrieNode<E>(realBitMap, realBuffer, mutator.ownership)
+            }
+        }
+    }
+
+    fun containsAll(otherNode: TrieNode<E>, shift: Int): Boolean {
+        if (this === otherNode) return true
+        // essentially `buffer.containsAll(otherNode.buffer)`
+        if (shift > MAX_SHIFT) return otherNode.buffer.all { it in buffer }
+
+        // potential bitmap is an intersection of input bitmaps
+        val potentialBitMap = bitmap and otherNode.bitmap
+        // left bitmap must contain right bitmap => right bitmap must be equal to intersection
+        if (potentialBitMap != otherNode.bitmap) return false
+        // check each child, shortcut to false if any one isn't contained
+        potentialBitMap.forEachOneBit { positionMask, _ ->
+            val thisIndex = indexOfCellAt(positionMask)
+            val otherNodeIndex = otherNode.indexOfCellAt(positionMask)
+            val thisCell = buffer[thisIndex]
+            val otherNodeCell = otherNode.buffer[otherNodeIndex]
+            val thisIsNode = thisCell is TrieNode<*>
+            val otherIsNode = otherNodeCell is TrieNode<*>
+            when {
+                // both are nodes => check recursively
+                thisIsNode && otherIsNode -> @Suppress("UNCHECKED_CAST") {
+                    thisCell as TrieNode<E>
+                    otherNodeCell as TrieNode<E>
+                    thisCell.containsAll(otherNodeCell, shift + LOG_MAX_BRANCHING_FACTOR) || return false
+                }
+                // left is node, right is just E => check containment
+                thisIsNode -> @Suppress("UNCHECKED_CAST") {
+                    thisCell as TrieNode<E>
+                    otherNodeCell as E
+                    thisCell.contains(otherNodeCell.hashCode(), otherNodeCell, shift + LOG_MAX_BRANCHING_FACTOR) || return false
+                }
+                // left is just E, right is node => not possible
+                otherIsNode -> return false
+                // both are just E => containment is just equality
+                else -> thisCell == otherNodeCell || return false
+            }
+        }
+        return true
+    }
+
+
+    fun add(elementHash: Int, element: E, shift: Int): TrieNode<E> {
+        val cellPositionMask = 1 shl indexSegment(elementHash, shift)
+
+        if (hasNoCellAt(cellPositionMask)) { // element is absent
+            return addElementAt(cellPositionMask, element)
+        }
+
+        val cellIndex = indexOfCellAt(cellPositionMask)
+        if (buffer[cellIndex] is TrieNode<*>) { // element may be in node
+            val targetNode = nodeAtIndex(cellIndex)
+            val newNode = if (shift == MAX_SHIFT) {
+                targetNode.collisionAdd(element)
+            } else {
+                targetNode.add(elementHash, element, shift + LOG_MAX_BRANCHING_FACTOR)
+            }
+            if (targetNode === newNode) return this
+            return updateNodeAtIndex(cellIndex, newNode)
+        }
+        // element is directly in buffer
+        if (element == buffer[cellIndex]) return this
+        return moveElementToNode(cellIndex, elementHash, element, shift)
+    }
+
+    fun mutableAdd(elementHash: Int, element: E, shift: Int, mutator: PersistentHashSetBuilder<*>): TrieNode<E> {
+        val cellPosition = 1 shl indexSegment(elementHash, shift)
+
+        if (hasNoCellAt(cellPosition)) { // element is absent
+            mutator.size++
+            return mutableAddElementAt(cellPosition, element, mutator.ownership)
+        }
+
+        val cellIndex = indexOfCellAt(cellPosition)
+        if (buffer[cellIndex] is TrieNode<*>) { // element may be in node
+            val targetNode = nodeAtIndex(cellIndex)
+            val newNode = if (shift == MAX_SHIFT) {
+                targetNode.mutableCollisionAdd(element, mutator)
+            } else {
+                targetNode.mutableAdd(elementHash, element, shift + LOG_MAX_BRANCHING_FACTOR, mutator)
+            }
+            if (targetNode === newNode) return this
+            return mutableUpdateNodeAtIndex(cellIndex, newNode, mutator.ownership)
+        }
+        // element is directly in buffer
+        if (element == buffer[cellIndex]) return this
+        mutator.size++
+        return mutableMoveElementToNode(cellIndex, elementHash, element, shift, mutator.ownership)
+    }
+
+    fun remove(elementHash: Int, element: E, shift: Int): TrieNode<E> {
+        val cellPositionMask = 1 shl indexSegment(elementHash, shift)
+
+        if (hasNoCellAt(cellPositionMask)) { // element is absent
+            return this
+        }
+
+        val cellIndex = indexOfCellAt(cellPositionMask)
+        if (buffer[cellIndex] is TrieNode<*>) { // element may be in node
+            val targetNode = nodeAtIndex(cellIndex)
+            val newNode = if (shift == MAX_SHIFT) {
+                targetNode.collisionRemove(element)
+            } else {
+                targetNode.remove(elementHash, element, shift + LOG_MAX_BRANCHING_FACTOR)
+            }
+            if (targetNode === newNode) return this
+            return updateNodeAtIndex(cellIndex, newNode)
+        }
+        // element is directly in buffer
+        if (element == buffer[cellIndex]) {
+            return removeCellAtIndex(cellIndex, cellPositionMask)
+        }
+        return this
+    }
+
+    fun mutableRemove(elementHash: Int, element: E, shift: Int, mutator: PersistentHashSetBuilder<*>): TrieNode<E> {
+        val cellPositionMask = 1 shl indexSegment(elementHash, shift)
+
+        if (hasNoCellAt(cellPositionMask)) { // element is absent
+            return this
+        }
+
+        val cellIndex = indexOfCellAt(cellPositionMask)
+        if (buffer[cellIndex] is TrieNode<*>) { // element may be in node
+            val targetNode = nodeAtIndex(cellIndex)
+            val newNode = if (shift == MAX_SHIFT) {
+                targetNode.mutableCollisionRemove(element, mutator)
+            } else {
+                targetNode.mutableRemove(elementHash, element, shift + LOG_MAX_BRANCHING_FACTOR, mutator)
+            }
+            if (ownedBy === mutator.ownership || targetNode !== newNode) {
+                return mutableUpdateNodeAtIndex(cellIndex, newNode, mutator.ownership)
+            }
+            return this
+        }
+        // element is directly in buffer
+        if (element == buffer[cellIndex]) {
+            mutator.size--
+            return mutableRemoveCellAtIndex(cellIndex, cellPositionMask, mutator.ownership)   // check is empty
+        }
+        return this
+    }
+
+    internal companion object {
+        internal val EMPTY = TrieNode<Nothing>(0, emptyArray())
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMap.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMap.kt
new file mode 100644
index 0000000..d6f2f8a
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMap.kt
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.persistentOrderedMap
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.ImmutableCollection
+import androidx.compose.runtime.external.kotlinx.collections.immutable.ImmutableSet
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentMap
+import androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap.PersistentHashMap
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.EndOfChain
+import androidx.compose.runtime.external.kotlinx.collections.immutable.mutate
+
+internal class LinkedValue<V>(val value: V, val previous: Any?, val next: Any?) {
+    /** Constructs LinkedValue for a new single entry */
+    constructor(value: V) : this(value, EndOfChain, EndOfChain)
+    /** Constructs LinkedValue for a new last entry */
+    constructor(value: V, previous: Any?) : this(value, previous, EndOfChain)
+
+    fun withValue(newValue: V) = LinkedValue(newValue, previous, next)
+    fun withPrevious(newPrevious: Any?) = LinkedValue(value, newPrevious, next)
+    fun withNext(newNext: Any?) = LinkedValue(value, previous, newNext)
+
+    val hasNext get() = next !== EndOfChain
+    val hasPrevious get() = previous !== EndOfChain
+}
+
+internal class PersistentOrderedMap<K, V>(
+        internal val firstKey: Any?,
+        internal val lastKey: Any?,
+        internal val hashMap: PersistentHashMap<K, LinkedValue<V>>
+) : AbstractMap<K, V>(), PersistentMap<K, V> {
+
+    override val size: Int get() = hashMap.size
+
+    override val keys: ImmutableSet<K>
+        get() {
+            return PersistentOrderedMapKeys(this)
+        }
+
+    override val values: ImmutableCollection<V>
+        get() {
+            return PersistentOrderedMapValues(this)
+        }
+
+    override val entries: ImmutableSet<Map.Entry<K, V>>
+        get() {
+            return createEntries()
+        }
+
+    private fun createEntries(): ImmutableSet<Map.Entry<K, V>> {
+        return PersistentOrderedMapEntries(this)
+    }
+
+    // TODO: compiler bug: this bridge should be generated automatically
+    @PublishedApi
+    internal fun getEntries(): Set<Map.Entry<K, V>> {
+        return createEntries()
+    }
+
+    override fun containsKey(key: K): Boolean = hashMap.containsKey(key)
+
+    override fun get(key: K): V? = hashMap[key]?.value
+
+    override fun put(key: K, value: @UnsafeVariance V): PersistentOrderedMap<K, V> {
+        if (isEmpty()) {
+            val newMap = hashMap.put(key, LinkedValue(value))
+            return PersistentOrderedMap(key, key, newMap)
+        }
+
+        val links = hashMap[key]
+        if (links != null) {
+            if (links.value === value) {
+                return this
+            }
+            val newMap = hashMap.put(key, links.withValue(value))
+            return PersistentOrderedMap(firstKey, lastKey, newMap)
+        }
+
+        @Suppress("UNCHECKED_CAST")
+        val lastKey = lastKey as K
+        val lastLinks = hashMap[lastKey]!!
+//        assert(!lastLink.hasNext)
+        val newMap = hashMap
+                .put(lastKey, lastLinks.withNext(key))
+                .put(key, LinkedValue(value, previous = lastKey))
+        return PersistentOrderedMap(firstKey, key, newMap)
+    }
+
+    override fun remove(key: K): PersistentOrderedMap<K, V> {
+        val links = hashMap[key] ?: return this
+
+        var newMap = hashMap.remove(key)
+        if (links.hasPrevious) {
+            val previousLinks = newMap[links.previous]!!
+//            assert(previousLinks.next == key)
+            @Suppress("UNCHECKED_CAST")
+            newMap = newMap.put(links.previous as K, previousLinks.withNext(links.next))
+        }
+        if (links.hasNext) {
+            val nextLinks = newMap[links.next]!!
+//            assert(nextLinks.previous == key)
+            @Suppress("UNCHECKED_CAST")
+            newMap = newMap.put(links.next as K, nextLinks.withPrevious(links.previous))
+        }
+
+        val newFirstKey = if (!links.hasPrevious) links.next else firstKey
+        val newLastKey = if (!links.hasNext) links.previous else lastKey
+        return PersistentOrderedMap(newFirstKey, newLastKey, newMap)
+    }
+
+    override fun remove(key: K, value: @UnsafeVariance V): PersistentOrderedMap<K, V> {
+        val links = hashMap[key] ?: return this
+        return if (links.value == value) this.remove(key) else this
+    }
+
+    override fun putAll(m: Map<out K, @UnsafeVariance V>): PersistentMap<K, V> {
+        return this.mutate { it.putAll(m) }
+    }
+
+    override fun clear(): PersistentMap<K, V> {
+        return emptyOf()
+    }
+
+    override fun builder(): PersistentMap.Builder<K, V> {
+        return PersistentOrderedMapBuilder(this)
+    }
+
+    internal companion object {
+        private val EMPTY = PersistentOrderedMap<Nothing, Nothing>(EndOfChain, EndOfChain, PersistentHashMap.emptyOf())
+        @Suppress("UNCHECKED_CAST")
+        internal fun <K, V> emptyOf(): PersistentOrderedMap<K, V> = EMPTY as PersistentOrderedMap<K, V>
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapBuilder.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapBuilder.kt
new file mode 100644
index 0000000..c0d1f8e
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapBuilder.kt
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.persistentOrderedMap
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentMap
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.EndOfChain
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.assert
+
+internal class PersistentOrderedMapBuilder<K, V>(private var map: PersistentOrderedMap<K, V>) : AbstractMutableMap<K, V>(), PersistentMap.Builder<K, V> {
+    internal var firstKey = map.firstKey
+        private set
+
+    private var lastKey = map.lastKey
+
+    internal val hashMapBuilder = map.hashMap.builder()
+
+    override val size: Int get() = hashMapBuilder.size
+
+    override fun build(): PersistentMap<K, V> {
+        val newHashMap = hashMapBuilder.build()
+        map = if (newHashMap === map.hashMap) {
+            assert(firstKey === map.firstKey)
+            assert(lastKey === map.lastKey)
+            map
+        } else {
+            PersistentOrderedMap(firstKey, lastKey, newHashMap)
+        }
+        return map
+    }
+
+    override val entries: MutableSet<MutableMap.MutableEntry<K, V>>
+        get() {
+            return PersistentOrderedMapBuilderEntries(this)
+        }
+
+    override val keys: MutableSet<K>
+        get() {
+            return PersistentOrderedMapBuilderKeys(this)
+        }
+
+    override val values: MutableCollection<V>
+        get() {
+            return PersistentOrderedMapBuilderValues(this)
+        }
+
+    override fun containsKey(key: K): Boolean = hashMapBuilder.containsKey(key)
+
+    override fun get(key: K): V? = hashMapBuilder[key]?.value
+
+    override fun put(key: K, value: @UnsafeVariance V): V? {
+        val links = hashMapBuilder[key]
+        if (links != null) {
+            if (links.value === value) {
+                return value
+            }
+            hashMapBuilder[key] = links.withValue(value)
+            return links.value
+        }
+
+        if (isEmpty()) {  //  isEmpty
+            firstKey = key
+            lastKey = key
+            hashMapBuilder[key] = LinkedValue(value)
+            return null
+        }
+        @Suppress("UNCHECKED_CAST")
+        val lastKey = lastKey as K
+        val lastLinks = hashMapBuilder[lastKey]!!
+        assert(!lastLinks.hasNext)
+
+        hashMapBuilder[lastKey] = lastLinks.withNext(key)
+        hashMapBuilder[key] = LinkedValue(value, previous = lastKey)
+        this.lastKey = key
+        return null
+    }
+
+    override fun remove(key: K): V? {
+        val links = hashMapBuilder.remove(key) ?: return null
+
+        if (links.hasPrevious) {
+            val previousLinks = hashMapBuilder[links.previous]!!
+//            assert(previousLinks.next == key)
+            @Suppress("UNCHECKED_CAST")
+            hashMapBuilder[links.previous as K] = previousLinks.withNext(links.next)
+        } else {
+            firstKey = links.next
+        }
+        if (links.hasNext) {
+            val nextLinks = hashMapBuilder[links.next]!!
+//            assert(nextLinks.previous == key)
+            @Suppress("UNCHECKED_CAST")
+            hashMapBuilder[links.next as K] = nextLinks.withPrevious(links.previous)
+        } else {
+            lastKey = links.previous
+        }
+
+        return links.value
+    }
+
+    fun remove(key: K, value: V): Boolean {
+        val links = hashMapBuilder[key] ?: return false
+
+        return if (links.value != value) {
+            false
+        } else {
+            remove(key)
+            true
+        }
+    }
+
+    override fun clear() {
+        hashMapBuilder.clear()
+        firstKey = EndOfChain
+        lastKey = EndOfChain
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapBuilderContentIterators.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapBuilderContentIterators.kt
new file mode 100644
index 0000000..e4f2e75
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapBuilderContentIterators.kt
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.persistentOrderedMap
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap.MapEntry
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.EndOfChain
+
+internal open class PersistentOrderedMapBuilderLinksIterator<K, V>(
+        private var nextKey: Any?,
+        internal val builder: PersistentOrderedMapBuilder<K, V>
+) : MutableIterator<LinkedValue<V>> {
+
+    internal var lastIteratedKey: Any? = EndOfChain
+    private var nextWasInvoked = false
+    private var expectedModCount = builder.hashMapBuilder.modCount
+    internal var index = 0
+
+    override fun hasNext(): Boolean {
+        return index < builder.size
+    }
+
+    override fun next(): LinkedValue<V> {
+        checkForComodification()
+        checkHasNext()
+        lastIteratedKey = nextKey
+        nextWasInvoked = true
+        index++
+        @Suppress("UNCHECKED_CAST")
+        val result = builder.hashMapBuilder.getOrElse(nextKey as K) {
+            throw ConcurrentModificationException("Hash code of a key ($nextKey) has changed after it was added to the persistent map.")
+        }
+        nextKey = result.next
+        return result
+    }
+
+    override fun remove() {
+        checkNextWasInvoked()
+        builder.remove(lastIteratedKey)
+        lastIteratedKey = null
+        nextWasInvoked = false
+        expectedModCount = builder.hashMapBuilder.modCount
+        index--
+    }
+
+    private fun checkHasNext() {
+        if (!hasNext())
+            throw NoSuchElementException()
+    }
+
+    private fun checkNextWasInvoked() {
+        if (!nextWasInvoked)
+            throw IllegalStateException()
+    }
+
+    private fun checkForComodification() {
+        if (builder.hashMapBuilder.modCount != expectedModCount)
+            throw ConcurrentModificationException()
+    }
+}
+
+internal class PersistentOrderedMapBuilderEntriesIterator<K, V>(map: PersistentOrderedMapBuilder<K, V>): MutableIterator<MutableMap.MutableEntry<K, V>> {
+    private val internal = PersistentOrderedMapBuilderLinksIterator(map.firstKey, map)
+
+    override fun hasNext(): Boolean {
+        return internal.hasNext()
+    }
+
+    override fun next(): MutableMap.MutableEntry<K, V> {
+        val links = internal.next()
+        @Suppress("UNCHECKED_CAST")
+        return MutableMapEntry(internal.builder.hashMapBuilder, internal.lastIteratedKey as K, links)
+    }
+
+    override fun remove() {
+        internal.remove()
+    }
+}
+
+private class MutableMapEntry<K, V>(private val mutableMap: MutableMap<K, LinkedValue<V>>,
+                                    key: K,
+                                    private var links: LinkedValue<V>) : MapEntry<K, V>(key, links.value), MutableMap.MutableEntry<K, V> {
+    override val value: V
+        get() = links.value
+
+    override fun setValue(newValue: V): V {
+        val result = links.value
+        links = links.withValue(newValue)
+        mutableMap[key] = links
+        return result
+    }
+}
+
+internal class PersistentOrderedMapBuilderKeysIterator<out K, out V>(map: PersistentOrderedMapBuilder<K, V>): MutableIterator<K> {
+    private val internal = PersistentOrderedMapBuilderLinksIterator(map.firstKey, map)
+
+    override fun hasNext(): Boolean {
+        return internal.hasNext()
+    }
+
+    override fun next(): K {
+        internal.next()
+        @Suppress("UNCHECKED_CAST")
+        return internal.lastIteratedKey as K
+    }
+
+    override fun remove() {
+        internal.remove()
+    }
+}
+
+internal class PersistentOrderedMapBuilderValuesIterator<out K, out V>(map: PersistentOrderedMapBuilder<K, V>): MutableIterator<V> {
+    private val internal = PersistentOrderedMapBuilderLinksIterator(map.firstKey, map)
+
+    override fun hasNext(): Boolean {
+        return internal.hasNext()
+    }
+
+    override fun next(): V {
+        return internal.next().value
+    }
+
+    override fun remove() {
+        internal.remove()
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapBuilderContentViews.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapBuilderContentViews.kt
new file mode 100644
index 0000000..7956ed3
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapBuilderContentViews.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.persistentOrderedMap
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap.AbstractMapBuilderEntries
+
+internal class PersistentOrderedMapBuilderEntries<K, V>(private val builder: PersistentOrderedMapBuilder<K, V>)
+    : AbstractMapBuilderEntries<MutableMap.MutableEntry<K, V>, K, V>() {
+    override fun add(element: MutableMap.MutableEntry<K, V>): Boolean {
+        throw UnsupportedOperationException()
+    }
+
+    override fun clear() {
+        builder.clear()
+    }
+
+    override fun iterator(): MutableIterator<MutableMap.MutableEntry<K, V>> {
+        return PersistentOrderedMapBuilderEntriesIterator(builder)
+    }
+
+    override fun removeEntry(element: Map.Entry<K, V>): Boolean {
+        return builder.remove(element.key, element.value)
+    }
+
+    override val size: Int
+        get() = builder.size
+
+    override fun containsEntry(element: Map.Entry<K, V>): Boolean {
+        return builder[element.key]?.let { candidate -> candidate == element.value }
+                ?: (element.value == null && builder.containsKey(element.key))
+    }
+}
+
+internal class PersistentOrderedMapBuilderKeys<K, V>(private val builder: PersistentOrderedMapBuilder<K, V>) : MutableSet<K>, AbstractMutableSet<K>() {
+    override fun add(element: K): Boolean {
+        throw UnsupportedOperationException()
+    }
+
+    override fun clear() {
+        builder.clear()
+    }
+
+    override fun iterator(): MutableIterator<K> {
+        return PersistentOrderedMapBuilderKeysIterator(builder)
+    }
+
+    override fun remove(element: K): Boolean {
+        if (builder.containsKey(element)) {
+            builder.remove(element)
+            return true
+        }
+        return false
+    }
+
+    override val size: Int
+        get() = builder.size
+
+    override fun contains(element: K): Boolean {
+        return builder.containsKey(element)
+    }
+}
+
+internal class PersistentOrderedMapBuilderValues<K, V>(private val builder: PersistentOrderedMapBuilder<K, V>) : MutableCollection<V>, AbstractMutableCollection<V>() {
+    override val size: Int
+        get() = builder.size
+
+    override fun contains(element: V): Boolean {
+        return builder.containsValue(element)
+    }
+
+    override fun add(element: V): Boolean {
+        throw UnsupportedOperationException()
+    }
+
+    override fun clear() {
+        builder.clear()
+    }
+
+    override fun iterator(): MutableIterator<V> {
+        return PersistentOrderedMapBuilderValuesIterator(builder)
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapContentIterators.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapContentIterators.kt
new file mode 100644
index 0000000..fd17d26
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapContentIterators.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.persistentOrderedMap
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap.MapEntry
+
+internal open class PersistentOrderedMapLinksIterator<K, V>(
+        internal var nextKey: Any?,
+        private val hashMap: Map<K, LinkedValue<V>>
+) : Iterator<LinkedValue<V>> {
+    internal var index = 0
+
+    override fun hasNext(): Boolean {
+        return index < hashMap.size
+    }
+
+    override fun next(): LinkedValue<V> {
+        if (!hasNext()) {
+            throw NoSuchElementException()
+        }
+        @Suppress("UNCHECKED_CAST")
+        val result = hashMap.getOrElse(nextKey as K) {
+            throw ConcurrentModificationException("Hash code of a key ($nextKey) has changed after it was added to the persistent map.")
+        }
+        index++
+        nextKey = result.next
+        return result
+    }
+
+}
+
+internal class PersistentOrderedMapEntriesIterator<out K, out V>(map: PersistentOrderedMap<K, V>) : Iterator<Map.Entry<K, V>> {
+    private val internal = PersistentOrderedMapLinksIterator(map.firstKey, map.hashMap)
+
+    override fun hasNext(): Boolean {
+        return internal.hasNext()
+    }
+
+    override fun next(): Map.Entry<K, V> {
+        @Suppress("UNCHECKED_CAST")
+        val nextKey = internal.nextKey as K
+        val nextValue = internal.next().value
+        return MapEntry(nextKey, nextValue)
+    }
+}
+
+internal class PersistentOrderedMapKeysIterator<out K, out V>(map: PersistentOrderedMap<K, V>) : Iterator<K> {
+    private val internal = PersistentOrderedMapLinksIterator(map.firstKey, map.hashMap)
+
+    override fun hasNext(): Boolean {
+        return internal.hasNext()
+    }
+
+    override fun next(): K {
+        @Suppress("UNCHECKED_CAST")
+        val nextKey = internal.nextKey as K
+        internal.next()
+        return nextKey
+    }
+}
+
+internal class PersistentOrderedMapValuesIterator<out K, out V>(map: PersistentOrderedMap<K, V>) : Iterator<V> {
+    private val internal = PersistentOrderedMapLinksIterator(map.firstKey, map.hashMap)
+
+    override fun hasNext(): Boolean {
+        return internal.hasNext()
+    }
+
+    override fun next(): V {
+        return internal.next().value
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapContentViews.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapContentViews.kt
new file mode 100644
index 0000000..f08f5ca
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapContentViews.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.persistentOrderedMap
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.ImmutableCollection
+import androidx.compose.runtime.external.kotlinx.collections.immutable.ImmutableSet
+
+internal class PersistentOrderedMapEntries<K, V>(private val map: PersistentOrderedMap<K, V>) : ImmutableSet<Map.Entry<K, V>>, AbstractSet<Map.Entry<K, V>>() {
+    override val size: Int get() = map.size
+
+    override fun contains(element: Map.Entry<K, V>): Boolean {
+        // TODO: Eliminate this check after KT-30016 gets fixed.
+        @Suppress("USELESS_CAST")
+        if ((element as Any?) !is Map.Entry<*, *>) return false
+        return map[element.key]?.let { candidate -> candidate == element.value }
+                ?: (element.value == null && map.containsKey(element.key))
+    }
+
+    override fun iterator(): Iterator<Map.Entry<K, V>> {
+        return PersistentOrderedMapEntriesIterator(map)
+    }
+}
+
+internal class PersistentOrderedMapKeys<K, V>(private val map: PersistentOrderedMap<K, V>) : ImmutableSet<K>, AbstractSet<K>() {
+    override val size: Int
+        get() = map.size
+
+    override fun contains(element: K): Boolean {
+        return map.containsKey(element)
+    }
+
+    override fun iterator(): Iterator<K> {
+        return PersistentOrderedMapKeysIterator(map)
+    }
+}
+
+internal class PersistentOrderedMapValues<K, V>(private val map: PersistentOrderedMap<K, V>) : ImmutableCollection<V>, AbstractCollection<V>() {
+    override val size: Int
+        get() = map.size
+
+    override fun contains(element: V): Boolean {
+        return map.containsValue(element)
+    }
+
+    override fun iterator(): Iterator<V> {
+        return PersistentOrderedMapValuesIterator(map)
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet.kt
new file mode 100644
index 0000000..8614767
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet.kt
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.persistentOrderedSet
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentSet
+import androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap.PersistentHashMap
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.EndOfChain
+import androidx.compose.runtime.external.kotlinx.collections.immutable.mutate
+
+internal class Links(val previous: Any?, val next: Any?) {
+    /** Constructs Links for a new single element */
+    constructor() : this(EndOfChain, EndOfChain)
+    /** Constructs Links for a new last element */
+    constructor(previous: Any?) : this(previous, EndOfChain)
+
+    fun withNext(newNext: Any?) = Links(previous, newNext)
+    fun withPrevious(newPrevious: Any?) = Links(newPrevious, next)
+
+    val hasNext get() = next !== EndOfChain
+    val hasPrevious get() = previous !== EndOfChain
+}
+
+internal class PersistentOrderedSet<E>(
+        internal val firstElement: Any?,
+        internal val lastElement: Any?,
+        internal val hashMap: PersistentHashMap<E, Links>
+) : AbstractSet<E>(), PersistentSet<E> {
+
+    override val size: Int get() = hashMap.size
+
+    override fun contains(element: E): Boolean = hashMap.containsKey(element)
+
+    override fun add(element: E): PersistentSet<E> {
+        if (hashMap.containsKey(element)) {
+            return this
+        }
+        if (isEmpty()) {
+            val newMap = hashMap.put(element, Links())
+            return PersistentOrderedSet(element, element, newMap)
+        }
+        @Suppress("UNCHECKED_CAST")
+        val lastElement = lastElement as E
+        val lastLinks = hashMap[lastElement]!!
+//        assert(!lastLinks.hasNext)
+
+        val newMap = hashMap
+                .put(lastElement, lastLinks.withNext(element))
+                .put(element, Links(previous = lastElement))
+        return PersistentOrderedSet(firstElement, element, newMap)
+    }
+
+    override fun addAll(elements: Collection<E>): PersistentSet<E> {
+        return this.mutate { it.addAll(elements) }
+    }
+
+    override fun remove(element: E): PersistentSet<E> {
+        val links = hashMap[element] ?: return this
+
+        var newMap = hashMap.remove(element)
+        if (links.hasPrevious) {
+            val previousLinks = newMap[links.previous]!!
+//            assert(previousLinks.next == element)
+            @Suppress("UNCHECKED_CAST")
+            newMap = newMap.put(links.previous as E, previousLinks.withNext(links.next))
+        }
+        if (links.hasNext) {
+            val nextLinks = newMap[links.next]!!
+//            assert(nextLinks.previous == element)
+            @Suppress("UNCHECKED_CAST")
+            newMap = newMap.put(links.next as E, nextLinks.withPrevious(links.previous))
+        }
+        val newFirstElement = if (!links.hasPrevious) links.next else firstElement
+        val newLastElement = if (!links.hasNext) links.previous else lastElement
+        return PersistentOrderedSet(newFirstElement, newLastElement, newMap)
+    }
+
+    override fun removeAll(elements: Collection<E>): PersistentSet<E> {
+        return mutate { it.removeAll(elements) }
+    }
+
+    override fun removeAll(predicate: (E) -> Boolean): PersistentSet<E> {
+        return mutate { it.removeAll(predicate) }
+    }
+
+    override fun retainAll(elements: Collection<E>): PersistentSet<E> {
+        return mutate { it.retainAll(elements) }
+    }
+
+    override fun clear(): PersistentSet<E> {
+        return PersistentOrderedSet.emptyOf()
+    }
+
+    override fun iterator(): Iterator<E> {
+        return PersistentOrderedSetIterator(firstElement, hashMap)
+    }
+
+    override fun builder(): PersistentSet.Builder<E> {
+        return PersistentOrderedSetBuilder(this)
+    }
+
+    internal companion object {
+        private val EMPTY = PersistentOrderedSet<Nothing>(EndOfChain, EndOfChain, PersistentHashMap.emptyOf())
+        internal fun <E> emptyOf(): PersistentSet<E> = EMPTY
+    }
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSetBuilder.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSetBuilder.kt
new file mode 100644
index 0000000..dc566ec
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSetBuilder.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.persistentOrderedSet
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentSet
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.EndOfChain
+import androidx.compose.runtime.external.kotlinx.collections.immutable.internal.assert
+
+internal class PersistentOrderedSetBuilder<E>(private var set: PersistentOrderedSet<E>) : AbstractMutableSet<E>(), PersistentSet.Builder<E> {
+    internal var firstElement = set.firstElement
+    private var lastElement = set.lastElement
+    internal val hashMapBuilder = set.hashMap.builder()
+
+    override val size: Int
+        get() = hashMapBuilder.size
+
+    override fun build(): PersistentSet<E> {
+        val newMap = hashMapBuilder.build()
+        set = if (newMap === set.hashMap) {
+            assert(firstElement === set.firstElement)
+            assert(lastElement === set.lastElement)
+            set
+        } else {
+            PersistentOrderedSet(firstElement, lastElement, newMap)
+        }
+        return set
+    }
+
+    override fun contains(element: E): Boolean {
+        return hashMapBuilder.containsKey(element)
+    }
+
+    override fun add(element: E): Boolean {
+        if (hashMapBuilder.containsKey(element)) {
+            return false
+        }
+        if (isEmpty()) {
+            firstElement = element
+            lastElement = element
+            hashMapBuilder[element] = Links()
+            return true
+        }
+
+        val lastLinks = hashMapBuilder[lastElement]!!
+//        assert(!lastLinks.hasNext)
+        @Suppress("UNCHECKED_CAST")
+        hashMapBuilder[lastElement as E] = lastLinks.withNext(element)
+        hashMapBuilder[element] = Links(previous = lastElement)
+        lastElement = element
+
+        return true
+    }
+
+    override fun remove(element: E): Boolean {
+        val links = hashMapBuilder.remove(element) ?: return false
+
+        if (links.hasPrevious) {
+            val previousLinks = hashMapBuilder[links.previous]!!
+//            assert(previousLinks.next == element)
+            @Suppress("UNCHECKED_CAST")
+            hashMapBuilder[links.previous as E] = previousLinks.withNext(links.next)
+        } else {
+            firstElement = links.next
+        }
+        if (links.hasNext) {
+            val nextLinks = hashMapBuilder[links.next]!!
+//            assert(nextLinks.previous == element)
+            @Suppress("UNCHECKED_CAST")
+            hashMapBuilder[links.next as E] = nextLinks.withPrevious(links.previous)
+        } else {
+            lastElement = links.previous
+        }
+
+        return true
+    }
+
+    override fun clear() {
+        hashMapBuilder.clear()
+        firstElement = EndOfChain
+        lastElement = EndOfChain
+    }
+
+    override fun iterator(): MutableIterator<E> {
+        return PersistentOrderedSetMutableIterator(this)
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSetIterator.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSetIterator.kt
new file mode 100644
index 0000000..7043466
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSetIterator.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.persistentOrderedSet
+
+internal open class PersistentOrderedSetIterator<E>(private var nextElement: Any?,
+                                                    internal val map: Map<E, Links>) : Iterator<E> {
+    internal var index = 0
+
+    override fun hasNext(): Boolean {
+        return index < map.size
+    }
+
+    override fun next(): E {
+        checkHasNext()
+
+        @Suppress("UNCHECKED_CAST")
+        val result = nextElement as E
+        index++
+        nextElement = map.getOrElse(result) {
+            throw ConcurrentModificationException("Hash code of an element ($result) has changed after it was added to the persistent set.")
+        }.next
+        return result
+    }
+
+    private fun checkHasNext() {
+        if (!hasNext())
+            throw NoSuchElementException()
+    }
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSetMutableIterator.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSetMutableIterator.kt
new file mode 100644
index 0000000..2f6f891
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSetMutableIterator.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.persistentOrderedSet
+
+internal class PersistentOrderedSetMutableIterator<E>(private val builder: PersistentOrderedSetBuilder<E>)
+    : PersistentOrderedSetIterator<E>(builder.firstElement, builder.hashMapBuilder), MutableIterator<E> {
+
+    private var lastIteratedElement: E? = null
+    private var nextWasInvoked = false
+    private var expectedModCount = builder.hashMapBuilder.modCount
+
+    override fun next(): E {
+        checkForComodification()
+        val next = super.next()
+        lastIteratedElement = next
+        nextWasInvoked = true
+        return next
+    }
+
+    override fun remove() {
+        checkNextWasInvoked()
+        builder.remove(lastIteratedElement)
+        lastIteratedElement = null
+        nextWasInvoked = false
+        expectedModCount = builder.hashMapBuilder.modCount
+        index--
+    }
+
+    private fun checkNextWasInvoked() {
+        if (!nextWasInvoked)
+            throw IllegalStateException()
+    }
+
+    private fun checkForComodification() {
+        if (builder.hashMapBuilder.modCount != expectedModCount)
+            throw ConcurrentModificationException()
+    }
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain.kt
new file mode 100644
index 0000000..e6ccf98
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain.kt
@@ -0,0 +1,8 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal
+
+internal object EndOfChain
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/ForEachOneBit.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/ForEachOneBit.kt
new file mode 100644
index 0000000..7788c70
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/ForEachOneBit.kt
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2016-2020 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal
+
+// 'iterate' all the bits set to one in a given integer, in the form of one-bit masks
+internal inline fun Int.forEachOneBit(body: (mask: Int, index: Int) -> Unit) {
+    var mask = this
+    var index = 0
+    while (mask != 0) {
+        val bit = mask.takeLowestOneBit()
+        body(bit, index)
+        index++
+        mask = mask xor bit
+    }
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/ListImplementation.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/ListImplementation.kt
new file mode 100644
index 0000000..12c85f8
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/ListImplementation.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal
+
+import kotlin.jvm.JvmStatic
+
+internal object ListImplementation {
+
+    @JvmStatic
+    internal fun checkElementIndex(index: Int, size: Int) {
+        if (index < 0 || index >= size) {
+            throw IndexOutOfBoundsException("index: $index, size: $size")
+        }
+    }
+
+    @JvmStatic
+    internal fun checkPositionIndex(index: Int, size: Int) {
+        if (index < 0 || index > size) {
+            throw IndexOutOfBoundsException("index: $index, size: $size")
+        }
+    }
+
+    @JvmStatic
+    internal fun checkRangeIndexes(fromIndex: Int, toIndex: Int, size: Int) {
+        if (fromIndex < 0 || toIndex > size) {
+            throw IndexOutOfBoundsException("fromIndex: $fromIndex, toIndex: $toIndex, size: $size")
+        }
+        if (fromIndex > toIndex) {
+            throw IllegalArgumentException("fromIndex: $fromIndex > toIndex: $toIndex")
+        }
+    }
+
+    @JvmStatic
+    internal fun orderedHashCode(c: Collection<*>): Int {
+        var hashCode = 1
+        for (e in c) {
+            hashCode = 31 * hashCode + (e?.hashCode() ?: 0)
+        }
+        return hashCode
+    }
+
+    @JvmStatic
+    internal fun orderedEquals(c: Collection<*>, other: Collection<*>): Boolean {
+        if (c.size != other.size) return false
+
+        val otherIterator = other.iterator()
+        for (elem in c) {
+            val elemOther = otherIterator.next()
+            if (elem != elemOther) {
+                return false
+            }
+        }
+        return true
+    }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/MutabilityOwnership.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/MutabilityOwnership.kt
new file mode 100644
index 0000000..a08e673
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/MutabilityOwnership.kt
@@ -0,0 +1,13 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal
+
+/**
+ * The mutability ownership token of a persistent collection builder.
+ *
+ * Used to mark persistent data structures, that are owned by a collection builder and can be mutated by it.
+ */
+internal class MutabilityOwnership
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/MutableCounter.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/MutableCounter.kt
new file mode 100644
index 0000000..28798b2
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/MutableCounter.kt
@@ -0,0 +1,10 @@
+/*
+ * Copyright 2016-2020 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal
+
+internal data class DeltaCounter(var count: Int = 0) {
+    operator fun plusAssign(that: Int) { count += that }
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/commonFunctions.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/commonFunctions.kt
new file mode 100644
index 0000000..fdd80aa
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/external/kotlinx/collections/immutable/internal/commonFunctions.kt
@@ -0,0 +1,11 @@
+/*
+ * Copyright 2016-2019 JetBrains s.r.o.
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
+ */
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal
+
+internal fun assert(@Suppress("UNUSED_PARAMETER") condition: Boolean) {}
+
+@Suppress("NO_ACTUAL_FOR_EXPECT") // implemented by protected property in JVM
+internal expect var AbstractMutableList<*>.modCount: Int
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateList.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateList.kt
index b3b609f..c41ceab 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateList.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateList.kt
@@ -17,8 +17,8 @@
 package androidx.compose.runtime.snapshots
 
 import androidx.compose.runtime.Stable
-import kotlinx.collections.immutable.PersistentList
-import kotlinx.collections.immutable.persistentListOf
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentList
+import androidx.compose.runtime.external.kotlinx.collections.immutable.persistentListOf
 
 /**
  * An implementation of [MutableList] that can be observed and snapshot. This is the result type
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMap.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMap.kt
index d8daf9c..38ac73f 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMap.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateMap.kt
@@ -17,8 +17,8 @@
 package androidx.compose.runtime.snapshots
 
 import androidx.compose.runtime.Stable
-import kotlinx.collections.immutable.PersistentMap
-import kotlinx.collections.immutable.persistentHashMapOf
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentMap
+import androidx.compose.runtime.external.kotlinx.collections.immutable.persistentHashMapOf
 
 /**
  * An implementation of [MutableMap] that can be observed and snapshot. This is the result type
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionTests.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionTests.kt
index 6e460e6..bc34c6e 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionTests.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionTests.kt
@@ -2922,6 +2922,103 @@
         assertFalse(rememberedValue)
         assertEquals(1, count)
     }
+
+    @Test // regression test for b/188015757
+    fun testRestartOfDefaultFunctions() = compositionTest {
+
+        @Composable
+        fun Test() {
+            Defaults()
+            use(stateB)
+        }
+
+        compose {
+            Test()
+        }
+
+        // Force Defaults to skip
+        stateB++
+        advance()
+
+        // Force Defaults to recompose
+        stateA++
+        advance()
+    }
+
+    /**
+     * set should set the value every time, update should only set after initial composition.
+     */
+    @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    fun composeNodeSetVsUpdate() = runBlockingTest {
+        localRecomposerTest { recomposer ->
+            class SetUpdateNode(property: String) {
+                var changeCount = 0
+                var property: String = property
+                    set(value) {
+                        field = value
+                        changeCount++
+                    }
+            }
+            class SetUpdateNodeApplier : AbstractApplier<SetUpdateNode>(SetUpdateNode("root")) {
+                override fun insertTopDown(index: Int, instance: SetUpdateNode) {}
+                override fun insertBottomUp(index: Int, instance: SetUpdateNode) {}
+                override fun remove(index: Int, count: Int) {}
+                override fun move(from: Int, to: Int, count: Int) {}
+                override fun onClear() {}
+            }
+            val composition = Composition(SetUpdateNodeApplier(), recomposer)
+            val nodes = mutableListOf<SetUpdateNode>()
+            fun makeNode(property: String) = SetUpdateNode(property).also { nodes += it }
+
+            var value by mutableStateOf("initial")
+
+            composition.setContent {
+                ComposeNode<SetUpdateNode, SetUpdateNodeApplier>(
+                    factory = { makeNode(value) },
+                    update = {
+                        set(value) { property = value }
+                    }
+                )
+                ComposeNode<SetUpdateNode, SetUpdateNodeApplier>(
+                    factory = { makeNode(value) },
+                    update = {
+                        update(value) { property = value }
+                    }
+                )
+            }
+
+            assertEquals("initial", nodes[0].property, "node 0 initial composition value")
+            assertEquals("initial", nodes[1].property, "node 1 initial composition value")
+            assertEquals(1, nodes[0].changeCount, "node 0 initial composition changeCount")
+            assertEquals(0, nodes[1].changeCount, "node 1 initial composition changeCount")
+
+            value = "changed"
+            Snapshot.sendApplyNotifications()
+            advanceUntilIdle()
+
+            assertEquals("changed", nodes[0].property, "node 0 recomposition value")
+            assertEquals("changed", nodes[1].property, "node 1 recomposition value")
+            assertEquals(2, nodes[0].changeCount, "node 0 recomposition changeCount")
+            assertEquals(1, nodes[1].changeCount, "node 1 recomposition changeCount")
+        }
+    }
+}
+
+var stateA by mutableStateOf(1000)
+var stateB by mutableStateOf(2000)
+
+fun use(@Suppress("UNUSED_PARAMETER") v: Int) {}
+
+fun calculateSomething() = 4
+
+@Composable // used in testRestartOfDefaultFunctions
+fun Defaults(a: Int = 1, b: Int = 2, c: Int = 3, d: Int = calculateSomething()) {
+    assertEquals(1, a)
+    assertEquals(2, b)
+    assertEquals(3, c)
+    assertEquals(4, d)
+    use(stateA)
 }
 
 @OptIn(InternalComposeApi::class)
diff --git a/compose/test-utils/lint-baseline.xml b/compose/test-utils/lint-baseline.xml
index 6773bc2..42a176b 100644
--- a/compose/test-utils/lint-baseline.xml
+++ b/compose/test-utils/lint-baseline.xml
@@ -1,74 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt`. Referenced from `com.sun.jna.Native.AWT`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna/5.5.0/jna-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.datatransfer`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.dnd`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.event`. Referenced from `com.sun.jna.platform.WindowUtils.NativeWindowUtils.1`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.geom`. Referenced from `com.sun.jna.platform.WindowUtils.NativeWindowUtils`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.image`. Referenced from `com.sun.jna.platform.RasterRangesUtils`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `javax.swing.text`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `javax.swing`. Referenced from `com.sun.jna.platform.WindowUtils.MacWindowUtils`.">
-        <location
-            file="../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.lang.instrument`. Referenced from `kotlinx.coroutines.repackaged.net.bytebuddy.agent.ByteBuddyAgent`.">
-        <location
-            file="../../../../prebuilts/androidx/external/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.4.3/kotlinx-coroutines-debug-1.4.3.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.lang.management`. Referenced from `kotlinx.coroutines.repackaged.net.bytebuddy.agent.ByteBuddyAgent.ProcessProvider.ForCurrentVm.ForLegacyVm`.">
-        <location
-            file="../../../../prebuilts/androidx/external/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.4.3/kotlinx-coroutines-debug-1.4.3.jar"/>
-    </issue>
-
 </issues>
diff --git a/compose/ui/ui-graphics/api/1.0.0-beta08.txt b/compose/ui/ui-graphics/api/1.0.0-beta08.txt
index 4ac2634..b417872 100644
--- a/compose/ui/ui-graphics/api/1.0.0-beta08.txt
+++ b/compose/ui/ui-graphics/api/1.0.0-beta08.txt
@@ -2,7 +2,7 @@
 package androidx.compose.ui.graphics {
 
   public final class AndroidBlendMode_androidKt {
-    method public static boolean isSupported(androidx.compose.ui.graphics.BlendMode);
+    method public static boolean isSupported-s9anfk8(int);
   }
 
   public final class AndroidCanvas_androidKt {
@@ -29,44 +29,44 @@
     ctor public AndroidPaint();
     method public android.graphics.Paint asFrameworkPaint();
     method public float getAlpha();
-    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public int getBlendMode-0nO6VwU();
     method public long getColor-0d7_KjU();
     method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
-    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public int getFilterQuality-f-v9h1I();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public android.graphics.Shader? getShader();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public int getStrokeCap-KaPHkGw();
+    method public int getStrokeJoin-LxFBmk8();
     method public float getStrokeMiterLimit();
     method public float getStrokeWidth();
-    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public int getStyle-TiuSbCo();
     method public boolean isAntiAlias();
     method public void setAlpha(float value);
     method public void setAntiAlias(boolean value);
-    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode value);
+    method public void setBlendMode-s9anfk8(int value);
     method public void setColor-8_81llA(long color);
     method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
-    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality value);
+    method public void setFilterQuality-vDHp3xo(int value);
     method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
     method public void setShader(android.graphics.Shader? value);
-    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap value);
-    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin value);
+    method public void setStrokeCap-BeK7IIE(int value);
+    method public void setStrokeJoin-Ww9F2mQ(int value);
     method public void setStrokeMiterLimit(float value);
     method public void setStrokeWidth(float value);
-    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle value);
+    method public void setStyle-k9PVt8s(int value);
     property public float alpha;
-    property public androidx.compose.ui.graphics.BlendMode blendMode;
+    property public int blendMode;
     property public long color;
     property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
-    property public androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public int filterQuality;
     property public boolean isAntiAlias;
     property public androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public android.graphics.Shader? shader;
-    property public androidx.compose.ui.graphics.StrokeCap strokeCap;
-    property public androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public int strokeCap;
+    property public int strokeJoin;
     property public float strokeMiterLimit;
     property public float strokeWidth;
-    property public androidx.compose.ui.graphics.PaintingStyle style;
+    property public int style;
   }
 
   public final class AndroidPaint_androidKt {
@@ -85,22 +85,22 @@
     method public void close();
     method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.compose.ui.geometry.Rect getBounds();
-    method public androidx.compose.ui.graphics.PathFillType getFillType();
+    method public int getFillType-Rg-k1Os();
     method public android.graphics.Path getInternalPath();
     method public boolean isConvex();
     method public boolean isEmpty();
     method public void lineTo(float x, float y);
     method public void moveTo(float x, float y);
-    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, androidx.compose.ui.graphics.PathOperation operation);
+    method public boolean op-xiGExi0(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
     method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
     method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
     method public void relativeLineTo(float dx, float dy);
     method public void relativeMoveTo(float dx, float dy);
     method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
     method public void reset();
-    method public void setFillType(androidx.compose.ui.graphics.PathFillType value);
+    method public void setFillType-oQ8Xj4U(int value);
     method public void translate-k-4lQ0M(long offset);
-    property public androidx.compose.ui.graphics.PathFillType fillType;
+    property public int fillType;
     property public final android.graphics.Path internalPath;
     property public boolean isConvex;
     property public boolean isEmpty;
@@ -132,43 +132,83 @@
   }
 
   public final class AndroidTileMode_androidKt {
-    method public static android.graphics.Shader.TileMode toNativeTileMode(androidx.compose.ui.graphics.TileMode);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode-0vamqd0(int);
   }
 
   public final class AndroidVertexMode_androidKt {
-    method public static android.graphics.Canvas.VertexMode toNativeVertexMode(androidx.compose.ui.graphics.VertexMode);
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode-JOOmi9M(int);
   }
 
-  public enum BlendMode {
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Clear;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Color;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorBurn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorDodge;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Darken;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Difference;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Dst;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstAtop;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstIn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOut;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOver;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Exclusion;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hardlight;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hue;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Lighten;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Luminosity;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Modulate;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Multiply;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Overlay;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Plus;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Saturation;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Screen;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Softlight;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Src;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcAtop;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcIn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOut;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOver;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Xor;
+  @androidx.compose.runtime.Immutable public final inline class BlendMode {
+    ctor public BlendMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.BlendMode.Companion Companion;
+  }
+
+  public static final class BlendMode.Companion {
+    method public int getClear-0nO6VwU();
+    method public int getColor-0nO6VwU();
+    method public int getColorBurn-0nO6VwU();
+    method public int getColorDodge-0nO6VwU();
+    method public int getDarken-0nO6VwU();
+    method public int getDifference-0nO6VwU();
+    method public int getDst-0nO6VwU();
+    method public int getDstAtop-0nO6VwU();
+    method public int getDstIn-0nO6VwU();
+    method public int getDstOut-0nO6VwU();
+    method public int getDstOver-0nO6VwU();
+    method public int getExclusion-0nO6VwU();
+    method public int getHardlight-0nO6VwU();
+    method public int getHue-0nO6VwU();
+    method public int getLighten-0nO6VwU();
+    method public int getLuminosity-0nO6VwU();
+    method public int getModulate-0nO6VwU();
+    method public int getMultiply-0nO6VwU();
+    method public int getOverlay-0nO6VwU();
+    method public int getPlus-0nO6VwU();
+    method public int getSaturation-0nO6VwU();
+    method public int getScreen-0nO6VwU();
+    method public int getSoftlight-0nO6VwU();
+    method public int getSrc-0nO6VwU();
+    method public int getSrcAtop-0nO6VwU();
+    method public int getSrcIn-0nO6VwU();
+    method public int getSrcOut-0nO6VwU();
+    method public int getSrcOver-0nO6VwU();
+    method public int getXor-0nO6VwU();
+    property public final int Clear;
+    property public final int Color;
+    property public final int ColorBurn;
+    property public final int ColorDodge;
+    property public final int Darken;
+    property public final int Difference;
+    property public final int Dst;
+    property public final int DstAtop;
+    property public final int DstIn;
+    property public final int DstOut;
+    property public final int DstOver;
+    property public final int Exclusion;
+    property public final int Hardlight;
+    property public final int Hue;
+    property public final int Lighten;
+    property public final int Luminosity;
+    property public final int Modulate;
+    property public final int Multiply;
+    property public final int Overlay;
+    property public final int Plus;
+    property public final int Saturation;
+    property public final int Screen;
+    property public final int Softlight;
+    property public final int Src;
+    property public final int SrcAtop;
+    property public final int SrcIn;
+    property public final int SrcOut;
+    property public final int SrcOver;
+    property public final int Xor;
   }
 
   @androidx.compose.runtime.Immutable public abstract sealed class Brush {
@@ -177,16 +217,16 @@
   }
 
   public static final class Brush.Companion {
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient-CcUA5qQ(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient-NvQjRjk(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional int tileMode);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-PvDSl28(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-acbAMd8(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient-CcUA5qQ(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient-NvQjRjk(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional int tileMode);
   }
 
   public final class BrushKt {
@@ -194,9 +234,9 @@
   }
 
   public interface Canvas {
-    method public void clipPath(androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public void clipRect(float left, float top, float right, float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipPath-fquoRGU(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public default void clipRect-MsRSx38(androidx.compose.ui.geometry.Rect rect, optional int clipOp);
+    method public void clipRect-wxHPq4g(float left, float top, float right, float bottom, optional int clipOp);
     method public void concat-58bKbWc(float[] matrix);
     method public void disableZ();
     method public default void drawArc(androidx.compose.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
@@ -209,12 +249,12 @@
     method public default void drawOval(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
     method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
-    method public void drawPoints(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
-    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints-iVdqbVo(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints-59E74cI(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
     method public default void drawRect(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
     method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
-    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, androidx.compose.ui.graphics.BlendMode blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices-nA16xIE(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
     method public void enableZ();
     method public void restore();
     method public void rotate(float degrees);
@@ -240,9 +280,22 @@
     method public static inline void withSaveLayer(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint, kotlin.jvm.functions.Function0<kotlin.Unit> block);
   }
 
-  public enum ClipOp {
-    enum_constant public static final androidx.compose.ui.graphics.ClipOp Difference;
-    enum_constant public static final androidx.compose.ui.graphics.ClipOp Intersect;
+  @androidx.compose.runtime.Immutable public final inline class ClipOp {
+    ctor public ClipOp();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ClipOp.Companion Companion;
+  }
+
+  public static final class ClipOp.Companion {
+    method public int getDifference-rtfAjoo();
+    method public int getIntersect-rtfAjoo();
+    property public final int Difference;
+    property public final int Intersect;
   }
 
   @androidx.compose.runtime.Immutable public final inline class Color {
@@ -305,7 +358,7 @@
   public static final class ColorFilter.Companion {
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter colorMatrix-jHG-Opc(float[] colorMatrix);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting-6xK2E-Q(long multiply, long add);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional int blendMode);
   }
 
   public final class ColorKt {
@@ -348,11 +401,26 @@
   public final class DegreesKt {
   }
 
-  public enum FilterQuality {
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality High;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Low;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Medium;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality None;
+  @androidx.compose.runtime.Immutable public final inline class FilterQuality {
+    ctor public FilterQuality();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.FilterQuality.Companion Companion;
+  }
+
+  public static final class FilterQuality.Companion {
+    method public int getHigh-f-v9h1I();
+    method public int getLow-f-v9h1I();
+    method public int getMedium-f-v9h1I();
+    method public int getNone-f-v9h1I();
+    property public final int High;
+    property public final int Low;
+    property public final int Medium;
+    property public final int None;
   }
 
   public final class Float16Kt {
@@ -360,14 +428,14 @@
 
   public interface ImageBitmap {
     method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
-    method public androidx.compose.ui.graphics.ImageBitmapConfig getConfig();
+    method public int getConfig-_sVssgQ();
     method public boolean getHasAlpha();
     method public int getHeight();
     method public int getWidth();
     method public void prepareToDraw();
     method public void readPixels(int[] buffer, optional int startX, optional int startY, optional int width, optional int height, optional int bufferOffset, optional int stride);
     property public abstract androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
-    property public abstract androidx.compose.ui.graphics.ImageBitmapConfig config;
+    property public abstract int config;
     property public abstract boolean hasAlpha;
     property public abstract int height;
     property public abstract int width;
@@ -377,16 +445,32 @@
   public static final class ImageBitmap.Companion {
   }
 
-  public enum ImageBitmapConfig {
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Alpha8;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Argb8888;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig F16;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Gpu;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Rgb565;
+  @androidx.compose.runtime.Immutable public final inline class ImageBitmapConfig {
+    ctor public ImageBitmapConfig();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ImageBitmapConfig.Companion Companion;
+  }
+
+  public static final class ImageBitmapConfig.Companion {
+    method public int getAlpha8-_sVssgQ();
+    method public int getArgb8888-_sVssgQ();
+    method public int getF16-_sVssgQ();
+    method public int getGpu-_sVssgQ();
+    method public int getRgb565-_sVssgQ();
+    property public final int Alpha8;
+    property public final int Argb8888;
+    property public final int F16;
+    property public final int Gpu;
+    property public final int Rgb565;
   }
 
   public final class ImageBitmapKt {
-    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional androidx.compose.ui.graphics.ImageBitmapConfig config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap-E8BOdIU(int width, int height, optional int config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
     method public static androidx.compose.ui.graphics.PixelMap toPixelMap(androidx.compose.ui.graphics.ImageBitmap, optional int startX, optional int startY, optional int width, optional int height, optional int[] buffer, optional int bufferOffset, optional int stride);
   }
 
@@ -469,61 +553,74 @@
 
   public final class OutlineKt {
     method public static void addOutline(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Outline outline);
-    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
     method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
-    method public static void drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public static void drawOutline-Ar0j1Zw(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
   }
 
   public interface Paint {
     method public android.graphics.Paint asFrameworkPaint();
     method public float getAlpha();
-    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public int getBlendMode-0nO6VwU();
     method public long getColor-0d7_KjU();
     method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
-    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public int getFilterQuality-f-v9h1I();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public android.graphics.Shader? getShader();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public int getStrokeCap-KaPHkGw();
+    method public int getStrokeJoin-LxFBmk8();
     method public float getStrokeMiterLimit();
     method public float getStrokeWidth();
-    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public int getStyle-TiuSbCo();
     method public boolean isAntiAlias();
     method public void setAlpha(float p);
     method public void setAntiAlias(boolean p);
-    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode p);
+    method public void setBlendMode-s9anfk8(int p);
     method public void setColor-8_81llA(long p);
     method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? p);
-    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality p);
+    method public void setFilterQuality-vDHp3xo(int p);
     method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? p);
     method public void setShader(android.graphics.Shader? p);
-    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap p);
-    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin p);
+    method public void setStrokeCap-BeK7IIE(int p);
+    method public void setStrokeJoin-Ww9F2mQ(int p);
     method public void setStrokeMiterLimit(float p);
     method public void setStrokeWidth(float p);
-    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle p);
+    method public void setStyle-k9PVt8s(int p);
     property public abstract float alpha;
-    property public abstract androidx.compose.ui.graphics.BlendMode blendMode;
+    property public abstract int blendMode;
     property public abstract long color;
     property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
-    property public abstract androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public abstract int filterQuality;
     property public abstract boolean isAntiAlias;
     property public abstract androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public abstract android.graphics.Shader? shader;
-    property public abstract androidx.compose.ui.graphics.StrokeCap strokeCap;
-    property public abstract androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public abstract int strokeCap;
+    property public abstract int strokeJoin;
     property public abstract float strokeMiterLimit;
     property public abstract float strokeWidth;
-    property public abstract androidx.compose.ui.graphics.PaintingStyle style;
+    property public abstract int style;
   }
 
   public final class PaintKt {
     field public static final float DefaultAlpha = 1.0f;
   }
 
-  public enum PaintingStyle {
-    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Fill;
-    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Stroke;
+  @androidx.compose.runtime.Immutable public final inline class PaintingStyle {
+    ctor public PaintingStyle();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PaintingStyle.Companion Companion;
+  }
+
+  public static final class PaintingStyle.Companion {
+    method public int getFill-TiuSbCo();
+    method public int getStroke-TiuSbCo();
+    property public final int Fill;
+    property public final int Stroke;
   }
 
   public interface Path {
@@ -538,28 +635,28 @@
     method public void close();
     method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.compose.ui.geometry.Rect getBounds();
-    method public androidx.compose.ui.graphics.PathFillType getFillType();
+    method public int getFillType-Rg-k1Os();
     method public boolean isConvex();
     method public boolean isEmpty();
     method public void lineTo(float x, float y);
     method public void moveTo(float x, float y);
-    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, androidx.compose.ui.graphics.PathOperation operation);
+    method public boolean op-xiGExi0(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
     method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
     method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
     method public void relativeLineTo(float dx, float dy);
     method public void relativeMoveTo(float dx, float dy);
     method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
     method public void reset();
-    method public void setFillType(androidx.compose.ui.graphics.PathFillType p);
+    method public void setFillType-oQ8Xj4U(int p);
     method public void translate-k-4lQ0M(long offset);
-    property public abstract androidx.compose.ui.graphics.PathFillType fillType;
+    property public abstract int fillType;
     property public abstract boolean isConvex;
     property public abstract boolean isEmpty;
     field public static final androidx.compose.ui.graphics.Path.Companion Companion;
   }
 
   public static final class Path.Companion {
-    method public androidx.compose.ui.graphics.Path combine(androidx.compose.ui.graphics.PathOperation operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
+    method public androidx.compose.ui.graphics.Path combine-mTgLSnE(int operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
   }
 
   public interface PathEffect {
@@ -570,12 +667,25 @@
     method public androidx.compose.ui.graphics.PathEffect chainPathEffect(androidx.compose.ui.graphics.PathEffect outer, androidx.compose.ui.graphics.PathEffect inner);
     method public androidx.compose.ui.graphics.PathEffect cornerPathEffect(float radius);
     method public androidx.compose.ui.graphics.PathEffect dashPathEffect(float[] intervals, optional float phase);
-    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect(androidx.compose.ui.graphics.Path shape, float advance, float phase, androidx.compose.ui.graphics.StampedPathEffectStyle style);
+    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect-czNbfQQ(androidx.compose.ui.graphics.Path shape, float advance, float phase, int style);
   }
 
-  public enum PathFillType {
-    enum_constant public static final androidx.compose.ui.graphics.PathFillType EvenOdd;
-    enum_constant public static final androidx.compose.ui.graphics.PathFillType NonZero;
+  @androidx.compose.runtime.Immutable public final inline class PathFillType {
+    ctor public PathFillType();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PathFillType.Companion Companion;
+  }
+
+  public static final class PathFillType.Companion {
+    method public int getEvenOdd-Rg-k1Os();
+    method public int getNonZero-Rg-k1Os();
+    property public final int EvenOdd;
+    property public final int NonZero;
   }
 
   public interface PathMeasure {
@@ -585,12 +695,36 @@
     property public abstract float length;
   }
 
-  public enum PathOperation {
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation difference;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation intersect;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation reverseDifference;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation union;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation xor;
+  @androidx.compose.runtime.Immutable public final inline class PathOperation {
+    ctor public PathOperation();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PathOperation.Companion Companion;
+  }
+
+  public static final class PathOperation.Companion {
+    method public int getDifference-b3I0S0c();
+    method public int getIntersect-b3I0S0c();
+    method public int getReverseDifference-b3I0S0c();
+    method public int getUnion-b3I0S0c();
+    method public int getXor-b3I0S0c();
+    property public final int Difference;
+    property public final int Intersect;
+    property public final int ReverseDifference;
+    property public final int Union;
+    property public final int Xor;
+  }
+
+  public final class PathOperationKt {
+    method @Deprecated public static int getDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getIntersect(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getReverseDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getUnion(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getXor(androidx.compose.ui.graphics.PathOperation.Companion);
   }
 
   public final class PixelMap {
@@ -608,10 +742,24 @@
     property public final int width;
   }
 
-  public enum PointMode {
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Lines;
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Points;
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Polygon;
+  @androidx.compose.runtime.Immutable public final inline class PointMode {
+    ctor public PointMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PointMode.Companion Companion;
+  }
+
+  public static final class PointMode.Companion {
+    method public int getLines-r_lszbg();
+    method public int getPoints-r_lszbg();
+    method public int getPolygon-r_lszbg();
+    property public final int Lines;
+    property public final int Points;
+    property public final int Polygon;
   }
 
   @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
@@ -635,9 +783,9 @@
   }
 
   public final class ShaderKt {
-    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional androidx.compose.ui.graphics.TileMode tileModeX, optional androidx.compose.ui.graphics.TileMode tileModeY);
-    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader ImageShader-UWo3-ZU(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
     method public static android.graphics.Shader SweepGradientShader-GpNgDDw(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
   }
 
@@ -671,81 +819,168 @@
     property public final long value;
   }
 
-  public enum StampedPathEffectStyle {
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Morph;
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Rotate;
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Translate;
+  @androidx.compose.runtime.Immutable public final inline class StampedPathEffectStyle {
+    ctor public StampedPathEffectStyle();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StampedPathEffectStyle.Companion Companion;
   }
 
-  public enum StrokeCap {
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Butt;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Round;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Square;
+  public static final class StampedPathEffectStyle.Companion {
+    method public int getMorph-Ypspkwk();
+    method public int getRotate-Ypspkwk();
+    method public int getTranslate-Ypspkwk();
+    property public final int Morph;
+    property public final int Rotate;
+    property public final int Translate;
   }
 
-  public enum StrokeJoin {
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Bevel;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Miter;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Round;
+  @androidx.compose.runtime.Immutable public final inline class StrokeCap {
+    ctor public StrokeCap();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StrokeCap.Companion Companion;
+  }
+
+  public static final class StrokeCap.Companion {
+    method public int getButt-KaPHkGw();
+    method public int getRound-KaPHkGw();
+    method public int getSquare-KaPHkGw();
+    property public final int Butt;
+    property public final int Round;
+    property public final int Square;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StrokeJoin {
+    ctor public StrokeJoin();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StrokeJoin.Companion Companion;
+  }
+
+  public static final class StrokeJoin.Companion {
+    method public int getBevel-LxFBmk8();
+    method public int getMiter-LxFBmk8();
+    method public int getRound-LxFBmk8();
+    property public final int Bevel;
+    property public final int Miter;
+    property public final int Round;
   }
 
   @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
     method public android.graphics.Shader createShader-uvyYCjk(long size);
   }
 
-  public enum TileMode {
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Clamp;
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Mirror;
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Repeated;
+  @androidx.compose.runtime.Immutable public final inline class TileMode {
+    ctor public TileMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.TileMode.Companion Companion;
   }
 
-  public enum VertexMode {
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleFan;
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleStrip;
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode Triangles;
+  public static final class TileMode.Companion {
+    method public int getClamp-3opZhB0();
+    method public int getMirror-3opZhB0();
+    method public int getRepeated-3opZhB0();
+    property public final int Clamp;
+    property public final int Mirror;
+    property public final int Repeated;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class VertexMode {
+    ctor public VertexMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.VertexMode.Companion Companion;
+  }
+
+  public static final class VertexMode.Companion {
+    method public int getTriangleFan-c2xauaI();
+    method public int getTriangleStrip-c2xauaI();
+    method public int getTriangles-c2xauaI();
+    property public final int TriangleFan;
+    property public final int TriangleStrip;
+    property public final int Triangles;
   }
 
   public final class Vertices {
-    ctor public Vertices(androidx.compose.ui.graphics.VertexMode vertexMode, java.util.List<androidx.compose.ui.geometry.Offset> positions, java.util.List<androidx.compose.ui.geometry.Offset> textureCoordinates, java.util.List<androidx.compose.ui.graphics.Color> colors, java.util.List<java.lang.Integer> indices);
     method public int[] getColors();
     method public short[] getIndices();
     method public float[] getPositions();
     method public float[] getTextureCoordinates();
-    method public androidx.compose.ui.graphics.VertexMode getVertexMode();
+    method public int getVertexMode-c2xauaI();
     property public final int[] colors;
     property public final short[] indices;
     property public final float[] positions;
     property public final float[] textureCoordinates;
-    property public final androidx.compose.ui.graphics.VertexMode vertexMode;
+    property public final int vertexMode;
   }
 
 }
 
 package androidx.compose.ui.graphics.colorspace {
 
-  public enum Adaptation {
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  public abstract class Adaptation {
+    field public static final androidx.compose.ui.graphics.colorspace.Adaptation.Companion Companion;
   }
 
-  public enum ColorModel {
-    method public final int getComponentCount();
-    property public final int componentCount;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Cmyk;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Lab;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Rgb;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Xyz;
+  public static final class Adaptation.Companion {
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getBradford();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getCiecat02();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getVonKries();
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ColorModel {
+    ctor public ColorModel();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getComponentCount-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.graphics.colorspace.ColorModel.Companion Companion;
+  }
+
+  public static final class ColorModel.Companion {
+    method public long getCmyk-xdoWZVw();
+    method public long getLab-xdoWZVw();
+    method public long getRgb-xdoWZVw();
+    method public long getXyz-xdoWZVw();
+    property public final long Cmyk;
+    property public final long Lab;
+    property public final long Rgb;
+    property public final long Xyz;
   }
 
   public abstract class ColorSpace {
-    ctor public ColorSpace(String name, androidx.compose.ui.graphics.colorspace.ColorModel model);
     method public final float[] fromXyz(float x, float y, float z);
     method public abstract float[] fromXyz(float[] v);
     method public final int getComponentCount();
     method public abstract float getMaxValue(int component);
     method public abstract float getMinValue(int component);
-    method public final androidx.compose.ui.graphics.colorspace.ColorModel getModel();
+    method public final long getModel-xdoWZVw();
     method public final String getName();
     method public boolean isSrgb();
     method public abstract boolean isWideGamut();
@@ -754,14 +989,14 @@
     property public final int componentCount;
     property public boolean isSrgb;
     property public abstract boolean isWideGamut;
-    property public final androidx.compose.ui.graphics.colorspace.ColorModel model;
+    property public final long model;
     property public final String name;
   }
 
   public final class ColorSpaceKt {
     method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, optional androidx.compose.ui.graphics.colorspace.Adaptation adaptation);
     method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint);
-    method public static androidx.compose.ui.graphics.colorspace.Connector connect(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional androidx.compose.ui.graphics.colorspace.RenderIntent intent);
+    method public static androidx.compose.ui.graphics.colorspace.Connector connect-InwLUsE(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional int intent);
   }
 
   public final class ColorSpaces {
@@ -803,12 +1038,12 @@
 
   public class Connector {
     method public final androidx.compose.ui.graphics.colorspace.ColorSpace getDestination();
-    method public final androidx.compose.ui.graphics.colorspace.RenderIntent getRenderIntent();
+    method public final int getRenderIntent-uksYyKA();
     method public final androidx.compose.ui.graphics.colorspace.ColorSpace getSource();
     method public final float[] transform(float r, float g, float b);
     method public float[] transform(float[] v);
     property public final androidx.compose.ui.graphics.colorspace.ColorSpace destination;
-    property public final androidx.compose.ui.graphics.colorspace.RenderIntent renderIntent;
+    property public final int renderIntent;
     property public final androidx.compose.ui.graphics.colorspace.ColorSpace source;
   }
 
@@ -834,11 +1069,26 @@
     field public static final androidx.compose.ui.graphics.colorspace.Illuminant INSTANCE;
   }
 
-  public enum RenderIntent {
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Absolute;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Perceptual;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Relative;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Saturation;
+  @androidx.compose.runtime.Immutable public final inline class RenderIntent {
+    ctor public RenderIntent();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.colorspace.RenderIntent.Companion Companion;
+  }
+
+  public static final class RenderIntent.Companion {
+    method public int getAbsolute-uksYyKA();
+    method public int getPerceptual-uksYyKA();
+    method public int getRelative-uksYyKA();
+    method public int getSaturation-uksYyKA();
+    property public final int Absolute;
+    property public final int Perceptual;
+    property public final int Relative;
+    property public final int Saturation;
   }
 
   public final class Rgb extends androidx.compose.ui.graphics.colorspace.ColorSpace {
@@ -920,24 +1170,24 @@
   public final class CanvasDrawScope implements androidx.compose.ui.graphics.drawscope.DrawScope {
     ctor public CanvasDrawScope();
     method public inline void draw-jkGVKLE(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
-    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath-_TD-E3k(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
     method public float getDensity();
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public float getFontScale();
@@ -966,24 +1216,24 @@
   }
 
   @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawScope extends androidx.compose.ui.unit.Density {
-    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-NGaRamM(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-fNghmuc(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle-NGaRamM(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath-_TD-E3k(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect-fNghmuc(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public default long getCenter-F1C5BW0();
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
@@ -997,13 +1247,13 @@
   }
 
   public static final class DrawScope.Companion {
-    method public androidx.compose.ui.graphics.BlendMode getDefaultBlendMode();
-    property public final androidx.compose.ui.graphics.BlendMode DefaultBlendMode;
+    method public int getDefaultBlendMode-0nO6VwU();
+    property public final int DefaultBlendMode;
   }
 
   public final class DrawScopeKt {
-    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
-    method public static inline void clipRect(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipPath--PbAnyU(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipRect-2ny_0ws(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
     method public static inline void drawIntoCanvas(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
     method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
     method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float inset, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
@@ -1023,8 +1273,8 @@
   }
 
   @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawTransform {
-    method public void clipPath(androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipPath-fquoRGU(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public void clipRect-wxHPq4g(optional float left, optional float top, optional float right, optional float bottom, optional int clipOp);
     method public default long getCenter-F1C5BW0();
     method public long getSize-NH-jbRc();
     method public void inset(float left, float top, float right, float bottom);
@@ -1048,14 +1298,13 @@
   }
 
   public final class Stroke extends androidx.compose.ui.graphics.drawscope.DrawStyle {
-    ctor public Stroke(optional float width, optional float miter, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.StrokeJoin join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
-    method public androidx.compose.ui.graphics.StrokeCap getCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getJoin();
+    method public int getCap-KaPHkGw();
+    method public int getJoin-LxFBmk8();
     method public float getMiter();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public float getWidth();
-    property public final androidx.compose.ui.graphics.StrokeCap cap;
-    property public final androidx.compose.ui.graphics.StrokeJoin join;
+    property public final int cap;
+    property public final int join;
     property public final float miter;
     property public final androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public final float width;
@@ -1065,10 +1314,10 @@
   }
 
   public static final class Stroke.Companion {
-    method public androidx.compose.ui.graphics.StrokeCap getDefaultCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getDefaultJoin();
-    property public final androidx.compose.ui.graphics.StrokeCap DefaultCap;
-    property public final androidx.compose.ui.graphics.StrokeJoin DefaultJoin;
+    method public int getDefaultCap-KaPHkGw();
+    method public int getDefaultJoin-LxFBmk8();
+    property public final int DefaultCap;
+    property public final int DefaultJoin;
   }
 
 }
diff --git a/compose/ui/ui-graphics/api/api_lint.ignore b/compose/ui/ui-graphics/api/api_lint.ignore
index 1725abd..7a4f6416b 100644
--- a/compose/ui/ui-graphics/api/api_lint.ignore
+++ b/compose/ui/ui-graphics/api/api_lint.ignore
@@ -47,6 +47,10 @@
     androidx.compose.ui.graphics.vector.PathBuilder does not declare a `build()` method, but builder classes are expected to
 
 
+MissingNullability: androidx.compose.ui.graphics.BlendMode#toString-impl(int):
+    Missing nullability on method `toString-impl` return
+MissingNullability: androidx.compose.ui.graphics.ClipOp#toString-impl(int):
+    Missing nullability on method `toString-impl` return
 MissingNullability: androidx.compose.ui.graphics.ColorMatrix#constructor-impl(float[]):
     Missing nullability on method `constructor-impl` return
 MissingNullability: androidx.compose.ui.graphics.ColorMatrix#convertRgbToYuv-impl(float[]) parameter #0:
@@ -63,6 +67,10 @@
     Missing nullability on method `toString-impl` return
 MissingNullability: androidx.compose.ui.graphics.ColorMatrix#toString-impl(float[]) parameter #0:
     Missing nullability on parameter `p` in method `toString-impl`
+MissingNullability: androidx.compose.ui.graphics.FilterQuality#toString-impl(int):
+    Missing nullability on method `toString-impl` return
+MissingNullability: androidx.compose.ui.graphics.ImageBitmapConfig#toString-impl(int):
+    Missing nullability on method `toString-impl` return
 MissingNullability: androidx.compose.ui.graphics.Matrix#constructor-impl(float[]):
     Missing nullability on method `constructor-impl` return
 MissingNullability: androidx.compose.ui.graphics.Matrix#equals-impl(float[], Object) parameter #0:
@@ -75,6 +83,20 @@
     Missing nullability on parameter `$this` in method `reset-impl`
 MissingNullability: androidx.compose.ui.graphics.Matrix#toString-impl(float[]) parameter #0:
     Missing nullability on parameter `$this` in method `toString-impl`
+MissingNullability: androidx.compose.ui.graphics.PaintingStyle#toString-impl(int):
+    Missing nullability on method `toString-impl` return
+MissingNullability: androidx.compose.ui.graphics.PathFillType#toString-impl(int):
+    Missing nullability on method `toString-impl` return
+MissingNullability: androidx.compose.ui.graphics.PathOperation#toString-impl(int):
+    Missing nullability on method `toString-impl` return
+MissingNullability: androidx.compose.ui.graphics.StampedPathEffectStyle#toString-impl(int):
+    Missing nullability on method `toString-impl` return
+MissingNullability: androidx.compose.ui.graphics.StrokeJoin#toString-impl(int):
+    Missing nullability on method `toString-impl` return
+MissingNullability: androidx.compose.ui.graphics.TileMode#toString-impl(int):
+    Missing nullability on method `toString-impl` return
+MissingNullability: androidx.compose.ui.graphics.colorspace.ColorModel#toString-impl(long):
+    Missing nullability on method `toString-impl` return
 
 
 NotCloseable: androidx.compose.ui.graphics.AndroidPath:
diff --git a/compose/ui/ui-graphics/api/current.ignore b/compose/ui/ui-graphics/api/current.ignore
new file mode 100644
index 0000000..2b982ad
--- /dev/null
+++ b/compose/ui/ui-graphics/api/current.ignore
@@ -0,0 +1,529 @@
+// Baseline format: 1.0
+AddedAbstractMethod: androidx.compose.ui.graphics.Canvas#clipPath-fquoRGU(androidx.compose.ui.graphics.Path, int):
+    Added method androidx.compose.ui.graphics.Canvas.clipPath-fquoRGU(androidx.compose.ui.graphics.Path,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Canvas#clipRect-wxHPq4g(float, float, float, float, int):
+    Added method androidx.compose.ui.graphics.Canvas.clipRect-wxHPq4g(float,float,float,float,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Canvas#drawPoints-iVdqbVo(int, java.util.List<androidx.compose.ui.geometry.Offset>, androidx.compose.ui.graphics.Paint):
+    Added method androidx.compose.ui.graphics.Canvas.drawPoints-iVdqbVo(int,java.util.List<androidx.compose.ui.geometry.Offset>,androidx.compose.ui.graphics.Paint)
+AddedAbstractMethod: androidx.compose.ui.graphics.Canvas#drawRawPoints-59E74cI(int, float[], androidx.compose.ui.graphics.Paint):
+    Added method androidx.compose.ui.graphics.Canvas.drawRawPoints-59E74cI(int,float[],androidx.compose.ui.graphics.Paint)
+AddedAbstractMethod: androidx.compose.ui.graphics.Canvas#drawVertices-nA16xIE(androidx.compose.ui.graphics.Vertices, int, androidx.compose.ui.graphics.Paint):
+    Added method androidx.compose.ui.graphics.Canvas.drawVertices-nA16xIE(androidx.compose.ui.graphics.Vertices,int,androidx.compose.ui.graphics.Paint)
+AddedAbstractMethod: androidx.compose.ui.graphics.ImageBitmap#getConfig-_sVssgQ():
+    Added method androidx.compose.ui.graphics.ImageBitmap.getConfig-_sVssgQ()
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#getBlendMode-0nO6VwU():
+    Added method androidx.compose.ui.graphics.Paint.getBlendMode-0nO6VwU()
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#getFilterQuality-f-v9h1I():
+    Added method androidx.compose.ui.graphics.Paint.getFilterQuality-f-v9h1I()
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#getStrokeCap-KaPHkGw():
+    Added method androidx.compose.ui.graphics.Paint.getStrokeCap-KaPHkGw()
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#getStrokeJoin-LxFBmk8():
+    Added method androidx.compose.ui.graphics.Paint.getStrokeJoin-LxFBmk8()
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#getStyle-TiuSbCo():
+    Added method androidx.compose.ui.graphics.Paint.getStyle-TiuSbCo()
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#setBlendMode-s9anfk8(int):
+    Added method androidx.compose.ui.graphics.Paint.setBlendMode-s9anfk8(int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#setFilterQuality-vDHp3xo(int):
+    Added method androidx.compose.ui.graphics.Paint.setFilterQuality-vDHp3xo(int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#setStrokeCap-BeK7IIE(int):
+    Added method androidx.compose.ui.graphics.Paint.setStrokeCap-BeK7IIE(int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#setStrokeJoin-Ww9F2mQ(int):
+    Added method androidx.compose.ui.graphics.Paint.setStrokeJoin-Ww9F2mQ(int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#setStyle-k9PVt8s(int):
+    Added method androidx.compose.ui.graphics.Paint.setStyle-k9PVt8s(int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Path#getFillType-Rg-k1Os():
+    Added method androidx.compose.ui.graphics.Path.getFillType-Rg-k1Os()
+AddedAbstractMethod: androidx.compose.ui.graphics.Path#op-xiGExi0(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Path, int):
+    Added method androidx.compose.ui.graphics.Path.op-xiGExi0(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.Path,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Path#setFillType-oQ8Xj4U(int):
+    Added method androidx.compose.ui.graphics.Path.setFillType-oQ8Xj4U(int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawArc-BcZ8TnY(long, float, float, boolean, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawArc-BcZ8TnY(long,float,float,boolean,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush, float, float, boolean, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush,float,float,boolean,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawCircle-NGaRamM(long, float, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawCircle-NGaRamM(long,float,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush, float, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush,float,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap, long, long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap,long,long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawLine-QXZmVdc(long, long, long, float, int, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawLine-QXZmVdc(long,long,long,float,int,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush, long, long, float, int, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush,long,long,float,int,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawOval-IdEHoqk(long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawOval-IdEHoqk(long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPath-_TD-E3k(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawPath-_TD-E3k(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPath-tilSWAQ(androidx.compose.ui.graphics.Path, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawPath-tilSWAQ(androidx.compose.ui.graphics.Path,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset>, int, long, float, int, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset>,int,long,float,int,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset>, int, androidx.compose.ui.graphics.Brush, float, int, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset>,int,androidx.compose.ui.graphics.Brush,float,int,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRect-IdEHoqk(long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawRect-IdEHoqk(long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRoundRect-fNghmuc(long, long, long, long, androidx.compose.ui.graphics.drawscope.DrawStyle, float, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawRoundRect-fNghmuc(long,long,long,long,androidx.compose.ui.graphics.drawscope.DrawStyle,float,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush, long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush,long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawTransform#clipPath-fquoRGU(androidx.compose.ui.graphics.Path, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawTransform.clipPath-fquoRGU(androidx.compose.ui.graphics.Path,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawTransform#clipRect-wxHPq4g(float, float, float, float, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawTransform.clipRect-wxHPq4g(float,float,float,float,int)
+
+
+ChangedSuperclass: androidx.compose.ui.graphics.BlendMode:
+    Class androidx.compose.ui.graphics.BlendMode superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.ClipOp:
+    Class androidx.compose.ui.graphics.ClipOp superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.FilterQuality:
+    Class androidx.compose.ui.graphics.FilterQuality superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.ImageBitmapConfig:
+    Class androidx.compose.ui.graphics.ImageBitmapConfig superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.PaintingStyle:
+    Class androidx.compose.ui.graphics.PaintingStyle superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.PathFillType:
+    Class androidx.compose.ui.graphics.PathFillType superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.PathOperation:
+    Class androidx.compose.ui.graphics.PathOperation superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.PointMode:
+    Class androidx.compose.ui.graphics.PointMode superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.StampedPathEffectStyle:
+    Class androidx.compose.ui.graphics.StampedPathEffectStyle superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.StrokeCap:
+    Class androidx.compose.ui.graphics.StrokeCap superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.StrokeJoin:
+    Class androidx.compose.ui.graphics.StrokeJoin superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.TileMode:
+    Class androidx.compose.ui.graphics.TileMode superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.VertexMode:
+    Class androidx.compose.ui.graphics.VertexMode superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.colorspace.Adaptation:
+    Class androidx.compose.ui.graphics.colorspace.Adaptation superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.colorspace.ColorModel:
+    Class androidx.compose.ui.graphics.colorspace.ColorModel superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.colorspace.RenderIntent:
+    Class androidx.compose.ui.graphics.colorspace.RenderIntent superclass changed from java.lang.Enum to java.lang.Object
+
+
+InvalidNullConversion: Field AndroidPaint.blendMode:
+    Attempted to remove @NonNull annotation from Field AndroidPaint.blendMode
+InvalidNullConversion: Field AndroidPaint.filterQuality:
+    Attempted to remove @NonNull annotation from Field AndroidPaint.filterQuality
+InvalidNullConversion: Field AndroidPaint.strokeCap:
+    Attempted to remove @NonNull annotation from Field AndroidPaint.strokeCap
+InvalidNullConversion: Field AndroidPaint.strokeJoin:
+    Attempted to remove @NonNull annotation from Field AndroidPaint.strokeJoin
+InvalidNullConversion: Field AndroidPaint.style:
+    Attempted to remove @NonNull annotation from Field AndroidPaint.style
+InvalidNullConversion: Field AndroidPath.fillType:
+    Attempted to remove @NonNull annotation from Field AndroidPath.fillType
+InvalidNullConversion: Field ColorSpace.model:
+    Attempted to remove @NonNull annotation from Field ColorSpace.model
+InvalidNullConversion: Field Connector.renderIntent:
+    Attempted to remove @NonNull annotation from Field Connector.renderIntent
+InvalidNullConversion: Field DrawScope.Companion.DefaultBlendMode:
+    Attempted to remove @NonNull annotation from Field DrawScope.Companion.DefaultBlendMode
+InvalidNullConversion: Field ImageBitmap.config:
+    Attempted to remove @NonNull annotation from Field ImageBitmap.config
+InvalidNullConversion: Field Paint.blendMode:
+    Attempted to remove @NonNull annotation from Field Paint.blendMode
+InvalidNullConversion: Field Paint.filterQuality:
+    Attempted to remove @NonNull annotation from Field Paint.filterQuality
+InvalidNullConversion: Field Paint.strokeCap:
+    Attempted to remove @NonNull annotation from Field Paint.strokeCap
+InvalidNullConversion: Field Paint.strokeJoin:
+    Attempted to remove @NonNull annotation from Field Paint.strokeJoin
+InvalidNullConversion: Field Paint.style:
+    Attempted to remove @NonNull annotation from Field Paint.style
+InvalidNullConversion: Field Path.fillType:
+    Attempted to remove @NonNull annotation from Field Path.fillType
+InvalidNullConversion: Field Stroke.Companion.DefaultCap:
+    Attempted to remove @NonNull annotation from Field Stroke.Companion.DefaultCap
+InvalidNullConversion: Field Stroke.Companion.DefaultJoin:
+    Attempted to remove @NonNull annotation from Field Stroke.Companion.DefaultJoin
+InvalidNullConversion: Field Stroke.cap:
+    Attempted to remove @NonNull annotation from Field Stroke.cap
+InvalidNullConversion: Field Stroke.join:
+    Attempted to remove @NonNull annotation from Field Stroke.join
+InvalidNullConversion: Field Vertices.vertexMode:
+    Attempted to remove @NonNull annotation from Field Vertices.vertexMode
+
+
+RemovedField: androidx.compose.ui.graphics.BlendMode#Clear:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Clear
+RemovedField: androidx.compose.ui.graphics.BlendMode#Color:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Color
+RemovedField: androidx.compose.ui.graphics.BlendMode#ColorBurn:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.ColorBurn
+RemovedField: androidx.compose.ui.graphics.BlendMode#ColorDodge:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.ColorDodge
+RemovedField: androidx.compose.ui.graphics.BlendMode#Darken:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Darken
+RemovedField: androidx.compose.ui.graphics.BlendMode#Difference:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Difference
+RemovedField: androidx.compose.ui.graphics.BlendMode#Dst:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Dst
+RemovedField: androidx.compose.ui.graphics.BlendMode#DstAtop:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.DstAtop
+RemovedField: androidx.compose.ui.graphics.BlendMode#DstIn:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.DstIn
+RemovedField: androidx.compose.ui.graphics.BlendMode#DstOut:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.DstOut
+RemovedField: androidx.compose.ui.graphics.BlendMode#DstOver:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.DstOver
+RemovedField: androidx.compose.ui.graphics.BlendMode#Exclusion:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Exclusion
+RemovedField: androidx.compose.ui.graphics.BlendMode#Hardlight:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Hardlight
+RemovedField: androidx.compose.ui.graphics.BlendMode#Hue:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Hue
+RemovedField: androidx.compose.ui.graphics.BlendMode#Lighten:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Lighten
+RemovedField: androidx.compose.ui.graphics.BlendMode#Luminosity:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Luminosity
+RemovedField: androidx.compose.ui.graphics.BlendMode#Modulate:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Modulate
+RemovedField: androidx.compose.ui.graphics.BlendMode#Multiply:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Multiply
+RemovedField: androidx.compose.ui.graphics.BlendMode#Overlay:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Overlay
+RemovedField: androidx.compose.ui.graphics.BlendMode#Plus:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Plus
+RemovedField: androidx.compose.ui.graphics.BlendMode#Saturation:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Saturation
+RemovedField: androidx.compose.ui.graphics.BlendMode#Screen:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Screen
+RemovedField: androidx.compose.ui.graphics.BlendMode#Softlight:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Softlight
+RemovedField: androidx.compose.ui.graphics.BlendMode#Src:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Src
+RemovedField: androidx.compose.ui.graphics.BlendMode#SrcAtop:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.SrcAtop
+RemovedField: androidx.compose.ui.graphics.BlendMode#SrcIn:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.SrcIn
+RemovedField: androidx.compose.ui.graphics.BlendMode#SrcOut:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.SrcOut
+RemovedField: androidx.compose.ui.graphics.BlendMode#SrcOver:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.SrcOver
+RemovedField: androidx.compose.ui.graphics.BlendMode#Xor:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Xor
+RemovedField: androidx.compose.ui.graphics.ClipOp#Difference:
+    Removed enum constant androidx.compose.ui.graphics.ClipOp.Difference
+RemovedField: androidx.compose.ui.graphics.ClipOp#Intersect:
+    Removed enum constant androidx.compose.ui.graphics.ClipOp.Intersect
+RemovedField: androidx.compose.ui.graphics.FilterQuality#High:
+    Removed enum constant androidx.compose.ui.graphics.FilterQuality.High
+RemovedField: androidx.compose.ui.graphics.FilterQuality#Low:
+    Removed enum constant androidx.compose.ui.graphics.FilterQuality.Low
+RemovedField: androidx.compose.ui.graphics.FilterQuality#Medium:
+    Removed enum constant androidx.compose.ui.graphics.FilterQuality.Medium
+RemovedField: androidx.compose.ui.graphics.FilterQuality#None:
+    Removed enum constant androidx.compose.ui.graphics.FilterQuality.None
+RemovedField: androidx.compose.ui.graphics.ImageBitmapConfig#Alpha8:
+    Removed enum constant androidx.compose.ui.graphics.ImageBitmapConfig.Alpha8
+RemovedField: androidx.compose.ui.graphics.ImageBitmapConfig#Argb8888:
+    Removed enum constant androidx.compose.ui.graphics.ImageBitmapConfig.Argb8888
+RemovedField: androidx.compose.ui.graphics.ImageBitmapConfig#F16:
+    Removed enum constant androidx.compose.ui.graphics.ImageBitmapConfig.F16
+RemovedField: androidx.compose.ui.graphics.ImageBitmapConfig#Gpu:
+    Removed enum constant androidx.compose.ui.graphics.ImageBitmapConfig.Gpu
+RemovedField: androidx.compose.ui.graphics.ImageBitmapConfig#Rgb565:
+    Removed enum constant androidx.compose.ui.graphics.ImageBitmapConfig.Rgb565
+RemovedField: androidx.compose.ui.graphics.PaintingStyle#Fill:
+    Removed enum constant androidx.compose.ui.graphics.PaintingStyle.Fill
+RemovedField: androidx.compose.ui.graphics.PaintingStyle#Stroke:
+    Removed enum constant androidx.compose.ui.graphics.PaintingStyle.Stroke
+RemovedField: androidx.compose.ui.graphics.PathFillType#EvenOdd:
+    Removed enum constant androidx.compose.ui.graphics.PathFillType.EvenOdd
+RemovedField: androidx.compose.ui.graphics.PathFillType#NonZero:
+    Removed enum constant androidx.compose.ui.graphics.PathFillType.NonZero
+RemovedField: androidx.compose.ui.graphics.PathOperation#difference:
+    Removed enum constant androidx.compose.ui.graphics.PathOperation.difference
+RemovedField: androidx.compose.ui.graphics.PathOperation#intersect:
+    Removed enum constant androidx.compose.ui.graphics.PathOperation.intersect
+RemovedField: androidx.compose.ui.graphics.PathOperation#reverseDifference:
+    Removed enum constant androidx.compose.ui.graphics.PathOperation.reverseDifference
+RemovedField: androidx.compose.ui.graphics.PathOperation#union:
+    Removed enum constant androidx.compose.ui.graphics.PathOperation.union
+RemovedField: androidx.compose.ui.graphics.PathOperation#xor:
+    Removed enum constant androidx.compose.ui.graphics.PathOperation.xor
+RemovedField: androidx.compose.ui.graphics.PointMode#Lines:
+    Removed enum constant androidx.compose.ui.graphics.PointMode.Lines
+RemovedField: androidx.compose.ui.graphics.PointMode#Points:
+    Removed enum constant androidx.compose.ui.graphics.PointMode.Points
+RemovedField: androidx.compose.ui.graphics.PointMode#Polygon:
+    Removed enum constant androidx.compose.ui.graphics.PointMode.Polygon
+RemovedField: androidx.compose.ui.graphics.StampedPathEffectStyle#Morph:
+    Removed enum constant androidx.compose.ui.graphics.StampedPathEffectStyle.Morph
+RemovedField: androidx.compose.ui.graphics.StampedPathEffectStyle#Rotate:
+    Removed enum constant androidx.compose.ui.graphics.StampedPathEffectStyle.Rotate
+RemovedField: androidx.compose.ui.graphics.StampedPathEffectStyle#Translate:
+    Removed enum constant androidx.compose.ui.graphics.StampedPathEffectStyle.Translate
+RemovedField: androidx.compose.ui.graphics.StrokeCap#Butt:
+    Removed enum constant androidx.compose.ui.graphics.StrokeCap.Butt
+RemovedField: androidx.compose.ui.graphics.StrokeCap#Round:
+    Removed enum constant androidx.compose.ui.graphics.StrokeCap.Round
+RemovedField: androidx.compose.ui.graphics.StrokeCap#Square:
+    Removed enum constant androidx.compose.ui.graphics.StrokeCap.Square
+RemovedField: androidx.compose.ui.graphics.StrokeJoin#Bevel:
+    Removed enum constant androidx.compose.ui.graphics.StrokeJoin.Bevel
+RemovedField: androidx.compose.ui.graphics.StrokeJoin#Miter:
+    Removed enum constant androidx.compose.ui.graphics.StrokeJoin.Miter
+RemovedField: androidx.compose.ui.graphics.StrokeJoin#Round:
+    Removed enum constant androidx.compose.ui.graphics.StrokeJoin.Round
+RemovedField: androidx.compose.ui.graphics.TileMode#Clamp:
+    Removed enum constant androidx.compose.ui.graphics.TileMode.Clamp
+RemovedField: androidx.compose.ui.graphics.TileMode#Mirror:
+    Removed enum constant androidx.compose.ui.graphics.TileMode.Mirror
+RemovedField: androidx.compose.ui.graphics.TileMode#Repeated:
+    Removed enum constant androidx.compose.ui.graphics.TileMode.Repeated
+RemovedField: androidx.compose.ui.graphics.VertexMode#TriangleFan:
+    Removed enum constant androidx.compose.ui.graphics.VertexMode.TriangleFan
+RemovedField: androidx.compose.ui.graphics.VertexMode#TriangleStrip:
+    Removed enum constant androidx.compose.ui.graphics.VertexMode.TriangleStrip
+RemovedField: androidx.compose.ui.graphics.VertexMode#Triangles:
+    Removed enum constant androidx.compose.ui.graphics.VertexMode.Triangles
+RemovedField: androidx.compose.ui.graphics.colorspace.Adaptation#Bradford:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.Adaptation.Bradford
+RemovedField: androidx.compose.ui.graphics.colorspace.Adaptation#Ciecat02:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.Adaptation.Ciecat02
+RemovedField: androidx.compose.ui.graphics.colorspace.Adaptation#VonKries:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.Adaptation.VonKries
+RemovedField: androidx.compose.ui.graphics.colorspace.ColorModel#Cmyk:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.ColorModel.Cmyk
+RemovedField: androidx.compose.ui.graphics.colorspace.ColorModel#Lab:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.ColorModel.Lab
+RemovedField: androidx.compose.ui.graphics.colorspace.ColorModel#Rgb:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.ColorModel.Rgb
+RemovedField: androidx.compose.ui.graphics.colorspace.ColorModel#Xyz:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.ColorModel.Xyz
+RemovedField: androidx.compose.ui.graphics.colorspace.RenderIntent#Absolute:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.RenderIntent.Absolute
+RemovedField: androidx.compose.ui.graphics.colorspace.RenderIntent#Perceptual:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.RenderIntent.Perceptual
+RemovedField: androidx.compose.ui.graphics.colorspace.RenderIntent#Relative:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.RenderIntent.Relative
+RemovedField: androidx.compose.ui.graphics.colorspace.RenderIntent#Saturation:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.RenderIntent.Saturation
+
+
+RemovedMethod: androidx.compose.ui.graphics.AndroidBlendMode_androidKt#isSupported(androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.AndroidBlendMode_androidKt.isSupported(androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#getBlendMode():
+    Removed method androidx.compose.ui.graphics.AndroidPaint.getBlendMode()
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#getFilterQuality():
+    Removed method androidx.compose.ui.graphics.AndroidPaint.getFilterQuality()
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#getStrokeCap():
+    Removed method androidx.compose.ui.graphics.AndroidPaint.getStrokeCap()
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#getStrokeJoin():
+    Removed method androidx.compose.ui.graphics.AndroidPaint.getStrokeJoin()
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#getStyle():
+    Removed method androidx.compose.ui.graphics.AndroidPaint.getStyle()
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#setBlendMode(androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.AndroidPaint.setBlendMode(androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#setFilterQuality(androidx.compose.ui.graphics.FilterQuality):
+    Removed method androidx.compose.ui.graphics.AndroidPaint.setFilterQuality(androidx.compose.ui.graphics.FilterQuality)
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#setStrokeCap(androidx.compose.ui.graphics.StrokeCap):
+    Removed method androidx.compose.ui.graphics.AndroidPaint.setStrokeCap(androidx.compose.ui.graphics.StrokeCap)
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin):
+    Removed method androidx.compose.ui.graphics.AndroidPaint.setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin)
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#setStyle(androidx.compose.ui.graphics.PaintingStyle):
+    Removed method androidx.compose.ui.graphics.AndroidPaint.setStyle(androidx.compose.ui.graphics.PaintingStyle)
+RemovedMethod: androidx.compose.ui.graphics.AndroidPath#getFillType():
+    Removed method androidx.compose.ui.graphics.AndroidPath.getFillType()
+RemovedMethod: androidx.compose.ui.graphics.AndroidPath#op(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.PathOperation):
+    Removed method androidx.compose.ui.graphics.AndroidPath.op(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.PathOperation)
+RemovedMethod: androidx.compose.ui.graphics.AndroidPath#setFillType(androidx.compose.ui.graphics.PathFillType):
+    Removed method androidx.compose.ui.graphics.AndroidPath.setFillType(androidx.compose.ui.graphics.PathFillType)
+RemovedMethod: androidx.compose.ui.graphics.AndroidTileMode_androidKt#toNativeTileMode(androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.AndroidTileMode_androidKt.toNativeTileMode(androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.AndroidVertexMode_androidKt#toNativeVertexMode(androidx.compose.ui.graphics.VertexMode):
+    Removed method androidx.compose.ui.graphics.AndroidVertexMode_androidKt.toNativeVertexMode(androidx.compose.ui.graphics.VertexMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color>, float, float, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color>,float,float,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[], float, float, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[],float,float,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color>, long, long, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color>,long,long,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[], long, long, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[],long,long,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color>, long, float, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color>,long,float,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[], long, float, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[],long,float,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#verticalGradient(java.util.List<androidx.compose.ui.graphics.Color>, float, float, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.verticalGradient(java.util.List<androidx.compose.ui.graphics.Color>,float,float,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[], float, float, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[],float,float,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Canvas#clipPath(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.ClipOp):
+    Removed method androidx.compose.ui.graphics.Canvas.clipPath(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.ClipOp)
+RemovedMethod: androidx.compose.ui.graphics.Canvas#clipRect(androidx.compose.ui.geometry.Rect, androidx.compose.ui.graphics.ClipOp):
+    Removed method androidx.compose.ui.graphics.Canvas.clipRect(androidx.compose.ui.geometry.Rect,androidx.compose.ui.graphics.ClipOp)
+RemovedMethod: androidx.compose.ui.graphics.Canvas#clipRect(float, float, float, float, androidx.compose.ui.graphics.ClipOp):
+    Removed method androidx.compose.ui.graphics.Canvas.clipRect(float,float,float,float,androidx.compose.ui.graphics.ClipOp)
+RemovedMethod: androidx.compose.ui.graphics.Canvas#drawPoints(androidx.compose.ui.graphics.PointMode, java.util.List<androidx.compose.ui.geometry.Offset>, androidx.compose.ui.graphics.Paint):
+    Removed method androidx.compose.ui.graphics.Canvas.drawPoints(androidx.compose.ui.graphics.PointMode,java.util.List<androidx.compose.ui.geometry.Offset>,androidx.compose.ui.graphics.Paint)
+RemovedMethod: androidx.compose.ui.graphics.Canvas#drawRawPoints(androidx.compose.ui.graphics.PointMode, float[], androidx.compose.ui.graphics.Paint):
+    Removed method androidx.compose.ui.graphics.Canvas.drawRawPoints(androidx.compose.ui.graphics.PointMode,float[],androidx.compose.ui.graphics.Paint)
+RemovedMethod: androidx.compose.ui.graphics.Canvas#drawVertices(androidx.compose.ui.graphics.Vertices, androidx.compose.ui.graphics.BlendMode, androidx.compose.ui.graphics.Paint):
+    Removed method androidx.compose.ui.graphics.Canvas.drawVertices(androidx.compose.ui.graphics.Vertices,androidx.compose.ui.graphics.BlendMode,androidx.compose.ui.graphics.Paint)
+RemovedMethod: androidx.compose.ui.graphics.ColorFilter.Companion#tint-aamYUWA(long, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.ColorFilter.Companion.tint-aamYUWA(long,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.ImageBitmap#getConfig():
+    Removed method androidx.compose.ui.graphics.ImageBitmap.getConfig()
+RemovedMethod: androidx.compose.ui.graphics.ImageBitmapKt#ImageBitmap(int, int, androidx.compose.ui.graphics.ImageBitmapConfig, boolean, androidx.compose.ui.graphics.colorspace.ColorSpace):
+    Removed method androidx.compose.ui.graphics.ImageBitmapKt.ImageBitmap(int,int,androidx.compose.ui.graphics.ImageBitmapConfig,boolean,androidx.compose.ui.graphics.colorspace.ColorSpace)
+RemovedMethod: androidx.compose.ui.graphics.OutlineKt#drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.OutlineKt.drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope,androidx.compose.ui.graphics.Outline,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.OutlineKt#drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.OutlineKt.drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope,androidx.compose.ui.graphics.Outline,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.Paint#getBlendMode():
+    Removed method androidx.compose.ui.graphics.Paint.getBlendMode()
+RemovedMethod: androidx.compose.ui.graphics.Paint#getFilterQuality():
+    Removed method androidx.compose.ui.graphics.Paint.getFilterQuality()
+RemovedMethod: androidx.compose.ui.graphics.Paint#getStrokeCap():
+    Removed method androidx.compose.ui.graphics.Paint.getStrokeCap()
+RemovedMethod: androidx.compose.ui.graphics.Paint#getStrokeJoin():
+    Removed method androidx.compose.ui.graphics.Paint.getStrokeJoin()
+RemovedMethod: androidx.compose.ui.graphics.Paint#getStyle():
+    Removed method androidx.compose.ui.graphics.Paint.getStyle()
+RemovedMethod: androidx.compose.ui.graphics.Paint#setBlendMode(androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.Paint.setBlendMode(androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.Paint#setFilterQuality(androidx.compose.ui.graphics.FilterQuality):
+    Removed method androidx.compose.ui.graphics.Paint.setFilterQuality(androidx.compose.ui.graphics.FilterQuality)
+RemovedMethod: androidx.compose.ui.graphics.Paint#setStrokeCap(androidx.compose.ui.graphics.StrokeCap):
+    Removed method androidx.compose.ui.graphics.Paint.setStrokeCap(androidx.compose.ui.graphics.StrokeCap)
+RemovedMethod: androidx.compose.ui.graphics.Paint#setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin):
+    Removed method androidx.compose.ui.graphics.Paint.setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin)
+RemovedMethod: androidx.compose.ui.graphics.Paint#setStyle(androidx.compose.ui.graphics.PaintingStyle):
+    Removed method androidx.compose.ui.graphics.Paint.setStyle(androidx.compose.ui.graphics.PaintingStyle)
+RemovedMethod: androidx.compose.ui.graphics.Path#getFillType():
+    Removed method androidx.compose.ui.graphics.Path.getFillType()
+RemovedMethod: androidx.compose.ui.graphics.Path#op(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.PathOperation):
+    Removed method androidx.compose.ui.graphics.Path.op(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.PathOperation)
+RemovedMethod: androidx.compose.ui.graphics.Path#setFillType(androidx.compose.ui.graphics.PathFillType):
+    Removed method androidx.compose.ui.graphics.Path.setFillType(androidx.compose.ui.graphics.PathFillType)
+RemovedMethod: androidx.compose.ui.graphics.Path.Companion#combine(androidx.compose.ui.graphics.PathOperation, androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Path):
+    Removed method androidx.compose.ui.graphics.Path.Companion.combine(androidx.compose.ui.graphics.PathOperation,androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.Path)
+RemovedMethod: androidx.compose.ui.graphics.PathEffect.Companion#stampedPathEffect(androidx.compose.ui.graphics.Path, float, float, androidx.compose.ui.graphics.StampedPathEffectStyle):
+    Removed method androidx.compose.ui.graphics.PathEffect.Companion.stampedPathEffect(androidx.compose.ui.graphics.Path,float,float,androidx.compose.ui.graphics.StampedPathEffectStyle)
+RemovedMethod: androidx.compose.ui.graphics.ShaderKt#ImageShader(androidx.compose.ui.graphics.ImageBitmap, androidx.compose.ui.graphics.TileMode, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.ShaderKt.ImageShader(androidx.compose.ui.graphics.ImageBitmap,androidx.compose.ui.graphics.TileMode,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.ShaderKt#LinearGradientShader-GfyHbQM(long, long, java.util.List<androidx.compose.ui.graphics.Color>, java.util.List<java.lang.Float>, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.ShaderKt.LinearGradientShader-GfyHbQM(long,long,java.util.List<androidx.compose.ui.graphics.Color>,java.util.List<java.lang.Float>,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.ShaderKt#RadialGradientShader-cY6o93o(long, float, java.util.List<androidx.compose.ui.graphics.Color>, java.util.List<java.lang.Float>, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.ShaderKt.RadialGradientShader-cY6o93o(long,float,java.util.List<androidx.compose.ui.graphics.Color>,java.util.List<java.lang.Float>,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Vertices#Vertices(androidx.compose.ui.graphics.VertexMode, java.util.List<androidx.compose.ui.geometry.Offset>, java.util.List<androidx.compose.ui.geometry.Offset>, java.util.List<androidx.compose.ui.graphics.Color>, java.util.List<java.lang.Integer>):
+    Removed constructor androidx.compose.ui.graphics.Vertices(androidx.compose.ui.graphics.VertexMode,java.util.List<androidx.compose.ui.geometry.Offset>,java.util.List<androidx.compose.ui.geometry.Offset>,java.util.List<androidx.compose.ui.graphics.Color>,java.util.List<java.lang.Integer>)
+RemovedMethod: androidx.compose.ui.graphics.Vertices#getVertexMode():
+    Removed method androidx.compose.ui.graphics.Vertices.getVertexMode()
+RemovedMethod: androidx.compose.ui.graphics.colorspace.ColorModel#getComponentCount():
+    Removed method androidx.compose.ui.graphics.colorspace.ColorModel.getComponentCount()
+RemovedMethod: androidx.compose.ui.graphics.colorspace.ColorSpace#ColorSpace(String, androidx.compose.ui.graphics.colorspace.ColorModel):
+    Removed constructor androidx.compose.ui.graphics.colorspace.ColorSpace(String,androidx.compose.ui.graphics.colorspace.ColorModel)
+RemovedMethod: androidx.compose.ui.graphics.colorspace.ColorSpace#getModel():
+    Removed method androidx.compose.ui.graphics.colorspace.ColorSpace.getModel()
+RemovedMethod: androidx.compose.ui.graphics.colorspace.ColorSpaceKt#connect(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.RenderIntent):
+    Removed method androidx.compose.ui.graphics.colorspace.ColorSpaceKt.connect(androidx.compose.ui.graphics.colorspace.ColorSpace,androidx.compose.ui.graphics.colorspace.ColorSpace,androidx.compose.ui.graphics.colorspace.RenderIntent)
+RemovedMethod: androidx.compose.ui.graphics.colorspace.Connector#getRenderIntent():
+    Removed method androidx.compose.ui.graphics.colorspace.Connector.getRenderIntent()
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawArc-BcZ8TnY(long, float, float, boolean, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawArc-BcZ8TnY(long,float,float,boolean,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush, float, float, boolean, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush,float,float,boolean,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawCircle-NGaRamM(long, float, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawCircle-NGaRamM(long,float,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush, float, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush,float,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap, long, long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap,long,long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawLine-QXZmVdc(long, long, long, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawLine-QXZmVdc(long,long,long,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawOval-IdEHoqk(long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawOval-IdEHoqk(long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawPath(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawPath(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawPath-tilSWAQ(androidx.compose.ui.graphics.Path, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawPath-tilSWAQ(androidx.compose.ui.graphics.Path,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawPoints(java.util.List<androidx.compose.ui.geometry.Offset>, androidx.compose.ui.graphics.PointMode, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawPoints(java.util.List<androidx.compose.ui.geometry.Offset>,androidx.compose.ui.graphics.PointMode,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset>, androidx.compose.ui.graphics.PointMode, long, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset>,androidx.compose.ui.graphics.PointMode,long,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawRect-IdEHoqk(long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawRect-IdEHoqk(long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawRoundRect-fNghmuc(long, long, long, long, androidx.compose.ui.graphics.drawscope.DrawStyle, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawRoundRect-fNghmuc(long,long,long,long,androidx.compose.ui.graphics.drawscope.DrawStyle,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush, long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush,long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawArc-BcZ8TnY(long, float, float, boolean, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawArc-BcZ8TnY(long,float,float,boolean,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush, float, float, boolean, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush,float,float,boolean,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawCircle-NGaRamM(long, float, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawCircle-NGaRamM(long,float,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush, float, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush,float,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap, long, long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap,long,long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawLine-QXZmVdc(long, long, long, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawLine-QXZmVdc(long,long,long,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawOval-IdEHoqk(long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawOval-IdEHoqk(long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPath(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawPath(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPath-tilSWAQ(androidx.compose.ui.graphics.Path, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawPath-tilSWAQ(androidx.compose.ui.graphics.Path,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPoints(java.util.List<androidx.compose.ui.geometry.Offset>, androidx.compose.ui.graphics.PointMode, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawPoints(java.util.List<androidx.compose.ui.geometry.Offset>,androidx.compose.ui.graphics.PointMode,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset>, androidx.compose.ui.graphics.PointMode, long, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset>,androidx.compose.ui.graphics.PointMode,long,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRect-IdEHoqk(long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawRect-IdEHoqk(long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRoundRect-fNghmuc(long, long, long, long, androidx.compose.ui.graphics.drawscope.DrawStyle, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawRoundRect-fNghmuc(long,long,long,long,androidx.compose.ui.graphics.drawscope.DrawStyle,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush, long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush,long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope.Companion#getDefaultBlendMode():
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.Companion.getDefaultBlendMode()
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScopeKt#clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.ClipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit>):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScopeKt.clipPath(androidx.compose.ui.graphics.drawscope.DrawScope,androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.ClipOp,kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit>)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScopeKt#clipRect(androidx.compose.ui.graphics.drawscope.DrawScope, float, float, float, float, androidx.compose.ui.graphics.ClipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit>):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScopeKt.clipRect(androidx.compose.ui.graphics.drawscope.DrawScope,float,float,float,float,androidx.compose.ui.graphics.ClipOp,kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit>)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawTransform#clipPath(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.ClipOp):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawTransform.clipPath(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.ClipOp)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawTransform#clipRect(float, float, float, float, androidx.compose.ui.graphics.ClipOp):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawTransform.clipRect(float,float,float,float,androidx.compose.ui.graphics.ClipOp)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.Stroke#Stroke(float, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.StrokeJoin, androidx.compose.ui.graphics.PathEffect):
+    Removed constructor androidx.compose.ui.graphics.drawscope.Stroke(float,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.StrokeJoin,androidx.compose.ui.graphics.PathEffect)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.Stroke#getCap():
+    Removed method androidx.compose.ui.graphics.drawscope.Stroke.getCap()
+RemovedMethod: androidx.compose.ui.graphics.drawscope.Stroke#getJoin():
+    Removed method androidx.compose.ui.graphics.drawscope.Stroke.getJoin()
+RemovedMethod: androidx.compose.ui.graphics.drawscope.Stroke.Companion#getDefaultCap():
+    Removed method androidx.compose.ui.graphics.drawscope.Stroke.Companion.getDefaultCap()
+RemovedMethod: androidx.compose.ui.graphics.drawscope.Stroke.Companion#getDefaultJoin():
+    Removed method androidx.compose.ui.graphics.drawscope.Stroke.Companion.getDefaultJoin()
diff --git a/compose/ui/ui-graphics/api/current.txt b/compose/ui/ui-graphics/api/current.txt
index 4ac2634..b417872 100644
--- a/compose/ui/ui-graphics/api/current.txt
+++ b/compose/ui/ui-graphics/api/current.txt
@@ -2,7 +2,7 @@
 package androidx.compose.ui.graphics {
 
   public final class AndroidBlendMode_androidKt {
-    method public static boolean isSupported(androidx.compose.ui.graphics.BlendMode);
+    method public static boolean isSupported-s9anfk8(int);
   }
 
   public final class AndroidCanvas_androidKt {
@@ -29,44 +29,44 @@
     ctor public AndroidPaint();
     method public android.graphics.Paint asFrameworkPaint();
     method public float getAlpha();
-    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public int getBlendMode-0nO6VwU();
     method public long getColor-0d7_KjU();
     method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
-    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public int getFilterQuality-f-v9h1I();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public android.graphics.Shader? getShader();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public int getStrokeCap-KaPHkGw();
+    method public int getStrokeJoin-LxFBmk8();
     method public float getStrokeMiterLimit();
     method public float getStrokeWidth();
-    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public int getStyle-TiuSbCo();
     method public boolean isAntiAlias();
     method public void setAlpha(float value);
     method public void setAntiAlias(boolean value);
-    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode value);
+    method public void setBlendMode-s9anfk8(int value);
     method public void setColor-8_81llA(long color);
     method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
-    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality value);
+    method public void setFilterQuality-vDHp3xo(int value);
     method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
     method public void setShader(android.graphics.Shader? value);
-    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap value);
-    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin value);
+    method public void setStrokeCap-BeK7IIE(int value);
+    method public void setStrokeJoin-Ww9F2mQ(int value);
     method public void setStrokeMiterLimit(float value);
     method public void setStrokeWidth(float value);
-    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle value);
+    method public void setStyle-k9PVt8s(int value);
     property public float alpha;
-    property public androidx.compose.ui.graphics.BlendMode blendMode;
+    property public int blendMode;
     property public long color;
     property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
-    property public androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public int filterQuality;
     property public boolean isAntiAlias;
     property public androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public android.graphics.Shader? shader;
-    property public androidx.compose.ui.graphics.StrokeCap strokeCap;
-    property public androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public int strokeCap;
+    property public int strokeJoin;
     property public float strokeMiterLimit;
     property public float strokeWidth;
-    property public androidx.compose.ui.graphics.PaintingStyle style;
+    property public int style;
   }
 
   public final class AndroidPaint_androidKt {
@@ -85,22 +85,22 @@
     method public void close();
     method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.compose.ui.geometry.Rect getBounds();
-    method public androidx.compose.ui.graphics.PathFillType getFillType();
+    method public int getFillType-Rg-k1Os();
     method public android.graphics.Path getInternalPath();
     method public boolean isConvex();
     method public boolean isEmpty();
     method public void lineTo(float x, float y);
     method public void moveTo(float x, float y);
-    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, androidx.compose.ui.graphics.PathOperation operation);
+    method public boolean op-xiGExi0(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
     method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
     method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
     method public void relativeLineTo(float dx, float dy);
     method public void relativeMoveTo(float dx, float dy);
     method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
     method public void reset();
-    method public void setFillType(androidx.compose.ui.graphics.PathFillType value);
+    method public void setFillType-oQ8Xj4U(int value);
     method public void translate-k-4lQ0M(long offset);
-    property public androidx.compose.ui.graphics.PathFillType fillType;
+    property public int fillType;
     property public final android.graphics.Path internalPath;
     property public boolean isConvex;
     property public boolean isEmpty;
@@ -132,43 +132,83 @@
   }
 
   public final class AndroidTileMode_androidKt {
-    method public static android.graphics.Shader.TileMode toNativeTileMode(androidx.compose.ui.graphics.TileMode);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode-0vamqd0(int);
   }
 
   public final class AndroidVertexMode_androidKt {
-    method public static android.graphics.Canvas.VertexMode toNativeVertexMode(androidx.compose.ui.graphics.VertexMode);
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode-JOOmi9M(int);
   }
 
-  public enum BlendMode {
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Clear;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Color;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorBurn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorDodge;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Darken;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Difference;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Dst;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstAtop;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstIn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOut;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOver;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Exclusion;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hardlight;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hue;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Lighten;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Luminosity;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Modulate;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Multiply;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Overlay;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Plus;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Saturation;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Screen;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Softlight;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Src;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcAtop;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcIn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOut;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOver;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Xor;
+  @androidx.compose.runtime.Immutable public final inline class BlendMode {
+    ctor public BlendMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.BlendMode.Companion Companion;
+  }
+
+  public static final class BlendMode.Companion {
+    method public int getClear-0nO6VwU();
+    method public int getColor-0nO6VwU();
+    method public int getColorBurn-0nO6VwU();
+    method public int getColorDodge-0nO6VwU();
+    method public int getDarken-0nO6VwU();
+    method public int getDifference-0nO6VwU();
+    method public int getDst-0nO6VwU();
+    method public int getDstAtop-0nO6VwU();
+    method public int getDstIn-0nO6VwU();
+    method public int getDstOut-0nO6VwU();
+    method public int getDstOver-0nO6VwU();
+    method public int getExclusion-0nO6VwU();
+    method public int getHardlight-0nO6VwU();
+    method public int getHue-0nO6VwU();
+    method public int getLighten-0nO6VwU();
+    method public int getLuminosity-0nO6VwU();
+    method public int getModulate-0nO6VwU();
+    method public int getMultiply-0nO6VwU();
+    method public int getOverlay-0nO6VwU();
+    method public int getPlus-0nO6VwU();
+    method public int getSaturation-0nO6VwU();
+    method public int getScreen-0nO6VwU();
+    method public int getSoftlight-0nO6VwU();
+    method public int getSrc-0nO6VwU();
+    method public int getSrcAtop-0nO6VwU();
+    method public int getSrcIn-0nO6VwU();
+    method public int getSrcOut-0nO6VwU();
+    method public int getSrcOver-0nO6VwU();
+    method public int getXor-0nO6VwU();
+    property public final int Clear;
+    property public final int Color;
+    property public final int ColorBurn;
+    property public final int ColorDodge;
+    property public final int Darken;
+    property public final int Difference;
+    property public final int Dst;
+    property public final int DstAtop;
+    property public final int DstIn;
+    property public final int DstOut;
+    property public final int DstOver;
+    property public final int Exclusion;
+    property public final int Hardlight;
+    property public final int Hue;
+    property public final int Lighten;
+    property public final int Luminosity;
+    property public final int Modulate;
+    property public final int Multiply;
+    property public final int Overlay;
+    property public final int Plus;
+    property public final int Saturation;
+    property public final int Screen;
+    property public final int Softlight;
+    property public final int Src;
+    property public final int SrcAtop;
+    property public final int SrcIn;
+    property public final int SrcOut;
+    property public final int SrcOver;
+    property public final int Xor;
   }
 
   @androidx.compose.runtime.Immutable public abstract sealed class Brush {
@@ -177,16 +217,16 @@
   }
 
   public static final class Brush.Companion {
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient-CcUA5qQ(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient-NvQjRjk(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional int tileMode);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-PvDSl28(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-acbAMd8(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient-CcUA5qQ(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient-NvQjRjk(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional int tileMode);
   }
 
   public final class BrushKt {
@@ -194,9 +234,9 @@
   }
 
   public interface Canvas {
-    method public void clipPath(androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public void clipRect(float left, float top, float right, float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipPath-fquoRGU(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public default void clipRect-MsRSx38(androidx.compose.ui.geometry.Rect rect, optional int clipOp);
+    method public void clipRect-wxHPq4g(float left, float top, float right, float bottom, optional int clipOp);
     method public void concat-58bKbWc(float[] matrix);
     method public void disableZ();
     method public default void drawArc(androidx.compose.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
@@ -209,12 +249,12 @@
     method public default void drawOval(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
     method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
-    method public void drawPoints(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
-    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints-iVdqbVo(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints-59E74cI(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
     method public default void drawRect(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
     method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
-    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, androidx.compose.ui.graphics.BlendMode blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices-nA16xIE(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
     method public void enableZ();
     method public void restore();
     method public void rotate(float degrees);
@@ -240,9 +280,22 @@
     method public static inline void withSaveLayer(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint, kotlin.jvm.functions.Function0<kotlin.Unit> block);
   }
 
-  public enum ClipOp {
-    enum_constant public static final androidx.compose.ui.graphics.ClipOp Difference;
-    enum_constant public static final androidx.compose.ui.graphics.ClipOp Intersect;
+  @androidx.compose.runtime.Immutable public final inline class ClipOp {
+    ctor public ClipOp();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ClipOp.Companion Companion;
+  }
+
+  public static final class ClipOp.Companion {
+    method public int getDifference-rtfAjoo();
+    method public int getIntersect-rtfAjoo();
+    property public final int Difference;
+    property public final int Intersect;
   }
 
   @androidx.compose.runtime.Immutable public final inline class Color {
@@ -305,7 +358,7 @@
   public static final class ColorFilter.Companion {
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter colorMatrix-jHG-Opc(float[] colorMatrix);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting-6xK2E-Q(long multiply, long add);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional int blendMode);
   }
 
   public final class ColorKt {
@@ -348,11 +401,26 @@
   public final class DegreesKt {
   }
 
-  public enum FilterQuality {
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality High;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Low;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Medium;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality None;
+  @androidx.compose.runtime.Immutable public final inline class FilterQuality {
+    ctor public FilterQuality();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.FilterQuality.Companion Companion;
+  }
+
+  public static final class FilterQuality.Companion {
+    method public int getHigh-f-v9h1I();
+    method public int getLow-f-v9h1I();
+    method public int getMedium-f-v9h1I();
+    method public int getNone-f-v9h1I();
+    property public final int High;
+    property public final int Low;
+    property public final int Medium;
+    property public final int None;
   }
 
   public final class Float16Kt {
@@ -360,14 +428,14 @@
 
   public interface ImageBitmap {
     method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
-    method public androidx.compose.ui.graphics.ImageBitmapConfig getConfig();
+    method public int getConfig-_sVssgQ();
     method public boolean getHasAlpha();
     method public int getHeight();
     method public int getWidth();
     method public void prepareToDraw();
     method public void readPixels(int[] buffer, optional int startX, optional int startY, optional int width, optional int height, optional int bufferOffset, optional int stride);
     property public abstract androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
-    property public abstract androidx.compose.ui.graphics.ImageBitmapConfig config;
+    property public abstract int config;
     property public abstract boolean hasAlpha;
     property public abstract int height;
     property public abstract int width;
@@ -377,16 +445,32 @@
   public static final class ImageBitmap.Companion {
   }
 
-  public enum ImageBitmapConfig {
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Alpha8;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Argb8888;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig F16;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Gpu;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Rgb565;
+  @androidx.compose.runtime.Immutable public final inline class ImageBitmapConfig {
+    ctor public ImageBitmapConfig();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ImageBitmapConfig.Companion Companion;
+  }
+
+  public static final class ImageBitmapConfig.Companion {
+    method public int getAlpha8-_sVssgQ();
+    method public int getArgb8888-_sVssgQ();
+    method public int getF16-_sVssgQ();
+    method public int getGpu-_sVssgQ();
+    method public int getRgb565-_sVssgQ();
+    property public final int Alpha8;
+    property public final int Argb8888;
+    property public final int F16;
+    property public final int Gpu;
+    property public final int Rgb565;
   }
 
   public final class ImageBitmapKt {
-    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional androidx.compose.ui.graphics.ImageBitmapConfig config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap-E8BOdIU(int width, int height, optional int config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
     method public static androidx.compose.ui.graphics.PixelMap toPixelMap(androidx.compose.ui.graphics.ImageBitmap, optional int startX, optional int startY, optional int width, optional int height, optional int[] buffer, optional int bufferOffset, optional int stride);
   }
 
@@ -469,61 +553,74 @@
 
   public final class OutlineKt {
     method public static void addOutline(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Outline outline);
-    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
     method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
-    method public static void drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public static void drawOutline-Ar0j1Zw(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
   }
 
   public interface Paint {
     method public android.graphics.Paint asFrameworkPaint();
     method public float getAlpha();
-    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public int getBlendMode-0nO6VwU();
     method public long getColor-0d7_KjU();
     method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
-    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public int getFilterQuality-f-v9h1I();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public android.graphics.Shader? getShader();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public int getStrokeCap-KaPHkGw();
+    method public int getStrokeJoin-LxFBmk8();
     method public float getStrokeMiterLimit();
     method public float getStrokeWidth();
-    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public int getStyle-TiuSbCo();
     method public boolean isAntiAlias();
     method public void setAlpha(float p);
     method public void setAntiAlias(boolean p);
-    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode p);
+    method public void setBlendMode-s9anfk8(int p);
     method public void setColor-8_81llA(long p);
     method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? p);
-    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality p);
+    method public void setFilterQuality-vDHp3xo(int p);
     method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? p);
     method public void setShader(android.graphics.Shader? p);
-    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap p);
-    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin p);
+    method public void setStrokeCap-BeK7IIE(int p);
+    method public void setStrokeJoin-Ww9F2mQ(int p);
     method public void setStrokeMiterLimit(float p);
     method public void setStrokeWidth(float p);
-    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle p);
+    method public void setStyle-k9PVt8s(int p);
     property public abstract float alpha;
-    property public abstract androidx.compose.ui.graphics.BlendMode blendMode;
+    property public abstract int blendMode;
     property public abstract long color;
     property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
-    property public abstract androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public abstract int filterQuality;
     property public abstract boolean isAntiAlias;
     property public abstract androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public abstract android.graphics.Shader? shader;
-    property public abstract androidx.compose.ui.graphics.StrokeCap strokeCap;
-    property public abstract androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public abstract int strokeCap;
+    property public abstract int strokeJoin;
     property public abstract float strokeMiterLimit;
     property public abstract float strokeWidth;
-    property public abstract androidx.compose.ui.graphics.PaintingStyle style;
+    property public abstract int style;
   }
 
   public final class PaintKt {
     field public static final float DefaultAlpha = 1.0f;
   }
 
-  public enum PaintingStyle {
-    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Fill;
-    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Stroke;
+  @androidx.compose.runtime.Immutable public final inline class PaintingStyle {
+    ctor public PaintingStyle();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PaintingStyle.Companion Companion;
+  }
+
+  public static final class PaintingStyle.Companion {
+    method public int getFill-TiuSbCo();
+    method public int getStroke-TiuSbCo();
+    property public final int Fill;
+    property public final int Stroke;
   }
 
   public interface Path {
@@ -538,28 +635,28 @@
     method public void close();
     method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.compose.ui.geometry.Rect getBounds();
-    method public androidx.compose.ui.graphics.PathFillType getFillType();
+    method public int getFillType-Rg-k1Os();
     method public boolean isConvex();
     method public boolean isEmpty();
     method public void lineTo(float x, float y);
     method public void moveTo(float x, float y);
-    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, androidx.compose.ui.graphics.PathOperation operation);
+    method public boolean op-xiGExi0(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
     method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
     method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
     method public void relativeLineTo(float dx, float dy);
     method public void relativeMoveTo(float dx, float dy);
     method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
     method public void reset();
-    method public void setFillType(androidx.compose.ui.graphics.PathFillType p);
+    method public void setFillType-oQ8Xj4U(int p);
     method public void translate-k-4lQ0M(long offset);
-    property public abstract androidx.compose.ui.graphics.PathFillType fillType;
+    property public abstract int fillType;
     property public abstract boolean isConvex;
     property public abstract boolean isEmpty;
     field public static final androidx.compose.ui.graphics.Path.Companion Companion;
   }
 
   public static final class Path.Companion {
-    method public androidx.compose.ui.graphics.Path combine(androidx.compose.ui.graphics.PathOperation operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
+    method public androidx.compose.ui.graphics.Path combine-mTgLSnE(int operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
   }
 
   public interface PathEffect {
@@ -570,12 +667,25 @@
     method public androidx.compose.ui.graphics.PathEffect chainPathEffect(androidx.compose.ui.graphics.PathEffect outer, androidx.compose.ui.graphics.PathEffect inner);
     method public androidx.compose.ui.graphics.PathEffect cornerPathEffect(float radius);
     method public androidx.compose.ui.graphics.PathEffect dashPathEffect(float[] intervals, optional float phase);
-    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect(androidx.compose.ui.graphics.Path shape, float advance, float phase, androidx.compose.ui.graphics.StampedPathEffectStyle style);
+    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect-czNbfQQ(androidx.compose.ui.graphics.Path shape, float advance, float phase, int style);
   }
 
-  public enum PathFillType {
-    enum_constant public static final androidx.compose.ui.graphics.PathFillType EvenOdd;
-    enum_constant public static final androidx.compose.ui.graphics.PathFillType NonZero;
+  @androidx.compose.runtime.Immutable public final inline class PathFillType {
+    ctor public PathFillType();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PathFillType.Companion Companion;
+  }
+
+  public static final class PathFillType.Companion {
+    method public int getEvenOdd-Rg-k1Os();
+    method public int getNonZero-Rg-k1Os();
+    property public final int EvenOdd;
+    property public final int NonZero;
   }
 
   public interface PathMeasure {
@@ -585,12 +695,36 @@
     property public abstract float length;
   }
 
-  public enum PathOperation {
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation difference;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation intersect;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation reverseDifference;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation union;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation xor;
+  @androidx.compose.runtime.Immutable public final inline class PathOperation {
+    ctor public PathOperation();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PathOperation.Companion Companion;
+  }
+
+  public static final class PathOperation.Companion {
+    method public int getDifference-b3I0S0c();
+    method public int getIntersect-b3I0S0c();
+    method public int getReverseDifference-b3I0S0c();
+    method public int getUnion-b3I0S0c();
+    method public int getXor-b3I0S0c();
+    property public final int Difference;
+    property public final int Intersect;
+    property public final int ReverseDifference;
+    property public final int Union;
+    property public final int Xor;
+  }
+
+  public final class PathOperationKt {
+    method @Deprecated public static int getDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getIntersect(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getReverseDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getUnion(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getXor(androidx.compose.ui.graphics.PathOperation.Companion);
   }
 
   public final class PixelMap {
@@ -608,10 +742,24 @@
     property public final int width;
   }
 
-  public enum PointMode {
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Lines;
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Points;
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Polygon;
+  @androidx.compose.runtime.Immutable public final inline class PointMode {
+    ctor public PointMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PointMode.Companion Companion;
+  }
+
+  public static final class PointMode.Companion {
+    method public int getLines-r_lszbg();
+    method public int getPoints-r_lszbg();
+    method public int getPolygon-r_lszbg();
+    property public final int Lines;
+    property public final int Points;
+    property public final int Polygon;
   }
 
   @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
@@ -635,9 +783,9 @@
   }
 
   public final class ShaderKt {
-    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional androidx.compose.ui.graphics.TileMode tileModeX, optional androidx.compose.ui.graphics.TileMode tileModeY);
-    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader ImageShader-UWo3-ZU(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
     method public static android.graphics.Shader SweepGradientShader-GpNgDDw(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
   }
 
@@ -671,81 +819,168 @@
     property public final long value;
   }
 
-  public enum StampedPathEffectStyle {
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Morph;
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Rotate;
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Translate;
+  @androidx.compose.runtime.Immutable public final inline class StampedPathEffectStyle {
+    ctor public StampedPathEffectStyle();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StampedPathEffectStyle.Companion Companion;
   }
 
-  public enum StrokeCap {
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Butt;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Round;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Square;
+  public static final class StampedPathEffectStyle.Companion {
+    method public int getMorph-Ypspkwk();
+    method public int getRotate-Ypspkwk();
+    method public int getTranslate-Ypspkwk();
+    property public final int Morph;
+    property public final int Rotate;
+    property public final int Translate;
   }
 
-  public enum StrokeJoin {
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Bevel;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Miter;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Round;
+  @androidx.compose.runtime.Immutable public final inline class StrokeCap {
+    ctor public StrokeCap();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StrokeCap.Companion Companion;
+  }
+
+  public static final class StrokeCap.Companion {
+    method public int getButt-KaPHkGw();
+    method public int getRound-KaPHkGw();
+    method public int getSquare-KaPHkGw();
+    property public final int Butt;
+    property public final int Round;
+    property public final int Square;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StrokeJoin {
+    ctor public StrokeJoin();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StrokeJoin.Companion Companion;
+  }
+
+  public static final class StrokeJoin.Companion {
+    method public int getBevel-LxFBmk8();
+    method public int getMiter-LxFBmk8();
+    method public int getRound-LxFBmk8();
+    property public final int Bevel;
+    property public final int Miter;
+    property public final int Round;
   }
 
   @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
     method public android.graphics.Shader createShader-uvyYCjk(long size);
   }
 
-  public enum TileMode {
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Clamp;
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Mirror;
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Repeated;
+  @androidx.compose.runtime.Immutable public final inline class TileMode {
+    ctor public TileMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.TileMode.Companion Companion;
   }
 
-  public enum VertexMode {
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleFan;
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleStrip;
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode Triangles;
+  public static final class TileMode.Companion {
+    method public int getClamp-3opZhB0();
+    method public int getMirror-3opZhB0();
+    method public int getRepeated-3opZhB0();
+    property public final int Clamp;
+    property public final int Mirror;
+    property public final int Repeated;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class VertexMode {
+    ctor public VertexMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.VertexMode.Companion Companion;
+  }
+
+  public static final class VertexMode.Companion {
+    method public int getTriangleFan-c2xauaI();
+    method public int getTriangleStrip-c2xauaI();
+    method public int getTriangles-c2xauaI();
+    property public final int TriangleFan;
+    property public final int TriangleStrip;
+    property public final int Triangles;
   }
 
   public final class Vertices {
-    ctor public Vertices(androidx.compose.ui.graphics.VertexMode vertexMode, java.util.List<androidx.compose.ui.geometry.Offset> positions, java.util.List<androidx.compose.ui.geometry.Offset> textureCoordinates, java.util.List<androidx.compose.ui.graphics.Color> colors, java.util.List<java.lang.Integer> indices);
     method public int[] getColors();
     method public short[] getIndices();
     method public float[] getPositions();
     method public float[] getTextureCoordinates();
-    method public androidx.compose.ui.graphics.VertexMode getVertexMode();
+    method public int getVertexMode-c2xauaI();
     property public final int[] colors;
     property public final short[] indices;
     property public final float[] positions;
     property public final float[] textureCoordinates;
-    property public final androidx.compose.ui.graphics.VertexMode vertexMode;
+    property public final int vertexMode;
   }
 
 }
 
 package androidx.compose.ui.graphics.colorspace {
 
-  public enum Adaptation {
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  public abstract class Adaptation {
+    field public static final androidx.compose.ui.graphics.colorspace.Adaptation.Companion Companion;
   }
 
-  public enum ColorModel {
-    method public final int getComponentCount();
-    property public final int componentCount;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Cmyk;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Lab;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Rgb;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Xyz;
+  public static final class Adaptation.Companion {
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getBradford();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getCiecat02();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getVonKries();
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ColorModel {
+    ctor public ColorModel();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getComponentCount-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.graphics.colorspace.ColorModel.Companion Companion;
+  }
+
+  public static final class ColorModel.Companion {
+    method public long getCmyk-xdoWZVw();
+    method public long getLab-xdoWZVw();
+    method public long getRgb-xdoWZVw();
+    method public long getXyz-xdoWZVw();
+    property public final long Cmyk;
+    property public final long Lab;
+    property public final long Rgb;
+    property public final long Xyz;
   }
 
   public abstract class ColorSpace {
-    ctor public ColorSpace(String name, androidx.compose.ui.graphics.colorspace.ColorModel model);
     method public final float[] fromXyz(float x, float y, float z);
     method public abstract float[] fromXyz(float[] v);
     method public final int getComponentCount();
     method public abstract float getMaxValue(int component);
     method public abstract float getMinValue(int component);
-    method public final androidx.compose.ui.graphics.colorspace.ColorModel getModel();
+    method public final long getModel-xdoWZVw();
     method public final String getName();
     method public boolean isSrgb();
     method public abstract boolean isWideGamut();
@@ -754,14 +989,14 @@
     property public final int componentCount;
     property public boolean isSrgb;
     property public abstract boolean isWideGamut;
-    property public final androidx.compose.ui.graphics.colorspace.ColorModel model;
+    property public final long model;
     property public final String name;
   }
 
   public final class ColorSpaceKt {
     method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, optional androidx.compose.ui.graphics.colorspace.Adaptation adaptation);
     method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint);
-    method public static androidx.compose.ui.graphics.colorspace.Connector connect(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional androidx.compose.ui.graphics.colorspace.RenderIntent intent);
+    method public static androidx.compose.ui.graphics.colorspace.Connector connect-InwLUsE(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional int intent);
   }
 
   public final class ColorSpaces {
@@ -803,12 +1038,12 @@
 
   public class Connector {
     method public final androidx.compose.ui.graphics.colorspace.ColorSpace getDestination();
-    method public final androidx.compose.ui.graphics.colorspace.RenderIntent getRenderIntent();
+    method public final int getRenderIntent-uksYyKA();
     method public final androidx.compose.ui.graphics.colorspace.ColorSpace getSource();
     method public final float[] transform(float r, float g, float b);
     method public float[] transform(float[] v);
     property public final androidx.compose.ui.graphics.colorspace.ColorSpace destination;
-    property public final androidx.compose.ui.graphics.colorspace.RenderIntent renderIntent;
+    property public final int renderIntent;
     property public final androidx.compose.ui.graphics.colorspace.ColorSpace source;
   }
 
@@ -834,11 +1069,26 @@
     field public static final androidx.compose.ui.graphics.colorspace.Illuminant INSTANCE;
   }
 
-  public enum RenderIntent {
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Absolute;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Perceptual;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Relative;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Saturation;
+  @androidx.compose.runtime.Immutable public final inline class RenderIntent {
+    ctor public RenderIntent();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.colorspace.RenderIntent.Companion Companion;
+  }
+
+  public static final class RenderIntent.Companion {
+    method public int getAbsolute-uksYyKA();
+    method public int getPerceptual-uksYyKA();
+    method public int getRelative-uksYyKA();
+    method public int getSaturation-uksYyKA();
+    property public final int Absolute;
+    property public final int Perceptual;
+    property public final int Relative;
+    property public final int Saturation;
   }
 
   public final class Rgb extends androidx.compose.ui.graphics.colorspace.ColorSpace {
@@ -920,24 +1170,24 @@
   public final class CanvasDrawScope implements androidx.compose.ui.graphics.drawscope.DrawScope {
     ctor public CanvasDrawScope();
     method public inline void draw-jkGVKLE(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
-    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath-_TD-E3k(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
     method public float getDensity();
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public float getFontScale();
@@ -966,24 +1216,24 @@
   }
 
   @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawScope extends androidx.compose.ui.unit.Density {
-    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-NGaRamM(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-fNghmuc(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle-NGaRamM(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath-_TD-E3k(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect-fNghmuc(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public default long getCenter-F1C5BW0();
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
@@ -997,13 +1247,13 @@
   }
 
   public static final class DrawScope.Companion {
-    method public androidx.compose.ui.graphics.BlendMode getDefaultBlendMode();
-    property public final androidx.compose.ui.graphics.BlendMode DefaultBlendMode;
+    method public int getDefaultBlendMode-0nO6VwU();
+    property public final int DefaultBlendMode;
   }
 
   public final class DrawScopeKt {
-    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
-    method public static inline void clipRect(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipPath--PbAnyU(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipRect-2ny_0ws(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
     method public static inline void drawIntoCanvas(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
     method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
     method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float inset, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
@@ -1023,8 +1273,8 @@
   }
 
   @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawTransform {
-    method public void clipPath(androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipPath-fquoRGU(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public void clipRect-wxHPq4g(optional float left, optional float top, optional float right, optional float bottom, optional int clipOp);
     method public default long getCenter-F1C5BW0();
     method public long getSize-NH-jbRc();
     method public void inset(float left, float top, float right, float bottom);
@@ -1048,14 +1298,13 @@
   }
 
   public final class Stroke extends androidx.compose.ui.graphics.drawscope.DrawStyle {
-    ctor public Stroke(optional float width, optional float miter, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.StrokeJoin join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
-    method public androidx.compose.ui.graphics.StrokeCap getCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getJoin();
+    method public int getCap-KaPHkGw();
+    method public int getJoin-LxFBmk8();
     method public float getMiter();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public float getWidth();
-    property public final androidx.compose.ui.graphics.StrokeCap cap;
-    property public final androidx.compose.ui.graphics.StrokeJoin join;
+    property public final int cap;
+    property public final int join;
     property public final float miter;
     property public final androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public final float width;
@@ -1065,10 +1314,10 @@
   }
 
   public static final class Stroke.Companion {
-    method public androidx.compose.ui.graphics.StrokeCap getDefaultCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getDefaultJoin();
-    property public final androidx.compose.ui.graphics.StrokeCap DefaultCap;
-    property public final androidx.compose.ui.graphics.StrokeJoin DefaultJoin;
+    method public int getDefaultCap-KaPHkGw();
+    method public int getDefaultJoin-LxFBmk8();
+    property public final int DefaultCap;
+    property public final int DefaultJoin;
   }
 
 }
diff --git a/compose/ui/ui-graphics/api/public_plus_experimental_1.0.0-beta08.txt b/compose/ui/ui-graphics/api/public_plus_experimental_1.0.0-beta08.txt
index 4ac2634..b417872 100644
--- a/compose/ui/ui-graphics/api/public_plus_experimental_1.0.0-beta08.txt
+++ b/compose/ui/ui-graphics/api/public_plus_experimental_1.0.0-beta08.txt
@@ -2,7 +2,7 @@
 package androidx.compose.ui.graphics {
 
   public final class AndroidBlendMode_androidKt {
-    method public static boolean isSupported(androidx.compose.ui.graphics.BlendMode);
+    method public static boolean isSupported-s9anfk8(int);
   }
 
   public final class AndroidCanvas_androidKt {
@@ -29,44 +29,44 @@
     ctor public AndroidPaint();
     method public android.graphics.Paint asFrameworkPaint();
     method public float getAlpha();
-    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public int getBlendMode-0nO6VwU();
     method public long getColor-0d7_KjU();
     method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
-    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public int getFilterQuality-f-v9h1I();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public android.graphics.Shader? getShader();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public int getStrokeCap-KaPHkGw();
+    method public int getStrokeJoin-LxFBmk8();
     method public float getStrokeMiterLimit();
     method public float getStrokeWidth();
-    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public int getStyle-TiuSbCo();
     method public boolean isAntiAlias();
     method public void setAlpha(float value);
     method public void setAntiAlias(boolean value);
-    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode value);
+    method public void setBlendMode-s9anfk8(int value);
     method public void setColor-8_81llA(long color);
     method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
-    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality value);
+    method public void setFilterQuality-vDHp3xo(int value);
     method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
     method public void setShader(android.graphics.Shader? value);
-    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap value);
-    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin value);
+    method public void setStrokeCap-BeK7IIE(int value);
+    method public void setStrokeJoin-Ww9F2mQ(int value);
     method public void setStrokeMiterLimit(float value);
     method public void setStrokeWidth(float value);
-    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle value);
+    method public void setStyle-k9PVt8s(int value);
     property public float alpha;
-    property public androidx.compose.ui.graphics.BlendMode blendMode;
+    property public int blendMode;
     property public long color;
     property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
-    property public androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public int filterQuality;
     property public boolean isAntiAlias;
     property public androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public android.graphics.Shader? shader;
-    property public androidx.compose.ui.graphics.StrokeCap strokeCap;
-    property public androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public int strokeCap;
+    property public int strokeJoin;
     property public float strokeMiterLimit;
     property public float strokeWidth;
-    property public androidx.compose.ui.graphics.PaintingStyle style;
+    property public int style;
   }
 
   public final class AndroidPaint_androidKt {
@@ -85,22 +85,22 @@
     method public void close();
     method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.compose.ui.geometry.Rect getBounds();
-    method public androidx.compose.ui.graphics.PathFillType getFillType();
+    method public int getFillType-Rg-k1Os();
     method public android.graphics.Path getInternalPath();
     method public boolean isConvex();
     method public boolean isEmpty();
     method public void lineTo(float x, float y);
     method public void moveTo(float x, float y);
-    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, androidx.compose.ui.graphics.PathOperation operation);
+    method public boolean op-xiGExi0(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
     method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
     method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
     method public void relativeLineTo(float dx, float dy);
     method public void relativeMoveTo(float dx, float dy);
     method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
     method public void reset();
-    method public void setFillType(androidx.compose.ui.graphics.PathFillType value);
+    method public void setFillType-oQ8Xj4U(int value);
     method public void translate-k-4lQ0M(long offset);
-    property public androidx.compose.ui.graphics.PathFillType fillType;
+    property public int fillType;
     property public final android.graphics.Path internalPath;
     property public boolean isConvex;
     property public boolean isEmpty;
@@ -132,43 +132,83 @@
   }
 
   public final class AndroidTileMode_androidKt {
-    method public static android.graphics.Shader.TileMode toNativeTileMode(androidx.compose.ui.graphics.TileMode);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode-0vamqd0(int);
   }
 
   public final class AndroidVertexMode_androidKt {
-    method public static android.graphics.Canvas.VertexMode toNativeVertexMode(androidx.compose.ui.graphics.VertexMode);
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode-JOOmi9M(int);
   }
 
-  public enum BlendMode {
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Clear;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Color;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorBurn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorDodge;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Darken;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Difference;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Dst;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstAtop;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstIn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOut;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOver;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Exclusion;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hardlight;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hue;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Lighten;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Luminosity;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Modulate;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Multiply;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Overlay;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Plus;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Saturation;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Screen;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Softlight;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Src;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcAtop;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcIn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOut;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOver;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Xor;
+  @androidx.compose.runtime.Immutable public final inline class BlendMode {
+    ctor public BlendMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.BlendMode.Companion Companion;
+  }
+
+  public static final class BlendMode.Companion {
+    method public int getClear-0nO6VwU();
+    method public int getColor-0nO6VwU();
+    method public int getColorBurn-0nO6VwU();
+    method public int getColorDodge-0nO6VwU();
+    method public int getDarken-0nO6VwU();
+    method public int getDifference-0nO6VwU();
+    method public int getDst-0nO6VwU();
+    method public int getDstAtop-0nO6VwU();
+    method public int getDstIn-0nO6VwU();
+    method public int getDstOut-0nO6VwU();
+    method public int getDstOver-0nO6VwU();
+    method public int getExclusion-0nO6VwU();
+    method public int getHardlight-0nO6VwU();
+    method public int getHue-0nO6VwU();
+    method public int getLighten-0nO6VwU();
+    method public int getLuminosity-0nO6VwU();
+    method public int getModulate-0nO6VwU();
+    method public int getMultiply-0nO6VwU();
+    method public int getOverlay-0nO6VwU();
+    method public int getPlus-0nO6VwU();
+    method public int getSaturation-0nO6VwU();
+    method public int getScreen-0nO6VwU();
+    method public int getSoftlight-0nO6VwU();
+    method public int getSrc-0nO6VwU();
+    method public int getSrcAtop-0nO6VwU();
+    method public int getSrcIn-0nO6VwU();
+    method public int getSrcOut-0nO6VwU();
+    method public int getSrcOver-0nO6VwU();
+    method public int getXor-0nO6VwU();
+    property public final int Clear;
+    property public final int Color;
+    property public final int ColorBurn;
+    property public final int ColorDodge;
+    property public final int Darken;
+    property public final int Difference;
+    property public final int Dst;
+    property public final int DstAtop;
+    property public final int DstIn;
+    property public final int DstOut;
+    property public final int DstOver;
+    property public final int Exclusion;
+    property public final int Hardlight;
+    property public final int Hue;
+    property public final int Lighten;
+    property public final int Luminosity;
+    property public final int Modulate;
+    property public final int Multiply;
+    property public final int Overlay;
+    property public final int Plus;
+    property public final int Saturation;
+    property public final int Screen;
+    property public final int Softlight;
+    property public final int Src;
+    property public final int SrcAtop;
+    property public final int SrcIn;
+    property public final int SrcOut;
+    property public final int SrcOver;
+    property public final int Xor;
   }
 
   @androidx.compose.runtime.Immutable public abstract sealed class Brush {
@@ -177,16 +217,16 @@
   }
 
   public static final class Brush.Companion {
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient-CcUA5qQ(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient-NvQjRjk(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional int tileMode);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-PvDSl28(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-acbAMd8(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient-CcUA5qQ(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient-NvQjRjk(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional int tileMode);
   }
 
   public final class BrushKt {
@@ -194,9 +234,9 @@
   }
 
   public interface Canvas {
-    method public void clipPath(androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public void clipRect(float left, float top, float right, float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipPath-fquoRGU(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public default void clipRect-MsRSx38(androidx.compose.ui.geometry.Rect rect, optional int clipOp);
+    method public void clipRect-wxHPq4g(float left, float top, float right, float bottom, optional int clipOp);
     method public void concat-58bKbWc(float[] matrix);
     method public void disableZ();
     method public default void drawArc(androidx.compose.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
@@ -209,12 +249,12 @@
     method public default void drawOval(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
     method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
-    method public void drawPoints(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
-    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints-iVdqbVo(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints-59E74cI(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
     method public default void drawRect(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
     method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
-    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, androidx.compose.ui.graphics.BlendMode blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices-nA16xIE(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
     method public void enableZ();
     method public void restore();
     method public void rotate(float degrees);
@@ -240,9 +280,22 @@
     method public static inline void withSaveLayer(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint, kotlin.jvm.functions.Function0<kotlin.Unit> block);
   }
 
-  public enum ClipOp {
-    enum_constant public static final androidx.compose.ui.graphics.ClipOp Difference;
-    enum_constant public static final androidx.compose.ui.graphics.ClipOp Intersect;
+  @androidx.compose.runtime.Immutable public final inline class ClipOp {
+    ctor public ClipOp();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ClipOp.Companion Companion;
+  }
+
+  public static final class ClipOp.Companion {
+    method public int getDifference-rtfAjoo();
+    method public int getIntersect-rtfAjoo();
+    property public final int Difference;
+    property public final int Intersect;
   }
 
   @androidx.compose.runtime.Immutable public final inline class Color {
@@ -305,7 +358,7 @@
   public static final class ColorFilter.Companion {
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter colorMatrix-jHG-Opc(float[] colorMatrix);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting-6xK2E-Q(long multiply, long add);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional int blendMode);
   }
 
   public final class ColorKt {
@@ -348,11 +401,26 @@
   public final class DegreesKt {
   }
 
-  public enum FilterQuality {
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality High;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Low;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Medium;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality None;
+  @androidx.compose.runtime.Immutable public final inline class FilterQuality {
+    ctor public FilterQuality();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.FilterQuality.Companion Companion;
+  }
+
+  public static final class FilterQuality.Companion {
+    method public int getHigh-f-v9h1I();
+    method public int getLow-f-v9h1I();
+    method public int getMedium-f-v9h1I();
+    method public int getNone-f-v9h1I();
+    property public final int High;
+    property public final int Low;
+    property public final int Medium;
+    property public final int None;
   }
 
   public final class Float16Kt {
@@ -360,14 +428,14 @@
 
   public interface ImageBitmap {
     method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
-    method public androidx.compose.ui.graphics.ImageBitmapConfig getConfig();
+    method public int getConfig-_sVssgQ();
     method public boolean getHasAlpha();
     method public int getHeight();
     method public int getWidth();
     method public void prepareToDraw();
     method public void readPixels(int[] buffer, optional int startX, optional int startY, optional int width, optional int height, optional int bufferOffset, optional int stride);
     property public abstract androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
-    property public abstract androidx.compose.ui.graphics.ImageBitmapConfig config;
+    property public abstract int config;
     property public abstract boolean hasAlpha;
     property public abstract int height;
     property public abstract int width;
@@ -377,16 +445,32 @@
   public static final class ImageBitmap.Companion {
   }
 
-  public enum ImageBitmapConfig {
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Alpha8;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Argb8888;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig F16;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Gpu;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Rgb565;
+  @androidx.compose.runtime.Immutable public final inline class ImageBitmapConfig {
+    ctor public ImageBitmapConfig();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ImageBitmapConfig.Companion Companion;
+  }
+
+  public static final class ImageBitmapConfig.Companion {
+    method public int getAlpha8-_sVssgQ();
+    method public int getArgb8888-_sVssgQ();
+    method public int getF16-_sVssgQ();
+    method public int getGpu-_sVssgQ();
+    method public int getRgb565-_sVssgQ();
+    property public final int Alpha8;
+    property public final int Argb8888;
+    property public final int F16;
+    property public final int Gpu;
+    property public final int Rgb565;
   }
 
   public final class ImageBitmapKt {
-    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional androidx.compose.ui.graphics.ImageBitmapConfig config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap-E8BOdIU(int width, int height, optional int config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
     method public static androidx.compose.ui.graphics.PixelMap toPixelMap(androidx.compose.ui.graphics.ImageBitmap, optional int startX, optional int startY, optional int width, optional int height, optional int[] buffer, optional int bufferOffset, optional int stride);
   }
 
@@ -469,61 +553,74 @@
 
   public final class OutlineKt {
     method public static void addOutline(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Outline outline);
-    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
     method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
-    method public static void drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public static void drawOutline-Ar0j1Zw(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
   }
 
   public interface Paint {
     method public android.graphics.Paint asFrameworkPaint();
     method public float getAlpha();
-    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public int getBlendMode-0nO6VwU();
     method public long getColor-0d7_KjU();
     method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
-    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public int getFilterQuality-f-v9h1I();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public android.graphics.Shader? getShader();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public int getStrokeCap-KaPHkGw();
+    method public int getStrokeJoin-LxFBmk8();
     method public float getStrokeMiterLimit();
     method public float getStrokeWidth();
-    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public int getStyle-TiuSbCo();
     method public boolean isAntiAlias();
     method public void setAlpha(float p);
     method public void setAntiAlias(boolean p);
-    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode p);
+    method public void setBlendMode-s9anfk8(int p);
     method public void setColor-8_81llA(long p);
     method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? p);
-    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality p);
+    method public void setFilterQuality-vDHp3xo(int p);
     method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? p);
     method public void setShader(android.graphics.Shader? p);
-    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap p);
-    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin p);
+    method public void setStrokeCap-BeK7IIE(int p);
+    method public void setStrokeJoin-Ww9F2mQ(int p);
     method public void setStrokeMiterLimit(float p);
     method public void setStrokeWidth(float p);
-    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle p);
+    method public void setStyle-k9PVt8s(int p);
     property public abstract float alpha;
-    property public abstract androidx.compose.ui.graphics.BlendMode blendMode;
+    property public abstract int blendMode;
     property public abstract long color;
     property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
-    property public abstract androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public abstract int filterQuality;
     property public abstract boolean isAntiAlias;
     property public abstract androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public abstract android.graphics.Shader? shader;
-    property public abstract androidx.compose.ui.graphics.StrokeCap strokeCap;
-    property public abstract androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public abstract int strokeCap;
+    property public abstract int strokeJoin;
     property public abstract float strokeMiterLimit;
     property public abstract float strokeWidth;
-    property public abstract androidx.compose.ui.graphics.PaintingStyle style;
+    property public abstract int style;
   }
 
   public final class PaintKt {
     field public static final float DefaultAlpha = 1.0f;
   }
 
-  public enum PaintingStyle {
-    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Fill;
-    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Stroke;
+  @androidx.compose.runtime.Immutable public final inline class PaintingStyle {
+    ctor public PaintingStyle();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PaintingStyle.Companion Companion;
+  }
+
+  public static final class PaintingStyle.Companion {
+    method public int getFill-TiuSbCo();
+    method public int getStroke-TiuSbCo();
+    property public final int Fill;
+    property public final int Stroke;
   }
 
   public interface Path {
@@ -538,28 +635,28 @@
     method public void close();
     method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.compose.ui.geometry.Rect getBounds();
-    method public androidx.compose.ui.graphics.PathFillType getFillType();
+    method public int getFillType-Rg-k1Os();
     method public boolean isConvex();
     method public boolean isEmpty();
     method public void lineTo(float x, float y);
     method public void moveTo(float x, float y);
-    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, androidx.compose.ui.graphics.PathOperation operation);
+    method public boolean op-xiGExi0(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
     method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
     method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
     method public void relativeLineTo(float dx, float dy);
     method public void relativeMoveTo(float dx, float dy);
     method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
     method public void reset();
-    method public void setFillType(androidx.compose.ui.graphics.PathFillType p);
+    method public void setFillType-oQ8Xj4U(int p);
     method public void translate-k-4lQ0M(long offset);
-    property public abstract androidx.compose.ui.graphics.PathFillType fillType;
+    property public abstract int fillType;
     property public abstract boolean isConvex;
     property public abstract boolean isEmpty;
     field public static final androidx.compose.ui.graphics.Path.Companion Companion;
   }
 
   public static final class Path.Companion {
-    method public androidx.compose.ui.graphics.Path combine(androidx.compose.ui.graphics.PathOperation operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
+    method public androidx.compose.ui.graphics.Path combine-mTgLSnE(int operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
   }
 
   public interface PathEffect {
@@ -570,12 +667,25 @@
     method public androidx.compose.ui.graphics.PathEffect chainPathEffect(androidx.compose.ui.graphics.PathEffect outer, androidx.compose.ui.graphics.PathEffect inner);
     method public androidx.compose.ui.graphics.PathEffect cornerPathEffect(float radius);
     method public androidx.compose.ui.graphics.PathEffect dashPathEffect(float[] intervals, optional float phase);
-    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect(androidx.compose.ui.graphics.Path shape, float advance, float phase, androidx.compose.ui.graphics.StampedPathEffectStyle style);
+    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect-czNbfQQ(androidx.compose.ui.graphics.Path shape, float advance, float phase, int style);
   }
 
-  public enum PathFillType {
-    enum_constant public static final androidx.compose.ui.graphics.PathFillType EvenOdd;
-    enum_constant public static final androidx.compose.ui.graphics.PathFillType NonZero;
+  @androidx.compose.runtime.Immutable public final inline class PathFillType {
+    ctor public PathFillType();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PathFillType.Companion Companion;
+  }
+
+  public static final class PathFillType.Companion {
+    method public int getEvenOdd-Rg-k1Os();
+    method public int getNonZero-Rg-k1Os();
+    property public final int EvenOdd;
+    property public final int NonZero;
   }
 
   public interface PathMeasure {
@@ -585,12 +695,36 @@
     property public abstract float length;
   }
 
-  public enum PathOperation {
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation difference;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation intersect;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation reverseDifference;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation union;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation xor;
+  @androidx.compose.runtime.Immutable public final inline class PathOperation {
+    ctor public PathOperation();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PathOperation.Companion Companion;
+  }
+
+  public static final class PathOperation.Companion {
+    method public int getDifference-b3I0S0c();
+    method public int getIntersect-b3I0S0c();
+    method public int getReverseDifference-b3I0S0c();
+    method public int getUnion-b3I0S0c();
+    method public int getXor-b3I0S0c();
+    property public final int Difference;
+    property public final int Intersect;
+    property public final int ReverseDifference;
+    property public final int Union;
+    property public final int Xor;
+  }
+
+  public final class PathOperationKt {
+    method @Deprecated public static int getDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getIntersect(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getReverseDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getUnion(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getXor(androidx.compose.ui.graphics.PathOperation.Companion);
   }
 
   public final class PixelMap {
@@ -608,10 +742,24 @@
     property public final int width;
   }
 
-  public enum PointMode {
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Lines;
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Points;
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Polygon;
+  @androidx.compose.runtime.Immutable public final inline class PointMode {
+    ctor public PointMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PointMode.Companion Companion;
+  }
+
+  public static final class PointMode.Companion {
+    method public int getLines-r_lszbg();
+    method public int getPoints-r_lszbg();
+    method public int getPolygon-r_lszbg();
+    property public final int Lines;
+    property public final int Points;
+    property public final int Polygon;
   }
 
   @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
@@ -635,9 +783,9 @@
   }
 
   public final class ShaderKt {
-    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional androidx.compose.ui.graphics.TileMode tileModeX, optional androidx.compose.ui.graphics.TileMode tileModeY);
-    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader ImageShader-UWo3-ZU(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
     method public static android.graphics.Shader SweepGradientShader-GpNgDDw(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
   }
 
@@ -671,81 +819,168 @@
     property public final long value;
   }
 
-  public enum StampedPathEffectStyle {
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Morph;
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Rotate;
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Translate;
+  @androidx.compose.runtime.Immutable public final inline class StampedPathEffectStyle {
+    ctor public StampedPathEffectStyle();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StampedPathEffectStyle.Companion Companion;
   }
 
-  public enum StrokeCap {
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Butt;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Round;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Square;
+  public static final class StampedPathEffectStyle.Companion {
+    method public int getMorph-Ypspkwk();
+    method public int getRotate-Ypspkwk();
+    method public int getTranslate-Ypspkwk();
+    property public final int Morph;
+    property public final int Rotate;
+    property public final int Translate;
   }
 
-  public enum StrokeJoin {
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Bevel;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Miter;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Round;
+  @androidx.compose.runtime.Immutable public final inline class StrokeCap {
+    ctor public StrokeCap();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StrokeCap.Companion Companion;
+  }
+
+  public static final class StrokeCap.Companion {
+    method public int getButt-KaPHkGw();
+    method public int getRound-KaPHkGw();
+    method public int getSquare-KaPHkGw();
+    property public final int Butt;
+    property public final int Round;
+    property public final int Square;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StrokeJoin {
+    ctor public StrokeJoin();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StrokeJoin.Companion Companion;
+  }
+
+  public static final class StrokeJoin.Companion {
+    method public int getBevel-LxFBmk8();
+    method public int getMiter-LxFBmk8();
+    method public int getRound-LxFBmk8();
+    property public final int Bevel;
+    property public final int Miter;
+    property public final int Round;
   }
 
   @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
     method public android.graphics.Shader createShader-uvyYCjk(long size);
   }
 
-  public enum TileMode {
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Clamp;
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Mirror;
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Repeated;
+  @androidx.compose.runtime.Immutable public final inline class TileMode {
+    ctor public TileMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.TileMode.Companion Companion;
   }
 
-  public enum VertexMode {
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleFan;
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleStrip;
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode Triangles;
+  public static final class TileMode.Companion {
+    method public int getClamp-3opZhB0();
+    method public int getMirror-3opZhB0();
+    method public int getRepeated-3opZhB0();
+    property public final int Clamp;
+    property public final int Mirror;
+    property public final int Repeated;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class VertexMode {
+    ctor public VertexMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.VertexMode.Companion Companion;
+  }
+
+  public static final class VertexMode.Companion {
+    method public int getTriangleFan-c2xauaI();
+    method public int getTriangleStrip-c2xauaI();
+    method public int getTriangles-c2xauaI();
+    property public final int TriangleFan;
+    property public final int TriangleStrip;
+    property public final int Triangles;
   }
 
   public final class Vertices {
-    ctor public Vertices(androidx.compose.ui.graphics.VertexMode vertexMode, java.util.List<androidx.compose.ui.geometry.Offset> positions, java.util.List<androidx.compose.ui.geometry.Offset> textureCoordinates, java.util.List<androidx.compose.ui.graphics.Color> colors, java.util.List<java.lang.Integer> indices);
     method public int[] getColors();
     method public short[] getIndices();
     method public float[] getPositions();
     method public float[] getTextureCoordinates();
-    method public androidx.compose.ui.graphics.VertexMode getVertexMode();
+    method public int getVertexMode-c2xauaI();
     property public final int[] colors;
     property public final short[] indices;
     property public final float[] positions;
     property public final float[] textureCoordinates;
-    property public final androidx.compose.ui.graphics.VertexMode vertexMode;
+    property public final int vertexMode;
   }
 
 }
 
 package androidx.compose.ui.graphics.colorspace {
 
-  public enum Adaptation {
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  public abstract class Adaptation {
+    field public static final androidx.compose.ui.graphics.colorspace.Adaptation.Companion Companion;
   }
 
-  public enum ColorModel {
-    method public final int getComponentCount();
-    property public final int componentCount;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Cmyk;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Lab;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Rgb;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Xyz;
+  public static final class Adaptation.Companion {
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getBradford();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getCiecat02();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getVonKries();
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ColorModel {
+    ctor public ColorModel();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getComponentCount-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.graphics.colorspace.ColorModel.Companion Companion;
+  }
+
+  public static final class ColorModel.Companion {
+    method public long getCmyk-xdoWZVw();
+    method public long getLab-xdoWZVw();
+    method public long getRgb-xdoWZVw();
+    method public long getXyz-xdoWZVw();
+    property public final long Cmyk;
+    property public final long Lab;
+    property public final long Rgb;
+    property public final long Xyz;
   }
 
   public abstract class ColorSpace {
-    ctor public ColorSpace(String name, androidx.compose.ui.graphics.colorspace.ColorModel model);
     method public final float[] fromXyz(float x, float y, float z);
     method public abstract float[] fromXyz(float[] v);
     method public final int getComponentCount();
     method public abstract float getMaxValue(int component);
     method public abstract float getMinValue(int component);
-    method public final androidx.compose.ui.graphics.colorspace.ColorModel getModel();
+    method public final long getModel-xdoWZVw();
     method public final String getName();
     method public boolean isSrgb();
     method public abstract boolean isWideGamut();
@@ -754,14 +989,14 @@
     property public final int componentCount;
     property public boolean isSrgb;
     property public abstract boolean isWideGamut;
-    property public final androidx.compose.ui.graphics.colorspace.ColorModel model;
+    property public final long model;
     property public final String name;
   }
 
   public final class ColorSpaceKt {
     method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, optional androidx.compose.ui.graphics.colorspace.Adaptation adaptation);
     method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint);
-    method public static androidx.compose.ui.graphics.colorspace.Connector connect(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional androidx.compose.ui.graphics.colorspace.RenderIntent intent);
+    method public static androidx.compose.ui.graphics.colorspace.Connector connect-InwLUsE(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional int intent);
   }
 
   public final class ColorSpaces {
@@ -803,12 +1038,12 @@
 
   public class Connector {
     method public final androidx.compose.ui.graphics.colorspace.ColorSpace getDestination();
-    method public final androidx.compose.ui.graphics.colorspace.RenderIntent getRenderIntent();
+    method public final int getRenderIntent-uksYyKA();
     method public final androidx.compose.ui.graphics.colorspace.ColorSpace getSource();
     method public final float[] transform(float r, float g, float b);
     method public float[] transform(float[] v);
     property public final androidx.compose.ui.graphics.colorspace.ColorSpace destination;
-    property public final androidx.compose.ui.graphics.colorspace.RenderIntent renderIntent;
+    property public final int renderIntent;
     property public final androidx.compose.ui.graphics.colorspace.ColorSpace source;
   }
 
@@ -834,11 +1069,26 @@
     field public static final androidx.compose.ui.graphics.colorspace.Illuminant INSTANCE;
   }
 
-  public enum RenderIntent {
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Absolute;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Perceptual;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Relative;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Saturation;
+  @androidx.compose.runtime.Immutable public final inline class RenderIntent {
+    ctor public RenderIntent();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.colorspace.RenderIntent.Companion Companion;
+  }
+
+  public static final class RenderIntent.Companion {
+    method public int getAbsolute-uksYyKA();
+    method public int getPerceptual-uksYyKA();
+    method public int getRelative-uksYyKA();
+    method public int getSaturation-uksYyKA();
+    property public final int Absolute;
+    property public final int Perceptual;
+    property public final int Relative;
+    property public final int Saturation;
   }
 
   public final class Rgb extends androidx.compose.ui.graphics.colorspace.ColorSpace {
@@ -920,24 +1170,24 @@
   public final class CanvasDrawScope implements androidx.compose.ui.graphics.drawscope.DrawScope {
     ctor public CanvasDrawScope();
     method public inline void draw-jkGVKLE(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
-    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath-_TD-E3k(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
     method public float getDensity();
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public float getFontScale();
@@ -966,24 +1216,24 @@
   }
 
   @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawScope extends androidx.compose.ui.unit.Density {
-    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-NGaRamM(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-fNghmuc(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle-NGaRamM(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath-_TD-E3k(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect-fNghmuc(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public default long getCenter-F1C5BW0();
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
@@ -997,13 +1247,13 @@
   }
 
   public static final class DrawScope.Companion {
-    method public androidx.compose.ui.graphics.BlendMode getDefaultBlendMode();
-    property public final androidx.compose.ui.graphics.BlendMode DefaultBlendMode;
+    method public int getDefaultBlendMode-0nO6VwU();
+    property public final int DefaultBlendMode;
   }
 
   public final class DrawScopeKt {
-    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
-    method public static inline void clipRect(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipPath--PbAnyU(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipRect-2ny_0ws(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
     method public static inline void drawIntoCanvas(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
     method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
     method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float inset, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
@@ -1023,8 +1273,8 @@
   }
 
   @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawTransform {
-    method public void clipPath(androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipPath-fquoRGU(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public void clipRect-wxHPq4g(optional float left, optional float top, optional float right, optional float bottom, optional int clipOp);
     method public default long getCenter-F1C5BW0();
     method public long getSize-NH-jbRc();
     method public void inset(float left, float top, float right, float bottom);
@@ -1048,14 +1298,13 @@
   }
 
   public final class Stroke extends androidx.compose.ui.graphics.drawscope.DrawStyle {
-    ctor public Stroke(optional float width, optional float miter, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.StrokeJoin join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
-    method public androidx.compose.ui.graphics.StrokeCap getCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getJoin();
+    method public int getCap-KaPHkGw();
+    method public int getJoin-LxFBmk8();
     method public float getMiter();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public float getWidth();
-    property public final androidx.compose.ui.graphics.StrokeCap cap;
-    property public final androidx.compose.ui.graphics.StrokeJoin join;
+    property public final int cap;
+    property public final int join;
     property public final float miter;
     property public final androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public final float width;
@@ -1065,10 +1314,10 @@
   }
 
   public static final class Stroke.Companion {
-    method public androidx.compose.ui.graphics.StrokeCap getDefaultCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getDefaultJoin();
-    property public final androidx.compose.ui.graphics.StrokeCap DefaultCap;
-    property public final androidx.compose.ui.graphics.StrokeJoin DefaultJoin;
+    method public int getDefaultCap-KaPHkGw();
+    method public int getDefaultJoin-LxFBmk8();
+    property public final int DefaultCap;
+    property public final int DefaultJoin;
   }
 
 }
diff --git a/compose/ui/ui-graphics/api/public_plus_experimental_current.txt b/compose/ui/ui-graphics/api/public_plus_experimental_current.txt
index 4ac2634..b417872 100644
--- a/compose/ui/ui-graphics/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-graphics/api/public_plus_experimental_current.txt
@@ -2,7 +2,7 @@
 package androidx.compose.ui.graphics {
 
   public final class AndroidBlendMode_androidKt {
-    method public static boolean isSupported(androidx.compose.ui.graphics.BlendMode);
+    method public static boolean isSupported-s9anfk8(int);
   }
 
   public final class AndroidCanvas_androidKt {
@@ -29,44 +29,44 @@
     ctor public AndroidPaint();
     method public android.graphics.Paint asFrameworkPaint();
     method public float getAlpha();
-    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public int getBlendMode-0nO6VwU();
     method public long getColor-0d7_KjU();
     method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
-    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public int getFilterQuality-f-v9h1I();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public android.graphics.Shader? getShader();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public int getStrokeCap-KaPHkGw();
+    method public int getStrokeJoin-LxFBmk8();
     method public float getStrokeMiterLimit();
     method public float getStrokeWidth();
-    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public int getStyle-TiuSbCo();
     method public boolean isAntiAlias();
     method public void setAlpha(float value);
     method public void setAntiAlias(boolean value);
-    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode value);
+    method public void setBlendMode-s9anfk8(int value);
     method public void setColor-8_81llA(long color);
     method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
-    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality value);
+    method public void setFilterQuality-vDHp3xo(int value);
     method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
     method public void setShader(android.graphics.Shader? value);
-    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap value);
-    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin value);
+    method public void setStrokeCap-BeK7IIE(int value);
+    method public void setStrokeJoin-Ww9F2mQ(int value);
     method public void setStrokeMiterLimit(float value);
     method public void setStrokeWidth(float value);
-    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle value);
+    method public void setStyle-k9PVt8s(int value);
     property public float alpha;
-    property public androidx.compose.ui.graphics.BlendMode blendMode;
+    property public int blendMode;
     property public long color;
     property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
-    property public androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public int filterQuality;
     property public boolean isAntiAlias;
     property public androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public android.graphics.Shader? shader;
-    property public androidx.compose.ui.graphics.StrokeCap strokeCap;
-    property public androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public int strokeCap;
+    property public int strokeJoin;
     property public float strokeMiterLimit;
     property public float strokeWidth;
-    property public androidx.compose.ui.graphics.PaintingStyle style;
+    property public int style;
   }
 
   public final class AndroidPaint_androidKt {
@@ -85,22 +85,22 @@
     method public void close();
     method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.compose.ui.geometry.Rect getBounds();
-    method public androidx.compose.ui.graphics.PathFillType getFillType();
+    method public int getFillType-Rg-k1Os();
     method public android.graphics.Path getInternalPath();
     method public boolean isConvex();
     method public boolean isEmpty();
     method public void lineTo(float x, float y);
     method public void moveTo(float x, float y);
-    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, androidx.compose.ui.graphics.PathOperation operation);
+    method public boolean op-xiGExi0(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
     method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
     method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
     method public void relativeLineTo(float dx, float dy);
     method public void relativeMoveTo(float dx, float dy);
     method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
     method public void reset();
-    method public void setFillType(androidx.compose.ui.graphics.PathFillType value);
+    method public void setFillType-oQ8Xj4U(int value);
     method public void translate-k-4lQ0M(long offset);
-    property public androidx.compose.ui.graphics.PathFillType fillType;
+    property public int fillType;
     property public final android.graphics.Path internalPath;
     property public boolean isConvex;
     property public boolean isEmpty;
@@ -132,43 +132,83 @@
   }
 
   public final class AndroidTileMode_androidKt {
-    method public static android.graphics.Shader.TileMode toNativeTileMode(androidx.compose.ui.graphics.TileMode);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode-0vamqd0(int);
   }
 
   public final class AndroidVertexMode_androidKt {
-    method public static android.graphics.Canvas.VertexMode toNativeVertexMode(androidx.compose.ui.graphics.VertexMode);
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode-JOOmi9M(int);
   }
 
-  public enum BlendMode {
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Clear;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Color;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorBurn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorDodge;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Darken;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Difference;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Dst;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstAtop;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstIn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOut;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOver;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Exclusion;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hardlight;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hue;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Lighten;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Luminosity;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Modulate;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Multiply;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Overlay;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Plus;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Saturation;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Screen;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Softlight;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Src;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcAtop;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcIn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOut;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOver;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Xor;
+  @androidx.compose.runtime.Immutable public final inline class BlendMode {
+    ctor public BlendMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.BlendMode.Companion Companion;
+  }
+
+  public static final class BlendMode.Companion {
+    method public int getClear-0nO6VwU();
+    method public int getColor-0nO6VwU();
+    method public int getColorBurn-0nO6VwU();
+    method public int getColorDodge-0nO6VwU();
+    method public int getDarken-0nO6VwU();
+    method public int getDifference-0nO6VwU();
+    method public int getDst-0nO6VwU();
+    method public int getDstAtop-0nO6VwU();
+    method public int getDstIn-0nO6VwU();
+    method public int getDstOut-0nO6VwU();
+    method public int getDstOver-0nO6VwU();
+    method public int getExclusion-0nO6VwU();
+    method public int getHardlight-0nO6VwU();
+    method public int getHue-0nO6VwU();
+    method public int getLighten-0nO6VwU();
+    method public int getLuminosity-0nO6VwU();
+    method public int getModulate-0nO6VwU();
+    method public int getMultiply-0nO6VwU();
+    method public int getOverlay-0nO6VwU();
+    method public int getPlus-0nO6VwU();
+    method public int getSaturation-0nO6VwU();
+    method public int getScreen-0nO6VwU();
+    method public int getSoftlight-0nO6VwU();
+    method public int getSrc-0nO6VwU();
+    method public int getSrcAtop-0nO6VwU();
+    method public int getSrcIn-0nO6VwU();
+    method public int getSrcOut-0nO6VwU();
+    method public int getSrcOver-0nO6VwU();
+    method public int getXor-0nO6VwU();
+    property public final int Clear;
+    property public final int Color;
+    property public final int ColorBurn;
+    property public final int ColorDodge;
+    property public final int Darken;
+    property public final int Difference;
+    property public final int Dst;
+    property public final int DstAtop;
+    property public final int DstIn;
+    property public final int DstOut;
+    property public final int DstOver;
+    property public final int Exclusion;
+    property public final int Hardlight;
+    property public final int Hue;
+    property public final int Lighten;
+    property public final int Luminosity;
+    property public final int Modulate;
+    property public final int Multiply;
+    property public final int Overlay;
+    property public final int Plus;
+    property public final int Saturation;
+    property public final int Screen;
+    property public final int Softlight;
+    property public final int Src;
+    property public final int SrcAtop;
+    property public final int SrcIn;
+    property public final int SrcOut;
+    property public final int SrcOver;
+    property public final int Xor;
   }
 
   @androidx.compose.runtime.Immutable public abstract sealed class Brush {
@@ -177,16 +217,16 @@
   }
 
   public static final class Brush.Companion {
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient-CcUA5qQ(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient-NvQjRjk(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional int tileMode);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-PvDSl28(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-acbAMd8(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient-CcUA5qQ(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient-NvQjRjk(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional int tileMode);
   }
 
   public final class BrushKt {
@@ -194,9 +234,9 @@
   }
 
   public interface Canvas {
-    method public void clipPath(androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public void clipRect(float left, float top, float right, float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipPath-fquoRGU(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public default void clipRect-MsRSx38(androidx.compose.ui.geometry.Rect rect, optional int clipOp);
+    method public void clipRect-wxHPq4g(float left, float top, float right, float bottom, optional int clipOp);
     method public void concat-58bKbWc(float[] matrix);
     method public void disableZ();
     method public default void drawArc(androidx.compose.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
@@ -209,12 +249,12 @@
     method public default void drawOval(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
     method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
-    method public void drawPoints(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
-    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints-iVdqbVo(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints-59E74cI(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
     method public default void drawRect(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
     method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
-    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, androidx.compose.ui.graphics.BlendMode blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices-nA16xIE(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
     method public void enableZ();
     method public void restore();
     method public void rotate(float degrees);
@@ -240,9 +280,22 @@
     method public static inline void withSaveLayer(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint, kotlin.jvm.functions.Function0<kotlin.Unit> block);
   }
 
-  public enum ClipOp {
-    enum_constant public static final androidx.compose.ui.graphics.ClipOp Difference;
-    enum_constant public static final androidx.compose.ui.graphics.ClipOp Intersect;
+  @androidx.compose.runtime.Immutable public final inline class ClipOp {
+    ctor public ClipOp();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ClipOp.Companion Companion;
+  }
+
+  public static final class ClipOp.Companion {
+    method public int getDifference-rtfAjoo();
+    method public int getIntersect-rtfAjoo();
+    property public final int Difference;
+    property public final int Intersect;
   }
 
   @androidx.compose.runtime.Immutable public final inline class Color {
@@ -305,7 +358,7 @@
   public static final class ColorFilter.Companion {
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter colorMatrix-jHG-Opc(float[] colorMatrix);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting-6xK2E-Q(long multiply, long add);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional int blendMode);
   }
 
   public final class ColorKt {
@@ -348,11 +401,26 @@
   public final class DegreesKt {
   }
 
-  public enum FilterQuality {
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality High;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Low;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Medium;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality None;
+  @androidx.compose.runtime.Immutable public final inline class FilterQuality {
+    ctor public FilterQuality();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.FilterQuality.Companion Companion;
+  }
+
+  public static final class FilterQuality.Companion {
+    method public int getHigh-f-v9h1I();
+    method public int getLow-f-v9h1I();
+    method public int getMedium-f-v9h1I();
+    method public int getNone-f-v9h1I();
+    property public final int High;
+    property public final int Low;
+    property public final int Medium;
+    property public final int None;
   }
 
   public final class Float16Kt {
@@ -360,14 +428,14 @@
 
   public interface ImageBitmap {
     method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
-    method public androidx.compose.ui.graphics.ImageBitmapConfig getConfig();
+    method public int getConfig-_sVssgQ();
     method public boolean getHasAlpha();
     method public int getHeight();
     method public int getWidth();
     method public void prepareToDraw();
     method public void readPixels(int[] buffer, optional int startX, optional int startY, optional int width, optional int height, optional int bufferOffset, optional int stride);
     property public abstract androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
-    property public abstract androidx.compose.ui.graphics.ImageBitmapConfig config;
+    property public abstract int config;
     property public abstract boolean hasAlpha;
     property public abstract int height;
     property public abstract int width;
@@ -377,16 +445,32 @@
   public static final class ImageBitmap.Companion {
   }
 
-  public enum ImageBitmapConfig {
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Alpha8;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Argb8888;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig F16;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Gpu;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Rgb565;
+  @androidx.compose.runtime.Immutable public final inline class ImageBitmapConfig {
+    ctor public ImageBitmapConfig();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ImageBitmapConfig.Companion Companion;
+  }
+
+  public static final class ImageBitmapConfig.Companion {
+    method public int getAlpha8-_sVssgQ();
+    method public int getArgb8888-_sVssgQ();
+    method public int getF16-_sVssgQ();
+    method public int getGpu-_sVssgQ();
+    method public int getRgb565-_sVssgQ();
+    property public final int Alpha8;
+    property public final int Argb8888;
+    property public final int F16;
+    property public final int Gpu;
+    property public final int Rgb565;
   }
 
   public final class ImageBitmapKt {
-    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional androidx.compose.ui.graphics.ImageBitmapConfig config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap-E8BOdIU(int width, int height, optional int config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
     method public static androidx.compose.ui.graphics.PixelMap toPixelMap(androidx.compose.ui.graphics.ImageBitmap, optional int startX, optional int startY, optional int width, optional int height, optional int[] buffer, optional int bufferOffset, optional int stride);
   }
 
@@ -469,61 +553,74 @@
 
   public final class OutlineKt {
     method public static void addOutline(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Outline outline);
-    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
     method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
-    method public static void drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public static void drawOutline-Ar0j1Zw(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
   }
 
   public interface Paint {
     method public android.graphics.Paint asFrameworkPaint();
     method public float getAlpha();
-    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public int getBlendMode-0nO6VwU();
     method public long getColor-0d7_KjU();
     method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
-    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public int getFilterQuality-f-v9h1I();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public android.graphics.Shader? getShader();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public int getStrokeCap-KaPHkGw();
+    method public int getStrokeJoin-LxFBmk8();
     method public float getStrokeMiterLimit();
     method public float getStrokeWidth();
-    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public int getStyle-TiuSbCo();
     method public boolean isAntiAlias();
     method public void setAlpha(float p);
     method public void setAntiAlias(boolean p);
-    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode p);
+    method public void setBlendMode-s9anfk8(int p);
     method public void setColor-8_81llA(long p);
     method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? p);
-    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality p);
+    method public void setFilterQuality-vDHp3xo(int p);
     method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? p);
     method public void setShader(android.graphics.Shader? p);
-    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap p);
-    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin p);
+    method public void setStrokeCap-BeK7IIE(int p);
+    method public void setStrokeJoin-Ww9F2mQ(int p);
     method public void setStrokeMiterLimit(float p);
     method public void setStrokeWidth(float p);
-    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle p);
+    method public void setStyle-k9PVt8s(int p);
     property public abstract float alpha;
-    property public abstract androidx.compose.ui.graphics.BlendMode blendMode;
+    property public abstract int blendMode;
     property public abstract long color;
     property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
-    property public abstract androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public abstract int filterQuality;
     property public abstract boolean isAntiAlias;
     property public abstract androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public abstract android.graphics.Shader? shader;
-    property public abstract androidx.compose.ui.graphics.StrokeCap strokeCap;
-    property public abstract androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public abstract int strokeCap;
+    property public abstract int strokeJoin;
     property public abstract float strokeMiterLimit;
     property public abstract float strokeWidth;
-    property public abstract androidx.compose.ui.graphics.PaintingStyle style;
+    property public abstract int style;
   }
 
   public final class PaintKt {
     field public static final float DefaultAlpha = 1.0f;
   }
 
-  public enum PaintingStyle {
-    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Fill;
-    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Stroke;
+  @androidx.compose.runtime.Immutable public final inline class PaintingStyle {
+    ctor public PaintingStyle();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PaintingStyle.Companion Companion;
+  }
+
+  public static final class PaintingStyle.Companion {
+    method public int getFill-TiuSbCo();
+    method public int getStroke-TiuSbCo();
+    property public final int Fill;
+    property public final int Stroke;
   }
 
   public interface Path {
@@ -538,28 +635,28 @@
     method public void close();
     method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.compose.ui.geometry.Rect getBounds();
-    method public androidx.compose.ui.graphics.PathFillType getFillType();
+    method public int getFillType-Rg-k1Os();
     method public boolean isConvex();
     method public boolean isEmpty();
     method public void lineTo(float x, float y);
     method public void moveTo(float x, float y);
-    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, androidx.compose.ui.graphics.PathOperation operation);
+    method public boolean op-xiGExi0(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
     method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
     method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
     method public void relativeLineTo(float dx, float dy);
     method public void relativeMoveTo(float dx, float dy);
     method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
     method public void reset();
-    method public void setFillType(androidx.compose.ui.graphics.PathFillType p);
+    method public void setFillType-oQ8Xj4U(int p);
     method public void translate-k-4lQ0M(long offset);
-    property public abstract androidx.compose.ui.graphics.PathFillType fillType;
+    property public abstract int fillType;
     property public abstract boolean isConvex;
     property public abstract boolean isEmpty;
     field public static final androidx.compose.ui.graphics.Path.Companion Companion;
   }
 
   public static final class Path.Companion {
-    method public androidx.compose.ui.graphics.Path combine(androidx.compose.ui.graphics.PathOperation operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
+    method public androidx.compose.ui.graphics.Path combine-mTgLSnE(int operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
   }
 
   public interface PathEffect {
@@ -570,12 +667,25 @@
     method public androidx.compose.ui.graphics.PathEffect chainPathEffect(androidx.compose.ui.graphics.PathEffect outer, androidx.compose.ui.graphics.PathEffect inner);
     method public androidx.compose.ui.graphics.PathEffect cornerPathEffect(float radius);
     method public androidx.compose.ui.graphics.PathEffect dashPathEffect(float[] intervals, optional float phase);
-    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect(androidx.compose.ui.graphics.Path shape, float advance, float phase, androidx.compose.ui.graphics.StampedPathEffectStyle style);
+    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect-czNbfQQ(androidx.compose.ui.graphics.Path shape, float advance, float phase, int style);
   }
 
-  public enum PathFillType {
-    enum_constant public static final androidx.compose.ui.graphics.PathFillType EvenOdd;
-    enum_constant public static final androidx.compose.ui.graphics.PathFillType NonZero;
+  @androidx.compose.runtime.Immutable public final inline class PathFillType {
+    ctor public PathFillType();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PathFillType.Companion Companion;
+  }
+
+  public static final class PathFillType.Companion {
+    method public int getEvenOdd-Rg-k1Os();
+    method public int getNonZero-Rg-k1Os();
+    property public final int EvenOdd;
+    property public final int NonZero;
   }
 
   public interface PathMeasure {
@@ -585,12 +695,36 @@
     property public abstract float length;
   }
 
-  public enum PathOperation {
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation difference;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation intersect;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation reverseDifference;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation union;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation xor;
+  @androidx.compose.runtime.Immutable public final inline class PathOperation {
+    ctor public PathOperation();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PathOperation.Companion Companion;
+  }
+
+  public static final class PathOperation.Companion {
+    method public int getDifference-b3I0S0c();
+    method public int getIntersect-b3I0S0c();
+    method public int getReverseDifference-b3I0S0c();
+    method public int getUnion-b3I0S0c();
+    method public int getXor-b3I0S0c();
+    property public final int Difference;
+    property public final int Intersect;
+    property public final int ReverseDifference;
+    property public final int Union;
+    property public final int Xor;
+  }
+
+  public final class PathOperationKt {
+    method @Deprecated public static int getDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getIntersect(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getReverseDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getUnion(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getXor(androidx.compose.ui.graphics.PathOperation.Companion);
   }
 
   public final class PixelMap {
@@ -608,10 +742,24 @@
     property public final int width;
   }
 
-  public enum PointMode {
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Lines;
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Points;
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Polygon;
+  @androidx.compose.runtime.Immutable public final inline class PointMode {
+    ctor public PointMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PointMode.Companion Companion;
+  }
+
+  public static final class PointMode.Companion {
+    method public int getLines-r_lszbg();
+    method public int getPoints-r_lszbg();
+    method public int getPolygon-r_lszbg();
+    property public final int Lines;
+    property public final int Points;
+    property public final int Polygon;
   }
 
   @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
@@ -635,9 +783,9 @@
   }
 
   public final class ShaderKt {
-    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional androidx.compose.ui.graphics.TileMode tileModeX, optional androidx.compose.ui.graphics.TileMode tileModeY);
-    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader ImageShader-UWo3-ZU(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
     method public static android.graphics.Shader SweepGradientShader-GpNgDDw(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
   }
 
@@ -671,81 +819,168 @@
     property public final long value;
   }
 
-  public enum StampedPathEffectStyle {
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Morph;
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Rotate;
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Translate;
+  @androidx.compose.runtime.Immutable public final inline class StampedPathEffectStyle {
+    ctor public StampedPathEffectStyle();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StampedPathEffectStyle.Companion Companion;
   }
 
-  public enum StrokeCap {
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Butt;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Round;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Square;
+  public static final class StampedPathEffectStyle.Companion {
+    method public int getMorph-Ypspkwk();
+    method public int getRotate-Ypspkwk();
+    method public int getTranslate-Ypspkwk();
+    property public final int Morph;
+    property public final int Rotate;
+    property public final int Translate;
   }
 
-  public enum StrokeJoin {
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Bevel;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Miter;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Round;
+  @androidx.compose.runtime.Immutable public final inline class StrokeCap {
+    ctor public StrokeCap();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StrokeCap.Companion Companion;
+  }
+
+  public static final class StrokeCap.Companion {
+    method public int getButt-KaPHkGw();
+    method public int getRound-KaPHkGw();
+    method public int getSquare-KaPHkGw();
+    property public final int Butt;
+    property public final int Round;
+    property public final int Square;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StrokeJoin {
+    ctor public StrokeJoin();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StrokeJoin.Companion Companion;
+  }
+
+  public static final class StrokeJoin.Companion {
+    method public int getBevel-LxFBmk8();
+    method public int getMiter-LxFBmk8();
+    method public int getRound-LxFBmk8();
+    property public final int Bevel;
+    property public final int Miter;
+    property public final int Round;
   }
 
   @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
     method public android.graphics.Shader createShader-uvyYCjk(long size);
   }
 
-  public enum TileMode {
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Clamp;
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Mirror;
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Repeated;
+  @androidx.compose.runtime.Immutable public final inline class TileMode {
+    ctor public TileMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.TileMode.Companion Companion;
   }
 
-  public enum VertexMode {
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleFan;
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleStrip;
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode Triangles;
+  public static final class TileMode.Companion {
+    method public int getClamp-3opZhB0();
+    method public int getMirror-3opZhB0();
+    method public int getRepeated-3opZhB0();
+    property public final int Clamp;
+    property public final int Mirror;
+    property public final int Repeated;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class VertexMode {
+    ctor public VertexMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.VertexMode.Companion Companion;
+  }
+
+  public static final class VertexMode.Companion {
+    method public int getTriangleFan-c2xauaI();
+    method public int getTriangleStrip-c2xauaI();
+    method public int getTriangles-c2xauaI();
+    property public final int TriangleFan;
+    property public final int TriangleStrip;
+    property public final int Triangles;
   }
 
   public final class Vertices {
-    ctor public Vertices(androidx.compose.ui.graphics.VertexMode vertexMode, java.util.List<androidx.compose.ui.geometry.Offset> positions, java.util.List<androidx.compose.ui.geometry.Offset> textureCoordinates, java.util.List<androidx.compose.ui.graphics.Color> colors, java.util.List<java.lang.Integer> indices);
     method public int[] getColors();
     method public short[] getIndices();
     method public float[] getPositions();
     method public float[] getTextureCoordinates();
-    method public androidx.compose.ui.graphics.VertexMode getVertexMode();
+    method public int getVertexMode-c2xauaI();
     property public final int[] colors;
     property public final short[] indices;
     property public final float[] positions;
     property public final float[] textureCoordinates;
-    property public final androidx.compose.ui.graphics.VertexMode vertexMode;
+    property public final int vertexMode;
   }
 
 }
 
 package androidx.compose.ui.graphics.colorspace {
 
-  public enum Adaptation {
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  public abstract class Adaptation {
+    field public static final androidx.compose.ui.graphics.colorspace.Adaptation.Companion Companion;
   }
 
-  public enum ColorModel {
-    method public final int getComponentCount();
-    property public final int componentCount;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Cmyk;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Lab;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Rgb;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Xyz;
+  public static final class Adaptation.Companion {
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getBradford();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getCiecat02();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getVonKries();
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ColorModel {
+    ctor public ColorModel();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getComponentCount-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.graphics.colorspace.ColorModel.Companion Companion;
+  }
+
+  public static final class ColorModel.Companion {
+    method public long getCmyk-xdoWZVw();
+    method public long getLab-xdoWZVw();
+    method public long getRgb-xdoWZVw();
+    method public long getXyz-xdoWZVw();
+    property public final long Cmyk;
+    property public final long Lab;
+    property public final long Rgb;
+    property public final long Xyz;
   }
 
   public abstract class ColorSpace {
-    ctor public ColorSpace(String name, androidx.compose.ui.graphics.colorspace.ColorModel model);
     method public final float[] fromXyz(float x, float y, float z);
     method public abstract float[] fromXyz(float[] v);
     method public final int getComponentCount();
     method public abstract float getMaxValue(int component);
     method public abstract float getMinValue(int component);
-    method public final androidx.compose.ui.graphics.colorspace.ColorModel getModel();
+    method public final long getModel-xdoWZVw();
     method public final String getName();
     method public boolean isSrgb();
     method public abstract boolean isWideGamut();
@@ -754,14 +989,14 @@
     property public final int componentCount;
     property public boolean isSrgb;
     property public abstract boolean isWideGamut;
-    property public final androidx.compose.ui.graphics.colorspace.ColorModel model;
+    property public final long model;
     property public final String name;
   }
 
   public final class ColorSpaceKt {
     method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, optional androidx.compose.ui.graphics.colorspace.Adaptation adaptation);
     method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint);
-    method public static androidx.compose.ui.graphics.colorspace.Connector connect(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional androidx.compose.ui.graphics.colorspace.RenderIntent intent);
+    method public static androidx.compose.ui.graphics.colorspace.Connector connect-InwLUsE(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional int intent);
   }
 
   public final class ColorSpaces {
@@ -803,12 +1038,12 @@
 
   public class Connector {
     method public final androidx.compose.ui.graphics.colorspace.ColorSpace getDestination();
-    method public final androidx.compose.ui.graphics.colorspace.RenderIntent getRenderIntent();
+    method public final int getRenderIntent-uksYyKA();
     method public final androidx.compose.ui.graphics.colorspace.ColorSpace getSource();
     method public final float[] transform(float r, float g, float b);
     method public float[] transform(float[] v);
     property public final androidx.compose.ui.graphics.colorspace.ColorSpace destination;
-    property public final androidx.compose.ui.graphics.colorspace.RenderIntent renderIntent;
+    property public final int renderIntent;
     property public final androidx.compose.ui.graphics.colorspace.ColorSpace source;
   }
 
@@ -834,11 +1069,26 @@
     field public static final androidx.compose.ui.graphics.colorspace.Illuminant INSTANCE;
   }
 
-  public enum RenderIntent {
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Absolute;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Perceptual;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Relative;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Saturation;
+  @androidx.compose.runtime.Immutable public final inline class RenderIntent {
+    ctor public RenderIntent();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.colorspace.RenderIntent.Companion Companion;
+  }
+
+  public static final class RenderIntent.Companion {
+    method public int getAbsolute-uksYyKA();
+    method public int getPerceptual-uksYyKA();
+    method public int getRelative-uksYyKA();
+    method public int getSaturation-uksYyKA();
+    property public final int Absolute;
+    property public final int Perceptual;
+    property public final int Relative;
+    property public final int Saturation;
   }
 
   public final class Rgb extends androidx.compose.ui.graphics.colorspace.ColorSpace {
@@ -920,24 +1170,24 @@
   public final class CanvasDrawScope implements androidx.compose.ui.graphics.drawscope.DrawScope {
     ctor public CanvasDrawScope();
     method public inline void draw-jkGVKLE(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
-    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath-_TD-E3k(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
     method public float getDensity();
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public float getFontScale();
@@ -966,24 +1216,24 @@
   }
 
   @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawScope extends androidx.compose.ui.unit.Density {
-    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-NGaRamM(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-fNghmuc(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle-NGaRamM(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath-_TD-E3k(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect-fNghmuc(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public default long getCenter-F1C5BW0();
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
@@ -997,13 +1247,13 @@
   }
 
   public static final class DrawScope.Companion {
-    method public androidx.compose.ui.graphics.BlendMode getDefaultBlendMode();
-    property public final androidx.compose.ui.graphics.BlendMode DefaultBlendMode;
+    method public int getDefaultBlendMode-0nO6VwU();
+    property public final int DefaultBlendMode;
   }
 
   public final class DrawScopeKt {
-    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
-    method public static inline void clipRect(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipPath--PbAnyU(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipRect-2ny_0ws(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
     method public static inline void drawIntoCanvas(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
     method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
     method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float inset, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
@@ -1023,8 +1273,8 @@
   }
 
   @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawTransform {
-    method public void clipPath(androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipPath-fquoRGU(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public void clipRect-wxHPq4g(optional float left, optional float top, optional float right, optional float bottom, optional int clipOp);
     method public default long getCenter-F1C5BW0();
     method public long getSize-NH-jbRc();
     method public void inset(float left, float top, float right, float bottom);
@@ -1048,14 +1298,13 @@
   }
 
   public final class Stroke extends androidx.compose.ui.graphics.drawscope.DrawStyle {
-    ctor public Stroke(optional float width, optional float miter, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.StrokeJoin join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
-    method public androidx.compose.ui.graphics.StrokeCap getCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getJoin();
+    method public int getCap-KaPHkGw();
+    method public int getJoin-LxFBmk8();
     method public float getMiter();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public float getWidth();
-    property public final androidx.compose.ui.graphics.StrokeCap cap;
-    property public final androidx.compose.ui.graphics.StrokeJoin join;
+    property public final int cap;
+    property public final int join;
     property public final float miter;
     property public final androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public final float width;
@@ -1065,10 +1314,10 @@
   }
 
   public static final class Stroke.Companion {
-    method public androidx.compose.ui.graphics.StrokeCap getDefaultCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getDefaultJoin();
-    property public final androidx.compose.ui.graphics.StrokeCap DefaultCap;
-    property public final androidx.compose.ui.graphics.StrokeJoin DefaultJoin;
+    method public int getDefaultCap-KaPHkGw();
+    method public int getDefaultJoin-LxFBmk8();
+    property public final int DefaultCap;
+    property public final int DefaultJoin;
   }
 
 }
diff --git a/compose/ui/ui-graphics/api/restricted_1.0.0-beta08.txt b/compose/ui/ui-graphics/api/restricted_1.0.0-beta08.txt
index 398edf5..43089e6 100644
--- a/compose/ui/ui-graphics/api/restricted_1.0.0-beta08.txt
+++ b/compose/ui/ui-graphics/api/restricted_1.0.0-beta08.txt
@@ -2,13 +2,13 @@
 package androidx.compose.ui.graphics {
 
   public final class AndroidBlendMode_androidKt {
-    method public static boolean isSupported(androidx.compose.ui.graphics.BlendMode);
+    method public static boolean isSupported-s9anfk8(int);
   }
 
   @kotlin.PublishedApi internal final class AndroidCanvas implements androidx.compose.ui.graphics.Canvas {
     ctor public AndroidCanvas();
-    method public void clipPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.ClipOp clipOp);
-    method public void clipRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipPath-fquoRGU(androidx.compose.ui.graphics.Path path, int clipOp);
+    method public void clipRect-wxHPq4g(float left, float top, float right, float bottom, int clipOp);
     method public void concat-58bKbWc(float[] matrix);
     method public void disableZ();
     method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
@@ -18,11 +18,11 @@
     method public void drawLine-bYPfCD8(long p1, long p2, androidx.compose.ui.graphics.Paint paint);
     method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
-    method public void drawPoints(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
-    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints-iVdqbVo(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints-59E74cI(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
     method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
-    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, androidx.compose.ui.graphics.BlendMode blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices-nA16xIE(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
     method public void enableZ();
     method public void restore();
     method public void rotate(float degrees);
@@ -30,7 +30,7 @@
     method public void saveLayer(androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint);
     method public void scale(float sx, float sy);
     method public void skew(float sx, float sy);
-    method public android.graphics.Region.Op toRegionOp(androidx.compose.ui.graphics.ClipOp);
+    method public android.graphics.Region.Op toRegionOp--7u2Bmg(int);
     method public void translate(float dx, float dy);
     field @kotlin.PublishedApi internal android.graphics.Canvas internalCanvas;
   }
@@ -59,44 +59,44 @@
     ctor public AndroidPaint();
     method public android.graphics.Paint asFrameworkPaint();
     method public float getAlpha();
-    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public int getBlendMode-0nO6VwU();
     method public long getColor-0d7_KjU();
     method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
-    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public int getFilterQuality-f-v9h1I();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public android.graphics.Shader? getShader();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public int getStrokeCap-KaPHkGw();
+    method public int getStrokeJoin-LxFBmk8();
     method public float getStrokeMiterLimit();
     method public float getStrokeWidth();
-    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public int getStyle-TiuSbCo();
     method public boolean isAntiAlias();
     method public void setAlpha(float value);
     method public void setAntiAlias(boolean value);
-    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode value);
+    method public void setBlendMode-s9anfk8(int value);
     method public void setColor-8_81llA(long color);
     method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
-    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality value);
+    method public void setFilterQuality-vDHp3xo(int value);
     method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
     method public void setShader(android.graphics.Shader? value);
-    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap value);
-    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin value);
+    method public void setStrokeCap-BeK7IIE(int value);
+    method public void setStrokeJoin-Ww9F2mQ(int value);
     method public void setStrokeMiterLimit(float value);
     method public void setStrokeWidth(float value);
-    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle value);
+    method public void setStyle-k9PVt8s(int value);
     property public float alpha;
-    property public androidx.compose.ui.graphics.BlendMode blendMode;
+    property public int blendMode;
     property public long color;
     property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
-    property public androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public int filterQuality;
     property public boolean isAntiAlias;
     property public androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public android.graphics.Shader? shader;
-    property public androidx.compose.ui.graphics.StrokeCap strokeCap;
-    property public androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public int strokeCap;
+    property public int strokeJoin;
     property public float strokeMiterLimit;
     property public float strokeWidth;
-    property public androidx.compose.ui.graphics.PaintingStyle style;
+    property public int style;
   }
 
   public final class AndroidPaint_androidKt {
@@ -115,22 +115,22 @@
     method public void close();
     method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.compose.ui.geometry.Rect getBounds();
-    method public androidx.compose.ui.graphics.PathFillType getFillType();
+    method public int getFillType-Rg-k1Os();
     method public android.graphics.Path getInternalPath();
     method public boolean isConvex();
     method public boolean isEmpty();
     method public void lineTo(float x, float y);
     method public void moveTo(float x, float y);
-    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, androidx.compose.ui.graphics.PathOperation operation);
+    method public boolean op-xiGExi0(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
     method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
     method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
     method public void relativeLineTo(float dx, float dy);
     method public void relativeMoveTo(float dx, float dy);
     method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
     method public void reset();
-    method public void setFillType(androidx.compose.ui.graphics.PathFillType value);
+    method public void setFillType-oQ8Xj4U(int value);
     method public void translate-k-4lQ0M(long offset);
-    property public androidx.compose.ui.graphics.PathFillType fillType;
+    property public int fillType;
     property public final android.graphics.Path internalPath;
     property public boolean isConvex;
     property public boolean isEmpty;
@@ -162,43 +162,83 @@
   }
 
   public final class AndroidTileMode_androidKt {
-    method public static android.graphics.Shader.TileMode toNativeTileMode(androidx.compose.ui.graphics.TileMode);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode-0vamqd0(int);
   }
 
   public final class AndroidVertexMode_androidKt {
-    method public static android.graphics.Canvas.VertexMode toNativeVertexMode(androidx.compose.ui.graphics.VertexMode);
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode-JOOmi9M(int);
   }
 
-  public enum BlendMode {
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Clear;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Color;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorBurn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorDodge;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Darken;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Difference;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Dst;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstAtop;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstIn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOut;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOver;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Exclusion;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hardlight;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hue;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Lighten;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Luminosity;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Modulate;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Multiply;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Overlay;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Plus;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Saturation;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Screen;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Softlight;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Src;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcAtop;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcIn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOut;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOver;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Xor;
+  @androidx.compose.runtime.Immutable public final inline class BlendMode {
+    ctor public BlendMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.BlendMode.Companion Companion;
+  }
+
+  public static final class BlendMode.Companion {
+    method public int getClear-0nO6VwU();
+    method public int getColor-0nO6VwU();
+    method public int getColorBurn-0nO6VwU();
+    method public int getColorDodge-0nO6VwU();
+    method public int getDarken-0nO6VwU();
+    method public int getDifference-0nO6VwU();
+    method public int getDst-0nO6VwU();
+    method public int getDstAtop-0nO6VwU();
+    method public int getDstIn-0nO6VwU();
+    method public int getDstOut-0nO6VwU();
+    method public int getDstOver-0nO6VwU();
+    method public int getExclusion-0nO6VwU();
+    method public int getHardlight-0nO6VwU();
+    method public int getHue-0nO6VwU();
+    method public int getLighten-0nO6VwU();
+    method public int getLuminosity-0nO6VwU();
+    method public int getModulate-0nO6VwU();
+    method public int getMultiply-0nO6VwU();
+    method public int getOverlay-0nO6VwU();
+    method public int getPlus-0nO6VwU();
+    method public int getSaturation-0nO6VwU();
+    method public int getScreen-0nO6VwU();
+    method public int getSoftlight-0nO6VwU();
+    method public int getSrc-0nO6VwU();
+    method public int getSrcAtop-0nO6VwU();
+    method public int getSrcIn-0nO6VwU();
+    method public int getSrcOut-0nO6VwU();
+    method public int getSrcOver-0nO6VwU();
+    method public int getXor-0nO6VwU();
+    property public final int Clear;
+    property public final int Color;
+    property public final int ColorBurn;
+    property public final int ColorDodge;
+    property public final int Darken;
+    property public final int Difference;
+    property public final int Dst;
+    property public final int DstAtop;
+    property public final int DstIn;
+    property public final int DstOut;
+    property public final int DstOver;
+    property public final int Exclusion;
+    property public final int Hardlight;
+    property public final int Hue;
+    property public final int Lighten;
+    property public final int Luminosity;
+    property public final int Modulate;
+    property public final int Multiply;
+    property public final int Overlay;
+    property public final int Plus;
+    property public final int Saturation;
+    property public final int Screen;
+    property public final int Softlight;
+    property public final int Src;
+    property public final int SrcAtop;
+    property public final int SrcIn;
+    property public final int SrcOut;
+    property public final int SrcOver;
+    property public final int Xor;
   }
 
   @androidx.compose.runtime.Immutable public abstract sealed class Brush {
@@ -207,16 +247,16 @@
   }
 
   public static final class Brush.Companion {
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient-CcUA5qQ(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient-NvQjRjk(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional int tileMode);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-PvDSl28(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-acbAMd8(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient-CcUA5qQ(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient-NvQjRjk(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional int tileMode);
   }
 
   public final class BrushKt {
@@ -224,9 +264,9 @@
   }
 
   public interface Canvas {
-    method public void clipPath(androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public void clipRect(float left, float top, float right, float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipPath-fquoRGU(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public default void clipRect-MsRSx38(androidx.compose.ui.geometry.Rect rect, optional int clipOp);
+    method public void clipRect-wxHPq4g(float left, float top, float right, float bottom, optional int clipOp);
     method public void concat-58bKbWc(float[] matrix);
     method public void disableZ();
     method public default void drawArc(androidx.compose.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
@@ -239,12 +279,12 @@
     method public default void drawOval(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
     method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
-    method public void drawPoints(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
-    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints-iVdqbVo(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints-59E74cI(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
     method public default void drawRect(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
     method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
-    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, androidx.compose.ui.graphics.BlendMode blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices-nA16xIE(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
     method public void enableZ();
     method public void restore();
     method public void rotate(float degrees);
@@ -271,9 +311,22 @@
     method public static inline void withSaveLayer(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint, kotlin.jvm.functions.Function0<kotlin.Unit> block);
   }
 
-  public enum ClipOp {
-    enum_constant public static final androidx.compose.ui.graphics.ClipOp Difference;
-    enum_constant public static final androidx.compose.ui.graphics.ClipOp Intersect;
+  @androidx.compose.runtime.Immutable public final inline class ClipOp {
+    ctor public ClipOp();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ClipOp.Companion Companion;
+  }
+
+  public static final class ClipOp.Companion {
+    method public int getDifference-rtfAjoo();
+    method public int getIntersect-rtfAjoo();
+    property public final int Difference;
+    property public final int Intersect;
   }
 
   @androidx.compose.runtime.Immutable public final inline class Color {
@@ -336,7 +389,7 @@
   public static final class ColorFilter.Companion {
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter colorMatrix-jHG-Opc(float[] colorMatrix);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting-6xK2E-Q(long multiply, long add);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional int blendMode);
   }
 
   public final class ColorKt {
@@ -380,11 +433,26 @@
     method @kotlin.PublishedApi internal static float degrees(float radians);
   }
 
-  public enum FilterQuality {
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality High;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Low;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Medium;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality None;
+  @androidx.compose.runtime.Immutable public final inline class FilterQuality {
+    ctor public FilterQuality();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.FilterQuality.Companion Companion;
+  }
+
+  public static final class FilterQuality.Companion {
+    method public int getHigh-f-v9h1I();
+    method public int getLow-f-v9h1I();
+    method public int getMedium-f-v9h1I();
+    method public int getNone-f-v9h1I();
+    property public final int High;
+    property public final int Low;
+    property public final int Medium;
+    property public final int None;
   }
 
   public final class Float16Kt {
@@ -392,14 +460,14 @@
 
   public interface ImageBitmap {
     method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
-    method public androidx.compose.ui.graphics.ImageBitmapConfig getConfig();
+    method public int getConfig-_sVssgQ();
     method public boolean getHasAlpha();
     method public int getHeight();
     method public int getWidth();
     method public void prepareToDraw();
     method public void readPixels(int[] buffer, optional int startX, optional int startY, optional int width, optional int height, optional int bufferOffset, optional int stride);
     property public abstract androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
-    property public abstract androidx.compose.ui.graphics.ImageBitmapConfig config;
+    property public abstract int config;
     property public abstract boolean hasAlpha;
     property public abstract int height;
     property public abstract int width;
@@ -409,16 +477,32 @@
   public static final class ImageBitmap.Companion {
   }
 
-  public enum ImageBitmapConfig {
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Alpha8;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Argb8888;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig F16;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Gpu;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Rgb565;
+  @androidx.compose.runtime.Immutable public final inline class ImageBitmapConfig {
+    ctor public ImageBitmapConfig();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ImageBitmapConfig.Companion Companion;
+  }
+
+  public static final class ImageBitmapConfig.Companion {
+    method public int getAlpha8-_sVssgQ();
+    method public int getArgb8888-_sVssgQ();
+    method public int getF16-_sVssgQ();
+    method public int getGpu-_sVssgQ();
+    method public int getRgb565-_sVssgQ();
+    property public final int Alpha8;
+    property public final int Argb8888;
+    property public final int F16;
+    property public final int Gpu;
+    property public final int Rgb565;
   }
 
   public final class ImageBitmapKt {
-    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional androidx.compose.ui.graphics.ImageBitmapConfig config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap-E8BOdIU(int width, int height, optional int config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
     method public static androidx.compose.ui.graphics.PixelMap toPixelMap(androidx.compose.ui.graphics.ImageBitmap, optional int startX, optional int startY, optional int width, optional int height, optional int[] buffer, optional int bufferOffset, optional int stride);
   }
 
@@ -501,61 +585,74 @@
 
   public final class OutlineKt {
     method public static void addOutline(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Outline outline);
-    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
     method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
-    method public static void drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public static void drawOutline-Ar0j1Zw(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
   }
 
   public interface Paint {
     method public android.graphics.Paint asFrameworkPaint();
     method public float getAlpha();
-    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public int getBlendMode-0nO6VwU();
     method public long getColor-0d7_KjU();
     method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
-    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public int getFilterQuality-f-v9h1I();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public android.graphics.Shader? getShader();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public int getStrokeCap-KaPHkGw();
+    method public int getStrokeJoin-LxFBmk8();
     method public float getStrokeMiterLimit();
     method public float getStrokeWidth();
-    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public int getStyle-TiuSbCo();
     method public boolean isAntiAlias();
     method public void setAlpha(float p);
     method public void setAntiAlias(boolean p);
-    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode p);
+    method public void setBlendMode-s9anfk8(int p);
     method public void setColor-8_81llA(long p);
     method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? p);
-    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality p);
+    method public void setFilterQuality-vDHp3xo(int p);
     method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? p);
     method public void setShader(android.graphics.Shader? p);
-    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap p);
-    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin p);
+    method public void setStrokeCap-BeK7IIE(int p);
+    method public void setStrokeJoin-Ww9F2mQ(int p);
     method public void setStrokeMiterLimit(float p);
     method public void setStrokeWidth(float p);
-    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle p);
+    method public void setStyle-k9PVt8s(int p);
     property public abstract float alpha;
-    property public abstract androidx.compose.ui.graphics.BlendMode blendMode;
+    property public abstract int blendMode;
     property public abstract long color;
     property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
-    property public abstract androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public abstract int filterQuality;
     property public abstract boolean isAntiAlias;
     property public abstract androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public abstract android.graphics.Shader? shader;
-    property public abstract androidx.compose.ui.graphics.StrokeCap strokeCap;
-    property public abstract androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public abstract int strokeCap;
+    property public abstract int strokeJoin;
     property public abstract float strokeMiterLimit;
     property public abstract float strokeWidth;
-    property public abstract androidx.compose.ui.graphics.PaintingStyle style;
+    property public abstract int style;
   }
 
   public final class PaintKt {
     field public static final float DefaultAlpha = 1.0f;
   }
 
-  public enum PaintingStyle {
-    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Fill;
-    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Stroke;
+  @androidx.compose.runtime.Immutable public final inline class PaintingStyle {
+    ctor public PaintingStyle();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PaintingStyle.Companion Companion;
+  }
+
+  public static final class PaintingStyle.Companion {
+    method public int getFill-TiuSbCo();
+    method public int getStroke-TiuSbCo();
+    property public final int Fill;
+    property public final int Stroke;
   }
 
   public interface Path {
@@ -570,28 +667,28 @@
     method public void close();
     method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.compose.ui.geometry.Rect getBounds();
-    method public androidx.compose.ui.graphics.PathFillType getFillType();
+    method public int getFillType-Rg-k1Os();
     method public boolean isConvex();
     method public boolean isEmpty();
     method public void lineTo(float x, float y);
     method public void moveTo(float x, float y);
-    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, androidx.compose.ui.graphics.PathOperation operation);
+    method public boolean op-xiGExi0(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
     method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
     method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
     method public void relativeLineTo(float dx, float dy);
     method public void relativeMoveTo(float dx, float dy);
     method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
     method public void reset();
-    method public void setFillType(androidx.compose.ui.graphics.PathFillType p);
+    method public void setFillType-oQ8Xj4U(int p);
     method public void translate-k-4lQ0M(long offset);
-    property public abstract androidx.compose.ui.graphics.PathFillType fillType;
+    property public abstract int fillType;
     property public abstract boolean isConvex;
     property public abstract boolean isEmpty;
     field public static final androidx.compose.ui.graphics.Path.Companion Companion;
   }
 
   public static final class Path.Companion {
-    method public androidx.compose.ui.graphics.Path combine(androidx.compose.ui.graphics.PathOperation operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
+    method public androidx.compose.ui.graphics.Path combine-mTgLSnE(int operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
   }
 
   public interface PathEffect {
@@ -602,12 +699,25 @@
     method public androidx.compose.ui.graphics.PathEffect chainPathEffect(androidx.compose.ui.graphics.PathEffect outer, androidx.compose.ui.graphics.PathEffect inner);
     method public androidx.compose.ui.graphics.PathEffect cornerPathEffect(float radius);
     method public androidx.compose.ui.graphics.PathEffect dashPathEffect(float[] intervals, optional float phase);
-    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect(androidx.compose.ui.graphics.Path shape, float advance, float phase, androidx.compose.ui.graphics.StampedPathEffectStyle style);
+    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect-czNbfQQ(androidx.compose.ui.graphics.Path shape, float advance, float phase, int style);
   }
 
-  public enum PathFillType {
-    enum_constant public static final androidx.compose.ui.graphics.PathFillType EvenOdd;
-    enum_constant public static final androidx.compose.ui.graphics.PathFillType NonZero;
+  @androidx.compose.runtime.Immutable public final inline class PathFillType {
+    ctor public PathFillType();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PathFillType.Companion Companion;
+  }
+
+  public static final class PathFillType.Companion {
+    method public int getEvenOdd-Rg-k1Os();
+    method public int getNonZero-Rg-k1Os();
+    property public final int EvenOdd;
+    property public final int NonZero;
   }
 
   public interface PathMeasure {
@@ -617,12 +727,36 @@
     property public abstract float length;
   }
 
-  public enum PathOperation {
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation difference;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation intersect;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation reverseDifference;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation union;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation xor;
+  @androidx.compose.runtime.Immutable public final inline class PathOperation {
+    ctor public PathOperation();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PathOperation.Companion Companion;
+  }
+
+  public static final class PathOperation.Companion {
+    method public int getDifference-b3I0S0c();
+    method public int getIntersect-b3I0S0c();
+    method public int getReverseDifference-b3I0S0c();
+    method public int getUnion-b3I0S0c();
+    method public int getXor-b3I0S0c();
+    property public final int Difference;
+    property public final int Intersect;
+    property public final int ReverseDifference;
+    property public final int Union;
+    property public final int Xor;
+  }
+
+  public final class PathOperationKt {
+    method @Deprecated public static int getDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getIntersect(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getReverseDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getUnion(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getXor(androidx.compose.ui.graphics.PathOperation.Companion);
   }
 
   public final class PixelMap {
@@ -640,10 +774,24 @@
     property public final int width;
   }
 
-  public enum PointMode {
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Lines;
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Points;
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Polygon;
+  @androidx.compose.runtime.Immutable public final inline class PointMode {
+    ctor public PointMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PointMode.Companion Companion;
+  }
+
+  public static final class PointMode.Companion {
+    method public int getLines-r_lszbg();
+    method public int getPoints-r_lszbg();
+    method public int getPolygon-r_lszbg();
+    property public final int Lines;
+    property public final int Points;
+    property public final int Polygon;
   }
 
   @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
@@ -667,9 +815,9 @@
   }
 
   public final class ShaderKt {
-    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional androidx.compose.ui.graphics.TileMode tileModeX, optional androidx.compose.ui.graphics.TileMode tileModeY);
-    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader ImageShader-UWo3-ZU(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
     method public static android.graphics.Shader SweepGradientShader-GpNgDDw(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
   }
 
@@ -703,81 +851,168 @@
     property public final long value;
   }
 
-  public enum StampedPathEffectStyle {
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Morph;
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Rotate;
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Translate;
+  @androidx.compose.runtime.Immutable public final inline class StampedPathEffectStyle {
+    ctor public StampedPathEffectStyle();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StampedPathEffectStyle.Companion Companion;
   }
 
-  public enum StrokeCap {
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Butt;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Round;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Square;
+  public static final class StampedPathEffectStyle.Companion {
+    method public int getMorph-Ypspkwk();
+    method public int getRotate-Ypspkwk();
+    method public int getTranslate-Ypspkwk();
+    property public final int Morph;
+    property public final int Rotate;
+    property public final int Translate;
   }
 
-  public enum StrokeJoin {
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Bevel;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Miter;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Round;
+  @androidx.compose.runtime.Immutable public final inline class StrokeCap {
+    ctor public StrokeCap();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StrokeCap.Companion Companion;
+  }
+
+  public static final class StrokeCap.Companion {
+    method public int getButt-KaPHkGw();
+    method public int getRound-KaPHkGw();
+    method public int getSquare-KaPHkGw();
+    property public final int Butt;
+    property public final int Round;
+    property public final int Square;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StrokeJoin {
+    ctor public StrokeJoin();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StrokeJoin.Companion Companion;
+  }
+
+  public static final class StrokeJoin.Companion {
+    method public int getBevel-LxFBmk8();
+    method public int getMiter-LxFBmk8();
+    method public int getRound-LxFBmk8();
+    property public final int Bevel;
+    property public final int Miter;
+    property public final int Round;
   }
 
   @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
     method public android.graphics.Shader createShader-uvyYCjk(long size);
   }
 
-  public enum TileMode {
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Clamp;
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Mirror;
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Repeated;
+  @androidx.compose.runtime.Immutable public final inline class TileMode {
+    ctor public TileMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.TileMode.Companion Companion;
   }
 
-  public enum VertexMode {
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleFan;
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleStrip;
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode Triangles;
+  public static final class TileMode.Companion {
+    method public int getClamp-3opZhB0();
+    method public int getMirror-3opZhB0();
+    method public int getRepeated-3opZhB0();
+    property public final int Clamp;
+    property public final int Mirror;
+    property public final int Repeated;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class VertexMode {
+    ctor public VertexMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.VertexMode.Companion Companion;
+  }
+
+  public static final class VertexMode.Companion {
+    method public int getTriangleFan-c2xauaI();
+    method public int getTriangleStrip-c2xauaI();
+    method public int getTriangles-c2xauaI();
+    property public final int TriangleFan;
+    property public final int TriangleStrip;
+    property public final int Triangles;
   }
 
   public final class Vertices {
-    ctor public Vertices(androidx.compose.ui.graphics.VertexMode vertexMode, java.util.List<androidx.compose.ui.geometry.Offset> positions, java.util.List<androidx.compose.ui.geometry.Offset> textureCoordinates, java.util.List<androidx.compose.ui.graphics.Color> colors, java.util.List<java.lang.Integer> indices);
     method public int[] getColors();
     method public short[] getIndices();
     method public float[] getPositions();
     method public float[] getTextureCoordinates();
-    method public androidx.compose.ui.graphics.VertexMode getVertexMode();
+    method public int getVertexMode-c2xauaI();
     property public final int[] colors;
     property public final short[] indices;
     property public final float[] positions;
     property public final float[] textureCoordinates;
-    property public final androidx.compose.ui.graphics.VertexMode vertexMode;
+    property public final int vertexMode;
   }
 
 }
 
 package androidx.compose.ui.graphics.colorspace {
 
-  public enum Adaptation {
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  public abstract class Adaptation {
+    field public static final androidx.compose.ui.graphics.colorspace.Adaptation.Companion Companion;
   }
 
-  public enum ColorModel {
-    method public final int getComponentCount();
-    property public final int componentCount;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Cmyk;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Lab;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Rgb;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Xyz;
+  public static final class Adaptation.Companion {
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getBradford();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getCiecat02();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getVonKries();
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ColorModel {
+    ctor public ColorModel();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getComponentCount-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.graphics.colorspace.ColorModel.Companion Companion;
+  }
+
+  public static final class ColorModel.Companion {
+    method public long getCmyk-xdoWZVw();
+    method public long getLab-xdoWZVw();
+    method public long getRgb-xdoWZVw();
+    method public long getXyz-xdoWZVw();
+    property public final long Cmyk;
+    property public final long Lab;
+    property public final long Rgb;
+    property public final long Xyz;
   }
 
   public abstract class ColorSpace {
-    ctor public ColorSpace(String name, androidx.compose.ui.graphics.colorspace.ColorModel model);
     method public final float[] fromXyz(float x, float y, float z);
     method public abstract float[] fromXyz(float[] v);
     method public final int getComponentCount();
     method public abstract float getMaxValue(int component);
     method public abstract float getMinValue(int component);
-    method public final androidx.compose.ui.graphics.colorspace.ColorModel getModel();
+    method public final long getModel-xdoWZVw();
     method public final String getName();
     method public boolean isSrgb();
     method public abstract boolean isWideGamut();
@@ -786,14 +1021,14 @@
     property public final int componentCount;
     property public boolean isSrgb;
     property public abstract boolean isWideGamut;
-    property public final androidx.compose.ui.graphics.colorspace.ColorModel model;
+    property public final long model;
     property public final String name;
   }
 
   public final class ColorSpaceKt {
     method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, optional androidx.compose.ui.graphics.colorspace.Adaptation adaptation);
     method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint);
-    method public static androidx.compose.ui.graphics.colorspace.Connector connect(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional androidx.compose.ui.graphics.colorspace.RenderIntent intent);
+    method public static androidx.compose.ui.graphics.colorspace.Connector connect-InwLUsE(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional int intent);
   }
 
   public final class ColorSpaces {
@@ -835,12 +1070,12 @@
 
   public class Connector {
     method public final androidx.compose.ui.graphics.colorspace.ColorSpace getDestination();
-    method public final androidx.compose.ui.graphics.colorspace.RenderIntent getRenderIntent();
+    method public final int getRenderIntent-uksYyKA();
     method public final androidx.compose.ui.graphics.colorspace.ColorSpace getSource();
     method public final float[] transform(float r, float g, float b);
     method public float[] transform(float[] v);
     property public final androidx.compose.ui.graphics.colorspace.ColorSpace destination;
-    property public final androidx.compose.ui.graphics.colorspace.RenderIntent renderIntent;
+    property public final int renderIntent;
     property public final androidx.compose.ui.graphics.colorspace.ColorSpace source;
   }
 
@@ -866,11 +1101,26 @@
     field public static final androidx.compose.ui.graphics.colorspace.Illuminant INSTANCE;
   }
 
-  public enum RenderIntent {
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Absolute;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Perceptual;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Relative;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Saturation;
+  @androidx.compose.runtime.Immutable public final inline class RenderIntent {
+    ctor public RenderIntent();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.colorspace.RenderIntent.Companion Companion;
+  }
+
+  public static final class RenderIntent.Companion {
+    method public int getAbsolute-uksYyKA();
+    method public int getPerceptual-uksYyKA();
+    method public int getRelative-uksYyKA();
+    method public int getSaturation-uksYyKA();
+    property public final int Absolute;
+    property public final int Perceptual;
+    property public final int Relative;
+    property public final int Saturation;
   }
 
   public final class Rgb extends androidx.compose.ui.graphics.colorspace.ColorSpace {
@@ -952,24 +1202,24 @@
   public final class CanvasDrawScope implements androidx.compose.ui.graphics.drawscope.DrawScope {
     ctor public CanvasDrawScope();
     method public inline void draw-jkGVKLE(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
-    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath-_TD-E3k(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
     method public float getDensity();
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public float getFontScale();
@@ -1022,24 +1272,24 @@
   }
 
   @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawScope extends androidx.compose.ui.unit.Density {
-    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-NGaRamM(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-fNghmuc(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle-NGaRamM(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath-_TD-E3k(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect-fNghmuc(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public default long getCenter-F1C5BW0();
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
@@ -1053,13 +1303,13 @@
   }
 
   public static final class DrawScope.Companion {
-    method public androidx.compose.ui.graphics.BlendMode getDefaultBlendMode();
-    property public final androidx.compose.ui.graphics.BlendMode DefaultBlendMode;
+    method public int getDefaultBlendMode-0nO6VwU();
+    property public final int DefaultBlendMode;
   }
 
   public final class DrawScopeKt {
-    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
-    method public static inline void clipRect(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipPath--PbAnyU(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipRect-2ny_0ws(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
     method public static inline void drawIntoCanvas(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
     method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
     method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float inset, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
@@ -1079,8 +1329,8 @@
   }
 
   @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawTransform {
-    method public void clipPath(androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipPath-fquoRGU(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public void clipRect-wxHPq4g(optional float left, optional float top, optional float right, optional float bottom, optional int clipOp);
     method public default long getCenter-F1C5BW0();
     method public long getSize-NH-jbRc();
     method public void inset(float left, float top, float right, float bottom);
@@ -1104,14 +1354,13 @@
   }
 
   public final class Stroke extends androidx.compose.ui.graphics.drawscope.DrawStyle {
-    ctor public Stroke(optional float width, optional float miter, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.StrokeJoin join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
-    method public androidx.compose.ui.graphics.StrokeCap getCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getJoin();
+    method public int getCap-KaPHkGw();
+    method public int getJoin-LxFBmk8();
     method public float getMiter();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public float getWidth();
-    property public final androidx.compose.ui.graphics.StrokeCap cap;
-    property public final androidx.compose.ui.graphics.StrokeJoin join;
+    property public final int cap;
+    property public final int join;
     property public final float miter;
     property public final androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public final float width;
@@ -1121,10 +1370,10 @@
   }
 
   public static final class Stroke.Companion {
-    method public androidx.compose.ui.graphics.StrokeCap getDefaultCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getDefaultJoin();
-    property public final androidx.compose.ui.graphics.StrokeCap DefaultCap;
-    property public final androidx.compose.ui.graphics.StrokeJoin DefaultJoin;
+    method public int getDefaultCap-KaPHkGw();
+    method public int getDefaultJoin-LxFBmk8();
+    property public final int DefaultCap;
+    property public final int DefaultJoin;
   }
 
 }
diff --git a/compose/ui/ui-graphics/api/restricted_current.ignore b/compose/ui/ui-graphics/api/restricted_current.ignore
new file mode 100644
index 0000000..a99410d
--- /dev/null
+++ b/compose/ui/ui-graphics/api/restricted_current.ignore
@@ -0,0 +1,541 @@
+// Baseline format: 1.0
+AddedAbstractMethod: androidx.compose.ui.graphics.Canvas#clipPath-fquoRGU(androidx.compose.ui.graphics.Path, int):
+    Added method androidx.compose.ui.graphics.Canvas.clipPath-fquoRGU(androidx.compose.ui.graphics.Path,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Canvas#clipRect-wxHPq4g(float, float, float, float, int):
+    Added method androidx.compose.ui.graphics.Canvas.clipRect-wxHPq4g(float,float,float,float,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Canvas#drawPoints-iVdqbVo(int, java.util.List<androidx.compose.ui.geometry.Offset>, androidx.compose.ui.graphics.Paint):
+    Added method androidx.compose.ui.graphics.Canvas.drawPoints-iVdqbVo(int,java.util.List<androidx.compose.ui.geometry.Offset>,androidx.compose.ui.graphics.Paint)
+AddedAbstractMethod: androidx.compose.ui.graphics.Canvas#drawRawPoints-59E74cI(int, float[], androidx.compose.ui.graphics.Paint):
+    Added method androidx.compose.ui.graphics.Canvas.drawRawPoints-59E74cI(int,float[],androidx.compose.ui.graphics.Paint)
+AddedAbstractMethod: androidx.compose.ui.graphics.Canvas#drawVertices-nA16xIE(androidx.compose.ui.graphics.Vertices, int, androidx.compose.ui.graphics.Paint):
+    Added method androidx.compose.ui.graphics.Canvas.drawVertices-nA16xIE(androidx.compose.ui.graphics.Vertices,int,androidx.compose.ui.graphics.Paint)
+AddedAbstractMethod: androidx.compose.ui.graphics.ImageBitmap#getConfig-_sVssgQ():
+    Added method androidx.compose.ui.graphics.ImageBitmap.getConfig-_sVssgQ()
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#getBlendMode-0nO6VwU():
+    Added method androidx.compose.ui.graphics.Paint.getBlendMode-0nO6VwU()
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#getFilterQuality-f-v9h1I():
+    Added method androidx.compose.ui.graphics.Paint.getFilterQuality-f-v9h1I()
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#getStrokeCap-KaPHkGw():
+    Added method androidx.compose.ui.graphics.Paint.getStrokeCap-KaPHkGw()
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#getStrokeJoin-LxFBmk8():
+    Added method androidx.compose.ui.graphics.Paint.getStrokeJoin-LxFBmk8()
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#getStyle-TiuSbCo():
+    Added method androidx.compose.ui.graphics.Paint.getStyle-TiuSbCo()
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#setBlendMode-s9anfk8(int):
+    Added method androidx.compose.ui.graphics.Paint.setBlendMode-s9anfk8(int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#setFilterQuality-vDHp3xo(int):
+    Added method androidx.compose.ui.graphics.Paint.setFilterQuality-vDHp3xo(int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#setStrokeCap-BeK7IIE(int):
+    Added method androidx.compose.ui.graphics.Paint.setStrokeCap-BeK7IIE(int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#setStrokeJoin-Ww9F2mQ(int):
+    Added method androidx.compose.ui.graphics.Paint.setStrokeJoin-Ww9F2mQ(int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Paint#setStyle-k9PVt8s(int):
+    Added method androidx.compose.ui.graphics.Paint.setStyle-k9PVt8s(int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Path#getFillType-Rg-k1Os():
+    Added method androidx.compose.ui.graphics.Path.getFillType-Rg-k1Os()
+AddedAbstractMethod: androidx.compose.ui.graphics.Path#op-xiGExi0(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Path, int):
+    Added method androidx.compose.ui.graphics.Path.op-xiGExi0(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.Path,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.Path#setFillType-oQ8Xj4U(int):
+    Added method androidx.compose.ui.graphics.Path.setFillType-oQ8Xj4U(int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawArc-BcZ8TnY(long, float, float, boolean, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawArc-BcZ8TnY(long,float,float,boolean,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush, float, float, boolean, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush,float,float,boolean,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawCircle-NGaRamM(long, float, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawCircle-NGaRamM(long,float,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush, float, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush,float,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap, long, long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap,long,long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawLine-QXZmVdc(long, long, long, float, int, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawLine-QXZmVdc(long,long,long,float,int,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush, long, long, float, int, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush,long,long,float,int,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawOval-IdEHoqk(long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawOval-IdEHoqk(long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPath-_TD-E3k(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawPath-_TD-E3k(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPath-tilSWAQ(androidx.compose.ui.graphics.Path, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawPath-tilSWAQ(androidx.compose.ui.graphics.Path,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset>, int, long, float, int, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset>,int,long,float,int,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset>, int, androidx.compose.ui.graphics.Brush, float, int, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset>,int,androidx.compose.ui.graphics.Brush,float,int,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRect-IdEHoqk(long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawRect-IdEHoqk(long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRoundRect-fNghmuc(long, long, long, long, androidx.compose.ui.graphics.drawscope.DrawStyle, float, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawRoundRect-fNghmuc(long,long,long,long,androidx.compose.ui.graphics.drawscope.DrawStyle,float,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush, long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawScope.drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush,long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawTransform#clipPath-fquoRGU(androidx.compose.ui.graphics.Path, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawTransform.clipPath-fquoRGU(androidx.compose.ui.graphics.Path,int)
+AddedAbstractMethod: androidx.compose.ui.graphics.drawscope.DrawTransform#clipRect-wxHPq4g(float, float, float, float, int):
+    Added method androidx.compose.ui.graphics.drawscope.DrawTransform.clipRect-wxHPq4g(float,float,float,float,int)
+
+
+ChangedSuperclass: androidx.compose.ui.graphics.BlendMode:
+    Class androidx.compose.ui.graphics.BlendMode superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.ClipOp:
+    Class androidx.compose.ui.graphics.ClipOp superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.FilterQuality:
+    Class androidx.compose.ui.graphics.FilterQuality superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.ImageBitmapConfig:
+    Class androidx.compose.ui.graphics.ImageBitmapConfig superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.PaintingStyle:
+    Class androidx.compose.ui.graphics.PaintingStyle superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.PathFillType:
+    Class androidx.compose.ui.graphics.PathFillType superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.PathOperation:
+    Class androidx.compose.ui.graphics.PathOperation superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.PointMode:
+    Class androidx.compose.ui.graphics.PointMode superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.StampedPathEffectStyle:
+    Class androidx.compose.ui.graphics.StampedPathEffectStyle superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.StrokeCap:
+    Class androidx.compose.ui.graphics.StrokeCap superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.StrokeJoin:
+    Class androidx.compose.ui.graphics.StrokeJoin superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.TileMode:
+    Class androidx.compose.ui.graphics.TileMode superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.VertexMode:
+    Class androidx.compose.ui.graphics.VertexMode superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.colorspace.Adaptation:
+    Class androidx.compose.ui.graphics.colorspace.Adaptation superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.colorspace.ColorModel:
+    Class androidx.compose.ui.graphics.colorspace.ColorModel superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.graphics.colorspace.RenderIntent:
+    Class androidx.compose.ui.graphics.colorspace.RenderIntent superclass changed from java.lang.Enum to java.lang.Object
+
+
+InvalidNullConversion: Field AndroidPaint.blendMode:
+    Attempted to remove @NonNull annotation from Field AndroidPaint.blendMode
+InvalidNullConversion: Field AndroidPaint.filterQuality:
+    Attempted to remove @NonNull annotation from Field AndroidPaint.filterQuality
+InvalidNullConversion: Field AndroidPaint.strokeCap:
+    Attempted to remove @NonNull annotation from Field AndroidPaint.strokeCap
+InvalidNullConversion: Field AndroidPaint.strokeJoin:
+    Attempted to remove @NonNull annotation from Field AndroidPaint.strokeJoin
+InvalidNullConversion: Field AndroidPaint.style:
+    Attempted to remove @NonNull annotation from Field AndroidPaint.style
+InvalidNullConversion: Field AndroidPath.fillType:
+    Attempted to remove @NonNull annotation from Field AndroidPath.fillType
+InvalidNullConversion: Field ColorSpace.model:
+    Attempted to remove @NonNull annotation from Field ColorSpace.model
+InvalidNullConversion: Field Connector.renderIntent:
+    Attempted to remove @NonNull annotation from Field Connector.renderIntent
+InvalidNullConversion: Field DrawScope.Companion.DefaultBlendMode:
+    Attempted to remove @NonNull annotation from Field DrawScope.Companion.DefaultBlendMode
+InvalidNullConversion: Field ImageBitmap.config:
+    Attempted to remove @NonNull annotation from Field ImageBitmap.config
+InvalidNullConversion: Field Paint.blendMode:
+    Attempted to remove @NonNull annotation from Field Paint.blendMode
+InvalidNullConversion: Field Paint.filterQuality:
+    Attempted to remove @NonNull annotation from Field Paint.filterQuality
+InvalidNullConversion: Field Paint.strokeCap:
+    Attempted to remove @NonNull annotation from Field Paint.strokeCap
+InvalidNullConversion: Field Paint.strokeJoin:
+    Attempted to remove @NonNull annotation from Field Paint.strokeJoin
+InvalidNullConversion: Field Paint.style:
+    Attempted to remove @NonNull annotation from Field Paint.style
+InvalidNullConversion: Field Path.fillType:
+    Attempted to remove @NonNull annotation from Field Path.fillType
+InvalidNullConversion: Field Stroke.Companion.DefaultCap:
+    Attempted to remove @NonNull annotation from Field Stroke.Companion.DefaultCap
+InvalidNullConversion: Field Stroke.Companion.DefaultJoin:
+    Attempted to remove @NonNull annotation from Field Stroke.Companion.DefaultJoin
+InvalidNullConversion: Field Stroke.cap:
+    Attempted to remove @NonNull annotation from Field Stroke.cap
+InvalidNullConversion: Field Stroke.join:
+    Attempted to remove @NonNull annotation from Field Stroke.join
+InvalidNullConversion: Field Vertices.vertexMode:
+    Attempted to remove @NonNull annotation from Field Vertices.vertexMode
+
+
+RemovedField: androidx.compose.ui.graphics.BlendMode#Clear:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Clear
+RemovedField: androidx.compose.ui.graphics.BlendMode#Color:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Color
+RemovedField: androidx.compose.ui.graphics.BlendMode#ColorBurn:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.ColorBurn
+RemovedField: androidx.compose.ui.graphics.BlendMode#ColorDodge:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.ColorDodge
+RemovedField: androidx.compose.ui.graphics.BlendMode#Darken:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Darken
+RemovedField: androidx.compose.ui.graphics.BlendMode#Difference:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Difference
+RemovedField: androidx.compose.ui.graphics.BlendMode#Dst:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Dst
+RemovedField: androidx.compose.ui.graphics.BlendMode#DstAtop:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.DstAtop
+RemovedField: androidx.compose.ui.graphics.BlendMode#DstIn:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.DstIn
+RemovedField: androidx.compose.ui.graphics.BlendMode#DstOut:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.DstOut
+RemovedField: androidx.compose.ui.graphics.BlendMode#DstOver:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.DstOver
+RemovedField: androidx.compose.ui.graphics.BlendMode#Exclusion:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Exclusion
+RemovedField: androidx.compose.ui.graphics.BlendMode#Hardlight:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Hardlight
+RemovedField: androidx.compose.ui.graphics.BlendMode#Hue:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Hue
+RemovedField: androidx.compose.ui.graphics.BlendMode#Lighten:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Lighten
+RemovedField: androidx.compose.ui.graphics.BlendMode#Luminosity:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Luminosity
+RemovedField: androidx.compose.ui.graphics.BlendMode#Modulate:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Modulate
+RemovedField: androidx.compose.ui.graphics.BlendMode#Multiply:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Multiply
+RemovedField: androidx.compose.ui.graphics.BlendMode#Overlay:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Overlay
+RemovedField: androidx.compose.ui.graphics.BlendMode#Plus:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Plus
+RemovedField: androidx.compose.ui.graphics.BlendMode#Saturation:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Saturation
+RemovedField: androidx.compose.ui.graphics.BlendMode#Screen:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Screen
+RemovedField: androidx.compose.ui.graphics.BlendMode#Softlight:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Softlight
+RemovedField: androidx.compose.ui.graphics.BlendMode#Src:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Src
+RemovedField: androidx.compose.ui.graphics.BlendMode#SrcAtop:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.SrcAtop
+RemovedField: androidx.compose.ui.graphics.BlendMode#SrcIn:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.SrcIn
+RemovedField: androidx.compose.ui.graphics.BlendMode#SrcOut:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.SrcOut
+RemovedField: androidx.compose.ui.graphics.BlendMode#SrcOver:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.SrcOver
+RemovedField: androidx.compose.ui.graphics.BlendMode#Xor:
+    Removed enum constant androidx.compose.ui.graphics.BlendMode.Xor
+RemovedField: androidx.compose.ui.graphics.ClipOp#Difference:
+    Removed enum constant androidx.compose.ui.graphics.ClipOp.Difference
+RemovedField: androidx.compose.ui.graphics.ClipOp#Intersect:
+    Removed enum constant androidx.compose.ui.graphics.ClipOp.Intersect
+RemovedField: androidx.compose.ui.graphics.FilterQuality#High:
+    Removed enum constant androidx.compose.ui.graphics.FilterQuality.High
+RemovedField: androidx.compose.ui.graphics.FilterQuality#Low:
+    Removed enum constant androidx.compose.ui.graphics.FilterQuality.Low
+RemovedField: androidx.compose.ui.graphics.FilterQuality#Medium:
+    Removed enum constant androidx.compose.ui.graphics.FilterQuality.Medium
+RemovedField: androidx.compose.ui.graphics.FilterQuality#None:
+    Removed enum constant androidx.compose.ui.graphics.FilterQuality.None
+RemovedField: androidx.compose.ui.graphics.ImageBitmapConfig#Alpha8:
+    Removed enum constant androidx.compose.ui.graphics.ImageBitmapConfig.Alpha8
+RemovedField: androidx.compose.ui.graphics.ImageBitmapConfig#Argb8888:
+    Removed enum constant androidx.compose.ui.graphics.ImageBitmapConfig.Argb8888
+RemovedField: androidx.compose.ui.graphics.ImageBitmapConfig#F16:
+    Removed enum constant androidx.compose.ui.graphics.ImageBitmapConfig.F16
+RemovedField: androidx.compose.ui.graphics.ImageBitmapConfig#Gpu:
+    Removed enum constant androidx.compose.ui.graphics.ImageBitmapConfig.Gpu
+RemovedField: androidx.compose.ui.graphics.ImageBitmapConfig#Rgb565:
+    Removed enum constant androidx.compose.ui.graphics.ImageBitmapConfig.Rgb565
+RemovedField: androidx.compose.ui.graphics.PaintingStyle#Fill:
+    Removed enum constant androidx.compose.ui.graphics.PaintingStyle.Fill
+RemovedField: androidx.compose.ui.graphics.PaintingStyle#Stroke:
+    Removed enum constant androidx.compose.ui.graphics.PaintingStyle.Stroke
+RemovedField: androidx.compose.ui.graphics.PathFillType#EvenOdd:
+    Removed enum constant androidx.compose.ui.graphics.PathFillType.EvenOdd
+RemovedField: androidx.compose.ui.graphics.PathFillType#NonZero:
+    Removed enum constant androidx.compose.ui.graphics.PathFillType.NonZero
+RemovedField: androidx.compose.ui.graphics.PathOperation#difference:
+    Removed enum constant androidx.compose.ui.graphics.PathOperation.difference
+RemovedField: androidx.compose.ui.graphics.PathOperation#intersect:
+    Removed enum constant androidx.compose.ui.graphics.PathOperation.intersect
+RemovedField: androidx.compose.ui.graphics.PathOperation#reverseDifference:
+    Removed enum constant androidx.compose.ui.graphics.PathOperation.reverseDifference
+RemovedField: androidx.compose.ui.graphics.PathOperation#union:
+    Removed enum constant androidx.compose.ui.graphics.PathOperation.union
+RemovedField: androidx.compose.ui.graphics.PathOperation#xor:
+    Removed enum constant androidx.compose.ui.graphics.PathOperation.xor
+RemovedField: androidx.compose.ui.graphics.PointMode#Lines:
+    Removed enum constant androidx.compose.ui.graphics.PointMode.Lines
+RemovedField: androidx.compose.ui.graphics.PointMode#Points:
+    Removed enum constant androidx.compose.ui.graphics.PointMode.Points
+RemovedField: androidx.compose.ui.graphics.PointMode#Polygon:
+    Removed enum constant androidx.compose.ui.graphics.PointMode.Polygon
+RemovedField: androidx.compose.ui.graphics.StampedPathEffectStyle#Morph:
+    Removed enum constant androidx.compose.ui.graphics.StampedPathEffectStyle.Morph
+RemovedField: androidx.compose.ui.graphics.StampedPathEffectStyle#Rotate:
+    Removed enum constant androidx.compose.ui.graphics.StampedPathEffectStyle.Rotate
+RemovedField: androidx.compose.ui.graphics.StampedPathEffectStyle#Translate:
+    Removed enum constant androidx.compose.ui.graphics.StampedPathEffectStyle.Translate
+RemovedField: androidx.compose.ui.graphics.StrokeCap#Butt:
+    Removed enum constant androidx.compose.ui.graphics.StrokeCap.Butt
+RemovedField: androidx.compose.ui.graphics.StrokeCap#Round:
+    Removed enum constant androidx.compose.ui.graphics.StrokeCap.Round
+RemovedField: androidx.compose.ui.graphics.StrokeCap#Square:
+    Removed enum constant androidx.compose.ui.graphics.StrokeCap.Square
+RemovedField: androidx.compose.ui.graphics.StrokeJoin#Bevel:
+    Removed enum constant androidx.compose.ui.graphics.StrokeJoin.Bevel
+RemovedField: androidx.compose.ui.graphics.StrokeJoin#Miter:
+    Removed enum constant androidx.compose.ui.graphics.StrokeJoin.Miter
+RemovedField: androidx.compose.ui.graphics.StrokeJoin#Round:
+    Removed enum constant androidx.compose.ui.graphics.StrokeJoin.Round
+RemovedField: androidx.compose.ui.graphics.TileMode#Clamp:
+    Removed enum constant androidx.compose.ui.graphics.TileMode.Clamp
+RemovedField: androidx.compose.ui.graphics.TileMode#Mirror:
+    Removed enum constant androidx.compose.ui.graphics.TileMode.Mirror
+RemovedField: androidx.compose.ui.graphics.TileMode#Repeated:
+    Removed enum constant androidx.compose.ui.graphics.TileMode.Repeated
+RemovedField: androidx.compose.ui.graphics.VertexMode#TriangleFan:
+    Removed enum constant androidx.compose.ui.graphics.VertexMode.TriangleFan
+RemovedField: androidx.compose.ui.graphics.VertexMode#TriangleStrip:
+    Removed enum constant androidx.compose.ui.graphics.VertexMode.TriangleStrip
+RemovedField: androidx.compose.ui.graphics.VertexMode#Triangles:
+    Removed enum constant androidx.compose.ui.graphics.VertexMode.Triangles
+RemovedField: androidx.compose.ui.graphics.colorspace.Adaptation#Bradford:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.Adaptation.Bradford
+RemovedField: androidx.compose.ui.graphics.colorspace.Adaptation#Ciecat02:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.Adaptation.Ciecat02
+RemovedField: androidx.compose.ui.graphics.colorspace.Adaptation#VonKries:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.Adaptation.VonKries
+RemovedField: androidx.compose.ui.graphics.colorspace.ColorModel#Cmyk:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.ColorModel.Cmyk
+RemovedField: androidx.compose.ui.graphics.colorspace.ColorModel#Lab:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.ColorModel.Lab
+RemovedField: androidx.compose.ui.graphics.colorspace.ColorModel#Rgb:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.ColorModel.Rgb
+RemovedField: androidx.compose.ui.graphics.colorspace.ColorModel#Xyz:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.ColorModel.Xyz
+RemovedField: androidx.compose.ui.graphics.colorspace.RenderIntent#Absolute:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.RenderIntent.Absolute
+RemovedField: androidx.compose.ui.graphics.colorspace.RenderIntent#Perceptual:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.RenderIntent.Perceptual
+RemovedField: androidx.compose.ui.graphics.colorspace.RenderIntent#Relative:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.RenderIntent.Relative
+RemovedField: androidx.compose.ui.graphics.colorspace.RenderIntent#Saturation:
+    Removed enum constant androidx.compose.ui.graphics.colorspace.RenderIntent.Saturation
+
+
+RemovedMethod: androidx.compose.ui.graphics.AndroidBlendMode_androidKt#isSupported(androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.AndroidBlendMode_androidKt.isSupported(androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.AndroidCanvas#clipPath(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.ClipOp):
+    Removed method androidx.compose.ui.graphics.AndroidCanvas.clipPath(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.ClipOp)
+RemovedMethod: androidx.compose.ui.graphics.AndroidCanvas#clipRect(float, float, float, float, androidx.compose.ui.graphics.ClipOp):
+    Removed method androidx.compose.ui.graphics.AndroidCanvas.clipRect(float,float,float,float,androidx.compose.ui.graphics.ClipOp)
+RemovedMethod: androidx.compose.ui.graphics.AndroidCanvas#drawPoints(androidx.compose.ui.graphics.PointMode, java.util.List<androidx.compose.ui.geometry.Offset>, androidx.compose.ui.graphics.Paint):
+    Removed method androidx.compose.ui.graphics.AndroidCanvas.drawPoints(androidx.compose.ui.graphics.PointMode,java.util.List<androidx.compose.ui.geometry.Offset>,androidx.compose.ui.graphics.Paint)
+RemovedMethod: androidx.compose.ui.graphics.AndroidCanvas#drawRawPoints(androidx.compose.ui.graphics.PointMode, float[], androidx.compose.ui.graphics.Paint):
+    Removed method androidx.compose.ui.graphics.AndroidCanvas.drawRawPoints(androidx.compose.ui.graphics.PointMode,float[],androidx.compose.ui.graphics.Paint)
+RemovedMethod: androidx.compose.ui.graphics.AndroidCanvas#drawVertices(androidx.compose.ui.graphics.Vertices, androidx.compose.ui.graphics.BlendMode, androidx.compose.ui.graphics.Paint):
+    Removed method androidx.compose.ui.graphics.AndroidCanvas.drawVertices(androidx.compose.ui.graphics.Vertices,androidx.compose.ui.graphics.BlendMode,androidx.compose.ui.graphics.Paint)
+RemovedMethod: androidx.compose.ui.graphics.AndroidCanvas#toRegionOp(androidx.compose.ui.graphics.ClipOp):
+    Removed method androidx.compose.ui.graphics.AndroidCanvas.toRegionOp(androidx.compose.ui.graphics.ClipOp)
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#getBlendMode():
+    Removed method androidx.compose.ui.graphics.AndroidPaint.getBlendMode()
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#getFilterQuality():
+    Removed method androidx.compose.ui.graphics.AndroidPaint.getFilterQuality()
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#getStrokeCap():
+    Removed method androidx.compose.ui.graphics.AndroidPaint.getStrokeCap()
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#getStrokeJoin():
+    Removed method androidx.compose.ui.graphics.AndroidPaint.getStrokeJoin()
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#getStyle():
+    Removed method androidx.compose.ui.graphics.AndroidPaint.getStyle()
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#setBlendMode(androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.AndroidPaint.setBlendMode(androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#setFilterQuality(androidx.compose.ui.graphics.FilterQuality):
+    Removed method androidx.compose.ui.graphics.AndroidPaint.setFilterQuality(androidx.compose.ui.graphics.FilterQuality)
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#setStrokeCap(androidx.compose.ui.graphics.StrokeCap):
+    Removed method androidx.compose.ui.graphics.AndroidPaint.setStrokeCap(androidx.compose.ui.graphics.StrokeCap)
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin):
+    Removed method androidx.compose.ui.graphics.AndroidPaint.setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin)
+RemovedMethod: androidx.compose.ui.graphics.AndroidPaint#setStyle(androidx.compose.ui.graphics.PaintingStyle):
+    Removed method androidx.compose.ui.graphics.AndroidPaint.setStyle(androidx.compose.ui.graphics.PaintingStyle)
+RemovedMethod: androidx.compose.ui.graphics.AndroidPath#getFillType():
+    Removed method androidx.compose.ui.graphics.AndroidPath.getFillType()
+RemovedMethod: androidx.compose.ui.graphics.AndroidPath#op(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.PathOperation):
+    Removed method androidx.compose.ui.graphics.AndroidPath.op(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.PathOperation)
+RemovedMethod: androidx.compose.ui.graphics.AndroidPath#setFillType(androidx.compose.ui.graphics.PathFillType):
+    Removed method androidx.compose.ui.graphics.AndroidPath.setFillType(androidx.compose.ui.graphics.PathFillType)
+RemovedMethod: androidx.compose.ui.graphics.AndroidTileMode_androidKt#toNativeTileMode(androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.AndroidTileMode_androidKt.toNativeTileMode(androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.AndroidVertexMode_androidKt#toNativeVertexMode(androidx.compose.ui.graphics.VertexMode):
+    Removed method androidx.compose.ui.graphics.AndroidVertexMode_androidKt.toNativeVertexMode(androidx.compose.ui.graphics.VertexMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color>, float, float, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color>,float,float,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[], float, float, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[],float,float,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color>, long, long, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color>,long,long,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[], long, long, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[],long,long,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color>, long, float, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color>,long,float,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[], long, float, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[],long,float,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#verticalGradient(java.util.List<androidx.compose.ui.graphics.Color>, float, float, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.verticalGradient(java.util.List<androidx.compose.ui.graphics.Color>,float,float,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Brush.Companion#verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[], float, float, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.Brush.Companion.verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>[],float,float,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Canvas#clipPath(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.ClipOp):
+    Removed method androidx.compose.ui.graphics.Canvas.clipPath(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.ClipOp)
+RemovedMethod: androidx.compose.ui.graphics.Canvas#clipRect(androidx.compose.ui.geometry.Rect, androidx.compose.ui.graphics.ClipOp):
+    Removed method androidx.compose.ui.graphics.Canvas.clipRect(androidx.compose.ui.geometry.Rect,androidx.compose.ui.graphics.ClipOp)
+RemovedMethod: androidx.compose.ui.graphics.Canvas#clipRect(float, float, float, float, androidx.compose.ui.graphics.ClipOp):
+    Removed method androidx.compose.ui.graphics.Canvas.clipRect(float,float,float,float,androidx.compose.ui.graphics.ClipOp)
+RemovedMethod: androidx.compose.ui.graphics.Canvas#drawPoints(androidx.compose.ui.graphics.PointMode, java.util.List<androidx.compose.ui.geometry.Offset>, androidx.compose.ui.graphics.Paint):
+    Removed method androidx.compose.ui.graphics.Canvas.drawPoints(androidx.compose.ui.graphics.PointMode,java.util.List<androidx.compose.ui.geometry.Offset>,androidx.compose.ui.graphics.Paint)
+RemovedMethod: androidx.compose.ui.graphics.Canvas#drawRawPoints(androidx.compose.ui.graphics.PointMode, float[], androidx.compose.ui.graphics.Paint):
+    Removed method androidx.compose.ui.graphics.Canvas.drawRawPoints(androidx.compose.ui.graphics.PointMode,float[],androidx.compose.ui.graphics.Paint)
+RemovedMethod: androidx.compose.ui.graphics.Canvas#drawVertices(androidx.compose.ui.graphics.Vertices, androidx.compose.ui.graphics.BlendMode, androidx.compose.ui.graphics.Paint):
+    Removed method androidx.compose.ui.graphics.Canvas.drawVertices(androidx.compose.ui.graphics.Vertices,androidx.compose.ui.graphics.BlendMode,androidx.compose.ui.graphics.Paint)
+RemovedMethod: androidx.compose.ui.graphics.ColorFilter.Companion#tint-aamYUWA(long, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.ColorFilter.Companion.tint-aamYUWA(long,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.ImageBitmap#getConfig():
+    Removed method androidx.compose.ui.graphics.ImageBitmap.getConfig()
+RemovedMethod: androidx.compose.ui.graphics.ImageBitmapKt#ImageBitmap(int, int, androidx.compose.ui.graphics.ImageBitmapConfig, boolean, androidx.compose.ui.graphics.colorspace.ColorSpace):
+    Removed method androidx.compose.ui.graphics.ImageBitmapKt.ImageBitmap(int,int,androidx.compose.ui.graphics.ImageBitmapConfig,boolean,androidx.compose.ui.graphics.colorspace.ColorSpace)
+RemovedMethod: androidx.compose.ui.graphics.OutlineKt#drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.OutlineKt.drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope,androidx.compose.ui.graphics.Outline,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.OutlineKt#drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.OutlineKt.drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope,androidx.compose.ui.graphics.Outline,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.Paint#getBlendMode():
+    Removed method androidx.compose.ui.graphics.Paint.getBlendMode()
+RemovedMethod: androidx.compose.ui.graphics.Paint#getFilterQuality():
+    Removed method androidx.compose.ui.graphics.Paint.getFilterQuality()
+RemovedMethod: androidx.compose.ui.graphics.Paint#getStrokeCap():
+    Removed method androidx.compose.ui.graphics.Paint.getStrokeCap()
+RemovedMethod: androidx.compose.ui.graphics.Paint#getStrokeJoin():
+    Removed method androidx.compose.ui.graphics.Paint.getStrokeJoin()
+RemovedMethod: androidx.compose.ui.graphics.Paint#getStyle():
+    Removed method androidx.compose.ui.graphics.Paint.getStyle()
+RemovedMethod: androidx.compose.ui.graphics.Paint#setBlendMode(androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.Paint.setBlendMode(androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.Paint#setFilterQuality(androidx.compose.ui.graphics.FilterQuality):
+    Removed method androidx.compose.ui.graphics.Paint.setFilterQuality(androidx.compose.ui.graphics.FilterQuality)
+RemovedMethod: androidx.compose.ui.graphics.Paint#setStrokeCap(androidx.compose.ui.graphics.StrokeCap):
+    Removed method androidx.compose.ui.graphics.Paint.setStrokeCap(androidx.compose.ui.graphics.StrokeCap)
+RemovedMethod: androidx.compose.ui.graphics.Paint#setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin):
+    Removed method androidx.compose.ui.graphics.Paint.setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin)
+RemovedMethod: androidx.compose.ui.graphics.Paint#setStyle(androidx.compose.ui.graphics.PaintingStyle):
+    Removed method androidx.compose.ui.graphics.Paint.setStyle(androidx.compose.ui.graphics.PaintingStyle)
+RemovedMethod: androidx.compose.ui.graphics.Path#getFillType():
+    Removed method androidx.compose.ui.graphics.Path.getFillType()
+RemovedMethod: androidx.compose.ui.graphics.Path#op(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.PathOperation):
+    Removed method androidx.compose.ui.graphics.Path.op(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.PathOperation)
+RemovedMethod: androidx.compose.ui.graphics.Path#setFillType(androidx.compose.ui.graphics.PathFillType):
+    Removed method androidx.compose.ui.graphics.Path.setFillType(androidx.compose.ui.graphics.PathFillType)
+RemovedMethod: androidx.compose.ui.graphics.Path.Companion#combine(androidx.compose.ui.graphics.PathOperation, androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Path):
+    Removed method androidx.compose.ui.graphics.Path.Companion.combine(androidx.compose.ui.graphics.PathOperation,androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.Path)
+RemovedMethod: androidx.compose.ui.graphics.PathEffect.Companion#stampedPathEffect(androidx.compose.ui.graphics.Path, float, float, androidx.compose.ui.graphics.StampedPathEffectStyle):
+    Removed method androidx.compose.ui.graphics.PathEffect.Companion.stampedPathEffect(androidx.compose.ui.graphics.Path,float,float,androidx.compose.ui.graphics.StampedPathEffectStyle)
+RemovedMethod: androidx.compose.ui.graphics.ShaderKt#ImageShader(androidx.compose.ui.graphics.ImageBitmap, androidx.compose.ui.graphics.TileMode, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.ShaderKt.ImageShader(androidx.compose.ui.graphics.ImageBitmap,androidx.compose.ui.graphics.TileMode,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.ShaderKt#LinearGradientShader-GfyHbQM(long, long, java.util.List<androidx.compose.ui.graphics.Color>, java.util.List<java.lang.Float>, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.ShaderKt.LinearGradientShader-GfyHbQM(long,long,java.util.List<androidx.compose.ui.graphics.Color>,java.util.List<java.lang.Float>,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.ShaderKt#RadialGradientShader-cY6o93o(long, float, java.util.List<androidx.compose.ui.graphics.Color>, java.util.List<java.lang.Float>, androidx.compose.ui.graphics.TileMode):
+    Removed method androidx.compose.ui.graphics.ShaderKt.RadialGradientShader-cY6o93o(long,float,java.util.List<androidx.compose.ui.graphics.Color>,java.util.List<java.lang.Float>,androidx.compose.ui.graphics.TileMode)
+RemovedMethod: androidx.compose.ui.graphics.Vertices#Vertices(androidx.compose.ui.graphics.VertexMode, java.util.List<androidx.compose.ui.geometry.Offset>, java.util.List<androidx.compose.ui.geometry.Offset>, java.util.List<androidx.compose.ui.graphics.Color>, java.util.List<java.lang.Integer>):
+    Removed constructor androidx.compose.ui.graphics.Vertices(androidx.compose.ui.graphics.VertexMode,java.util.List<androidx.compose.ui.geometry.Offset>,java.util.List<androidx.compose.ui.geometry.Offset>,java.util.List<androidx.compose.ui.graphics.Color>,java.util.List<java.lang.Integer>)
+RemovedMethod: androidx.compose.ui.graphics.Vertices#getVertexMode():
+    Removed method androidx.compose.ui.graphics.Vertices.getVertexMode()
+RemovedMethod: androidx.compose.ui.graphics.colorspace.ColorModel#getComponentCount():
+    Removed method androidx.compose.ui.graphics.colorspace.ColorModel.getComponentCount()
+RemovedMethod: androidx.compose.ui.graphics.colorspace.ColorSpace#ColorSpace(String, androidx.compose.ui.graphics.colorspace.ColorModel):
+    Removed constructor androidx.compose.ui.graphics.colorspace.ColorSpace(String,androidx.compose.ui.graphics.colorspace.ColorModel)
+RemovedMethod: androidx.compose.ui.graphics.colorspace.ColorSpace#getModel():
+    Removed method androidx.compose.ui.graphics.colorspace.ColorSpace.getModel()
+RemovedMethod: androidx.compose.ui.graphics.colorspace.ColorSpaceKt#connect(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.RenderIntent):
+    Removed method androidx.compose.ui.graphics.colorspace.ColorSpaceKt.connect(androidx.compose.ui.graphics.colorspace.ColorSpace,androidx.compose.ui.graphics.colorspace.ColorSpace,androidx.compose.ui.graphics.colorspace.RenderIntent)
+RemovedMethod: androidx.compose.ui.graphics.colorspace.Connector#getRenderIntent():
+    Removed method androidx.compose.ui.graphics.colorspace.Connector.getRenderIntent()
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawArc-BcZ8TnY(long, float, float, boolean, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawArc-BcZ8TnY(long,float,float,boolean,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush, float, float, boolean, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush,float,float,boolean,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawCircle-NGaRamM(long, float, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawCircle-NGaRamM(long,float,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush, float, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush,float,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap, long, long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap,long,long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawLine-QXZmVdc(long, long, long, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawLine-QXZmVdc(long,long,long,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawOval-IdEHoqk(long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawOval-IdEHoqk(long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawPath(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawPath(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawPath-tilSWAQ(androidx.compose.ui.graphics.Path, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawPath-tilSWAQ(androidx.compose.ui.graphics.Path,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawPoints(java.util.List<androidx.compose.ui.geometry.Offset>, androidx.compose.ui.graphics.PointMode, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawPoints(java.util.List<androidx.compose.ui.geometry.Offset>,androidx.compose.ui.graphics.PointMode,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset>, androidx.compose.ui.graphics.PointMode, long, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset>,androidx.compose.ui.graphics.PointMode,long,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawRect-IdEHoqk(long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawRect-IdEHoqk(long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawRoundRect-fNghmuc(long, long, long, long, androidx.compose.ui.graphics.drawscope.DrawStyle, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawRoundRect-fNghmuc(long,long,long,long,androidx.compose.ui.graphics.drawscope.DrawStyle,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.CanvasDrawScope#drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush, long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush,long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawArc-BcZ8TnY(long, float, float, boolean, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawArc-BcZ8TnY(long,float,float,boolean,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush, float, float, boolean, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush,float,float,boolean,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawCircle-NGaRamM(long, float, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawCircle-NGaRamM(long,float,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush, float, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush,float,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap, long, long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap,long,long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawLine-QXZmVdc(long, long, long, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawLine-QXZmVdc(long,long,long,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawOval-IdEHoqk(long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawOval-IdEHoqk(long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPath(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawPath(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPath-tilSWAQ(androidx.compose.ui.graphics.Path, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawPath-tilSWAQ(androidx.compose.ui.graphics.Path,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPoints(java.util.List<androidx.compose.ui.geometry.Offset>, androidx.compose.ui.graphics.PointMode, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawPoints(java.util.List<androidx.compose.ui.geometry.Offset>,androidx.compose.ui.graphics.PointMode,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset>, androidx.compose.ui.graphics.PointMode, long, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.PathEffect, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset>,androidx.compose.ui.graphics.PointMode,long,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.PathEffect,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRect-IdEHoqk(long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawRect-IdEHoqk(long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRoundRect-fNghmuc(long, long, long, long, androidx.compose.ui.graphics.drawscope.DrawStyle, float, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawRoundRect-fNghmuc(long,long,long,long,androidx.compose.ui.graphics.drawscope.DrawStyle,float,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush, long, long, long, float, androidx.compose.ui.graphics.drawscope.DrawStyle, androidx.compose.ui.graphics.ColorFilter, androidx.compose.ui.graphics.BlendMode):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush,long,long,long,float,androidx.compose.ui.graphics.drawscope.DrawStyle,androidx.compose.ui.graphics.ColorFilter,androidx.compose.ui.graphics.BlendMode)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope.Companion#getDefaultBlendMode():
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.Companion.getDefaultBlendMode()
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScopeKt#clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.ClipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit>):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScopeKt.clipPath(androidx.compose.ui.graphics.drawscope.DrawScope,androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.ClipOp,kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit>)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScopeKt#clipRect(androidx.compose.ui.graphics.drawscope.DrawScope, float, float, float, float, androidx.compose.ui.graphics.ClipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit>):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScopeKt.clipRect(androidx.compose.ui.graphics.drawscope.DrawScope,float,float,float,float,androidx.compose.ui.graphics.ClipOp,kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit>)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawTransform#clipPath(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.ClipOp):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawTransform.clipPath(androidx.compose.ui.graphics.Path,androidx.compose.ui.graphics.ClipOp)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawTransform#clipRect(float, float, float, float, androidx.compose.ui.graphics.ClipOp):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawTransform.clipRect(float,float,float,float,androidx.compose.ui.graphics.ClipOp)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.Stroke#Stroke(float, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.StrokeJoin, androidx.compose.ui.graphics.PathEffect):
+    Removed constructor androidx.compose.ui.graphics.drawscope.Stroke(float,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.StrokeJoin,androidx.compose.ui.graphics.PathEffect)
+RemovedMethod: androidx.compose.ui.graphics.drawscope.Stroke#getCap():
+    Removed method androidx.compose.ui.graphics.drawscope.Stroke.getCap()
+RemovedMethod: androidx.compose.ui.graphics.drawscope.Stroke#getJoin():
+    Removed method androidx.compose.ui.graphics.drawscope.Stroke.getJoin()
+RemovedMethod: androidx.compose.ui.graphics.drawscope.Stroke.Companion#getDefaultCap():
+    Removed method androidx.compose.ui.graphics.drawscope.Stroke.Companion.getDefaultCap()
+RemovedMethod: androidx.compose.ui.graphics.drawscope.Stroke.Companion#getDefaultJoin():
+    Removed method androidx.compose.ui.graphics.drawscope.Stroke.Companion.getDefaultJoin()
diff --git a/compose/ui/ui-graphics/api/restricted_current.txt b/compose/ui/ui-graphics/api/restricted_current.txt
index 398edf5..43089e6 100644
--- a/compose/ui/ui-graphics/api/restricted_current.txt
+++ b/compose/ui/ui-graphics/api/restricted_current.txt
@@ -2,13 +2,13 @@
 package androidx.compose.ui.graphics {
 
   public final class AndroidBlendMode_androidKt {
-    method public static boolean isSupported(androidx.compose.ui.graphics.BlendMode);
+    method public static boolean isSupported-s9anfk8(int);
   }
 
   @kotlin.PublishedApi internal final class AndroidCanvas implements androidx.compose.ui.graphics.Canvas {
     ctor public AndroidCanvas();
-    method public void clipPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.ClipOp clipOp);
-    method public void clipRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipPath-fquoRGU(androidx.compose.ui.graphics.Path path, int clipOp);
+    method public void clipRect-wxHPq4g(float left, float top, float right, float bottom, int clipOp);
     method public void concat-58bKbWc(float[] matrix);
     method public void disableZ();
     method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
@@ -18,11 +18,11 @@
     method public void drawLine-bYPfCD8(long p1, long p2, androidx.compose.ui.graphics.Paint paint);
     method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
-    method public void drawPoints(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
-    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints-iVdqbVo(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints-59E74cI(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
     method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
-    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, androidx.compose.ui.graphics.BlendMode blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices-nA16xIE(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
     method public void enableZ();
     method public void restore();
     method public void rotate(float degrees);
@@ -30,7 +30,7 @@
     method public void saveLayer(androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint);
     method public void scale(float sx, float sy);
     method public void skew(float sx, float sy);
-    method public android.graphics.Region.Op toRegionOp(androidx.compose.ui.graphics.ClipOp);
+    method public android.graphics.Region.Op toRegionOp--7u2Bmg(int);
     method public void translate(float dx, float dy);
     field @kotlin.PublishedApi internal android.graphics.Canvas internalCanvas;
   }
@@ -59,44 +59,44 @@
     ctor public AndroidPaint();
     method public android.graphics.Paint asFrameworkPaint();
     method public float getAlpha();
-    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public int getBlendMode-0nO6VwU();
     method public long getColor-0d7_KjU();
     method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
-    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public int getFilterQuality-f-v9h1I();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public android.graphics.Shader? getShader();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public int getStrokeCap-KaPHkGw();
+    method public int getStrokeJoin-LxFBmk8();
     method public float getStrokeMiterLimit();
     method public float getStrokeWidth();
-    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public int getStyle-TiuSbCo();
     method public boolean isAntiAlias();
     method public void setAlpha(float value);
     method public void setAntiAlias(boolean value);
-    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode value);
+    method public void setBlendMode-s9anfk8(int value);
     method public void setColor-8_81llA(long color);
     method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
-    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality value);
+    method public void setFilterQuality-vDHp3xo(int value);
     method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
     method public void setShader(android.graphics.Shader? value);
-    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap value);
-    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin value);
+    method public void setStrokeCap-BeK7IIE(int value);
+    method public void setStrokeJoin-Ww9F2mQ(int value);
     method public void setStrokeMiterLimit(float value);
     method public void setStrokeWidth(float value);
-    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle value);
+    method public void setStyle-k9PVt8s(int value);
     property public float alpha;
-    property public androidx.compose.ui.graphics.BlendMode blendMode;
+    property public int blendMode;
     property public long color;
     property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
-    property public androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public int filterQuality;
     property public boolean isAntiAlias;
     property public androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public android.graphics.Shader? shader;
-    property public androidx.compose.ui.graphics.StrokeCap strokeCap;
-    property public androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public int strokeCap;
+    property public int strokeJoin;
     property public float strokeMiterLimit;
     property public float strokeWidth;
-    property public androidx.compose.ui.graphics.PaintingStyle style;
+    property public int style;
   }
 
   public final class AndroidPaint_androidKt {
@@ -115,22 +115,22 @@
     method public void close();
     method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.compose.ui.geometry.Rect getBounds();
-    method public androidx.compose.ui.graphics.PathFillType getFillType();
+    method public int getFillType-Rg-k1Os();
     method public android.graphics.Path getInternalPath();
     method public boolean isConvex();
     method public boolean isEmpty();
     method public void lineTo(float x, float y);
     method public void moveTo(float x, float y);
-    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, androidx.compose.ui.graphics.PathOperation operation);
+    method public boolean op-xiGExi0(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
     method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
     method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
     method public void relativeLineTo(float dx, float dy);
     method public void relativeMoveTo(float dx, float dy);
     method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
     method public void reset();
-    method public void setFillType(androidx.compose.ui.graphics.PathFillType value);
+    method public void setFillType-oQ8Xj4U(int value);
     method public void translate-k-4lQ0M(long offset);
-    property public androidx.compose.ui.graphics.PathFillType fillType;
+    property public int fillType;
     property public final android.graphics.Path internalPath;
     property public boolean isConvex;
     property public boolean isEmpty;
@@ -162,43 +162,83 @@
   }
 
   public final class AndroidTileMode_androidKt {
-    method public static android.graphics.Shader.TileMode toNativeTileMode(androidx.compose.ui.graphics.TileMode);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode-0vamqd0(int);
   }
 
   public final class AndroidVertexMode_androidKt {
-    method public static android.graphics.Canvas.VertexMode toNativeVertexMode(androidx.compose.ui.graphics.VertexMode);
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode-JOOmi9M(int);
   }
 
-  public enum BlendMode {
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Clear;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Color;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorBurn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorDodge;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Darken;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Difference;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Dst;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstAtop;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstIn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOut;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOver;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Exclusion;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hardlight;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hue;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Lighten;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Luminosity;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Modulate;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Multiply;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Overlay;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Plus;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Saturation;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Screen;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Softlight;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Src;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcAtop;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcIn;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOut;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOver;
-    enum_constant public static final androidx.compose.ui.graphics.BlendMode Xor;
+  @androidx.compose.runtime.Immutable public final inline class BlendMode {
+    ctor public BlendMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.BlendMode.Companion Companion;
+  }
+
+  public static final class BlendMode.Companion {
+    method public int getClear-0nO6VwU();
+    method public int getColor-0nO6VwU();
+    method public int getColorBurn-0nO6VwU();
+    method public int getColorDodge-0nO6VwU();
+    method public int getDarken-0nO6VwU();
+    method public int getDifference-0nO6VwU();
+    method public int getDst-0nO6VwU();
+    method public int getDstAtop-0nO6VwU();
+    method public int getDstIn-0nO6VwU();
+    method public int getDstOut-0nO6VwU();
+    method public int getDstOver-0nO6VwU();
+    method public int getExclusion-0nO6VwU();
+    method public int getHardlight-0nO6VwU();
+    method public int getHue-0nO6VwU();
+    method public int getLighten-0nO6VwU();
+    method public int getLuminosity-0nO6VwU();
+    method public int getModulate-0nO6VwU();
+    method public int getMultiply-0nO6VwU();
+    method public int getOverlay-0nO6VwU();
+    method public int getPlus-0nO6VwU();
+    method public int getSaturation-0nO6VwU();
+    method public int getScreen-0nO6VwU();
+    method public int getSoftlight-0nO6VwU();
+    method public int getSrc-0nO6VwU();
+    method public int getSrcAtop-0nO6VwU();
+    method public int getSrcIn-0nO6VwU();
+    method public int getSrcOut-0nO6VwU();
+    method public int getSrcOver-0nO6VwU();
+    method public int getXor-0nO6VwU();
+    property public final int Clear;
+    property public final int Color;
+    property public final int ColorBurn;
+    property public final int ColorDodge;
+    property public final int Darken;
+    property public final int Difference;
+    property public final int Dst;
+    property public final int DstAtop;
+    property public final int DstIn;
+    property public final int DstOut;
+    property public final int DstOver;
+    property public final int Exclusion;
+    property public final int Hardlight;
+    property public final int Hue;
+    property public final int Lighten;
+    property public final int Luminosity;
+    property public final int Modulate;
+    property public final int Multiply;
+    property public final int Overlay;
+    property public final int Plus;
+    property public final int Saturation;
+    property public final int Screen;
+    property public final int Softlight;
+    property public final int Src;
+    property public final int SrcAtop;
+    property public final int SrcIn;
+    property public final int SrcOut;
+    property public final int SrcOver;
+    property public final int Xor;
   }
 
   @androidx.compose.runtime.Immutable public abstract sealed class Brush {
@@ -207,16 +247,16 @@
   }
 
   public static final class Brush.Companion {
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient-CcUA5qQ(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient-NvQjRjk(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional int tileMode);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-PvDSl28(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-acbAMd8(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient-CcUA5qQ(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient-NvQjRjk(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional int tileMode);
   }
 
   public final class BrushKt {
@@ -224,9 +264,9 @@
   }
 
   public interface Canvas {
-    method public void clipPath(androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public void clipRect(float left, float top, float right, float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipPath-fquoRGU(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public default void clipRect-MsRSx38(androidx.compose.ui.geometry.Rect rect, optional int clipOp);
+    method public void clipRect-wxHPq4g(float left, float top, float right, float bottom, optional int clipOp);
     method public void concat-58bKbWc(float[] matrix);
     method public void disableZ();
     method public default void drawArc(androidx.compose.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
@@ -239,12 +279,12 @@
     method public default void drawOval(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
     method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
-    method public void drawPoints(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
-    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints-iVdqbVo(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints-59E74cI(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
     method public default void drawRect(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
     method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
     method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
-    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, androidx.compose.ui.graphics.BlendMode blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices-nA16xIE(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
     method public void enableZ();
     method public void restore();
     method public void rotate(float degrees);
@@ -271,9 +311,22 @@
     method public static inline void withSaveLayer(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint, kotlin.jvm.functions.Function0<kotlin.Unit> block);
   }
 
-  public enum ClipOp {
-    enum_constant public static final androidx.compose.ui.graphics.ClipOp Difference;
-    enum_constant public static final androidx.compose.ui.graphics.ClipOp Intersect;
+  @androidx.compose.runtime.Immutable public final inline class ClipOp {
+    ctor public ClipOp();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ClipOp.Companion Companion;
+  }
+
+  public static final class ClipOp.Companion {
+    method public int getDifference-rtfAjoo();
+    method public int getIntersect-rtfAjoo();
+    property public final int Difference;
+    property public final int Intersect;
   }
 
   @androidx.compose.runtime.Immutable public final inline class Color {
@@ -336,7 +389,7 @@
   public static final class ColorFilter.Companion {
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter colorMatrix-jHG-Opc(float[] colorMatrix);
     method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting-6xK2E-Q(long multiply, long add);
-    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional int blendMode);
   }
 
   public final class ColorKt {
@@ -380,11 +433,26 @@
     method @kotlin.PublishedApi internal static float degrees(float radians);
   }
 
-  public enum FilterQuality {
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality High;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Low;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Medium;
-    enum_constant public static final androidx.compose.ui.graphics.FilterQuality None;
+  @androidx.compose.runtime.Immutable public final inline class FilterQuality {
+    ctor public FilterQuality();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.FilterQuality.Companion Companion;
+  }
+
+  public static final class FilterQuality.Companion {
+    method public int getHigh-f-v9h1I();
+    method public int getLow-f-v9h1I();
+    method public int getMedium-f-v9h1I();
+    method public int getNone-f-v9h1I();
+    property public final int High;
+    property public final int Low;
+    property public final int Medium;
+    property public final int None;
   }
 
   public final class Float16Kt {
@@ -392,14 +460,14 @@
 
   public interface ImageBitmap {
     method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
-    method public androidx.compose.ui.graphics.ImageBitmapConfig getConfig();
+    method public int getConfig-_sVssgQ();
     method public boolean getHasAlpha();
     method public int getHeight();
     method public int getWidth();
     method public void prepareToDraw();
     method public void readPixels(int[] buffer, optional int startX, optional int startY, optional int width, optional int height, optional int bufferOffset, optional int stride);
     property public abstract androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
-    property public abstract androidx.compose.ui.graphics.ImageBitmapConfig config;
+    property public abstract int config;
     property public abstract boolean hasAlpha;
     property public abstract int height;
     property public abstract int width;
@@ -409,16 +477,32 @@
   public static final class ImageBitmap.Companion {
   }
 
-  public enum ImageBitmapConfig {
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Alpha8;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Argb8888;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig F16;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Gpu;
-    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Rgb565;
+  @androidx.compose.runtime.Immutable public final inline class ImageBitmapConfig {
+    ctor public ImageBitmapConfig();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.ImageBitmapConfig.Companion Companion;
+  }
+
+  public static final class ImageBitmapConfig.Companion {
+    method public int getAlpha8-_sVssgQ();
+    method public int getArgb8888-_sVssgQ();
+    method public int getF16-_sVssgQ();
+    method public int getGpu-_sVssgQ();
+    method public int getRgb565-_sVssgQ();
+    property public final int Alpha8;
+    property public final int Argb8888;
+    property public final int F16;
+    property public final int Gpu;
+    property public final int Rgb565;
   }
 
   public final class ImageBitmapKt {
-    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional androidx.compose.ui.graphics.ImageBitmapConfig config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap-E8BOdIU(int width, int height, optional int config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
     method public static androidx.compose.ui.graphics.PixelMap toPixelMap(androidx.compose.ui.graphics.ImageBitmap, optional int startX, optional int startY, optional int width, optional int height, optional int[] buffer, optional int bufferOffset, optional int stride);
   }
 
@@ -501,61 +585,74 @@
 
   public final class OutlineKt {
     method public static void addOutline(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Outline outline);
-    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
     method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
-    method public static void drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public static void drawOutline-Ar0j1Zw(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline-mlewCHg(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
   }
 
   public interface Paint {
     method public android.graphics.Paint asFrameworkPaint();
     method public float getAlpha();
-    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public int getBlendMode-0nO6VwU();
     method public long getColor-0d7_KjU();
     method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
-    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public int getFilterQuality-f-v9h1I();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public android.graphics.Shader? getShader();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public int getStrokeCap-KaPHkGw();
+    method public int getStrokeJoin-LxFBmk8();
     method public float getStrokeMiterLimit();
     method public float getStrokeWidth();
-    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public int getStyle-TiuSbCo();
     method public boolean isAntiAlias();
     method public void setAlpha(float p);
     method public void setAntiAlias(boolean p);
-    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode p);
+    method public void setBlendMode-s9anfk8(int p);
     method public void setColor-8_81llA(long p);
     method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? p);
-    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality p);
+    method public void setFilterQuality-vDHp3xo(int p);
     method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? p);
     method public void setShader(android.graphics.Shader? p);
-    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap p);
-    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin p);
+    method public void setStrokeCap-BeK7IIE(int p);
+    method public void setStrokeJoin-Ww9F2mQ(int p);
     method public void setStrokeMiterLimit(float p);
     method public void setStrokeWidth(float p);
-    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle p);
+    method public void setStyle-k9PVt8s(int p);
     property public abstract float alpha;
-    property public abstract androidx.compose.ui.graphics.BlendMode blendMode;
+    property public abstract int blendMode;
     property public abstract long color;
     property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
-    property public abstract androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public abstract int filterQuality;
     property public abstract boolean isAntiAlias;
     property public abstract androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public abstract android.graphics.Shader? shader;
-    property public abstract androidx.compose.ui.graphics.StrokeCap strokeCap;
-    property public abstract androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public abstract int strokeCap;
+    property public abstract int strokeJoin;
     property public abstract float strokeMiterLimit;
     property public abstract float strokeWidth;
-    property public abstract androidx.compose.ui.graphics.PaintingStyle style;
+    property public abstract int style;
   }
 
   public final class PaintKt {
     field public static final float DefaultAlpha = 1.0f;
   }
 
-  public enum PaintingStyle {
-    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Fill;
-    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Stroke;
+  @androidx.compose.runtime.Immutable public final inline class PaintingStyle {
+    ctor public PaintingStyle();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PaintingStyle.Companion Companion;
+  }
+
+  public static final class PaintingStyle.Companion {
+    method public int getFill-TiuSbCo();
+    method public int getStroke-TiuSbCo();
+    property public final int Fill;
+    property public final int Stroke;
   }
 
   public interface Path {
@@ -570,28 +667,28 @@
     method public void close();
     method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
     method public androidx.compose.ui.geometry.Rect getBounds();
-    method public androidx.compose.ui.graphics.PathFillType getFillType();
+    method public int getFillType-Rg-k1Os();
     method public boolean isConvex();
     method public boolean isEmpty();
     method public void lineTo(float x, float y);
     method public void moveTo(float x, float y);
-    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, androidx.compose.ui.graphics.PathOperation operation);
+    method public boolean op-xiGExi0(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
     method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
     method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
     method public void relativeLineTo(float dx, float dy);
     method public void relativeMoveTo(float dx, float dy);
     method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
     method public void reset();
-    method public void setFillType(androidx.compose.ui.graphics.PathFillType p);
+    method public void setFillType-oQ8Xj4U(int p);
     method public void translate-k-4lQ0M(long offset);
-    property public abstract androidx.compose.ui.graphics.PathFillType fillType;
+    property public abstract int fillType;
     property public abstract boolean isConvex;
     property public abstract boolean isEmpty;
     field public static final androidx.compose.ui.graphics.Path.Companion Companion;
   }
 
   public static final class Path.Companion {
-    method public androidx.compose.ui.graphics.Path combine(androidx.compose.ui.graphics.PathOperation operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
+    method public androidx.compose.ui.graphics.Path combine-mTgLSnE(int operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
   }
 
   public interface PathEffect {
@@ -602,12 +699,25 @@
     method public androidx.compose.ui.graphics.PathEffect chainPathEffect(androidx.compose.ui.graphics.PathEffect outer, androidx.compose.ui.graphics.PathEffect inner);
     method public androidx.compose.ui.graphics.PathEffect cornerPathEffect(float radius);
     method public androidx.compose.ui.graphics.PathEffect dashPathEffect(float[] intervals, optional float phase);
-    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect(androidx.compose.ui.graphics.Path shape, float advance, float phase, androidx.compose.ui.graphics.StampedPathEffectStyle style);
+    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect-czNbfQQ(androidx.compose.ui.graphics.Path shape, float advance, float phase, int style);
   }
 
-  public enum PathFillType {
-    enum_constant public static final androidx.compose.ui.graphics.PathFillType EvenOdd;
-    enum_constant public static final androidx.compose.ui.graphics.PathFillType NonZero;
+  @androidx.compose.runtime.Immutable public final inline class PathFillType {
+    ctor public PathFillType();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PathFillType.Companion Companion;
+  }
+
+  public static final class PathFillType.Companion {
+    method public int getEvenOdd-Rg-k1Os();
+    method public int getNonZero-Rg-k1Os();
+    property public final int EvenOdd;
+    property public final int NonZero;
   }
 
   public interface PathMeasure {
@@ -617,12 +727,36 @@
     property public abstract float length;
   }
 
-  public enum PathOperation {
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation difference;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation intersect;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation reverseDifference;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation union;
-    enum_constant public static final androidx.compose.ui.graphics.PathOperation xor;
+  @androidx.compose.runtime.Immutable public final inline class PathOperation {
+    ctor public PathOperation();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PathOperation.Companion Companion;
+  }
+
+  public static final class PathOperation.Companion {
+    method public int getDifference-b3I0S0c();
+    method public int getIntersect-b3I0S0c();
+    method public int getReverseDifference-b3I0S0c();
+    method public int getUnion-b3I0S0c();
+    method public int getXor-b3I0S0c();
+    property public final int Difference;
+    property public final int Intersect;
+    property public final int ReverseDifference;
+    property public final int Union;
+    property public final int Xor;
+  }
+
+  public final class PathOperationKt {
+    method @Deprecated public static int getDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getIntersect(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getReverseDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getUnion(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getXor(androidx.compose.ui.graphics.PathOperation.Companion);
   }
 
   public final class PixelMap {
@@ -640,10 +774,24 @@
     property public final int width;
   }
 
-  public enum PointMode {
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Lines;
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Points;
-    enum_constant public static final androidx.compose.ui.graphics.PointMode Polygon;
+  @androidx.compose.runtime.Immutable public final inline class PointMode {
+    ctor public PointMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.PointMode.Companion Companion;
+  }
+
+  public static final class PointMode.Companion {
+    method public int getLines-r_lszbg();
+    method public int getPoints-r_lszbg();
+    method public int getPolygon-r_lszbg();
+    property public final int Lines;
+    property public final int Points;
+    property public final int Polygon;
   }
 
   @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
@@ -667,9 +815,9 @@
   }
 
   public final class ShaderKt {
-    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional androidx.compose.ui.graphics.TileMode tileModeX, optional androidx.compose.ui.graphics.TileMode tileModeY);
-    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
-    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader ImageShader-UWo3-ZU(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
     method public static android.graphics.Shader SweepGradientShader-GpNgDDw(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
   }
 
@@ -703,81 +851,168 @@
     property public final long value;
   }
 
-  public enum StampedPathEffectStyle {
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Morph;
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Rotate;
-    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Translate;
+  @androidx.compose.runtime.Immutable public final inline class StampedPathEffectStyle {
+    ctor public StampedPathEffectStyle();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StampedPathEffectStyle.Companion Companion;
   }
 
-  public enum StrokeCap {
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Butt;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Round;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Square;
+  public static final class StampedPathEffectStyle.Companion {
+    method public int getMorph-Ypspkwk();
+    method public int getRotate-Ypspkwk();
+    method public int getTranslate-Ypspkwk();
+    property public final int Morph;
+    property public final int Rotate;
+    property public final int Translate;
   }
 
-  public enum StrokeJoin {
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Bevel;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Miter;
-    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Round;
+  @androidx.compose.runtime.Immutable public final inline class StrokeCap {
+    ctor public StrokeCap();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StrokeCap.Companion Companion;
+  }
+
+  public static final class StrokeCap.Companion {
+    method public int getButt-KaPHkGw();
+    method public int getRound-KaPHkGw();
+    method public int getSquare-KaPHkGw();
+    property public final int Butt;
+    property public final int Round;
+    property public final int Square;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StrokeJoin {
+    ctor public StrokeJoin();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.StrokeJoin.Companion Companion;
+  }
+
+  public static final class StrokeJoin.Companion {
+    method public int getBevel-LxFBmk8();
+    method public int getMiter-LxFBmk8();
+    method public int getRound-LxFBmk8();
+    property public final int Bevel;
+    property public final int Miter;
+    property public final int Round;
   }
 
   @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
     method public android.graphics.Shader createShader-uvyYCjk(long size);
   }
 
-  public enum TileMode {
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Clamp;
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Mirror;
-    enum_constant public static final androidx.compose.ui.graphics.TileMode Repeated;
+  @androidx.compose.runtime.Immutable public final inline class TileMode {
+    ctor public TileMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.TileMode.Companion Companion;
   }
 
-  public enum VertexMode {
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleFan;
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleStrip;
-    enum_constant public static final androidx.compose.ui.graphics.VertexMode Triangles;
+  public static final class TileMode.Companion {
+    method public int getClamp-3opZhB0();
+    method public int getMirror-3opZhB0();
+    method public int getRepeated-3opZhB0();
+    property public final int Clamp;
+    property public final int Mirror;
+    property public final int Repeated;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class VertexMode {
+    ctor public VertexMode();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.VertexMode.Companion Companion;
+  }
+
+  public static final class VertexMode.Companion {
+    method public int getTriangleFan-c2xauaI();
+    method public int getTriangleStrip-c2xauaI();
+    method public int getTriangles-c2xauaI();
+    property public final int TriangleFan;
+    property public final int TriangleStrip;
+    property public final int Triangles;
   }
 
   public final class Vertices {
-    ctor public Vertices(androidx.compose.ui.graphics.VertexMode vertexMode, java.util.List<androidx.compose.ui.geometry.Offset> positions, java.util.List<androidx.compose.ui.geometry.Offset> textureCoordinates, java.util.List<androidx.compose.ui.graphics.Color> colors, java.util.List<java.lang.Integer> indices);
     method public int[] getColors();
     method public short[] getIndices();
     method public float[] getPositions();
     method public float[] getTextureCoordinates();
-    method public androidx.compose.ui.graphics.VertexMode getVertexMode();
+    method public int getVertexMode-c2xauaI();
     property public final int[] colors;
     property public final short[] indices;
     property public final float[] positions;
     property public final float[] textureCoordinates;
-    property public final androidx.compose.ui.graphics.VertexMode vertexMode;
+    property public final int vertexMode;
   }
 
 }
 
 package androidx.compose.ui.graphics.colorspace {
 
-  public enum Adaptation {
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  public abstract class Adaptation {
+    field public static final androidx.compose.ui.graphics.colorspace.Adaptation.Companion Companion;
   }
 
-  public enum ColorModel {
-    method public final int getComponentCount();
-    property public final int componentCount;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Cmyk;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Lab;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Rgb;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Xyz;
+  public static final class Adaptation.Companion {
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getBradford();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getCiecat02();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getVonKries();
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ColorModel {
+    ctor public ColorModel();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getComponentCount-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.graphics.colorspace.ColorModel.Companion Companion;
+  }
+
+  public static final class ColorModel.Companion {
+    method public long getCmyk-xdoWZVw();
+    method public long getLab-xdoWZVw();
+    method public long getRgb-xdoWZVw();
+    method public long getXyz-xdoWZVw();
+    property public final long Cmyk;
+    property public final long Lab;
+    property public final long Rgb;
+    property public final long Xyz;
   }
 
   public abstract class ColorSpace {
-    ctor public ColorSpace(String name, androidx.compose.ui.graphics.colorspace.ColorModel model);
     method public final float[] fromXyz(float x, float y, float z);
     method public abstract float[] fromXyz(float[] v);
     method public final int getComponentCount();
     method public abstract float getMaxValue(int component);
     method public abstract float getMinValue(int component);
-    method public final androidx.compose.ui.graphics.colorspace.ColorModel getModel();
+    method public final long getModel-xdoWZVw();
     method public final String getName();
     method public boolean isSrgb();
     method public abstract boolean isWideGamut();
@@ -786,14 +1021,14 @@
     property public final int componentCount;
     property public boolean isSrgb;
     property public abstract boolean isWideGamut;
-    property public final androidx.compose.ui.graphics.colorspace.ColorModel model;
+    property public final long model;
     property public final String name;
   }
 
   public final class ColorSpaceKt {
     method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, optional androidx.compose.ui.graphics.colorspace.Adaptation adaptation);
     method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint);
-    method public static androidx.compose.ui.graphics.colorspace.Connector connect(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional androidx.compose.ui.graphics.colorspace.RenderIntent intent);
+    method public static androidx.compose.ui.graphics.colorspace.Connector connect-InwLUsE(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional int intent);
   }
 
   public final class ColorSpaces {
@@ -835,12 +1070,12 @@
 
   public class Connector {
     method public final androidx.compose.ui.graphics.colorspace.ColorSpace getDestination();
-    method public final androidx.compose.ui.graphics.colorspace.RenderIntent getRenderIntent();
+    method public final int getRenderIntent-uksYyKA();
     method public final androidx.compose.ui.graphics.colorspace.ColorSpace getSource();
     method public final float[] transform(float r, float g, float b);
     method public float[] transform(float[] v);
     property public final androidx.compose.ui.graphics.colorspace.ColorSpace destination;
-    property public final androidx.compose.ui.graphics.colorspace.RenderIntent renderIntent;
+    property public final int renderIntent;
     property public final androidx.compose.ui.graphics.colorspace.ColorSpace source;
   }
 
@@ -866,11 +1101,26 @@
     field public static final androidx.compose.ui.graphics.colorspace.Illuminant INSTANCE;
   }
 
-  public enum RenderIntent {
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Absolute;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Perceptual;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Relative;
-    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Saturation;
+  @androidx.compose.runtime.Immutable public final inline class RenderIntent {
+    ctor public RenderIntent();
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.graphics.colorspace.RenderIntent.Companion Companion;
+  }
+
+  public static final class RenderIntent.Companion {
+    method public int getAbsolute-uksYyKA();
+    method public int getPerceptual-uksYyKA();
+    method public int getRelative-uksYyKA();
+    method public int getSaturation-uksYyKA();
+    property public final int Absolute;
+    property public final int Perceptual;
+    property public final int Relative;
+    property public final int Saturation;
   }
 
   public final class Rgb extends androidx.compose.ui.graphics.colorspace.ColorSpace {
@@ -952,24 +1202,24 @@
   public final class CanvasDrawScope implements androidx.compose.ui.graphics.drawscope.DrawScope {
     ctor public CanvasDrawScope();
     method public inline void draw-jkGVKLE(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
-    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath-_TD-E3k(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
     method public float getDensity();
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public float getFontScale();
@@ -1022,24 +1272,24 @@
   }
 
   @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawScope extends androidx.compose.ui.unit.Density {
-    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-NGaRamM(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawOval-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRect-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-fNghmuc(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
-    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-BcZ8TnY(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawArc-C-Io9bM(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle-NGaRamM(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle-m-UMHxE(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage-Yc2aOMw(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath-_TD-E3k(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints-yD3Jhvg(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect-0a6MmAQ(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect-IdEHoqk(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect-fNghmuc(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect-sDDzLXA(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public default long getCenter-F1C5BW0();
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
@@ -1053,13 +1303,13 @@
   }
 
   public static final class DrawScope.Companion {
-    method public androidx.compose.ui.graphics.BlendMode getDefaultBlendMode();
-    property public final androidx.compose.ui.graphics.BlendMode DefaultBlendMode;
+    method public int getDefaultBlendMode-0nO6VwU();
+    property public final int DefaultBlendMode;
   }
 
   public final class DrawScopeKt {
-    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
-    method public static inline void clipRect(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipPath--PbAnyU(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipRect-2ny_0ws(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
     method public static inline void drawIntoCanvas(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
     method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
     method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float inset, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
@@ -1079,8 +1329,8 @@
   }
 
   @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawTransform {
-    method public void clipPath(androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp clipOp);
-    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipPath-fquoRGU(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public void clipRect-wxHPq4g(optional float left, optional float top, optional float right, optional float bottom, optional int clipOp);
     method public default long getCenter-F1C5BW0();
     method public long getSize-NH-jbRc();
     method public void inset(float left, float top, float right, float bottom);
@@ -1104,14 +1354,13 @@
   }
 
   public final class Stroke extends androidx.compose.ui.graphics.drawscope.DrawStyle {
-    ctor public Stroke(optional float width, optional float miter, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.StrokeJoin join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
-    method public androidx.compose.ui.graphics.StrokeCap getCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getJoin();
+    method public int getCap-KaPHkGw();
+    method public int getJoin-LxFBmk8();
     method public float getMiter();
     method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
     method public float getWidth();
-    property public final androidx.compose.ui.graphics.StrokeCap cap;
-    property public final androidx.compose.ui.graphics.StrokeJoin join;
+    property public final int cap;
+    property public final int join;
     property public final float miter;
     property public final androidx.compose.ui.graphics.PathEffect? pathEffect;
     property public final float width;
@@ -1121,10 +1370,10 @@
   }
 
   public static final class Stroke.Companion {
-    method public androidx.compose.ui.graphics.StrokeCap getDefaultCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getDefaultJoin();
-    property public final androidx.compose.ui.graphics.StrokeCap DefaultCap;
-    property public final androidx.compose.ui.graphics.StrokeJoin DefaultJoin;
+    method public int getDefaultCap-KaPHkGw();
+    method public int getDefaultJoin-LxFBmk8();
+    property public final int DefaultCap;
+    property public final int DefaultJoin;
   }
 
 }
diff --git a/compose/ui/ui-graphics/benchmark/lint-baseline.xml b/compose/ui/ui-graphics/benchmark/lint-baseline.xml
index 079ca1b..42a176b 100644
--- a/compose/ui/ui-graphics/benchmark/lint-baseline.xml
+++ b/compose/ui/ui-graphics/benchmark/lint-baseline.xml
@@ -1,74 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt`. Referenced from `com.sun.jna.Native.AWT`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna/5.5.0/jna-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.datatransfer`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.dnd`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.event`. Referenced from `com.sun.jna.platform.WindowUtils.NativeWindowUtils.1`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.geom`. Referenced from `com.sun.jna.platform.WindowUtils.NativeWindowUtils`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.image`. Referenced from `com.sun.jna.platform.RasterRangesUtils`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `javax.swing.text`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `javax.swing`. Referenced from `com.sun.jna.platform.WindowUtils.MacWindowUtils`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.lang.instrument`. Referenced from `kotlinx.coroutines.repackaged.net.bytebuddy.agent.ByteBuddyAgent`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.4.3/kotlinx-coroutines-debug-1.4.3.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.lang.management`. Referenced from `kotlinx.coroutines.repackaged.net.bytebuddy.agent.ByteBuddyAgent.ProcessProvider.ForCurrentVm.ForLegacyVm`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.4.3/kotlinx-coroutines-debug-1.4.3.jar"/>
-    </issue>
-
 </issues>
diff --git a/compose/ui/ui-graphics/lint-baseline.xml b/compose/ui/ui-graphics/lint-baseline.xml
index c762933..42a176b 100644
--- a/compose/ui/ui-graphics/lint-baseline.xml
+++ b/compose/ui/ui-graphics/lint-baseline.xml
@@ -1,37 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.compose.ui.graphics.AndroidColorFilter_androidKt is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        BlendModeColorFilter(color.toArgb(), blendMode.toAndroidBlendMode())"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidColorFilter.android.kt"
-            line="39"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.compose.ui.graphics.CanvasUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                canvas.enableZ()"
-        errorLine2="                       ~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/graphics/CanvasUtils.android.kt"
-            line="39"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.compose.ui.graphics.CanvasUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                canvas.disableZ()"
-        errorLine2="                       ~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/graphics/CanvasUtils.android.kt"
-            line="41"
-            column="24"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
 </issues>
diff --git a/compose/ui/ui-graphics/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/AndroidBlendModeTest.kt b/compose/ui/ui-graphics/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/AndroidBlendModeTest.kt
index 622ed93..e5f71d0 100644
--- a/compose/ui/ui-graphics/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/AndroidBlendModeTest.kt
+++ b/compose/ui/ui-graphics/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/AndroidBlendModeTest.kt
@@ -414,4 +414,37 @@
             }
         }
     }
-}
\ No newline at end of file
+}
+
+private fun BlendMode.Companion.values(): Array<BlendMode> =
+    arrayOf(
+        Clear,
+        Src,
+        Dst,
+        SrcOver,
+        DstOver,
+        SrcIn,
+        DstIn,
+        SrcOut,
+        DstOut,
+        SrcAtop,
+        DstAtop,
+        Xor,
+        Plus,
+        Modulate,
+        Screen,
+        Overlay,
+        Darken,
+        Lighten,
+        ColorDodge,
+        ColorBurn,
+        Hardlight,
+        Softlight,
+        Difference,
+        Exclusion,
+        Multiply,
+        Hue,
+        Saturation,
+        Color,
+        Luminosity
+    )
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidBlendMode.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidBlendMode.android.kt
index 5eec959..a163882 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidBlendMode.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidBlendMode.android.kt
@@ -100,4 +100,6 @@
     BlendMode.Saturation -> android.graphics.BlendMode.SATURATION
     BlendMode.Color -> android.graphics.BlendMode.COLOR
     BlendMode.Luminosity -> android.graphics.BlendMode.LUMINOSITY
+    // Always return SRC_OVER as the default if there is no valid alternative
+    else -> android.graphics.BlendMode.SRC_OVER
 }
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidCanvas.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidCanvas.android.kt
index 970e993..1ab6529 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidCanvas.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidCanvas.android.kt
@@ -414,7 +414,7 @@
         // TODO(njawad) align drawVertices blendMode parameter usage with framework
         // android.graphics.Canvas#drawVertices does not consume a blendmode argument
         internalCanvas.drawVertices(
-            vertices.vertexMode.toNativeVertexMode(),
+            vertices.vertexMode.toAndroidVertexMode(),
             vertices.positions.size,
             vertices.positions,
             0, // TODO(njawad) figure out proper vertOffset)
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPaint.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPaint.android.kt
index a56ea13..0c8a2b5 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPaint.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPaint.android.kt
@@ -183,6 +183,7 @@
         StrokeCap.Square -> android.graphics.Paint.Cap.SQUARE
         StrokeCap.Round -> android.graphics.Paint.Cap.ROUND
         StrokeCap.Butt -> android.graphics.Paint.Cap.BUTT
+        else -> android.graphics.Paint.Cap.BUTT
     }
 }
 
@@ -199,6 +200,7 @@
         StrokeJoin.Miter -> android.graphics.Paint.Join.MITER
         StrokeJoin.Bevel -> android.graphics.Paint.Join.BEVEL
         StrokeJoin.Round -> android.graphics.Paint.Join.ROUND
+        else -> android.graphics.Paint.Join.MITER
     }
 }
 
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPath.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPath.android.kt
index 85708b1..8fafaac 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPath.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPath.android.kt
@@ -203,13 +203,11 @@
         path2: Path,
         operation: PathOperation
     ): Boolean {
-        // TODO njawad: determine requirements for potential API level
-        //        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
         val op = when (operation) {
-            PathOperation.difference -> android.graphics.Path.Op.DIFFERENCE
-            PathOperation.intersect -> android.graphics.Path.Op.INTERSECT
-            PathOperation.reverseDifference -> android.graphics.Path.Op.REVERSE_DIFFERENCE
-            PathOperation.union -> android.graphics.Path.Op.UNION
+            PathOperation.Difference -> android.graphics.Path.Op.DIFFERENCE
+            PathOperation.Intersect -> android.graphics.Path.Op.INTERSECT
+            PathOperation.ReverseDifference -> android.graphics.Path.Op.REVERSE_DIFFERENCE
+            PathOperation.Union -> android.graphics.Path.Op.UNION
             else -> android.graphics.Path.Op.XOR
         }
         return internalPath.op(path1.asAndroidPath(), path2.asAndroidPath(), op)
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathEffect.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathEffect.android.kt
index 4755271..70ab861 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathEffect.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPathEffect.android.kt
@@ -62,4 +62,5 @@
         StampedPathEffectStyle.Morph -> PathDashPathEffect.Style.MORPH
         StampedPathEffectStyle.Rotate -> PathDashPathEffect.Style.ROTATE
         StampedPathEffectStyle.Translate -> PathDashPathEffect.Style.TRANSLATE
+        else -> PathDashPathEffect.Style.TRANSLATE
     }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidShader.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidShader.android.kt
index 0b6f819..d416d3f 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidShader.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidShader.android.kt
@@ -39,7 +39,7 @@
         to.y,
         colors.toIntArray(),
         colorStops?.toFloatArray(),
-        tileMode.toNativeTileMode()
+        tileMode.toAndroidTileMode()
     )
 }
 
@@ -57,7 +57,7 @@
         radius,
         colors.toIntArray(),
         colorStops?.toFloatArray(),
-        tileMode.toNativeTileMode()
+        tileMode.toAndroidTileMode()
     )
 }
 
@@ -82,8 +82,8 @@
 ): Shader {
     return BitmapShader(
         image.asAndroidBitmap(),
-        tileModeX.toNativeTileMode(),
-        tileModeY.toNativeTileMode()
+        tileModeX.toAndroidTileMode(),
+        tileModeY.toAndroidTileMode()
     )
 }
 
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidTileMode.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidTileMode.android.kt
index 9854e88..190de78 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidTileMode.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidTileMode.android.kt
@@ -16,10 +16,10 @@
 
 package androidx.compose.ui.graphics
 
-actual typealias NativeTileMode = android.graphics.Shader.TileMode
-
-actual fun TileMode.toNativeTileMode(): NativeTileMode = when (this) {
+fun TileMode.toAndroidTileMode(): android.graphics.Shader.TileMode = when (this) {
     TileMode.Clamp -> android.graphics.Shader.TileMode.CLAMP
     TileMode.Repeated -> android.graphics.Shader.TileMode.REPEAT
     TileMode.Mirror -> android.graphics.Shader.TileMode.MIRROR
+    // Always fallback to TileMode.Clamp
+    else -> android.graphics.Shader.TileMode.CLAMP
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidVertexMode.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidVertexMode.android.kt
index 44d0600..d86c1b3 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidVertexMode.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidVertexMode.android.kt
@@ -16,10 +16,9 @@
 
 package androidx.compose.ui.graphics
 
-actual typealias NativeVertexMode = android.graphics.Canvas.VertexMode
-
-actual fun VertexMode.toNativeVertexMode() = when (this) {
+fun VertexMode.toAndroidVertexMode() = when (this) {
     VertexMode.Triangles -> android.graphics.Canvas.VertexMode.TRIANGLES
     VertexMode.TriangleStrip -> android.graphics.Canvas.VertexMode.TRIANGLE_STRIP
     VertexMode.TriangleFan -> android.graphics.Canvas.VertexMode.TRIANGLE_FAN
+    else -> android.graphics.Canvas.VertexMode.TRIANGLES
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/BlendMode.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/BlendMode.kt
index 7dfe594..5d1b746 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/BlendMode.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/BlendMode.kt
@@ -16,6 +16,8 @@
 
 package androidx.compose.ui.graphics
 
+import androidx.compose.runtime.Immutable
+
 /**
  * Algorithms to use when painting on the canvas.
  *
@@ -55,412 +57,450 @@
  *  * [Paint.blendMode], which uses [BlendMode] to define the compositing
  *    strategy.
  */
-enum class BlendMode {
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class BlendMode internal constructor(val value: Int) {
 
-    /**
-     * Drop both the source and destination images, leaving nothing.
-     */
-    Clear,
+    companion object {
 
-    /**
-     * Drop the destination image, only paint the source image.
-     *
-     * Conceptually, the destination is first cleared, then the source image is
-     * painted.
-     */
-    Src,
+        /**
+         * Drop both the source and destination images, leaving nothing.
+         */
+        val Clear = BlendMode(0)
 
-    /**
-     * Drop the source image, only paint the destination image.
-     *
-     * Conceptually, the source image is discarded, leaving the destination
-     * untouched.
-     */
-    Dst,
+        /**
+         * Drop the destination image, only paint the source image.
+         *
+         * Conceptually, the destination is first cleared, then the source image is
+         * painted.
+         */
+        val Src = BlendMode(1)
 
-    /**
-     * Composite the source image over the destination image.
-     *
-     * This is the default value. It represents the most intuitive case, where
-     * shapes are painted on top of what is below, with transparent areas showing
-     * the destination layer.
-     */
-    SrcOver,
+        /**
+         * Drop the source image, only paint the destination image.
+         *
+         * Conceptually, the source image is discarded, leaving the destination
+         * untouched.
+         */
+        val Dst = BlendMode(2)
 
-    /**
-     * Composite the source image under the destination image.
-     *
-     * This is the opposite of [SrcOver].
-     *
-     * This is useful when the source image should have been painted before the
-     * destination image, but could not be.
-     */
-    DstOver,
+        /**
+         * Composite the source image over the destination image.
+         *
+         * This is the default value. It represents the most intuitive case, where
+         * shapes are painted on top of what is below, with transparent areas showing
+         * the destination layer.
+         */
+        val SrcOver = BlendMode(3)
 
-    /**
-     * Show the source image, but only where the two images overlap. The
-     * destination image is not rendered, it is treated merely as a mask. The
-     * color channels of the destination are ignored, only the opacity has an
-     * effect.
-     *
-     * To show the destination image instead, consider [DstIn].
-     *
-     * To reverse the semantic of the mask (only showing the source where the
-     * destination is absent, rather than where it is present), consider
-     * [SrcOut].
-     */
-    SrcIn,
+        /**
+         * Composite the source image under the destination image.
+         *
+         * This is the opposite of [SrcOver].
+         *
+         * This is useful when the source image should have been painted before the
+         * destination image, but could not be.
+         */
+        val DstOver = BlendMode(4)
 
-    /**
-     * Show the destination image, but only where the two images overlap. The
-     * source image is not rendered, it is treated merely as a mask. The color
-     * channels of the source are ignored, only the opacity has an effect.
-     *
-     * To show the source image instead, consider [SrcIn].
-     *
-     * To reverse the semantic of the mask (only showing the source where the
-     * destination is present, rather than where it is absent), consider [DstOut].
-     */
-    DstIn,
+        /**
+         * Show the source image, but only where the two images overlap. The
+         * destination image is not rendered, it is treated merely as a mask. The
+         * color channels of the destination are ignored, only the opacity has an
+         * effect.
+         *
+         * To show the destination image instead, consider [DstIn].
+         *
+         * To reverse the semantic of the mask (only showing the source where the
+         * destination is absent, rather than where it is present), consider
+         * [SrcOut].
+         */
+        val SrcIn = BlendMode(5)
 
-    /**
-     * Show the source image, but only where the two images do not overlap. The
-     * destination image is not rendered, it is treated merely as a mask. The color
-     * channels of the destination are ignored, only the opacity has an effect.
-     *
-     * To show the destination image instead, consider [DstOut].
-     *
-     * To reverse the semantic of the mask (only showing the source where the
-     * destination is present, rather than where it is absent), consider [SrcIn].
-     *
-     * This corresponds to the "Source out Destination" Porter-Duff operator.
-     */
-    SrcOut,
+        /**
+         * Show the destination image, but only where the two images overlap. The
+         * source image is not rendered, it is treated merely as a mask. The color
+         * channels of the source are ignored, only the opacity has an effect.
+         *
+         * To show the source image instead, consider [SrcIn].
+         *
+         * To reverse the semantic of the mask (only showing the source where the
+         * destination is present, rather than where it is absent), consider [DstOut].
+         */
+        val DstIn = BlendMode(6)
 
-    /**
-     * Show the destination image, but only where the two images do not overlap. The
-     * source image is not rendered, it is treated merely as a mask. The color
-     * channels of the source are ignored, only the opacity has an effect.
-     *
-     * To show the source image instead, consider [SrcOut].
-     *
-     * To reverse the semantic of the mask (only showing the destination where the
-     * source is present, rather than where it is absent), consider [DstIn].
-     *
-     * This corresponds to the "Destination out Source" Porter-Duff operator.
-     */
-    DstOut,
+        /**
+         * Show the source image, but only where the two images do not overlap. The
+         * destination image is not rendered, it is treated merely as a mask. The color
+         * channels of the destination are ignored, only the opacity has an effect.
+         *
+         * To show the destination image instead, consider [DstOut].
+         *
+         * To reverse the semantic of the mask (only showing the source where the
+         * destination is present, rather than where it is absent), consider [SrcIn].
+         *
+         * This corresponds to the "Source out Destination" Porter-Duff operator.
+         */
+        val SrcOut = BlendMode(7)
 
-    /**
-     * Composite the source image over the destination image, but only where it
-     * overlaps the destination.
-     *
-     * This is essentially the [SrcOver] operator, but with the output's opacity
-     * channel being set to that of the destination image instead of being a
-     * combination of both image's opacity channels.
-     *
-     * For a variant with the destination on top instead of the source, see
-     * [DstAtop].
-     */
-    SrcAtop,
+        /**
+         * Show the destination image, but only where the two images do not overlap. The
+         * source image is not rendered, it is treated merely as a mask. The color
+         * channels of the source are ignored, only the opacity has an effect.
+         *
+         * To show the source image instead, consider [SrcOut].
+         *
+         * To reverse the semantic of the mask (only showing the destination where the
+         * source is present, rather than where it is absent), consider [DstIn].
+         *
+         * This corresponds to the "Destination out Source" Porter-Duff operator.
+         */
+        val DstOut = BlendMode(8)
 
-    /**
-     * Composite the destination image over the source image, but only where it
-     * overlaps the source.
-     *
-     * This is essentially the [DstOver] operator, but with the output's opacity
-     * channel being set to that of the source image instead of being a
-     * combination of both image's opacity channels.
-     *
-     * For a variant with the source on top instead of the destination, see
-     * [SrcAtop].
-     */
-    DstAtop,
+        /**
+         * Composite the source image over the destination image, but only where it
+         * overlaps the destination.
+         *
+         * This is essentially the [SrcOver] operator, but with the output's opacity
+         * channel being set to that of the destination image instead of being a
+         * combination of both image's opacity channels.
+         *
+         * For a variant with the destination on top instead of the source, see
+         * [DstAtop].
+         */
+        val SrcAtop = BlendMode(9)
 
-    /**
-     * Apply a bitwise `xor` operator to the source and destination images. This
-     * leaves transparency where they would overlap.
-     */
-    Xor,
+        /**
+         * Composite the destination image over the source image, but only where it
+         * overlaps the source.
+         *
+         * This is essentially the [DstOver] operator, but with the output's opacity
+         * channel being set to that of the source image instead of being a
+         * combination of both image's opacity channels.
+         *
+         * For a variant with the source on top instead of the destination, see
+         * [SrcAtop].
+         */
+        val DstAtop = BlendMode(10)
 
-    /**
-     * Sum the components of the source and destination images.
-     *
-     * Transparency in a pixel of one of the images reduces the contribution of
-     * that image to the corresponding output pixel, as if the color of that
-     * pixel in that image was darker.
-     *
-     */
-    Plus,
+        /**
+         * Apply a bitwise `xor` operator to the source and destination images. This
+         * leaves transparency where they would overlap.
+         */
+        val Xor = BlendMode(11)
 
-    /**
-     * Multiply the color components of the source and destination images.
-     *
-     * This can only result in the same or darker colors (multiplying by white,
-     * 1.0, results in no change; multiplying by black, 0.0, results in black).
-     *
-     * When compositing two opaque images, this has similar effect to overlapping
-     * two transparencies on a projector.
-     *
-     * For a variant that also multiplies the alpha channel, consider [Multiply].
-     *
-     * See also:
-     *
-     *  * [Screen], which does a similar computation but inverted.
-     *  * [Overlay], which combines [Modulate] and [Screen] to favor the
-     *    destination image.
-     *  * [Hardlight], which combines [Modulate] and [Screen] to favor the
-     *    source image.
-     */
-    Modulate,
+        /**
+         * Sum the components of the source and destination images.
+         *
+         * Transparency in a pixel of one of the images reduces the contribution of
+         * that image to the corresponding output pixel, as if the color of that
+         * pixel in that image was darker.
+         *
+         */
+        val Plus = BlendMode(12)
 
-    /**
-     * Multiply the inverse of the components of the source and destination
-     * images, and inverse the result.
-     *
-     * Inverting the components means that a fully saturated channel (opaque
-     * white) is treated as the value 0.0, and values normally treated as 0.0
-     * (black, transparent) are treated as 1.0.
-     *
-     * This is essentially the same as [Modulate] blend mode, but with the values
-     * of the colors inverted before the multiplication and the result being
-     * inverted back before rendering.
-     *
-     * This can only result in the same or lighter colors (multiplying by black,
-     * 1.0, results in no change; multiplying by white, 0.0, results in white).
-     * Similarly, in the alpha channel, it can only result in more opaque colors.
-     *
-     * This has similar effect to two projectors displaying their images on the
-     * same screen simultaneously.
-     *
-     * See also:
-     *
-     *  * [Modulate], which does a similar computation but without inverting the
-     *    values.
-     *  * [Overlay], which combines [Modulate] and [Screen] to favor the
-     *    destination image.
-     *  * [Hardlight], which combines [Modulate] and [Screen] to favor the
-     *    source image.
-     */
-    Screen, // The last coeff mode.
+        /**
+         * Multiply the color components of the source and destination images.
+         *
+         * This can only result in the same or darker colors (multiplying by white,
+         * 1.0, results in no change; multiplying by black, 0.0, results in black).
+         *
+         * When compositing two opaque images, this has similar effect to overlapping
+         * two transparencies on a projector.
+         *
+         * For a variant that also multiplies the alpha channel, consider [Multiply].
+         *
+         * See also:
+         *
+         *  * [Screen], which does a similar computation but inverted.
+         *  * [Overlay], which combines [Modulate] and [Screen] to favor the
+         *    destination image.
+         *  * [Hardlight], which combines [Modulate] and [Screen] to favor the
+         *    source image.
+         */
+        val Modulate = BlendMode(13)
 
-    /**
-     * Multiply the components of the source and destination images after
-     * adjusting them to favor the destination.
-     *
-     * Specifically, if the destination value is smaller, this multiplies it with
-     * the source value, whereas is the source value is smaller, it multiplies
-     * the inverse of the source value with the inverse of the destination value,
-     * then inverts the result.
-     *
-     * Inverting the components means that a fully saturated channel (opaque
-     * white) is treated as the value 0.0, and values normally treated as 0.0
-     * (black, transparent) are treated as 1.0.
-     *
-     * See also:
-     *
-     *  * [Modulate], which always multiplies the values.
-     *  * [Screen], which always multiplies the inverses of the values.
-     *  * [Hardlight], which is similar to [Overlay] but favors the source image
-     *    instead of the destination image.
-     */
-    Overlay,
+        /**
+         * Multiply the inverse of the components of the source and destination
+         * images, and inverse the result.
+         *
+         * Inverting the components means that a fully saturated channel (opaque
+         * white) is treated as the value 0.0, and values normally treated as 0.0
+         * (black, transparent) are treated as 1.0.
+         *
+         * This is essentially the same as [Modulate] blend mode, but with the values
+         * of the colors inverted before the multiplication and the result being
+         * inverted back before rendering.
+         *
+         * This can only result in the same or lighter colors (multiplying by black,
+         * 1.0, results in no change; multiplying by white, 0.0, results in white).
+         * Similarly, in the alpha channel, it can only result in more opaque colors.
+         *
+         * This has similar effect to two projectors displaying their images on the
+         * same screen simultaneously.
+         *
+         * See also:
+         *
+         *  * [Modulate], which does a similar computation but without inverting the
+         *    values.
+         *  * [Overlay], which combines [Modulate] and [Screen] to favor the
+         *    destination image.
+         *  * [Hardlight], which combines [Modulate] and [Screen] to favor the
+         *    source image.
+         */
+        val Screen = BlendMode(14) // The last coeff mode.
 
-    /**
-     * Composite the source and destination image by choosing the lowest value
-     * from each color channel.
-     *
-     * The opacity of the output image is computed in the same way as for
-     * [SrcOver].
-     */
-    Darken,
+        /**
+         * Multiply the components of the source and destination images after
+         * adjusting them to favor the destination.
+         *
+         * Specifically, if the destination value is smaller, this multiplies it with
+         * the source value, whereas is the source value is smaller, it multiplies
+         * the inverse of the source value with the inverse of the destination value,
+         * then inverts the result.
+         *
+         * Inverting the components means that a fully saturated channel (opaque
+         * white) is treated as the value 0.0, and values normally treated as 0.0
+         * (black, transparent) are treated as 1.0.
+         *
+         * See also:
+         *
+         *  * [Modulate], which always multiplies the values.
+         *  * [Screen], which always multiplies the inverses of the values.
+         *  * [Hardlight], which is similar to [Overlay] but favors the source image
+         *    instead of the destination image.
+         */
+        val Overlay = BlendMode(15)
 
-    /**
-     * Composite the source and destination image by choosing the highest value
-     * from each color channel.
-     *
-     * The opacity of the output image is computed in the same way as for
-     * [SrcOver].
-     */
-    Lighten,
+        /**
+         * Composite the source and destination image by choosing the lowest value
+         * from each color channel.
+         *
+         * The opacity of the output image is computed in the same way as for
+         * [SrcOver].
+         */
+        val Darken = BlendMode(16)
 
-    /**
-     * Divide the destination by the inverse of the source.
-     *
-     * Inverting the components means that a fully saturated channel (opaque
-     * white) is treated as the value 0.0, and values normally treated as 0.0
-     * (black, transparent) are treated as 1.0.
-     *
-     * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
-     */
-    ColorDodge,
+        /**
+         * Composite the source and destination image by choosing the highest value
+         * from each color channel.
+         *
+         * The opacity of the output image is computed in the same way as for
+         * [SrcOver].
+         */
+        val Lighten = BlendMode(17)
 
-    /**
-     * Divide the inverse of the destination by the the source, and inverse the result.
-     *
-     * Inverting the components means that a fully saturated channel (opaque
-     * white) is treated as the value 0.0, and values normally treated as 0.0
-     * (black, transparent) are treated as 1.0.
-     *
-     * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
-     */
-    ColorBurn,
+        /**
+         * Divide the destination by the inverse of the source.
+         *
+         * Inverting the components means that a fully saturated channel (opaque
+         * white) is treated as the value 0.0, and values normally treated as 0.0
+         * (black, transparent) are treated as 1.0.
+         *
+         * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
+         */
+        val ColorDodge = BlendMode(18)
 
-    /**
-     * Multiply the components of the source and destination images after
-     * adjusting them to favor the source.
-     *
-     * Specifically, if the source value is smaller, this multiplies it with the
-     * destination value, whereas is the destination value is smaller, it
-     * multiplies the inverse of the destination value with the inverse of the
-     * source value, then inverts the result.
-     *
-     * Inverting the components means that a fully saturated channel (opaque
-     * white) is treated as the value 0.0, and values normally treated as 0.0
-     * (black, transparent) are treated as 1.0.
-     *
-     * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
-     *
-     * See also:
-     *
-     *  * [Modulate], which always multiplies the values.
-     *  * [Screen], which always multiplies the inverses of the values.
-     *  * [Overlay], which is similar to [Hardlight] but favors the destination
-     *    image instead of the source image.
-     */
-    Hardlight,
+        /**
+         * Divide the inverse of the destination by the source, and inverse the result.
+         *
+         * Inverting the components means that a fully saturated channel (opaque
+         * white) is treated as the value 0.0, and values normally treated as 0.0
+         * (black, transparent) are treated as 1.0.
+         *
+         * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
+         */
+        val ColorBurn = BlendMode(19)
 
-    /**
-     * Use [ColorDodge] for source values below 0.5 and [ColorBurn] for source
-     * values above 0.5.
-     *
-     * This results in a similar but softer effect than [Overlay].
-     *
-     * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
-     *
-     * See also:
-     *
-     *  * [Color], which is a more subtle tinting effect.
-     */
-    Softlight,
+        /**
+         * Multiply the components of the source and destination images after
+         * adjusting them to favor the source.
+         *
+         * Specifically, if the source value is smaller, this multiplies it with the
+         * destination value, whereas is the destination value is smaller, it
+         * multiplies the inverse of the destination value with the inverse of the
+         * source value, then inverts the result.
+         *
+         * Inverting the components means that a fully saturated channel (opaque
+         * white) is treated as the value 0.0, and values normally treated as 0.0
+         * (black, transparent) are treated as 1.0.
+         *
+         * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
+         *
+         * See also:
+         *
+         *  * [Modulate], which always multiplies the values.
+         *  * [Screen], which always multiplies the inverses of the values.
+         *  * [Overlay], which is similar to [Hardlight] but favors the destination
+         *    image instead of the source image.
+         */
+        val Hardlight = BlendMode(20)
 
-    /**
-     * Subtract the smaller value from the bigger value for each channel.
-     *
-     * Compositing black has no effect; compositing white inverts the colors of
-     * the other image.
-     *
-     * The opacity of the output image is computed in the same way as for
-     * [SrcOver].
-     *
-     * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
-     *
-     * The effect is similar to [Exclusion] but harsher.
-     */
-    Difference,
+        /**
+         * Use [ColorDodge] for source values below 0.5 and [ColorBurn] for source
+         * values above 0.5.
+         *
+         * This results in a similar but softer effect than [Overlay].
+         *
+         * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
+         *
+         * See also:
+         *
+         *  * [Color], which is a more subtle tinting effect.
+         */
+        val Softlight = BlendMode(21)
 
-    /**
-     * Subtract double the product of the two images from the sum of the two
-     * images.
-     *
-     * Compositing black has no effect; compositing white inverts the colors of
-     * the other image.
-     *
-     * The opacity of the output image is computed in the same way as for
-     * [SrcOver].
-     *
-     * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
-     *
-     * The effect is similar to [Difference] but softer.
-     */
-    Exclusion,
+        /**
+         * Subtract the smaller value from the bigger value for each channel.
+         *
+         * Compositing black has no effect; compositing white inverts the colors of
+         * the other image.
+         *
+         * The opacity of the output image is computed in the same way as for
+         * [SrcOver].
+         *
+         * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
+         *
+         * The effect is similar to [Exclusion] but harsher.
+         */
+        val Difference = BlendMode(22)
 
-    /**
-     * Multiply the components of the source and destination images, including
-     * the alpha channel.
-     *
-     * This can only result in the same or darker colors (multiplying by white,
-     * 1.0, results in no change; multiplying by black, 0.0, results in black).
-     *
-     * Since the alpha channel is also multiplied, a fully-transparent pixel
-     * (opacity 0.0) in one image results in a fully transparent pixel in the
-     * output. This is similar to [DstIn], but with the colors combined.
-     *
-     * For a variant that multiplies the colors but does not multiply the alpha
-     * channel, consider [Modulate].
-     *
-     * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
-     */
-    Multiply, // The last separable mode.
+        /**
+         * Subtract double the product of the two images from the sum of the two
+         * images.
+         *
+         * Compositing black has no effect; compositing white inverts the colors of
+         * the other image.
+         *
+         * The opacity of the output image is computed in the same way as for
+         * [SrcOver].
+         *
+         * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
+         *
+         * The effect is similar to [Difference] but softer.
+         */
+        val Exclusion = BlendMode(23)
 
-    /**
-     * Take the hue of the source image, and the saturation and luminosity of the
-     * destination image.
-     *
-     * The effect is to tint the destination image with the source image.
-     *
-     * The opacity of the output image is computed in the same way as for
-     * [SrcOver]. Regions that are entirely transparent in the source image take
-     * their hue from the destination.
-     *
-     * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
-     */
-    Hue,
+        /**
+         * Multiply the components of the source and destination images, including
+         * the alpha channel.
+         *
+         * This can only result in the same or darker colors (multiplying by white,
+         * 1.0, results in no change; multiplying by black, 0.0, results in black).
+         *
+         * Since the alpha channel is also multiplied, a fully-transparent pixel
+         * (opacity 0.0) in one image results in a fully transparent pixel in the
+         * output. This is similar to [DstIn], but with the colors combined.
+         *
+         * For a variant that multiplies the colors but does not multiply the alpha
+         * channel, consider [Modulate].
+         *
+         * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
+         */
+        val Multiply = BlendMode(24) // The last separable mode.
 
-    /**
-     * Take the saturation of the source image, and the hue and luminosity of the
-     * destination image.
-     *
-     * The opacity of the output image is computed in the same way as for
-     * [SrcOver]. Regions that are entirely transparent in the source image take
-     * their saturation from the destination.
-     *
-     * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
-     *
-     * See also:
-     *
-     *  * [Color], which also applies the hue of the source image.
-     *  * [Luminosity], which applies the luminosity of the source image to the
-     *    destination.
-     */
-    Saturation,
+        /**
+         * Take the hue of the source image, and the saturation and luminosity of the
+         * destination image.
+         *
+         * The effect is to tint the destination image with the source image.
+         *
+         * The opacity of the output image is computed in the same way as for
+         * [SrcOver]. Regions that are entirely transparent in the source image take
+         * their hue from the destination.
+         *
+         * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
+         */
+        val Hue = BlendMode(25)
 
-    /**
-     * Take the hue and saturation of the source image, and the luminosity of the
-     * destination image.
-     *
-     * The effect is to tint the destination image with the source image.
-     *
-     * The opacity of the output image is computed in the same way as for
-     * [SrcOver]. Regions that are entirely transparent in the source image take
-     * their hue and saturation from the destination.
-     *
-     * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
-     *
-     * See also:
-     *
-     *  * [Hue], which is a similar but weaker effect.
-     *  * [Softlight], which is a similar tinting effect but also tints white.
-     *  * [Saturation], which only applies the saturation of the source image.
-     */
-    Color,
+        /**
+         * Take the saturation of the source image, and the hue and luminosity of the
+         * destination image.
+         *
+         * The opacity of the output image is computed in the same way as for
+         * [SrcOver]. Regions that are entirely transparent in the source image take
+         * their saturation from the destination.
+         *
+         * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
+         *
+         * See also:
+         *
+         *  * [Color], which also applies the hue of the source image.
+         *  * [Luminosity], which applies the luminosity of the source image to the
+         *    destination.
+         */
+        val Saturation = BlendMode(26)
 
-    /**
-     * Take the luminosity of the source image, and the hue and saturation of the
-     * destination image.
-     *
-     * The opacity of the output image is computed in the same way as for
-     * [SrcOver]. Regions that are entirely transparent in the source image take
-     * their luminosity from the destination.
-     *
-     * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
-     *
-     * See also:
-     *
-     *  * [Saturation], which applies the saturation of the source image to the
-     *    destination.
-     */
-    Luminosity;
+        /**
+         * Take the hue and saturation of the source image, and the luminosity of the
+         * destination image.
+         *
+         * The effect is to tint the destination image with the source image.
+         *
+         * The opacity of the output image is computed in the same way as for
+         * [SrcOver]. Regions that are entirely transparent in the source image take
+         * their hue and saturation from the destination.
+         *
+         * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
+         *
+         * See also:
+         *
+         *  * [Hue], which is a similar but weaker effect.
+         *  * [Softlight], which is a similar tinting effect but also tints white.
+         *  * [Saturation], which only applies the saturation of the source image.
+         */
+        val Color = BlendMode(27)
+
+        /**
+         * Take the luminosity of the source image, and the hue and saturation of the
+         * destination image.
+         *
+         * The opacity of the output image is computed in the same way as for
+         * [SrcOver]. Regions that are entirely transparent in the source image take
+         * their luminosity from the destination.
+         *
+         * **NOTE** This [BlendMode] can only be used on Android API level 29 and above
+         *
+         * See also:
+         *
+         *  * [Saturation], which applies the saturation of the source image to the
+         *    destination.
+         */
+        val Luminosity = BlendMode(28)
+    }
+
+    override fun toString() = when (this) {
+        Clear -> "Clear"
+        Src -> "Src"
+        Dst -> "Dst"
+        SrcOver -> "SrcOver"
+        DstOver -> "DstOver"
+        SrcIn -> "SrcIn"
+        DstIn -> "DstIn"
+        SrcOut -> "SrcOut"
+        DstOut -> "DstOut"
+        SrcAtop -> "SrcAtop"
+        DstAtop -> "DstAtop"
+        Xor -> "Xor"
+        Plus -> "Plus"
+        Modulate -> "Modulate"
+        Screen -> "Screen"
+        Overlay -> "Overlay"
+        Darken -> "Darken"
+        Lighten -> "Lighten"
+        ColorDodge -> "ColorDodge"
+        ColorBurn -> "ColorBurn"
+        Hardlight -> "HardLight"
+        Softlight -> "Softlight"
+        Difference -> "Difference"
+        Exclusion -> "Exclusion"
+        Multiply -> "Multiply"
+        Hue -> "Hue"
+        Saturation -> "Saturation"
+        Color -> "Color"
+        Luminosity -> "Luminosity"
+        else -> "Unknown" // Should not get here since we have an internal constructor
+    }
 }
 
 /**
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ClipOp.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ClipOp.kt
index 7ad1621..71e0679 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ClipOp.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ClipOp.kt
@@ -16,16 +16,28 @@
 
 package androidx.compose.ui.graphics
 
+import androidx.compose.runtime.Immutable
+
 /**
  * Defines how a new clip region should be merged with the existing clip
  * region.
  *
  * Used by [Canvas.clipRect].
  */
-enum class ClipOp {
-    /** Subtract the new region from the existing region. */
-    Difference,
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class ClipOp internal constructor(val value: Int) {
+    companion object {
+        /** Subtract the new region from the existing region. */
+        val Difference = ClipOp(0)
 
-    /** Intersect the new region from the existing region. */
-    Intersect
+        /** Intersect the new region from the existing region. */
+        val Intersect = ClipOp(1)
+    }
+
+    override fun toString() = when (this) {
+        Difference -> "Difference"
+        Intersect -> "Intersect"
+        else -> "Unknown"
+    }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Color.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Color.kt
index 4988abf..5524df22 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Color.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Color.kt
@@ -541,7 +541,7 @@
 @Stable
 fun Color.luminance(): Float {
     val colorSpace = colorSpace
-    require(colorSpace.model === ColorModel.Rgb) {
+    require(colorSpace.model == ColorModel.Rgb) {
         "The specified color must be encoded in an RGB color space. " +
             "The supplied color space is ${colorSpace.model}"
     }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/FilterQuality.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/FilterQuality.kt
index 13e8146..e3ec22c 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/FilterQuality.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/FilterQuality.kt
@@ -16,34 +16,49 @@
 
 package androidx.compose.ui.graphics
 
-// Quality levels for image filters.
-//
-// See [Paint.filterQuality].
-enum class FilterQuality {
+import androidx.compose.runtime.Immutable
 
-    /**
-     * Fastest possible filtering, albeit also the lowest quality
-     * Typically this implies nearest-neighbour filtering.
-     */
-    None,
+/**
+ * Quality levels for image filters.
+ * See [Paint.filterQuality].
+ */
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class FilterQuality internal constructor(val value: Int) {
 
-    /**
-     * Better quality than [None], faster than [Medium].
-     * Typically this implies bilinear interpolation.
-     */
-    Low,
+    companion object {
+        /**
+         * Fastest possible filtering, albeit also the lowest quality
+         * Typically this implies nearest-neighbour filtering.
+         */
+        val None = FilterQuality(0)
 
-    /**
-     * Better quality than [Low], faster than [High].
-     *
-     * Typically this implies a combination of bilinear interpolation and
-     * pyramidal parametric prefiltering (mipmaps).
-     */
-    Medium,
+        /**
+         * Better quality than [None], faster than [Medium].
+         * Typically this implies bilinear interpolation.
+         */
+        val Low = FilterQuality(1)
 
-    /**
-     * Best possible quality filtering, albeit also the slowest.
-     * Typically this implies bicubic interpolation or better.
-     */
-    High,
+        /**
+         * Better quality than [Low], faster than [High].
+         *
+         * Typically this implies a combination of bilinear interpolation and
+         * pyramidal parametric prefiltering (mipmaps).
+         */
+        val Medium = FilterQuality(2)
+
+        /**
+         * Best possible quality filtering, albeit also the slowest.
+         * Typically this implies bicubic interpolation or better.
+         */
+        val High = FilterQuality(3)
+    }
+
+    override fun toString() = when (this) {
+        None -> "None"
+        Low -> "Low"
+        Medium -> "Medium"
+        High -> "High"
+        else -> "Unknown"
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ImageBitmap.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ImageBitmap.kt
index 447bdda..674f758 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ImageBitmap.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/ImageBitmap.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.ui.graphics
 
+import androidx.compose.runtime.Immutable
 import androidx.compose.ui.graphics.colorspace.ColorSpace
 import androidx.compose.ui.graphics.colorspace.ColorSpaces
 
@@ -140,86 +141,99 @@
  * how pixels are stored. This affects the quality (color depth) as
  * well as the ability to display transparent/translucent colors.
  */
-enum class ImageBitmapConfig {
-    /**
-     * Each pixel is stored on 4 bytes. Each channel (RGB and alpha
-     * for translucency) is stored with 8 bits of precision (256
-     * possible values.)
-     *
-     * This configuration is very flexible and offers the best
-     * quality. It should be used whenever possible.
-     *
-     *      Use this formula to pack into 32 bits:
-     *
-     * ```
-     * val color =
-     *    ((A and 0xff) shl 24) or
-     *    ((B and 0xff) shl 16) or
-     *    ((G and 0xff) shl 8) or
-     *    (R and 0xff)
-     * ```
-     */
-    Argb8888,
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class ImageBitmapConfig internal constructor(val value: Int) {
+    companion object {
+        /**
+         * Each pixel is stored on 4 bytes. Each channel (RGB and alpha
+         * for translucency) is stored with 8 bits of precision (256
+         * possible values.)
+         *
+         * This configuration is very flexible and offers the best
+         * quality. It should be used whenever possible.
+         *
+         *      Use this formula to pack into 32 bits:
+         *
+         * ```
+         * val color =
+         *    ((A and 0xff) shl 24) or
+         *    ((B and 0xff) shl 16) or
+         *    ((G and 0xff) shl 8) or
+         *    (R and 0xff)
+         * ```
+         */
+        val Argb8888 = ImageBitmapConfig(0)
 
-    /**
-     * Each pixel is stored as a single translucency (alpha) channel.
-     * This is very useful to efficiently store masks for instance.
-     * No color information is stored.
-     * With this configuration, each pixel requires 1 byte of memory.
-     */
-    Alpha8,
+        /**
+         * Each pixel is stored as a single translucency (alpha) channel.
+         * This is very useful to efficiently store masks for instance.
+         * No color information is stored.
+         * With this configuration, each pixel requires 1 byte of memory.
+         */
+        val Alpha8 = ImageBitmapConfig(1)
 
-    /**
-     * Each pixel is stored on 2 bytes and only the RGB channels are
-     * encoded: red is stored with 5 bits of precision (32 possible
-     * values), green is stored with 6 bits of precision (64 possible
-     * values) and blue is stored with 5 bits of precision.
-     *
-     * This configuration can produce slight visual artifacts depending
-     * on the configuration of the source. For instance, without
-     * dithering, the result might show a greenish tint. To get better
-     * results dithering should be applied.
-     *
-     * This configuration may be useful when using opaque bitmaps
-     * that do not require high color fidelity.
-     *
-     *      Use this formula to pack into 16 bits:
-     * ```
-     *  val color =
-     *      ((R and 0x1f) shl 11) or
-     *      ((G and 0x3f) shl 5) or
-     *      (B and 0x1f)
-     * ```
-     */
-    Rgb565,
+        /**
+         * Each pixel is stored on 2 bytes and only the RGB channels are
+         * encoded: red is stored with 5 bits of precision (32 possible
+         * values), green is stored with 6 bits of precision (64 possible
+         * values) and blue is stored with 5 bits of precision.
+         *
+         * This configuration can produce slight visual artifacts depending
+         * on the configuration of the source. For instance, without
+         * dithering, the result might show a greenish tint. To get better
+         * results dithering should be applied.
+         *
+         * This configuration may be useful when using opaque bitmaps
+         * that do not require high color fidelity.
+         *
+         *      Use this formula to pack into 16 bits:
+         * ```
+         *  val color =
+         *      ((R and 0x1f) shl 11) or
+         *      ((G and 0x3f) shl 5) or
+         *      (B and 0x1f)
+         * ```
+         */
+        val Rgb565 = ImageBitmapConfig(2)
 
-    /**
-     * Each pixel is stored on 8 bytes. Each channel (RGB and alpha
-     * for translucency) is stored as a
-     * half-precision floating point value.
-     *
-     * This configuration is particularly suited for wide-gamut and
-     * HDR content.
-     *
-     *      Use this formula to pack into 64 bits:
-     * ```
-     *    val color =
-     *      ((A and 0xffff) shl 48) or
-     *      ((B and 0xffff) shl 32) or
-     *      ((G and 0xffff) shl 16) or
-     *      (R and 0xffff)
-     * ```
-     */
-    F16,
+        /**
+         * Each pixel is stored on 8 bytes. Each channel (RGB and alpha
+         * for translucency) is stored as a
+         * half-precision floating point value.
+         *
+         * This configuration is particularly suited for wide-gamut and
+         * HDR content.
+         *
+         *      Use this formula to pack into 64 bits:
+         * ```
+         *    val color =
+         *      ((A and 0xffff) shl 48) or
+         *      ((B and 0xffff) shl 32) or
+         *      ((G and 0xffff) shl 16) or
+         *      (R and 0xffff)
+         * ```
+         */
+        val F16 = ImageBitmapConfig(3)
 
-    /**
-     * Special configuration, when an ImageBitmap is stored only in graphic memory.
-     * ImageBitmaps in this configuration are always immutable.
-     *
-     * It is optimal for cases, when the only operation with the ImageBitmap is to draw it on a
-     * screen.
-     */
-    Gpu
+        /**
+         * Special configuration, when an ImageBitmap is stored only in graphic memory.
+         * ImageBitmaps in this configuration are always immutable.
+         *
+         * It is optimal for cases, when the only operation with the ImageBitmap is to draw it on a
+         * screen.
+         */
+        val Gpu = ImageBitmapConfig(4)
+    }
+
+    override fun toString() = when (this) {
+        Argb8888 -> "Argb8888"
+        Alpha8 -> "Alpha8"
+        Rgb565 -> "Rgb565"
+        F16 -> "F16"
+        Gpu -> "Gpu"
+        else -> "Unknown"
+    }
 }
 
 internal expect fun ActualImageBitmap(
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PaintingStyle.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PaintingStyle.kt
index f71f039..cc4df04 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PaintingStyle.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PaintingStyle.kt
@@ -16,25 +16,38 @@
 
 package androidx.compose.ui.graphics
 
+import androidx.compose.runtime.Immutable
+
 /**
  * Strategies for painting shapes and paths on a canvas.
  *
  * See [Paint.style].
  */
-enum class PaintingStyle {
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class PaintingStyle internal constructor(val value: Int) {
 
-    /**
-     * Apply the [Paint] to the inside of the shape. For example, when
-     * applied to the [Canvas.drawCircle] call, this results in a disc
-     * of the given size being painted.
-     */
-    Fill,
+    companion object {
 
-    /**
-     * Apply the [Paint] to the edge of the shape. For example, when
-     * applied to the [Canvas.drawCircle] call, this results is a hoop
-     * of the given size being painted. The line drawn on the edge will
-     * be the width given by the [Paint.strokeWidth] property.
-     */
-    Stroke
+        /**
+         * Apply the [Paint] to the inside of the shape. For example, when
+         * applied to the [Canvas.drawCircle] call, this results in a disc
+         * of the given size being painted.
+         */
+        val Fill = PaintingStyle(0)
+
+        /**
+         * Apply the [Paint] to the edge of the shape. For example, when
+         * applied to the [Canvas.drawCircle] call, this results is a hoop
+         * of the given size being painted. The line drawn on the edge will
+         * be the width given by the [Paint.strokeWidth] property.
+         */
+        val Stroke = PaintingStyle(1)
+    }
+
+    override fun toString() = when (this) {
+        Fill -> "Fill"
+        Stroke -> "Stroke"
+        else -> "Unknown"
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathEffect.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathEffect.kt
index fb12a5d..66b3550 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathEffect.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathEffect.kt
@@ -16,6 +16,8 @@
 
 package androidx.compose.ui.graphics
 
+import androidx.compose.runtime.Immutable
+
 /**
  * Effect applied to the geometry of a drawing primitive. For example, this can be used
  * to draw shapes as a dashed or shaped pattern, or apply a treatment around line segment
@@ -95,34 +97,45 @@
  *
  * @sample androidx.compose.ui.graphics.samples.StampedPathEffectSample
  */
-enum class StampedPathEffectStyle {
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class StampedPathEffectStyle internal constructor(val value: Int) {
 
-    /**
-     * Translate the path shape into the specified location aligning the top left of the path with
-     * the drawn geometry. This does not modify the path itself.
-     *
-     * For example, a circle drawn with a square path and [Translate] will draw the square path
-     * repeatedly with the top left corner of each stamped square along the curvature of the circle.
-     */
-    Translate,
+    companion object {
+        /**
+         * Translate the path shape into the specified location aligning the top left of the path with
+         * the drawn geometry. This does not modify the path itself.
+         *
+         * For example, a circle drawn with a square path and [Translate] will draw the square path
+         * repeatedly with the top left corner of each stamped square along the curvature of the circle.
+         */
+        val Translate = StampedPathEffectStyle(0)
 
-    /**
-     * Rotates the path shape its center along the curvature of the drawn geometry. This does not
-     * modify the path itself.
-     *
-     * For example, a circle drawn with a square path and [Rotate] will draw the square path
-     * repeatedly with the center of each stamped square along the curvature of the circle as well
-     * as each square being rotated along the circumference.
-     */
-    Rotate,
+        /**
+         * Rotates the path shape its center along the curvature of the drawn geometry. This does not
+         * modify the path itself.
+         *
+         * For example, a circle drawn with a square path and [Rotate] will draw the square path
+         * repeatedly with the center of each stamped square along the curvature of the circle as well
+         * as each square being rotated along the circumference.
+         */
+        val Rotate = StampedPathEffectStyle(1)
 
-    /**
-     * Modifies the points within the path such that they fit within the drawn geometry. This will
-     * turn straight lines into curves.
-     *
-     * For example, a circle drawn with a square path and [Morph] will modify the straight lines
-     * of the square paths to be curves such that each stamped square is rendered as an arc around
-     * the curvature of the circle.
-     */
-    Morph
+        /**
+         * Modifies the points within the path such that they fit within the drawn geometry. This will
+         * turn straight lines into curves.
+         *
+         * For example, a circle drawn with a square path and [Morph] will modify the straight lines
+         * of the square paths to be curves such that each stamped square is rendered as an arc around
+         * the curvature of the circle.
+         */
+        val Morph = StampedPathEffectStyle(2)
+    }
+
+    override fun toString() = when (this) {
+        Translate -> "Translate"
+        Rotate -> "Rotate"
+        Morph -> "Morph"
+        else -> "Unknown"
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathFillType.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathFillType.kt
index 4d2b4aa..59a8534 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathFillType.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathFillType.kt
@@ -16,35 +16,44 @@
 
 package androidx.compose.ui.graphics
 
+import androidx.compose.runtime.Immutable
+
 /**
  * Determines the winding rule that decides how the interior of a [Path] is
  * calculated.
  *
  * This enum is used by the [Path.fillType] property.
  */
-enum class PathFillType {
-    /**
-     * The interior is defined by a non-zero sum of signed edge crossings.
-     *
-     * For a given point, the point is considered to be on the inside of the path
-     * if a line drawn from the point to infinity crosses lines going clockwise
-     * around the point a different number of times than it crosses lines going
-     * counter-clockwise around that point.
-     *
-     * See: <https://en.wikipedia.org/wiki/Nonzero-rule>
-     */
-    NonZero,
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class PathFillType internal constructor(val value: Int) {
+    companion object {
+        /**
+         * The interior is defined by a non-zero sum of signed edge crossings.
+         *
+         * For a given point, the point is considered to be on the inside of the path
+         * if a line drawn from the point to infinity crosses lines going clockwise
+         * around the point a different number of times than it crosses lines going
+         * counter-clockwise around that point.
+         *
+         * See: <https://en.wikipedia.org/wiki/Nonzero-rule>
+         */
+        val NonZero = PathFillType(0)
 
-    /**
-     * The interior is defined by an odd number of edge crossings.
-     *
-     * For a given point, the point is considered to be on the inside of the path
-     * if a line drawn from the point to infinity crosses an odd number of lines.
-     *
-     * See: <https://en.wikipedia.org/wiki/Even-odd_rule>
-     */
-    EvenOdd
+        /**
+         * The interior is defined by an odd number of edge crossings.
+         *
+         * For a given point, the point is considered to be on the inside of the path
+         * if a line drawn from the point to infinity crosses an odd number of lines.
+         *
+         * See: <https://en.wikipedia.org/wiki/Even-odd_rule>
+         */
+        val EvenOdd = PathFillType(1)
+    }
 
-    // TODO b/162283938 (njawad) Android support inverse winding and inverse even odd. Should we
-    //  add these to compose as well?
+    override fun toString() = when (this) {
+        NonZero -> "NonZero"
+        EvenOdd -> "EvenOdd"
+        else -> "Unknown"
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathOperation.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathOperation.kt
index cd62d89..4163b8b 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathOperation.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PathOperation.kt
@@ -16,6 +16,8 @@
 
 package androidx.compose.ui.graphics
 
+import androidx.compose.runtime.Immutable
+
 /**
  * Strategies for combining paths.
  *
@@ -24,62 +26,128 @@
  * * [Path.combine], which uses this enum to decide how to combine two paths.
  */
 // Must be kept in sync with SkPathOp
-enum class PathOperation {
-    /**
-     * Subtract the second path from the first path.
-     *
-     * For example, if the two paths are overlapping circles of equal diameter
-     * but differing centers, the result would be a crescent portion of the
-     * first circle that was not overlapped by the second circle.
-     *
-     * See also:
-     *
-     *  * [reverseDifference], which is the same but subtracting the first path
-     *    from the second.
-     */
-    difference,
-    /**
-     * Create a new path that is the intersection of the two paths, leaving the
-     * overlapping pieces of the path.
-     *
-     * For example, if the two paths are overlapping circles of equal diameter
-     * but differing centers, the result would be only the overlapping portion
-     * of the two circles.
-     *
-     * See also:
-     *  * [xor], which is the inverse of this operation
-     */
-    intersect,
-    /**
-     * Create a new path that is the union (inclusive-or) of the two paths.
-     *
-     * For example, if the two paths are overlapping circles of equal diameter
-     * but differing centers, the result would be a figure-eight like shape
-     * matching the outer boundaries of both circles.
-     */
-    union,
-    /**
-     * Create a new path that is the exclusive-or of the two paths, leaving
-     * everything but the overlapping pieces of the path.
-     *
-     * For example, if the two paths are overlapping circles of equal diameter
-     * but differing centers, the figure-eight like shape less the overlapping parts
-     *
-     * See also:
-     *  * [intersect], which is the inverse of this operation
-     */
-    xor,
-    /**
-     * Subtract the first path from the second path.
-     *
-     * For example, if the two paths are overlapping circles of equal diameter
-     * but differing centers, the result would be a crescent portion of the
-     * second circle that was not overlapped by the first circle.
-     *
-     * See also:
-     *
-     *  * [difference], which is the same but subtracting the second path
-     *    from the first.
-     */
-    reverseDifference
-}
\ No newline at end of file
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class PathOperation internal constructor(val value: Int) {
+    companion object {
+        /**
+         * Subtract the second path from the first path.
+         *
+         * For example, if the two paths are overlapping circles of equal diameter
+         * but differing centers, the result would be a crescent portion of the
+         * first circle that was not overlapped by the second circle.
+         *
+         * See also:
+         *
+         *  * [ReverseDifference], which is the same but subtracting the first path
+         *    from the second.
+         */
+        val Difference = PathOperation(0)
+        /**
+         * Create a new path that is the intersection of the two paths, leaving the
+         * overlapping pieces of the path.
+         *
+         * For example, if the two paths are overlapping circles of equal diameter
+         * but differing centers, the result would be only the overlapping portion
+         * of the two circles.
+         *
+         * See also:
+         *  * [Xor], which is the inverse of this operation
+         */
+        val Intersect = PathOperation(1)
+
+        /**
+         * Create a new path that is the union (inclusive-or) of the two paths.
+         *
+         * For example, if the two paths are overlapping circles of equal diameter
+         * but differing centers, the result would be a figure-eight like shape
+         * matching the outer boundaries of both circles.
+         */
+        val Union = PathOperation(2)
+
+        /**
+         * Create a new path that is the exclusive-or of the two paths, leaving
+         * everything but the overlapping pieces of the path.
+         *
+         * For example, if the two paths are overlapping circles of equal diameter
+         * but differing centers, the figure-eight like shape less the overlapping parts
+         *
+         * See also:
+         *  * [Intersect], which is the inverse of this operation
+         */
+        val Xor = PathOperation(3)
+
+        /**
+         * Subtract the first path from the second path.
+         *
+         * For example, if the two paths are overlapping circles of equal diameter
+         * but differing centers, the result would be a crescent portion of the
+         * second circle that was not overlapped by the first circle.
+         *
+         * See also:
+         *
+         *  * [Difference], which is the same but subtracting the second path
+         *    from the first.
+         */
+        val ReverseDifference = PathOperation(4)
+    }
+
+    override fun toString() = when (this) {
+        Difference -> "Difference"
+        Intersect -> "Intersect"
+        Union -> "Union"
+        Xor -> "Xor"
+        ReverseDifference -> "ReverseDifference"
+        else -> "Unknown"
+    }
+}
+
+@Deprecated(
+    message = "Use PathOperation.Difference instead",
+    ReplaceWith(
+        "PathOperation.Difference",
+        "androidx.compose.ui.graphics.PathOperation.Difference"
+    )
+)
+val PathOperation.Companion.difference: PathOperation
+    get() = Difference
+
+@Deprecated(
+    message = "Use PathOperation.Intersect instead",
+    ReplaceWith(
+        "PathOperation.Intersect",
+        "androidx.compose.ui.graphics.PathOperation.Intersect"
+    )
+)
+val PathOperation.Companion.intersect: PathOperation
+    get() = Intersect
+
+@Deprecated(
+    message = "Use PathOperation.Union instead",
+    ReplaceWith(
+        "PathOperation.Union",
+        "androidx.compose.ui.graphics.PathOperation.Union"
+    )
+)
+val PathOperation.Companion.union: PathOperation
+    get() = Union
+
+@Deprecated(
+    message = "Use PathOperation.ReverseDifference instead",
+    ReplaceWith(
+        "PathOperation.ReverseDifference",
+        "androidx.compose.ui.graphics.PathOperation.ReverseDifference"
+    )
+)
+val PathOperation.Companion.reverseDifference: PathOperation
+    get() = ReverseDifference
+
+@Deprecated(
+    message = "Use PathOperation.Xor instead",
+    ReplaceWith(
+        "PathOperation.Xor",
+        "androidx.compose.ui.graphics.PathOperation.Xor"
+    )
+)
+val PathOperation.Companion.xor: PathOperation
+    get() = Xor
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PointMode.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PointMode.kt
index 73aaec3..ec14c01 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PointMode.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/PointMode.kt
@@ -16,6 +16,8 @@
 
 package androidx.compose.ui.graphics
 
+import androidx.compose.runtime.Immutable
+
 /**
  * Defines how a list of points is interpreted when drawing a set of points.
  *
@@ -23,35 +25,46 @@
 // ignore: deprecated_member_use
 /** Used by [Canvas.drawPoints]. */
 // These enum values must be kept in sync with SkCanvas::PointMode.
-enum class PointMode {
-    /**
-     * Draw each point separately.
-     *
-     * If the [Paint.strokeCap] is [StrokeCap.Round], then each point is drawn
-     * as a circle with the diameter of the [Paint.strokeWidth], filled as
-     * described by the [Paint] (ignoring [Paint.style]).
-     *
-     * Otherwise, each point is drawn as an axis-aligned square with sides of
-     * length [Paint.strokeWidth], filled as described by the [Paint] (ignoring
-     * [Paint.style]).
-     */
-    Points,
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class PointMode internal constructor(val value: Int) {
+    companion object {
+        /**
+         * Draw each point separately.
+         *
+         * If the [Paint.strokeCap] is [StrokeCap.Round], then each point is drawn
+         * as a circle with the diameter of the [Paint.strokeWidth], filled as
+         * described by the [Paint] (ignoring [Paint.style]).
+         *
+         * Otherwise, each point is drawn as an axis-aligned square with sides of
+         * length [Paint.strokeWidth], filled as described by the [Paint] (ignoring
+         * [Paint.style]).
+         */
+        val Points = PointMode(0)
 
-    /**
-     * Draw each sequence of two points as a line segment.
-     *
-     * If the number of points is odd, then the last point is ignored.
-     *
-     * The lines are stroked as described by the [Paint] (ignoring
-     * [Paint.style]).
-     */
-    Lines,
+        /**
+         * Draw each sequence of two points as a line segment.
+         *
+         * If the number of points is odd, then the last point is ignored.
+         *
+         * The lines are stroked as described by the [Paint] (ignoring
+         * [Paint.style]).
+         */
+        val Lines = PointMode(1)
 
-    /**
-     * Draw the entire sequence of point as one line.
-     *
-     * The lines are stroked as described by the [Paint] (ignoring
-     * [Paint.style]).
-     */
-    Polygon
+        /**
+         * Draw the entire sequence of point as one line.
+         *
+         * The lines are stroked as described by the [Paint] (ignoring
+         * [Paint.style]).
+         */
+        val Polygon = PointMode(2)
+    }
+
+    override fun toString() = when (this) {
+        Points -> "Points"
+        Lines -> "Lines"
+        Polygon -> "Polygon"
+        else -> "Unknown"
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeCap.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeCap.kt
index e0552c2..9a85a70 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeCap.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeCap.kt
@@ -16,25 +16,38 @@
 
 package androidx.compose.ui.graphics
 
+import androidx.compose.runtime.Immutable
+
 /**
  * Styles to use for line endings.
  * See [Paint.strokeCap].
  */
-enum class StrokeCap {
-    /**
-     * Begin and end contours with a flat edge and no extension.
-     */
-    Butt,
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class StrokeCap internal constructor(val value: Int) {
+    companion object {
+        /**
+         * Begin and end contours with a flat edge and no extension.
+         */
+        val Butt = StrokeCap(0)
 
-    /**
-     * Begin and end contours with a semi-circle extension.
-     */
-    Round,
+        /**
+         * Begin and end contours with a semi-circle extension.
+         */
+        val Round = StrokeCap(1)
 
-    /**
-     * Begin and end contours with a half square extension. This is
-     * similar to extending each contour by half the stroke width (as
-     * given by [Paint.strokeWidth]).
-     */
-    Square
+        /**
+         * Begin and end contours with a half square extension. This is
+         * similar to extending each contour by half the stroke width (as
+         * given by [Paint.strokeWidth]).
+         */
+        val Square = StrokeCap(2)
+    }
+
+    override fun toString() = when (this) {
+        Butt -> "Butt"
+        Round -> "Round"
+        Square -> "Square"
+        else -> "Unknown"
+    }
 }
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeJoin.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeJoin.kt
index 30b1578..31aa153 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeJoin.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/StrokeJoin.kt
@@ -16,6 +16,8 @@
 
 package androidx.compose.ui.graphics
 
+import androidx.compose.runtime.Immutable
+
 /**
  * Styles to use for line joins.
  *
@@ -23,20 +25,31 @@
  * rectangles, not points drawn as lines with [Canvas.drawPoints].
  * See [Paint.strokeJoin].
  */
-enum class StrokeJoin {
-    /**
-     * Joins between line segments form sharp corners.
-     */
-    Miter,
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class StrokeJoin internal constructor(val value: Int) {
+    companion object {
+        /**
+         * Joins between line segments form sharp corners.
+         */
+        val Miter = StrokeJoin(0)
 
-    /**
-     * Joins between line segments are semi-circular.
-     */
-    Round,
+        /**
+         * Joins between line segments are semi-circular.
+         */
+        val Round = StrokeJoin(1)
 
-    /**
-     * Joins between line segments connect the corners of the butt ends of the
-     * line segments to give a beveled appearance.
-     */
-    Bevel
+        /**
+         * Joins between line segments connect the corners of the butt ends of the
+         * line segments to give a beveled appearance.
+         */
+        val Bevel = StrokeJoin(2)
+    }
+
+    override fun toString() = when (this) {
+        Miter -> "Miter"
+        Round -> "Round"
+        Bevel -> "Bevel"
+        else -> "Unknown"
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/TileMode.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/TileMode.kt
index e825285..2c8e795 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/TileMode.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/TileMode.kt
@@ -16,45 +16,58 @@
 
 package androidx.compose.ui.graphics
 
-expect enum class NativeTileMode
+import androidx.compose.runtime.Immutable
 
-// Defines what happens at the edge of the gradient.
-//
-// A gradient is defined along a finite inner area. In the case of a linear
-// gradient, it's between the parallel lines that are orthogonal to the line
-// drawn between two points. In the case of radial gradients, it's the disc
-// that covers the circle centered on a particular point up to a given radius.
-//
-// This enum is used to define how the gradient should paint the regions
-// outside that defined inner area.
-//
-// See also:
-//
-//  * [LinearGradientShader], [RadialGradientShader] which works in
-//    relative coordinates and can create a [Shader] representing the gradient
-//    for a particular [Rect] on demand.
-enum class TileMode {
-    // Edge is clamped to the final color.
-    //
-    // The gradient will paint the all the regions outside the inner area with
-    // the color of the point closest to that region.
-    //
-    Clamp,
+/**
+ * Defines what happens at the edge of the gradient.
+ * A gradient is defined along a finite inner area. In the case of a linear
+ * gradient, it's between the parallel lines that are orthogonal to the line
+ * drawn between two points. In the case of radial gradients, it's the disc
+ * that covers the circle centered on a particular point up to a given radius.
+ *
+ * This enum is used to define how the gradient should paint the regions
+ * outside that defined inner area.
+ *
+ * See also:
+ * [LinearGradientShader], [RadialGradientShader] which works in
+ * relative coordinates and can create a [Shader] representing the gradient
+ * for a particular [Rect] on demand.
+ */
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class TileMode internal constructor(val value: Int) {
+    companion object {
+        /**
+         * Edge is clamped to the final color.
+         *
+         * The gradient will paint the all the regions outside the inner area with
+         * the color of the point closest to that region.
+         */
+        val Clamp = TileMode(0)
 
-    // Edge is repeated from first color to last.
-    //
-    // This is as if the stop points from 0.0 to 1.0 were then repeated from 1.0
-    // to 2.0, 2.0 to 3.0, and so forth (and for linear gradients, similarly from
-    // -1.0 to 0.0, -2.0 to -1.0, etc).
-    Repeated,
+        /**
+         * Edge is repeated from first color to last.
+         *
+         * This is as if the stop points from 0.0 to 1.0 were then repeated from 1.0
+         * to 2.0, 2.0 to 3.0, and so forth (and for linear gradients, similarly from
+         * -1.0 to 0.0, -2.0 to -1.0, etc).
+         */
+        val Repeated = TileMode(1)
 
-    // Edge is mirrored from last color to first.
-    //
-    // This is as if the stop points from 0.0 to 1.0 were then repeated backwards
-    // from 2.0 to 1.0, then forwards from 2.0 to 3.0, then backwards again from
-    // 4.0 to 3.0, and so forth (and for linear gradients, similarly from in the
-    // negative direction).
-    Mirror
-}
+        /**
+         * Edge is mirrored from last color to first.
+         * This is as if the stop points from 0.0 to 1.0 were then repeated backwards
+         * from 2.0 to 1.0, then forwards from 2.0 to 3.0, then backwards again from
+         * 4.0 to 3.0, and so forth (and for linear gradients, similarly from in the
+         * negative direction).
+         */
+        val Mirror = TileMode(2)
+    }
 
-expect fun TileMode.toNativeTileMode(): NativeTileMode
\ No newline at end of file
+    override fun toString() = when (this) {
+        Clamp -> "Clamp"
+        Repeated -> "Repeated"
+        Mirror -> "Mirror"
+        else -> "Unknown"
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/VertexMode.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/VertexMode.kt
index 583740c..c781e49 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/VertexMode.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/VertexMode.kt
@@ -16,28 +16,38 @@
 
 package androidx.compose.ui.graphics
 
-expect enum class NativeVertexMode
+import androidx.compose.runtime.Immutable
 
 /**
  * Defines how a list of points is interpreted when drawing a set of triangles.
  *
  * Used by [Canvas.drawVertices].
  */
-enum class VertexMode {
-    /**
-     * Draw each sequence of three points as the vertices of a triangle.
-     */
-    Triangles,
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class VertexMode internal constructor(val value: Int) {
 
-    /**
-     *  Draw each sliding window of three points as the vertices of a triangle.
-     */
-    TriangleStrip,
+    companion object {
+        /**
+         * Draw each sequence of three points as the vertices of a triangle.
+         */
+        val Triangles = VertexMode(0)
 
-    /**
-     * Draw the first point and each sliding window of two points as the vertices of a triangle.
-     */
-    TriangleFan;
-}
+        /**
+         *  Draw each sliding window of three points as the vertices of a triangle.
+         */
+        val TriangleStrip = VertexMode(1)
 
-expect fun VertexMode.toNativeVertexMode(): NativeVertexMode
\ No newline at end of file
+        /**
+         * Draw the first point and each sliding window of two points as the vertices of a triangle.
+         */
+        val TriangleFan = VertexMode(2)
+    }
+
+    override fun toString() = when (this) {
+        Triangles -> "Triangles"
+        TriangleStrip -> "TriangleStrip"
+        TriangleFan -> "TriangleFan"
+        else -> "Unknown"
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Adaptation.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Adaptation.kt
index 0e76895..fb26363 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Adaptation.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/Adaptation.kt
@@ -42,39 +42,47 @@
  * @see Connector
  * @see ColorSpace.connect
  */
-enum class Adaptation constructor(internal val transform: FloatArray) {
-    /**
-     * Bradford chromatic adaptation transform, as defined in the
-     * CIECAM97s color appearance model.
-     */
-    Bradford(
-        floatArrayOf(
-            0.8951f, -0.7502f, 0.0389f,
-            0.2664f, 1.7135f, -0.0685f,
-            -0.1614f, 0.0367f, 1.0296f
-        )
-    ),
+abstract class Adaptation private constructor(internal val transform: FloatArray) {
+    companion object {
+        /**
+         * Bradford chromatic adaptation transform, as defined in the
+         * CIECAM97s color appearance model.
+         */
+        val Bradford = object : Adaptation(
+            floatArrayOf(
+                0.8951f, -0.7502f, 0.0389f,
+                0.2664f, 1.7135f, -0.0685f,
+                -0.1614f, 0.0367f, 1.0296f
+            )
+        ) {
+            override fun toString() = "Bradford"
+        }
 
-    /**
-     * von Kries chromatic adaptation transform.
-     */
-    VonKries(
-        floatArrayOf(
-            0.40024f, -0.22630f, 0.00000f,
-            0.70760f, 1.16532f, 0.00000f,
-            -0.08081f, 0.04570f, 0.91822f
-        )
-    ),
+        /**
+         * von Kries chromatic adaptation transform.
+         */
+        val VonKries = object : Adaptation(
+            floatArrayOf(
+                0.40024f, -0.22630f, 0.00000f,
+                0.70760f, 1.16532f, 0.00000f,
+                -0.08081f, 0.04570f, 0.91822f
+            )
+        ) {
+            override fun toString() = "VonKries"
+        }
 
-    /**
-     * CIECAT02 chromatic adaption transform, as defined in the
-     * CIECAM02 color appearance model.
-     */
-    Ciecat02(
-        floatArrayOf(
-            0.7328f, -0.7036f, 0.0030f,
-            0.4296f, 1.6975f, 0.0136f,
-            -0.1624f, 0.0061f, 0.9834f
-        )
-    )
+        /**
+         * CIECAT02 chromatic adaption transform, as defined in the
+         * CIECAM02 color appearance model.
+         */
+        val Ciecat02 = object : Adaptation(
+            floatArrayOf(
+                0.7328f, -0.7036f, 0.0030f,
+                0.4296f, 1.6975f, 0.0136f,
+                -0.1624f, 0.0061f, 0.9834f
+            )
+        ) {
+            override fun toString() = "Ciecat02"
+        }
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorModel.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorModel.kt
index dc72476..1bd7cdd 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorModel.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorModel.kt
@@ -16,7 +16,10 @@
 
 package androidx.compose.ui.graphics.colorspace
 
-import androidx.compose.ui.graphics.colorspace.ColorModel.Rgb
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.Stable
+import androidx.compose.ui.util.packInts
+import androidx.compose.ui.util.unpackInt1
 
 /**
  * A color model is required by a [ColorSpace] to describe the
@@ -24,41 +27,63 @@
  * model is the [RGB][Rgb] color model which defines a color
  * as represented by a tuple of 3 numbers (red, green and blue).
  */
-enum class ColorModel(
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class ColorModel internal constructor (
+    /**
+     * pack both the number of components and an ordinal value to distinguish between
+     * different ColorModel types that have the same number of components
+     */
+    internal val packedValue: Long
+) {
     /**
      * Returns the number of components for this color model.
      *
      * @return An integer between 1 and 4
      */
     /*@IntRange(from = 1, to = 4)*/
+    @Stable
     val componentCount: Int
-) {
-    /**
-     * The RGB model is a color model with 3 components that
-     * refer to the three additive primiaries: red, green
-     * and blue.
-     */
-    Rgb(3),
+        get() {
+            return unpackInt1(packedValue)
+        }
 
-    /**
-     * The XYZ model is a color model with 3 components that
-     * are used to model human color vision on a basic sensory
-     * level.
-     */
-    Xyz(3),
+    companion object {
+        /**
+         * The RGB model is a color model with 3 components that
+         * refer to the three additive primiaries: red, green
+         * and blue.
+         */
+        val Rgb = ColorModel(packInts(3, 0))
 
-    /**
-     * The Lab model is a color model with 3 components used
-     * to describe a color space that is more perceptually
-     * uniform than XYZ.
-     */
-    Lab(3),
+        /**
+         * The XYZ model is a color model with 3 components that
+         * are used to model human color vision on a basic sensory
+         * level.
+         */
+        val Xyz = ColorModel(packInts(3, 1))
 
-    /**
-     * The CMYK model is a color model with 4 components that
-     * refer to four inks used in color printing: cyan, magenta,
-     * yellow and black (or key). CMYK is a subtractive color
-     * model.
-     */
-    Cmyk(4)
+        /**
+         * The Lab model is a color model with 3 components used
+         * to describe a color space that is more perceptually
+         * uniform than XYZ.
+         */
+        val Lab = ColorModel(packInts(3, 2))
+
+        /**
+         * The CMYK model is a color model with 4 components that
+         * refer to four inks used in color printing: cyan, magenta,
+         * yellow and black (or key). CMYK is a subtractive color
+         * model.
+         */
+        val Cmyk = ColorModel(packInts(4, 3))
+    }
+
+    override fun toString() = when (this) {
+        Rgb -> "Rgb"
+        Xyz -> "Xyz"
+        Lab -> "Lab"
+        Cmyk -> "Cmyk"
+        else -> "Unknown"
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorSpace.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorSpace.kt
index 72cf045..812fdb7 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorSpace.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/ColorSpace.kt
@@ -402,7 +402,7 @@
         return Connector.identity(this)
     }
 
-    return if (this.model === ColorModel.Rgb && destination.model === ColorModel.Rgb) {
+    return if (this.model == ColorModel.Rgb && destination.model == ColorModel.Rgb) {
         Connector.RgbConnector(
             this as Rgb,
             destination as Rgb,
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/RenderIntent.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/RenderIntent.kt
index 6b39f24..d165df0 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/RenderIntent.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/colorspace/RenderIntent.kt
@@ -16,6 +16,8 @@
 
 package androidx.compose.ui.graphics.colorspace
 
+import androidx.compose.runtime.Immutable
+
 /**
  * A render intent determines how a [connector][Connector]
  * maps colors from one color space to another. The choice of mapping is
@@ -24,40 +26,52 @@
  *
  * @see ColorSpace.connect
  */
-enum class RenderIntent {
-    /**
-     * Compresses the source gamut into the destination gamut.
-     * This render intent affects all colors, inside and outside
-     * of destination gamut. The goal of this render intent is
-     * to preserve the visual relationship between colors.
-     *
-     * This render intent is currently not
-     * implemented and behaves like [Relative].
-     */
-    Perceptual,
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@Immutable
+inline class RenderIntent internal constructor(val value: Int) {
+    companion object {
+        /**
+         * Compresses the source gamut into the destination gamut.
+         * This render intent affects all colors, inside and outside
+         * of destination gamut. The goal of this render intent is
+         * to preserve the visual relationship between colors.
+         *
+         * This render intent is currently not
+         * implemented and behaves like [Relative].
+         */
+        val Perceptual = RenderIntent(0)
 
-    /**
-     * Similar to the [Absolute] render intent, this render
-     * intent matches the closest color in the destination gamut
-     * but makes adjustments for the destination white point.
-     */
-    Relative,
+        /**
+         * Similar to the [Absolute] render intent, this render
+         * intent matches the closest color in the destination gamut
+         * but makes adjustments for the destination white point.
+         */
+        val Relative = RenderIntent(1)
 
-    /**
-     * Attempts to maintain the relative saturation of colors
-     * from the source gamut to the destination gamut, to keep
-     * highly saturated colors as saturated as possible.
-     *
-     * This render intent is currently not
-     * implemented and behaves like [Relative].
-     */
-    Saturation,
+        /**
+         * Attempts to maintain the relative saturation of colors
+         * from the source gamut to the destination gamut, to keep
+         * highly saturated colors as saturated as possible.
+         *
+         * This render intent is currently not
+         * implemented and behaves like [Relative].
+         */
+        val Saturation = RenderIntent(2)
 
-    /**
-     * Colors that are in the destination gamut are left unchanged.
-     * Colors that fall outside of the destination gamut are mapped
-     * to the closest possible color within the gamut of the destination
-     * color space (they are clipped).
-     */
-    Absolute
+        /**
+         * Colors that are in the destination gamut are left unchanged.
+         * Colors that fall outside of the destination gamut are mapped
+         * to the closest possible color within the gamut of the destination
+         * color space (they are clipped).
+         */
+        val Absolute = RenderIntent(3)
+    }
+
+    override fun toString() = when (this) {
+        Perceptual -> "Perceptual"
+        Relative -> "Relative"
+        Saturation -> "Saturation"
+        Absolute -> "Absolute"
+        else -> "Unknown"
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/BlendMode.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/BlendMode.desktop.kt
index bacaccb..752605d 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/BlendMode.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/BlendMode.desktop.kt
@@ -46,4 +46,6 @@
     BlendMode.Saturation -> org.jetbrains.skija.BlendMode.SATURATION
     BlendMode.Color -> org.jetbrains.skija.BlendMode.COLOR
     BlendMode.Luminosity -> org.jetbrains.skija.BlendMode.LUMINOSITY
+    // Always fallback to default blendmode of src over
+    else -> org.jetbrains.skija.BlendMode.SRC_OVER
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopCanvas.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopCanvas.desktop.kt
index 897cc44..6b80b7c 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopCanvas.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopCanvas.desktop.kt
@@ -19,11 +19,17 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.geometry.RoundRect
+import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.util.fastForEach
+import org.jetbrains.skija.CubicResampler
+import org.jetbrains.skija.FilterMipmap
+import org.jetbrains.skija.FilterMode
 import org.jetbrains.skija.Image
 import org.jetbrains.skija.Matrix44
+import org.jetbrains.skija.MipmapMode
+import org.jetbrains.skija.SamplingMode
 import org.jetbrains.skija.impl.Native
 import org.jetbrains.skija.ClipMode as SkijaClipMode
 import org.jetbrains.skija.RRect as SkijaRRect
@@ -164,14 +170,8 @@
     }
 
     override fun drawImage(image: ImageBitmap, topLeftOffset: Offset, paint: Paint) {
-        val bitmap = image.asDesktopBitmap()
-        Image.makeFromBitmap(bitmap).use { skijaImage ->
-            skija.drawImage(
-                skijaImage,
-                topLeftOffset.x, topLeftOffset.y,
-                paint.skija
-            )
-        }
+        val size = Size(image.width.toFloat(), image.height.toFloat())
+        drawImageRect(image, Offset.Zero, size, topLeftOffset, size, paint)
     }
 
     override fun drawImageRect(
@@ -182,23 +182,44 @@
         dstSize: IntSize,
         paint: Paint
     ) {
+        drawImageRect(
+            image,
+            Offset(srcOffset.x.toFloat(), srcOffset.y.toFloat()),
+            Size(srcSize.width.toFloat(), srcSize.height.toFloat()),
+            Offset(dstOffset.x.toFloat(), dstOffset.y.toFloat()),
+            Size(dstSize.width.toFloat(), dstSize.height.toFloat()),
+            paint
+        )
+    }
+
+    // TODO(demin): probably this method should be in the common Canvas
+    private fun drawImageRect(
+        image: ImageBitmap,
+        srcOffset: Offset,
+        srcSize: Size,
+        dstOffset: Offset,
+        dstSize: Size,
+        paint: Paint
+    ) {
         val bitmap = image.asDesktopBitmap()
         Image.makeFromBitmap(bitmap).use { skijaImage ->
             skija.drawImageRect(
                 skijaImage,
                 SkijaRect.makeXYWH(
-                    srcOffset.x.toFloat(),
-                    srcOffset.y.toFloat(),
-                    srcSize.width.toFloat(),
-                    srcSize.height.toFloat()
+                    srcOffset.x,
+                    srcOffset.y,
+                    srcSize.width,
+                    srcSize.height
                 ),
                 SkijaRect.makeXYWH(
-                    dstOffset.x.toFloat(),
-                    dstOffset.y.toFloat(),
-                    dstSize.width.toFloat(),
-                    dstSize.height.toFloat()
+                    dstOffset.x,
+                    dstOffset.y,
+                    dstSize.width,
+                    dstSize.height
                 ),
-                paint.skija
+                paint.filterQuality.toSkija(),
+                paint.skija,
+                true
             )
         }
     }
@@ -319,7 +340,7 @@
     override fun drawVertices(vertices: Vertices, blendMode: BlendMode, paint: Paint) {
         org.jetbrains.skija.Canvas._nDrawVertices(
             skija._ptr,
-            vertices.vertexMode.toSkijaMode(),
+            vertices.vertexMode.toDesktopVertexMode(),
             vertices.positions,
             vertices.colors,
             vertices.textureCoordinates,
@@ -329,15 +350,10 @@
         )
     }
 
-    private fun VertexMode.toSkijaMode() = when (this) {
-        VertexMode.Triangles -> 0
-        VertexMode.TriangleStrip -> 1
-        VertexMode.TriangleFan -> 2
-    }
-
     private fun ClipOp.toSkija() = when (this) {
         ClipOp.Difference -> SkijaClipMode.DIFFERENCE
         ClipOp.Intersect -> SkijaClipMode.INTERSECT
+        else -> SkijaClipMode.INTERSECT
     }
 
     private fun Matrix.toSkija() = Matrix44(
@@ -361,4 +377,14 @@
         this[2, 3],
         this[3, 3]
     )
+
+    // These constants are chosen to correspond the old implementation of SkFilterQuality:
+    // https://github.com/google/skia/blob/1f193df9b393d50da39570dab77a0bb5d28ec8ef/src/image/SkImage.cpp#L809
+    // https://github.com/google/skia/blob/1f193df9b393d50da39570dab77a0bb5d28ec8ef/include/core/SkSamplingOptions.h#L86
+    private fun FilterQuality.toSkija(): SamplingMode = when (this) {
+        FilterQuality.Low -> FilterMipmap(FilterMode.LINEAR, MipmapMode.NONE)
+        FilterQuality.Medium -> FilterMipmap(FilterMode.LINEAR, MipmapMode.NEAREST)
+        FilterQuality.High -> CubicResampler(1 / 3.0f, 1 / 3.0f)
+        else -> FilterMipmap(FilterMode.NEAREST, MipmapMode.NONE)
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPaint.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPaint.desktop.kt
index ef734b5..3242cf1 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPaint.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPaint.desktop.kt
@@ -16,7 +16,6 @@
 
 package androidx.compose.ui.graphics
 
-import org.jetbrains.skija.FilterQuality as SkijaFilterQuality
 import org.jetbrains.skija.PaintMode as SkijaPaintMode
 import org.jetbrains.skija.PaintStrokeCap as SkijaPaintStrokeCap
 import org.jetbrains.skija.PaintStrokeJoin as SkijaPaintStrokeJoin
@@ -28,10 +27,6 @@
 class DesktopPaint : Paint {
     internal val skija = org.jetbrains.skija.Paint()
 
-    constructor() {
-        filterQuality = FilterQuality.Medium
-    }
-
     override fun asFrameworkPaint(): NativePaint = skija
 
     override var alpha: Float
@@ -88,11 +83,7 @@
             field = value
         }
 
-    override var filterQuality: FilterQuality = FilterQuality.None
-        set(value) {
-            skija.filterQuality = value.toSkija()
-            field = value
-        }
+    override var filterQuality: FilterQuality = FilterQuality.Medium
 
     override var shader: Shader? = null
         set(value) {
@@ -115,25 +106,21 @@
     private fun PaintingStyle.toSkija() = when (this) {
         PaintingStyle.Fill -> SkijaPaintMode.FILL
         PaintingStyle.Stroke -> SkijaPaintMode.STROKE
+        else -> SkijaPaintMode.FILL
     }
 
     private fun StrokeCap.toSkija() = when (this) {
         StrokeCap.Butt -> SkijaPaintStrokeCap.BUTT
         StrokeCap.Round -> SkijaPaintStrokeCap.ROUND
         StrokeCap.Square -> SkijaPaintStrokeCap.SQUARE
+        else -> SkijaPaintStrokeCap.BUTT
     }
 
     private fun StrokeJoin.toSkija() = when (this) {
         StrokeJoin.Miter -> SkijaPaintStrokeJoin.MITER
         StrokeJoin.Round -> SkijaPaintStrokeJoin.ROUND
         StrokeJoin.Bevel -> SkijaPaintStrokeJoin.BEVEL
-    }
-
-    private fun FilterQuality.toSkija() = when (this) {
-        FilterQuality.None -> SkijaFilterQuality.NONE
-        FilterQuality.Low -> SkijaFilterQuality.LOW
-        FilterQuality.Medium -> SkijaFilterQuality.MEDIUM
-        FilterQuality.High -> SkijaFilterQuality.HIGH
+        else -> SkijaPaintStrokeJoin.MITER
     }
 }
 
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPath.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPath.desktop.kt
index 786117a..ca802b1 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPath.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPath.desktop.kt
@@ -188,11 +188,12 @@
     }
 
     private fun PathOperation.toSkijaOperation() = when (this) {
-        PathOperation.difference -> PathOp.DIFFERENCE
-        PathOperation.intersect -> PathOp.INTERSECT
-        PathOperation.union -> PathOp.UNION
-        PathOperation.xor -> PathOp.XOR
-        PathOperation.reverseDifference -> PathOp.REVERSE_DIFFERENCE
+        PathOperation.Difference -> PathOp.DIFFERENCE
+        PathOperation.Intersect -> PathOp.INTERSECT
+        PathOperation.Union -> PathOp.UNION
+        PathOperation.Xor -> PathOp.XOR
+        PathOperation.ReverseDifference -> PathOp.REVERSE_DIFFERENCE
+        else -> PathOp.XOR
     }
 
     override val isConvex: Boolean get() = internalPath.isConvex
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt
index a443873..d10e7b3 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt
@@ -57,4 +57,5 @@
         StampedPathEffectStyle.Morph -> SkijaPathEffect.Style.MORPH
         StampedPathEffectStyle.Rotate -> SkijaPathEffect.Style.ROTATE
         StampedPathEffectStyle.Translate -> SkijaPathEffect.Style.TRANSLATE
+        else -> SkijaPathEffect.Style.TRANSLATE
     }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopShader.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopShader.desktop.kt
index 62d3e33..516fdeb 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopShader.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopShader.desktop.kt
@@ -17,7 +17,6 @@
 package androidx.compose.ui.graphics
 
 import androidx.compose.ui.geometry.Offset
-import org.jetbrains.skija.FilterTileMode
 import org.jetbrains.skija.GradientStyle
 
 actual typealias Shader = org.jetbrains.skija.Shader
@@ -32,7 +31,7 @@
     validateColorStops(colors, colorStops)
     return Shader.makeLinearGradient(
         from.x, from.y, to.x, to.y, colors.toIntArray(), colorStops?.toFloatArray(),
-        GradientStyle(tileMode.toSkijaRect(), true, identityMatrix33())
+        GradientStyle(tileMode.toDesktopTileMode(), true, identityMatrix33())
     )
 }
 
@@ -50,7 +49,7 @@
         radius,
         colors.toIntArray(),
         colorStops?.toFloatArray(),
-        GradientStyle(tileMode.toSkijaRect(), true, identityMatrix33())
+        GradientStyle(tileMode.toDesktopTileMode(), true, identityMatrix33())
     )
 }
 
@@ -74,17 +73,11 @@
     tileModeY: TileMode
 ): Shader {
     return image.asDesktopBitmap().makeShader(
-        tileModeX.toSkijaTileMode(),
-        tileModeY.toSkijaTileMode()
+        tileModeX.toDesktopTileMode(),
+        tileModeY.toDesktopTileMode()
     )
 }
 
-private fun TileMode.toSkijaTileMode() = when (this) {
-    TileMode.Clamp -> FilterTileMode.CLAMP
-    TileMode.Repeated -> FilterTileMode.REPEAT
-    TileMode.Mirror -> FilterTileMode.MIRROR
-}
-
 private fun List<Color>.toIntArray(): IntArray =
     IntArray(size) { i -> this[i].toArgb() }
 
@@ -102,10 +95,4 @@
                 " equal length."
         )
     }
-}
-
-private fun TileMode.toSkijaRect() = when (this) {
-    TileMode.Clamp -> FilterTileMode.CLAMP
-    TileMode.Repeated -> FilterTileMode.REPEAT
-    TileMode.Mirror -> FilterTileMode.MIRROR
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopTileMode.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopTileMode.desktop.kt
index 1f9573d..5b1330f 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopTileMode.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopTileMode.desktop.kt
@@ -16,6 +16,11 @@
 
 package androidx.compose.ui.graphics
 
-actual typealias NativeTileMode = TileMode
+import org.jetbrains.skija.FilterTileMode
 
-actual fun TileMode.toNativeTileMode(): NativeTileMode = this
\ No newline at end of file
+fun TileMode.toDesktopTileMode(): FilterTileMode = when (this) {
+    TileMode.Clamp -> FilterTileMode.CLAMP
+    TileMode.Repeated -> FilterTileMode.REPEAT
+    TileMode.Mirror -> FilterTileMode.MIRROR
+    else -> FilterTileMode.CLAMP
+}
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopVertexMode.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopVertexMode.desktop.kt
index 83f55cf..42e53a4 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopVertexMode.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopVertexMode.desktop.kt
@@ -16,6 +16,9 @@
 
 package androidx.compose.ui.graphics
 
-actual typealias NativeVertexMode = VertexMode
-
-actual fun VertexMode.toNativeVertexMode(): NativeVertexMode = this
\ No newline at end of file
+fun VertexMode.toDesktopVertexMode(): Int = when (this) {
+    VertexMode.Triangles -> 0
+    VertexMode.TriangleStrip -> 1
+    VertexMode.TriangleFan -> 2
+    else -> 0
+}
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPaintTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPaintTest.kt
index aa73daa2..462a5ba 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPaintTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPaintTest.kt
@@ -17,7 +17,6 @@
 package androidx.compose.ui.graphics
 
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.platform.DesktopPlatform
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import org.junit.Assert.assertEquals
@@ -90,7 +89,7 @@
 
     @Test
     fun filterQuality() {
-        assumeTrue(DesktopPlatform.Current == DesktopPlatform.MacOS)
+        assumeTrue(isWindows || isLinux)
 
         canvas.drawImageRect(
             image = imageFromResource("androidx/compose/desktop/test.png"),
@@ -127,6 +126,46 @@
     }
 
     @Test
+    fun `filterQuality with scaled Canvas`() {
+        assumeTrue(isWindows || isLinux)
+
+        canvas.scale(2f, 2f)
+
+        canvas.drawImageRect(
+            image = imageFromResource("androidx/compose/desktop/test.png"),
+            srcOffset = IntOffset(0, 2),
+            srcSize = IntSize(2, 4),
+            dstOffset = IntOffset(0, 2),
+            dstSize = IntSize(2, 6),
+            paint = redPaint.apply {
+                filterQuality = FilterQuality.None
+            }
+        )
+        canvas.drawImageRect(
+            image = imageFromResource("androidx/compose/desktop/test.png"),
+            srcOffset = IntOffset(0, 2),
+            srcSize = IntSize(2, 4),
+            dstOffset = IntOffset(2, 2),
+            dstSize = IntSize(2, 6),
+            paint = redPaint.apply {
+                filterQuality = FilterQuality.Low
+            }
+        )
+        canvas.drawImageRect(
+            image = imageFromResource("androidx/compose/desktop/test.png"),
+            srcOffset = IntOffset(0, 2),
+            srcSize = IntSize(2, 4),
+            dstOffset = IntOffset(4, 2),
+            dstSize = IntSize(2, 6),
+            paint = redPaint.apply {
+                filterQuality = FilterQuality.High
+            }
+        )
+
+        screenshotRule.snap(surface)
+    }
+
+    @Test
     fun linearGradientShader() {
         canvas.drawRect(left = 0f, top = 0f, right = 16f, bottom = 16f, paint = redPaint)
 
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/TestUtils.kt
similarity index 62%
copy from camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
copy to compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/TestUtils.kt
index bfc1884..c98c362 100644
--- a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/TestUtils.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+package androidx.compose.ui.graphics
 
-import static org.junit.Assert.assertNotNull;
-
-import org.junit.Test;
-
-public class VersionNameTest {
-    @Test
-    public void testCurrentVersion_shouldNotEmpty() {
-        assertNotNull(VersionName.getCurrentVersion().getVersion());
-    }
-}
+private val os = System.getProperty("os.name").lowercase()
+internal val isLinux = os.startsWith("linux")
+internal val isWindows = os.startsWith("win")
+internal val isMacOs = os.startsWith("mac")
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/BlendModeTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/BlendModeTest.kt
new file mode 100644
index 0000000..a199eae
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/BlendModeTest.kt
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class BlendModeTest {
+
+    @Test
+    fun testToString() {
+        assertEquals("Clear", BlendMode.Clear.toString())
+        assertEquals("Src", BlendMode.Src.toString())
+        assertEquals("Dst", BlendMode.Dst.toString())
+        assertEquals("SrcOver", BlendMode.SrcOver.toString())
+        assertEquals("DstOver", BlendMode.DstOver.toString())
+        assertEquals("SrcIn", BlendMode.SrcIn.toString())
+        assertEquals("DstIn", BlendMode.DstIn.toString())
+        assertEquals("SrcOut", BlendMode.SrcOut.toString())
+        assertEquals("DstOut", BlendMode.DstOut.toString())
+        assertEquals("SrcAtop", BlendMode.SrcAtop.toString())
+        assertEquals("DstAtop", BlendMode.DstAtop.toString())
+        assertEquals("Xor", BlendMode.Xor.toString())
+        assertEquals("Plus", BlendMode.Plus.toString())
+        assertEquals("Modulate", BlendMode.Modulate.toString())
+        assertEquals("Screen", BlendMode.Screen.toString())
+        assertEquals("Overlay", BlendMode.Overlay.toString())
+        assertEquals("Darken", BlendMode.Darken.toString())
+        assertEquals("Lighten", BlendMode.Lighten.toString())
+        assertEquals("ColorDodge", BlendMode.ColorDodge.toString())
+        assertEquals("ColorBurn", BlendMode.ColorBurn.toString())
+        assertEquals("HardLight", BlendMode.Hardlight.toString())
+        assertEquals("Softlight", BlendMode.Softlight.toString())
+        assertEquals("Difference", BlendMode.Difference.toString())
+        assertEquals("Exclusion", BlendMode.Exclusion.toString())
+        assertEquals("Multiply", BlendMode.Multiply.toString())
+        assertEquals("Hue", BlendMode.Hue.toString())
+        assertEquals("Saturation", BlendMode.Saturation.toString())
+        assertEquals("Color", BlendMode.Color.toString())
+        assertEquals("Luminosity", BlendMode.Luminosity.toString())
+    }
+}
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/ClipOpTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/ClipOpTest.kt
new file mode 100644
index 0000000..669dbd1
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/ClipOpTest.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ClipOpTest {
+
+    @Test
+    fun testToString() {
+        assertEquals("Difference", ClipOp.Difference.toString())
+        assertEquals("Intersect", ClipOp.Intersect.toString())
+    }
+}
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/ColorSpaceTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/ColorSpaceTest.kt
index eafca54..7b05669 100644
--- a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/ColorSpaceTest.kt
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/ColorSpaceTest.kt
@@ -434,12 +434,12 @@
 
         assertSame(ColorSpaces.Srgb, connector.source)
         assertSame(ColorSpaces.DciP3, connector.destination)
-        assertSame(RenderIntent.Perceptual, connector.renderIntent)
+        assertEquals(RenderIntent.Perceptual, connector.renderIntent)
 
         connector = ColorSpaces.Srgb.connect(ColorSpaces.Srgb)
 
         assertSame(connector.destination, connector.source)
-        assertSame(RenderIntent.Relative, connector.renderIntent)
+        assertEquals(RenderIntent.Relative, connector.renderIntent)
 
         connector = ColorSpaces.DciP3.connect()
         assertSame(ColorSpaces.Srgb, connector.destination)
@@ -534,7 +534,7 @@
         val connector = ColorSpaces.Srgb.connect(ColorSpaces.Srgb)
 
         assertSame(connector.source, connector.destination)
-        assertSame(RenderIntent.Relative, connector.renderIntent)
+        assertEquals(RenderIntent.Relative, connector.renderIntent)
 
         val source = floatArrayOf(0.11112f, 0.22227f, 0.444448f)
 
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/FilterQualityTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/FilterQualityTest.kt
new file mode 100644
index 0000000..83c9ac7
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/FilterQualityTest.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class FilterQualityTest {
+
+    @Test
+    fun testToString() {
+        assertEquals("None", FilterQuality.None.toString())
+        assertEquals("Low", FilterQuality.Low.toString())
+        assertEquals("Medium", FilterQuality.Medium.toString())
+        assertEquals("High", FilterQuality.High.toString())
+    }
+}
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/ImageBitmapConfigTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/ImageBitmapConfigTest.kt
new file mode 100644
index 0000000..eaccafd
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/ImageBitmapConfigTest.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ImageBitmapConfigTest {
+
+    @Test
+    fun testToString() {
+        assertEquals("Argb8888", ImageBitmapConfig.Argb8888.toString())
+        assertEquals("Alpha8", ImageBitmapConfig.Alpha8.toString())
+        assertEquals("Rgb565", ImageBitmapConfig.Rgb565.toString())
+        assertEquals("F16", ImageBitmapConfig.F16.toString())
+        assertEquals("Gpu", ImageBitmapConfig.Gpu.toString())
+    }
+}
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/PaintingStyleTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/PaintingStyleTest.kt
new file mode 100644
index 0000000..ef10975
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/PaintingStyleTest.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class PaintingStyleTest {
+
+    @Test
+    fun testToString() {
+        assertEquals("Fill", PaintingStyle.Fill.toString())
+        assertEquals("Stroke", PaintingStyle.Stroke.toString())
+    }
+}
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/PathFillTypeTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/PathFillTypeTest.kt
new file mode 100644
index 0000000..2e9b237
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/PathFillTypeTest.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class PathFillTypeTest {
+
+    @Test
+    fun testToString() {
+        assertEquals("EvenOdd", PathFillType.EvenOdd.toString())
+        assertEquals("NonZero", PathFillType.NonZero.toString())
+    }
+}
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/PathOperationTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/PathOperationTest.kt
new file mode 100644
index 0000000..2e658d8
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/PathOperationTest.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class PathOperationTest {
+
+    @Test
+    fun testToString() {
+        assertEquals("Intersect", PathOperation.Intersect.toString())
+        assertEquals("Difference", PathOperation.Difference.toString())
+        assertEquals("Union", PathOperation.Union.toString())
+        assertEquals("Xor", PathOperation.Xor.toString())
+        assertEquals("ReverseDifference", PathOperation.ReverseDifference.toString())
+    }
+}
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/PointModeTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/PointModeTest.kt
new file mode 100644
index 0000000..d566307
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/PointModeTest.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class PointModeTest {
+
+    @Test
+    fun testToString() {
+        assertEquals("Points", PointMode.Points.toString())
+        assertEquals("Lines", PointMode.Lines.toString())
+        assertEquals("Polygon", PointMode.Polygon.toString())
+    }
+}
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/RenderIntentTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/RenderIntentTest.kt
new file mode 100644
index 0000000..f0fb161
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/RenderIntentTest.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics
+
+import androidx.compose.ui.graphics.colorspace.RenderIntent
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class RenderIntentTest {
+
+    @Test
+    fun testToString() {
+        assertEquals("Absolute", RenderIntent.Absolute.toString())
+        assertEquals("Perceptual", RenderIntent.Perceptual.toString())
+        assertEquals("Relative", RenderIntent.Relative.toString())
+        assertEquals("Saturation", RenderIntent.Saturation.toString())
+    }
+}
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/StampedPathEffectStyleTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/StampedPathEffectStyleTest.kt
new file mode 100644
index 0000000..382b847
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/StampedPathEffectStyleTest.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class StampedPathEffectStyleTest {
+
+    @Test
+    fun testToString() {
+        assertEquals("Translate", StampedPathEffectStyle.Translate.toString())
+        assertEquals("Rotate", StampedPathEffectStyle.Rotate.toString())
+        assertEquals("Morph", StampedPathEffectStyle.Morph.toString())
+    }
+}
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/StrokeCapTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/StrokeCapTest.kt
new file mode 100644
index 0000000..a785a79
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/StrokeCapTest.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class StrokeCapTest {
+
+    @Test
+    fun testToString() {
+        assertEquals("Butt", StrokeCap.Butt.toString())
+        assertEquals("Round", StrokeCap.Round.toString())
+        assertEquals("Square", StrokeCap.Square.toString())
+    }
+}
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/StrokeJoinTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/StrokeJoinTest.kt
new file mode 100644
index 0000000..ad32a8b
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/StrokeJoinTest.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class StrokeJoinTest {
+
+    @Test
+    fun testToString() {
+        assertEquals("Miter", StrokeJoin.Miter.toString())
+        assertEquals("Round", StrokeJoin.Round.toString())
+        assertEquals("Bevel", StrokeJoin.Bevel.toString())
+    }
+}
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/TileModeTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/TileModeTest.kt
new file mode 100644
index 0000000..77dfbb1
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/TileModeTest.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class TileModeTest {
+
+    @Test
+    fun testToString() {
+        assertEquals("Clamp", TileMode.Clamp.toString())
+        assertEquals("Mirror", TileMode.Mirror.toString())
+        assertEquals("Repeated", TileMode.Repeated.toString())
+    }
+}
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/VertexModeTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/VertexModeTest.kt
new file mode 100644
index 0000000..da0b64c
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/VertexModeTest.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class VertexModeTest {
+
+    @Test
+    fun testToString() {
+        assertEquals("TriangleFan", VertexMode.TriangleFan.toString())
+        assertEquals("TriangleStrip", VertexMode.TriangleStrip.toString())
+        assertEquals("Triangles", VertexMode.Triangles.toString())
+    }
+}
diff --git a/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/colorspace/ColorModelTest.kt b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/colorspace/ColorModelTest.kt
new file mode 100644
index 0000000..8007918
--- /dev/null
+++ b/compose/ui/ui-graphics/src/test/java/androidx/compose/ui/graphics/colorspace/ColorModelTest.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.graphics.colorspace
+
+import androidx.compose.ui.util.packInts
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ColorModelTest {
+
+    @Test
+    fun testRgb() {
+        assertEquals(packInts(3, 0), ColorModel.Rgb.packedValue)
+        assertEquals("Rgb", ColorModel.Rgb.toString())
+        assertEquals(3, ColorModel.Rgb.componentCount)
+    }
+
+    @Test
+    fun testXyz() {
+        assertEquals(packInts(3, 1), ColorModel.Xyz.packedValue)
+        assertEquals("Xyz", ColorModel.Xyz.toString())
+        assertEquals(3, ColorModel.Xyz.componentCount)
+    }
+
+    @Test
+    fun testLab() {
+        assertEquals(packInts(3, 2), ColorModel.Lab.packedValue)
+        assertEquals("Lab", ColorModel.Lab.toString())
+        assertEquals(3, ColorModel.Lab.componentCount)
+    }
+
+    @Test
+    fun testCmyk() {
+        assertEquals(packInts(4, 3), ColorModel.Cmyk.packedValue)
+        assertEquals("Cmyk", ColorModel.Cmyk.toString())
+        assertEquals(4, ColorModel.Cmyk.componentCount)
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-inspection/src/androidTest/AndroidManifest.xml b/compose/ui/ui-inspection/src/androidTest/AndroidManifest.xml
index 58b8a25..bc217cf 100644
--- a/compose/ui/ui-inspection/src/androidTest/AndroidManifest.xml
+++ b/compose/ui/ui-inspection/src/androidTest/AndroidManifest.xml
@@ -19,6 +19,7 @@
         <activity android:name="androidx.compose.ui.inspection.testdata.AndroidViewTestActivity" />
         <activity android:name="androidx.compose.ui.inspection.testdata.DialogTestActivity" />
         <activity android:name="androidx.compose.ui.inspection.testdata.ParametersTestActivity" />
+        <activity android:name="androidx.compose.ui.inspection.testdata.RippleTestActivity" />
         <activity android:name="androidx.compose.ui.inspection.testdata.TestActivity"
             android:theme="@style/TestTheme"/>
     </application>
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ParametersTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ParametersTest.kt
index e1df7ee..69e6296 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ParametersTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/ParametersTest.kt
@@ -160,8 +160,13 @@
             .getParametersResponse
 
         val text = params.findUnmerged("Text")
+        assertThat(text.type).isEqualTo(Parameter.Type.ITERABLE)
         val strings = params.stringsList
-        checkStringParam(strings, text, "Text", "one", 0)
+        val first = text.elementsList[0]
+
+        assertThat(strings.toMap()[text.name]).isEqualTo("Text")
+        assertThat(strings.toMap()[first.int32Value]).isEqualTo("one")
+        assertThat(text.elementsList.size).isEqualTo(1)
     }
 
     @Test
@@ -176,7 +181,17 @@
 
         val text = params.findMerged("Text")
         val strings = params.stringsList
-        checkStringParam(strings, text, "Text", "three, four, five", 0)
+
+        assertThat(text.type).isEqualTo(Parameter.Type.ITERABLE)
+        val first = text.elementsList[0]
+        val second = text.elementsList[1]
+        val third = text.elementsList[2]
+
+        assertThat(strings.toMap()[text.name]).isEqualTo("Text")
+        assertThat(strings.toMap()[first.int32Value]).isEqualTo("three")
+        assertThat(strings.toMap()[second.int32Value]).isEqualTo("four")
+        assertThat(strings.toMap()[third.int32Value]).isEqualTo("five")
+        assertThat(text.elementsList.size).isEqualTo(3)
     }
 }
 
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/RippleTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/RippleTest.kt
new file mode 100644
index 0000000..34efc1c
--- /dev/null
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/RippleTest.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.inspection
+
+import android.view.ViewGroup
+import androidx.compose.ui.inspection.framework.getChildren
+import androidx.compose.ui.inspection.rules.ComposeInspectionRule
+import androidx.compose.ui.inspection.rules.sendCommand
+import androidx.compose.ui.inspection.testdata.RippleTestActivity
+import androidx.compose.ui.inspection.util.GetComposablesCommand
+import androidx.compose.ui.inspection.util.ThreadUtils
+import androidx.test.filters.LargeTest
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.runBlocking
+import org.junit.Rule
+import org.junit.Test
+
+@LargeTest
+class RippleTest {
+    @get:Rule
+    val rule = ComposeInspectionRule(RippleTestActivity::class)
+
+    @Test
+    fun rippleViewsAreMarked(): Unit = runBlocking {
+        val app = rule.inspectorTester.sendCommand(GetComposablesCommand(rule.rootId))
+            .getComposablesResponse
+        val composeViewChildren = ThreadUtils.runOnMainThread {
+            val composeView = rule.rootsForTest.single() as ViewGroup
+            composeView.getChildren().map { it.uniqueDrawingId }
+        }.get()
+        val toSkip = app.rootsList.single().viewsToSkipList
+        assertThat(composeViewChildren).containsExactlyElementsIn(toSkip)
+        assertThat(toSkip).hasSize(1)
+    }
+}
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTreeTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTreeTest.kt
index 7b14c00..edcae42 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTreeTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTreeTest.kt
@@ -442,20 +442,24 @@
             node(
                 name = "Text",
                 isRenderNode = true,
-                mergedSemantics = "Studio",
-                unmergedSemantics = "Studio"
+                mergedSemantics = "[Studio]",
+                unmergedSemantics = "[Studio]"
             )
-            node("Row", children = listOf("Text", "Text"), mergedSemantics = "Hello, World")
-            node("Text", isRenderNode = true, unmergedSemantics = "Hello")
-            node("Text", isRenderNode = true, unmergedSemantics = "World")
             node(
                 name = "Row",
                 children = listOf("Text", "Text"),
-                mergedSemantics = "to",
-                unmergedSemantics = "to"
+                mergedSemantics = "[Hello, World]"
             )
-            node("Text", isRenderNode = true, unmergedSemantics = "Hello")
-            node("Text", isRenderNode = true, unmergedSemantics = "World")
+            node("Text", isRenderNode = true, unmergedSemantics = "[Hello]")
+            node("Text", isRenderNode = true, unmergedSemantics = "[World]")
+            node(
+                name = "Row",
+                children = listOf("Text", "Text"),
+                mergedSemantics = "[to]",
+                unmergedSemantics = "[to]"
+            )
+            node("Text", isRenderNode = true, unmergedSemantics = "[Hello]")
+            node("Text", isRenderNode = true, unmergedSemantics = "[World]")
         }
     }
 
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/RippleTestActivity.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/RippleTestActivity.kt
new file mode 100644
index 0000000..04f415b
--- /dev/null
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/testdata/RippleTestActivity.kt
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.inspection.testdata
+
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.compose.foundation.LocalIndication
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.indication
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.requiredHeight
+import androidx.compose.material.Text
+import androidx.compose.material.ripple.rememberRipple
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+
+class RippleTestActivity : ComponentActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContent {
+            Column {
+                val interactionSource = remember { MutableInteractionSource() }
+                Text(
+                    text = "Click me with indication",
+                    modifier = Modifier
+                        .clickable(
+                            interactionSource = interactionSource,
+                            indication = rememberRipple()
+                        ) { /* do something */ }
+                        .padding(10.dp)
+                )
+                Spacer(Modifier.requiredHeight(10.dp))
+                Text(
+                    text = "I show indication with clicking on other Text composable",
+                    modifier = Modifier
+                        .indication(interactionSource, LocalIndication.current)
+                        .padding(10.dp)
+                )
+            }
+        }
+    }
+}
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/ComposeLayoutInspector.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/ComposeLayoutInspector.kt
index 1d02de5..6999d46 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/ComposeLayoutInspector.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/ComposeLayoutInspector.kt
@@ -74,6 +74,7 @@
         val rootView: View,
         val viewParent: View,
         val nodes: List<InspectorNode>,
+        val viewsToSkip: List<Long>
     ) {
         /** The cached nodes as a map from node id to InspectorNode */
         val lookup = nodes.flatMap { it.flatten() }.associateBy { it.id }
@@ -149,8 +150,11 @@
                 addAllStrings(stringTable.toStringEntries())
                 addRoots(
                     ComposableRoot.newBuilder().apply {
-                        viewId = data?.viewParent?.uniqueDrawingId ?: 0L
-                        addAllNodes(composeNodes)
+                        if (data != null) {
+                            viewId = data.viewParent.uniqueDrawingId
+                            addAllNodes(composeNodes)
+                            addAllViewsToSkip(data.viewsToSkip)
+                        }
                     }
                 )
             }.build()
@@ -281,7 +285,7 @@
         val data = ThreadUtils.runOnMainThread {
             layoutInspectorTree.resetAccumulativeState()
             val data = getAndroidComposeViews(rootViewId, skipSystemComposables, generation).map {
-                CacheData(it.rootView, it.viewParent, it.createNodes())
+                CacheData(it.rootView, it.viewParent, it.createNodes(), it.viewsToSkip)
             }
             layoutInspectorTree.resetAccumulativeState()
             data
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/AndroidComposeViewWrapper.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/AndroidComposeViewWrapper.kt
index 5b11b69..c6b88ce 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/AndroidComposeViewWrapper.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/compose/AndroidComposeViewWrapper.kt
@@ -18,7 +18,10 @@
 
 import android.content.res.Resources
 import android.view.View
+import android.view.ViewGroup
+import androidx.compose.ui.R
 import androidx.compose.ui.inspection.framework.ancestors
+import androidx.compose.ui.inspection.framework.getChildren
 import androidx.compose.ui.inspection.framework.isRoot
 import androidx.compose.ui.inspection.inspector.InspectorNode
 import androidx.compose.ui.inspection.inspector.LayoutInspectorTree
@@ -71,7 +74,7 @@
 class AndroidComposeViewWrapper(
     private val layoutInspectorTree: LayoutInspectorTree,
     val rootView: View,
-    private val composeView: View,
+    private val composeView: ViewGroup,
     skipSystemComposables: Boolean
 ) {
     companion object {
@@ -85,7 +88,7 @@
                 AndroidComposeViewWrapper(
                     layoutInspectorTree,
                     rootView,
-                    composeView,
+                    composeView as ViewGroup,
                     skipSystemComposables
                 )
             } else {
@@ -103,6 +106,11 @@
         if (!skipSystemComposables) composeView
         else composeView.ancestors().first { !it.isSystemView() || it.isRoot() }
 
+    val viewsToSkip: List<Long> =
+        composeView.getChildren()
+            .filter { it.getTag(R.id.hide_in_inspector_tag) != null }
+            .map { it.uniqueDrawingId }
+
     private val inspectorNodes = layoutInspectorTree.apply {
         this.hideSystemNodes = skipSystemComposables
     }.convert(composeView)
diff --git a/compose/ui/ui-inspection/src/main/proto/compose_layout_inspection.proto b/compose/ui/ui-inspection/src/main/proto/compose_layout_inspection.proto
index 2cc5b3f..cbad50f6 100644
--- a/compose/ui/ui-inspection/src/main/proto/compose_layout_inspection.proto
+++ b/compose/ui/ui-inspection/src/main/proto/compose_layout_inspection.proto
@@ -65,6 +65,8 @@
     int64 view_id = 1;
     // All composables owned by this view (usually just one but could be more)
     repeated ComposableNode nodes = 2;
+    // All views owned by this view that should be hidden
+    repeated int64 views_to_skip = 3;
 }
 
 message ComposableNode {
diff --git a/compose/ui/ui-test/api/1.0.0-beta08.txt b/compose/ui/ui-test/api/1.0.0-beta08.txt
index 6da262b..4559dc2 100644
--- a/compose/ui/ui-test/api/1.0.0-beta08.txt
+++ b/compose/ui/ui-test/api/1.0.0-beta08.txt
@@ -26,8 +26,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
@@ -44,8 +44,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
   }
 
@@ -74,7 +74,8 @@
     method public static androidx.compose.ui.test.SemanticsMatcher hasAnyDescendant(androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsMatcher hasAnySibling(androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsMatcher hasClickAction();
-    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String label, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescriptionExactly(java.lang.String... values);
     method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction-KlQnJC8(int actionType);
     method public static androidx.compose.ui.test.SemanticsMatcher hasNoClickAction();
     method public static androidx.compose.ui.test.SemanticsMatcher hasNoScrollAction();
@@ -85,6 +86,7 @@
     method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
     method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
     method public static androidx.compose.ui.test.SemanticsMatcher hasText(String text, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTextExactly(String![] textValues, optional boolean includeEditableText);
     method public static androidx.compose.ui.test.SemanticsMatcher isDialog();
     method public static androidx.compose.ui.test.SemanticsMatcher isEnabled();
     method public static androidx.compose.ui.test.SemanticsMatcher isFocusable();
diff --git a/compose/ui/ui-test/api/current.ignore b/compose/ui/ui-test/api/current.ignore
index b52e84d..de30817 100644
--- a/compose/ui/ui-test/api/current.ignore
+++ b/compose/ui/ui-test/api/current.ignore
@@ -1,3 +1,15 @@
 // Baseline format: 1.0
+ParameterNameChange: androidx.compose.ui.test.FiltersKt#hasContentDescription(String, boolean, boolean) parameter #0:
+    Attempted to change parameter name from label to value in method androidx.compose.ui.test.FiltersKt.hasContentDescription
+
+
+RemovedMethod: androidx.compose.ui.test.AssertionsKt#assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String, boolean):
+    Removed method androidx.compose.ui.test.AssertionsKt.assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction,String,boolean)
+RemovedMethod: androidx.compose.ui.test.AssertionsKt#assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String, boolean):
+    Removed method androidx.compose.ui.test.AssertionsKt.assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction,String,boolean)
+RemovedMethod: androidx.compose.ui.test.AssertionsKt#assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String, boolean):
+    Removed method androidx.compose.ui.test.AssertionsKt.assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction,String,boolean)
+RemovedMethod: androidx.compose.ui.test.AssertionsKt#assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String, boolean):
+    Removed method androidx.compose.ui.test.AssertionsKt.assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction,String,boolean)
 RemovedMethod: androidx.compose.ui.test.FiltersKt#hasImeAction(androidx.compose.ui.text.input.ImeAction):
     Removed method androidx.compose.ui.test.FiltersKt.hasImeAction(androidx.compose.ui.text.input.ImeAction)
diff --git a/compose/ui/ui-test/api/current.txt b/compose/ui/ui-test/api/current.txt
index 6da262b..4559dc2 100644
--- a/compose/ui/ui-test/api/current.txt
+++ b/compose/ui/ui-test/api/current.txt
@@ -26,8 +26,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
@@ -44,8 +44,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
   }
 
@@ -74,7 +74,8 @@
     method public static androidx.compose.ui.test.SemanticsMatcher hasAnyDescendant(androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsMatcher hasAnySibling(androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsMatcher hasClickAction();
-    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String label, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescriptionExactly(java.lang.String... values);
     method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction-KlQnJC8(int actionType);
     method public static androidx.compose.ui.test.SemanticsMatcher hasNoClickAction();
     method public static androidx.compose.ui.test.SemanticsMatcher hasNoScrollAction();
@@ -85,6 +86,7 @@
     method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
     method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
     method public static androidx.compose.ui.test.SemanticsMatcher hasText(String text, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTextExactly(String![] textValues, optional boolean includeEditableText);
     method public static androidx.compose.ui.test.SemanticsMatcher isDialog();
     method public static androidx.compose.ui.test.SemanticsMatcher isEnabled();
     method public static androidx.compose.ui.test.SemanticsMatcher isFocusable();
diff --git a/compose/ui/ui-test/api/public_plus_experimental_1.0.0-beta08.txt b/compose/ui/ui-test/api/public_plus_experimental_1.0.0-beta08.txt
index 9bdce2b..ba65508 100644
--- a/compose/ui/ui-test/api/public_plus_experimental_1.0.0-beta08.txt
+++ b/compose/ui/ui-test/api/public_plus_experimental_1.0.0-beta08.txt
@@ -28,8 +28,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
@@ -46,8 +46,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
   }
 
@@ -79,7 +79,8 @@
     method public static androidx.compose.ui.test.SemanticsMatcher hasAnyDescendant(androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsMatcher hasAnySibling(androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsMatcher hasClickAction();
-    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String label, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescriptionExactly(java.lang.String... values);
     method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction-KlQnJC8(int actionType);
     method public static androidx.compose.ui.test.SemanticsMatcher hasNoClickAction();
     method public static androidx.compose.ui.test.SemanticsMatcher hasNoScrollAction();
@@ -92,6 +93,7 @@
     method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
     method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
     method public static androidx.compose.ui.test.SemanticsMatcher hasText(String text, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTextExactly(String![] textValues, optional boolean includeEditableText);
     method public static androidx.compose.ui.test.SemanticsMatcher isDialog();
     method public static androidx.compose.ui.test.SemanticsMatcher isEnabled();
     method public static androidx.compose.ui.test.SemanticsMatcher isFocusable();
diff --git a/compose/ui/ui-test/api/public_plus_experimental_current.txt b/compose/ui/ui-test/api/public_plus_experimental_current.txt
index 9bdce2b..ba65508 100644
--- a/compose/ui/ui-test/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-test/api/public_plus_experimental_current.txt
@@ -28,8 +28,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
@@ -46,8 +46,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
   }
 
@@ -79,7 +79,8 @@
     method public static androidx.compose.ui.test.SemanticsMatcher hasAnyDescendant(androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsMatcher hasAnySibling(androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsMatcher hasClickAction();
-    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String label, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescriptionExactly(java.lang.String... values);
     method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction-KlQnJC8(int actionType);
     method public static androidx.compose.ui.test.SemanticsMatcher hasNoClickAction();
     method public static androidx.compose.ui.test.SemanticsMatcher hasNoScrollAction();
@@ -92,6 +93,7 @@
     method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
     method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
     method public static androidx.compose.ui.test.SemanticsMatcher hasText(String text, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTextExactly(String![] textValues, optional boolean includeEditableText);
     method public static androidx.compose.ui.test.SemanticsMatcher isDialog();
     method public static androidx.compose.ui.test.SemanticsMatcher isEnabled();
     method public static androidx.compose.ui.test.SemanticsMatcher isFocusable();
diff --git a/compose/ui/ui-test/api/restricted_1.0.0-beta08.txt b/compose/ui/ui-test/api/restricted_1.0.0-beta08.txt
index 6da262b..4559dc2 100644
--- a/compose/ui/ui-test/api/restricted_1.0.0-beta08.txt
+++ b/compose/ui/ui-test/api/restricted_1.0.0-beta08.txt
@@ -26,8 +26,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
@@ -44,8 +44,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
   }
 
@@ -74,7 +74,8 @@
     method public static androidx.compose.ui.test.SemanticsMatcher hasAnyDescendant(androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsMatcher hasAnySibling(androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsMatcher hasClickAction();
-    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String label, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescriptionExactly(java.lang.String... values);
     method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction-KlQnJC8(int actionType);
     method public static androidx.compose.ui.test.SemanticsMatcher hasNoClickAction();
     method public static androidx.compose.ui.test.SemanticsMatcher hasNoScrollAction();
@@ -85,6 +86,7 @@
     method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
     method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
     method public static androidx.compose.ui.test.SemanticsMatcher hasText(String text, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTextExactly(String![] textValues, optional boolean includeEditableText);
     method public static androidx.compose.ui.test.SemanticsMatcher isDialog();
     method public static androidx.compose.ui.test.SemanticsMatcher isEnabled();
     method public static androidx.compose.ui.test.SemanticsMatcher isFocusable();
diff --git a/compose/ui/ui-test/api/restricted_current.ignore b/compose/ui/ui-test/api/restricted_current.ignore
index b52e84d..de30817 100644
--- a/compose/ui/ui-test/api/restricted_current.ignore
+++ b/compose/ui/ui-test/api/restricted_current.ignore
@@ -1,3 +1,15 @@
 // Baseline format: 1.0
+ParameterNameChange: androidx.compose.ui.test.FiltersKt#hasContentDescription(String, boolean, boolean) parameter #0:
+    Attempted to change parameter name from label to value in method androidx.compose.ui.test.FiltersKt.hasContentDescription
+
+
+RemovedMethod: androidx.compose.ui.test.AssertionsKt#assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String, boolean):
+    Removed method androidx.compose.ui.test.AssertionsKt.assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction,String,boolean)
+RemovedMethod: androidx.compose.ui.test.AssertionsKt#assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String, boolean):
+    Removed method androidx.compose.ui.test.AssertionsKt.assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction,String,boolean)
+RemovedMethod: androidx.compose.ui.test.AssertionsKt#assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String, boolean):
+    Removed method androidx.compose.ui.test.AssertionsKt.assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction,String,boolean)
+RemovedMethod: androidx.compose.ui.test.AssertionsKt#assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String, boolean):
+    Removed method androidx.compose.ui.test.AssertionsKt.assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction,String,boolean)
 RemovedMethod: androidx.compose.ui.test.FiltersKt#hasImeAction(androidx.compose.ui.text.input.ImeAction):
     Removed method androidx.compose.ui.test.FiltersKt.hasImeAction(androidx.compose.ui.text.input.ImeAction)
diff --git a/compose/ui/ui-test/api/restricted_current.txt b/compose/ui/ui-test/api/restricted_current.txt
index 6da262b..4559dc2 100644
--- a/compose/ui/ui-test/api/restricted_current.txt
+++ b/compose/ui/ui-test/api/restricted_current.txt
@@ -26,8 +26,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
     method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
@@ -44,8 +44,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
-    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
   }
 
@@ -74,7 +74,8 @@
     method public static androidx.compose.ui.test.SemanticsMatcher hasAnyDescendant(androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsMatcher hasAnySibling(androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static androidx.compose.ui.test.SemanticsMatcher hasClickAction();
-    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String label, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescriptionExactly(java.lang.String... values);
     method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction-KlQnJC8(int actionType);
     method public static androidx.compose.ui.test.SemanticsMatcher hasNoClickAction();
     method public static androidx.compose.ui.test.SemanticsMatcher hasNoScrollAction();
@@ -85,6 +86,7 @@
     method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
     method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
     method public static androidx.compose.ui.test.SemanticsMatcher hasText(String text, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTextExactly(String![] textValues, optional boolean includeEditableText);
     method public static androidx.compose.ui.test.SemanticsMatcher isDialog();
     method public static androidx.compose.ui.test.SemanticsMatcher isEnabled();
     method public static androidx.compose.ui.test.SemanticsMatcher isFocusable();
diff --git a/compose/ui/ui-test/lint-baseline.xml b/compose/ui/ui-test/lint-baseline.xml
index 98da96f..42a176b 100644
--- a/compose/ui/ui-test/lint-baseline.xml
+++ b/compose/ui/ui-test/lint-baseline.xml
@@ -1,26 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.compose.ui.test.android.WindowCapture_androidKt is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            decorView.viewTreeObserver.registerFrameCommitCallback {"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/test/android/WindowCapture.android.kt"
-            line="64"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.compose.ui.test.android.WindowCapture_androidKt is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="    PixelCopy.request(windowToCapture, captureRectInWindow, destBitmap, onCopyFinished, handler)"
-        errorLine2="              ~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/test/android/WindowCapture.android.kt"
-            line="100"
-            column="15"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
 </issues>
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/AssertsTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/AssertsTest.kt
index 2e8ee2b..7ac558d 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/AssertsTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/AssertsTest.kt
@@ -20,14 +20,12 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.semantics.SemanticsPropertyReceiver
-import androidx.compose.ui.semantics.editableText
 import androidx.compose.ui.semantics.selected
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.semantics.testTag
 import androidx.compose.ui.semantics.toggleableState
 import androidx.compose.ui.state.ToggleableState
 import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.text.AnnotatedString
 import org.junit.Rule
 import org.junit.Test
 
@@ -156,56 +154,6 @@
             .assertIsNotSelected()
     }
 
-    @Test
-    fun assertTextFieldText_isOk() {
-        rule.setContent {
-            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
-        }
-
-        rule.onNodeWithTag("test")
-            .assertTextEquals("Hello World")
-    }
-
-    @Test(expected = AssertionError::class)
-    fun assertTextFieldText_fails() {
-        rule.setContent {
-            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
-        }
-
-        rule.onNodeWithTag("test")
-            .assertTextEquals("Hello")
-    }
-
-    @Test
-    fun assertTextFieldText_substring_isOk() {
-        rule.setContent {
-            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
-        }
-
-        rule.onNodeWithTag("test")
-            .assertTextContains("Hello")
-    }
-
-    @Test(expected = AssertionError::class)
-    fun assertTextFieldText_substring_fails() {
-        rule.setContent {
-            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
-        }
-
-        rule.onNodeWithTag("test")
-            .assertTextContains("hello")
-    }
-
-    @Test
-    fun assertTextFieldText_substring_ignoreCase_isOk() {
-        rule.setContent {
-            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
-        }
-
-        rule.onNodeWithTag("test")
-            .assertTextContains("hello", ignoreCase = true)
-    }
-
     @Composable
     fun BoundaryNode(props: (SemanticsPropertyReceiver.() -> Unit)) {
         Column(Modifier.semantics(properties = props)) {}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/ErrorMessagesTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/ErrorMessagesTest.kt
index ba63e9f..587ba21 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/ErrorMessagesTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/ErrorMessagesTest.kt
@@ -115,7 +115,7 @@
         expectErrorMessageStartsWith(
             """
                 Failed to perform a gesture.
-                Reason: Expected exactly '1' node but found '2' nodes that satisfy: (Text = 'Toggle' (ignoreCase: false))
+                Reason: Expected exactly '1' node but found '2' nodes that satisfy: (Text + EditableText contains 'Toggle' (ignoreCase: false))
                 Nodes found:
                 1) Node #X at (l=X, t=X, r=X, b=X)px, Tag: 'MyButton'
             """.trimIndent()
@@ -170,7 +170,7 @@
         expectErrorMessageStartsWith(
             """
                 Failed to assert count of nodes.
-                Reason: Expected '3' nodes but found '2' nodes that satisfy: (Text = 'Toggle' (ignoreCase: false))
+                Reason: Expected '3' nodes but found '2' nodes that satisfy: (Text + EditableText contains 'Toggle' (ignoreCase: false))
                 Nodes found:
                 1) Node #X at (l=X, t=X, r=X, b=X)px
             """.trimIndent()
@@ -189,7 +189,7 @@
         expectErrorMessage(
             """
                 Failed to assert count of nodes.
-                Reason: Expected '3' nodes but could not find any node that satisfies: (Text = 'Toggle2' (ignoreCase: false))
+                Reason: Expected '3' nodes but could not find any node that satisfies: (Text + EditableText contains 'Toggle2' (ignoreCase: false))
             """.trimIndent()
         ) {
             rule.onAllNodesWithText("Toggle2")
@@ -214,10 +214,10 @@
                 Failed to perform a gesture.
                 The node is no longer in the tree, last known semantics:
                 Node #X at (l=X, t=X, r=X, b=X)px
-                Text = 'Hello'
+                Text = '[Hello]'
                 Actions = [GetTextLayoutResult]
                 Has 1 sibling
-                Original selector: Text = 'Hello' (ignoreCase: false)
+                Original selector: Text + EditableText contains 'Hello' (ignoreCase: false)
             """.trimIndent()
         ) {
             node.performClick()
@@ -242,10 +242,10 @@
                 Failed: assertExists.
                 The node is no longer in the tree, last known semantics:
                 Node #X at (l=X, t=X, r=X, b=X)px
-                Text = 'Hello'
+                Text = '[Hello]'
                 Actions = [GetTextLayoutResult]
                 Has 1 sibling
-                Original selector: Text = 'Hello' (ignoreCase: false)
+                Original selector: Text + EditableText contains 'Hello' (ignoreCase: false)
             """.trimIndent()
         ) {
             node.assertExists()
@@ -270,10 +270,10 @@
                 Failed to assert the following: (OnClick is defined)
                 The node is no longer in the tree, last known semantics:
                 Node #X at (l=X, t=X, r=X, b=X)px
-                Text = 'Hello'
+                Text = '[Hello]'
                 Actions = [GetTextLayoutResult]
                 Has 1 sibling
-                Original selector: Text = 'Hello' (ignoreCase: false)
+                Original selector: Text + EditableText contains 'Hello' (ignoreCase: false)
             """.trimIndent()
         ) {
             node.assertHasClickAction()
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/FindersTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/FindersTest.kt
index f49d562..8999ba5 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/FindersTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/FindersTest.kt
@@ -16,7 +16,9 @@
 
 package androidx.compose.ui.test
 
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
+import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.semantics.SemanticsPropertyReceiver
@@ -86,6 +88,21 @@
         rule.onNodeWithText("Hello World").assertExists()
     }
 
+    @Test
+    fun findByText_merged_matches() {
+        rule.setContent {
+            Box(Modifier.semantics(mergeDescendants = true) { }) {
+                Text("Hello")
+                Text("World")
+            }
+        }
+
+        rule.onNodeWithText("Hello").assertExists()
+        rule.onNodeWithText("World").assertExists()
+        rule.onAllNodesWithText("Hello").assertCountEquals(1)
+        rule.onAllNodesWithText("World").assertCountEquals(1)
+    }
+
     @Test(expected = AssertionError::class)
     fun findByText_fails() {
         rule.setContent {
@@ -96,6 +113,18 @@
         rule.onNodeWithText("World").assertExists()
     }
 
+    @Test(expected = AssertionError::class)
+    fun findByText_merged_fails() {
+        rule.setContent {
+            Box(Modifier.semantics(mergeDescendants = true) { }) {
+                Text("Hello")
+                Text("World")
+            }
+        }
+
+        rule.onNodeWithText("Hello, World").assertExists()
+    }
+
     @Test
     fun findBySubstring_matches() {
         rule.setContent {
@@ -106,6 +135,19 @@
     }
 
     @Test
+    fun findBySubstring_merged_matches() {
+        rule.setContent {
+            Box(Modifier.semantics(mergeDescendants = true) { }) {
+                Text("Hello")
+                Text("World")
+            }
+        }
+
+        rule.onNodeWithText("Wo", substring = true).assertExists()
+        rule.onNodeWithText("He", substring = true).assertExists()
+    }
+
+    @Test
     fun findBySubstring_ignoreCase_matches() {
         rule.setContent {
             BoundaryNode { text = AnnotatedString("Hello World") }
@@ -148,6 +190,21 @@
         rule.onNodeWithContentDescription("Hello World").assertExists()
     }
 
+    @Test
+    fun findByContentDescription_merged_matches() {
+        rule.setContent {
+            Box(Modifier.semantics(mergeDescendants = true) { }) {
+                Box(Modifier.semantics { contentDescription = "Hello" })
+                Box(Modifier.semantics { contentDescription = "World" })
+            }
+        }
+
+        rule.onNodeWithContentDescription("Hello").assertExists()
+        rule.onNodeWithContentDescription("World").assertExists()
+        rule.onAllNodesWithContentDescription("Hello").assertCountEquals(1)
+        rule.onAllNodesWithContentDescription("World").assertCountEquals(1)
+    }
+
     @Test(expected = AssertionError::class)
     fun findByContentDescription_fails() {
         rule.setContent {
@@ -157,6 +214,18 @@
         rule.onNodeWithContentDescription("Hello").assertExists()
     }
 
+    @Test(expected = AssertionError::class)
+    fun findByContentDescription_merged_fails() {
+        rule.setContent {
+            Box(Modifier.semantics(mergeDescendants = true) { }) {
+                Box(Modifier.semantics { contentDescription = "Hello" })
+                Box(Modifier.semantics { contentDescription = "World" })
+            }
+        }
+
+        rule.onNodeWithText("Hello, World").assertExists()
+    }
+
     @Test
     fun findByContentDescription_substring_matches() {
         rule.setContent {
@@ -166,6 +235,19 @@
         rule.onNodeWithContentDescription("World", substring = true).assertExists()
     }
 
+    @Test
+    fun findByContentDescription_merged_substring_matches() {
+        rule.setContent {
+            Box(Modifier.semantics(mergeDescendants = true) { }) {
+                Box(Modifier.semantics { contentDescription = "Hello" })
+                Box(Modifier.semantics { contentDescription = "World" })
+            }
+        }
+
+        rule.onNodeWithContentDescription("Wo", substring = true).assertExists()
+        rule.onNodeWithContentDescription("He", substring = true).assertExists()
+    }
+
     fun findByContentDescription_substring_noResult() {
         rule.setContent {
             BoundaryNode { contentDescription = "Hello World" }
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/PrintToStringTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/PrintToStringTest.kt
index 3d7c59b..79b46da 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/PrintToStringTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/PrintToStringTest.kt
@@ -23,6 +23,7 @@
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.semantics.contentDescription
 import androidx.compose.ui.semantics.disabled
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.semantics.testTag
@@ -71,7 +72,7 @@
             """
                 Printing with useUnmergedTree = 'false'
                 Node #X at (l=X, t=X, r=X, b=X)px
-                Text = 'Hello'
+                Text = '[Hello]'
                 Actions = [GetTextLayoutResult]
                 Has 1 sibling
             """.trimIndent()
@@ -92,11 +93,11 @@
             """
                 Printing with useUnmergedTree = 'false'
                 1) Node #X at (l=X, t=X, r=X, b=X)px
-                Text = 'Hello'
+                Text = '[Hello]'
                 Actions = [GetTextLayoutResult]
                 Has 1 sibling
                 2) Node #X at (l=X, t=X, r=X, b=X)px
-                Text = 'World'
+                Text = '[World]'
                 Actions = [GetTextLayoutResult]
                 Has 1 sibling
             """.trimIndent()
@@ -129,11 +130,11 @@
                     | [Disabled]
                     |  |-Node #X at (l=X, t=X, r=X, b=X)px
                     |    Role = 'Button'
-                    |    Text = 'Button'
+                    |    Text = '[Button]'
                     |    Actions = [OnClick, GetTextLayoutResult]
                     |    MergeDescendants = 'true'
                     |-Node #X at (l=X, t=X, r=X, b=X)px
-                      Text = 'Hello'
+                      Text = '[Hello]'
                       Actions = [GetTextLayoutResult]
             """.trimIndent()
         )
@@ -171,6 +172,107 @@
         )
     }
 
+    @Test
+    fun printMergedContentDescriptions() {
+        rule.setContent {
+            Box(Modifier.semantics(mergeDescendants = true) { }) {
+                Box(Modifier.semantics { contentDescription = "first" })
+                Box(Modifier.semantics { contentDescription = "second" })
+            }
+        }
+
+        val result = rule.onRoot()
+            .onChild()
+            .printToString()
+
+        assertThat(obfuscateNodesInfo(result)).isEqualTo(
+            """
+                Printing with useUnmergedTree = 'false'
+                Node #X at (l=X, t=X, r=X, b=X)px
+                ContentDescription = '[first, second]'
+                MergeDescendants = 'true'
+            """.trimIndent()
+        )
+    }
+
+    @Test
+    fun printUnmergedContentDescriptions() {
+        rule.setContent {
+            Box(Modifier.semantics(mergeDescendants = true) { }) {
+                Box(Modifier.semantics { contentDescription = "first" })
+                Box(Modifier.semantics { contentDescription = "second" })
+            }
+        }
+
+        val result = rule.onRoot(useUnmergedTree = true)
+            .onChild()
+            .printToString()
+
+        assertThat(obfuscateNodesInfo(result)).isEqualTo(
+            """
+                Printing with useUnmergedTree = 'true'
+                Node #X at (l=X, t=X, r=X, b=X)px
+                MergeDescendants = 'true'
+                 |-Node #X at (l=X, t=X, r=X, b=X)px
+                 | ContentDescription = '[first]'
+                 |-Node #X at (l=X, t=X, r=X, b=X)px
+                   ContentDescription = '[second]'
+            """.trimIndent()
+        )
+    }
+
+    @Test
+    fun printMergedText() {
+        rule.setContent {
+            Box(Modifier.semantics(mergeDescendants = true) { }) {
+                Text("first")
+                Text("second")
+            }
+        }
+
+        val result = rule.onRoot()
+            .onChild()
+            .printToString()
+
+        assertThat(obfuscateNodesInfo(result)).isEqualTo(
+            """
+                Printing with useUnmergedTree = 'false'
+                Node #X at (l=X, t=X, r=X, b=X)px
+                Text = '[first, second]'
+                Actions = [GetTextLayoutResult]
+                MergeDescendants = 'true'
+            """.trimIndent()
+        )
+    }
+
+    @Test
+    fun printUnmergedText() {
+        rule.setContent {
+            Box(Modifier.semantics(mergeDescendants = true) { }) {
+                Text("first")
+                Text("second")
+            }
+        }
+
+        val result = rule.onRoot(useUnmergedTree = true)
+            .onChild()
+            .printToString()
+
+        assertThat(obfuscateNodesInfo(result)).isEqualTo(
+            """
+                Printing with useUnmergedTree = 'true'
+                Node #X at (l=X, t=X, r=X, b=X)px
+                MergeDescendants = 'true'
+                 |-Node #X at (l=X, t=X, r=X, b=X)px
+                 | Text = '[first]'
+                 | Actions = [GetTextLayoutResult]
+                 |-Node #X at (l=X, t=X, r=X, b=X)px
+                   Text = '[second]'
+                   Actions = [GetTextLayoutResult]
+            """.trimIndent()
+        )
+    }
+
     @Composable
     fun ComposeSimpleCase() {
         MaterialTheme {
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/assertions/AssertContentDescription.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/assertions/AssertContentDescription.kt
new file mode 100644
index 0000000..3076fa0
--- /dev/null
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/assertions/AssertContentDescription.kt
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.test.assertions
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.semantics.testTag
+import androidx.compose.ui.test.assertContentDescriptionContains
+import androidx.compose.ui.test.assertContentDescriptionEquals
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.test.filters.MediumTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class AssertContentDescription {
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun equals() {
+        rule.setContent {
+            TestContent()
+        }
+        rule.onNodeWithTag("test")
+            .assertContentDescriptionEquals("Hello", "World")
+        rule.onNodeWithTag("test")
+            .assertContentDescriptionEquals("World", "Hello")
+    }
+
+    @Test
+    fun equals_empty() {
+        rule.setContent {
+            Box(Modifier.semantics { testTag = "test" })
+        }
+        rule.onNodeWithTag("test")
+            .assertContentDescriptionEquals()
+    }
+
+    @Test
+    fun contains() {
+        rule.setContent {
+            TestContent()
+        }
+        rule.onNodeWithTag("test")
+            .assertContentDescriptionContains("Hello")
+        rule.onNodeWithTag("test")
+            .assertContentDescriptionContains("World")
+    }
+
+    @Test
+    fun contains_substring() {
+        rule.setContent {
+            TestContent()
+        }
+        rule.onNodeWithTag("test")
+            .assertContentDescriptionContains("He", substring = true)
+        rule.onNodeWithTag("test")
+            .assertContentDescriptionContains("Wo", substring = true)
+    }
+
+    @Test(expected = AssertionError::class)
+    fun equals_fails_notEnoughElements() {
+        rule.setContent {
+            TestContent()
+        }
+        rule.onNodeWithTag("test")
+            .assertContentDescriptionEquals("Hello")
+    }
+
+    @Test(expected = AssertionError::class)
+    fun equals_fails_tooManyElements() {
+        rule.setContent {
+            TestContent()
+        }
+        rule.onNodeWithTag("test")
+            .assertContentDescriptionEquals("Hello", "World", "More")
+    }
+
+    @Composable
+    fun TestContent() {
+        Box(Modifier.semantics(mergeDescendants = true) { testTag = "test" }) {
+            Box(Modifier.semantics { contentDescription = "Hello" })
+            Box(Modifier.semantics { contentDescription = "World" })
+        }
+    }
+}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/assertions/AssertText.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/assertions/AssertText.kt
new file mode 100644
index 0000000..01ee757
--- /dev/null
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/assertions/AssertText.kt
@@ -0,0 +1,188 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.test.assertions
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.material.Text
+import androidx.compose.material.TextField
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.semantics.SemanticsPropertyReceiver
+import androidx.compose.ui.semantics.editableText
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.semantics.testTag
+import androidx.compose.ui.test.assertTextContains
+import androidx.compose.ui.test.assertTextEquals
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.text.AnnotatedString
+import androidx.test.filters.MediumTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class AssertText {
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun equals() {
+        rule.setContent {
+            TestContent()
+        }
+        rule.onNodeWithTag("test")
+            .assertTextEquals("Hello", "World")
+        rule.onNodeWithTag("test")
+            .assertTextEquals("World", "Hello")
+    }
+
+    @Test
+    fun equals_empty() {
+        rule.setContent {
+            Box(Modifier.semantics { testTag = "test" })
+        }
+        rule.onNodeWithTag("test")
+            .assertTextEquals()
+        rule.onNodeWithTag("test")
+            .assertTextEquals(includeEditableText = false)
+    }
+
+    @Test
+    fun contains() {
+        rule.setContent {
+            TestContent()
+        }
+        rule.onNodeWithTag("test")
+            .assertTextContains("Hello")
+        rule.onNodeWithTag("test")
+            .assertTextContains("World")
+    }
+
+    @Test
+    fun contains_substring() {
+        rule.setContent {
+            TestContent()
+        }
+        rule.onNodeWithTag("test")
+            .assertTextContains("He", substring = true)
+        rule.onNodeWithTag("test")
+            .assertTextContains("Wo", substring = true)
+    }
+
+    @Test(expected = AssertionError::class)
+    fun equals_fails_notEnoughElements() {
+        rule.setContent {
+            TestContent()
+        }
+        rule.onNodeWithTag("test")
+            .assertTextEquals("Hello")
+    }
+
+    @Test(expected = AssertionError::class)
+    fun equals_fails_tooManyElements() {
+        rule.setContent {
+            TestContent()
+        }
+        rule.onNodeWithTag("test")
+            .assertTextEquals("Hello", "World", "More")
+    }
+
+    @Test(expected = AssertionError::class)
+    fun textAndEditText() {
+        rule.setContent {
+            Box(Modifier.semantics(mergeDescendants = true) { testTag = "test" }) {
+                Text("Hello")
+                Text("World")
+                TextField("TextField", onValueChange = {})
+            }
+        }
+        rule.onNodeWithTag("test")
+            .assertTextEquals("Hello", "World", "TextField")
+        rule.onNodeWithTag("test")
+            .assertTextEquals("Hello", "World", includeEditableText = false)
+        rule.onNodeWithTag("test")
+            .assertTextContains("TextField")
+    }
+
+    @Test
+    fun assertTextFieldText_isOk() {
+        rule.setContent {
+            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
+        }
+
+        rule.onNodeWithTag("test")
+            .assertTextEquals("Hello World")
+    }
+
+    @Test(expected = AssertionError::class)
+    fun assertTextFieldText_fails() {
+        rule.setContent {
+            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
+        }
+
+        rule.onNodeWithTag("test")
+            .assertTextEquals("Hello")
+    }
+
+    @Test
+    fun assertTextFieldText_substring_isOk() {
+        rule.setContent {
+            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
+        }
+
+        rule.onNodeWithTag("test")
+            .assertTextContains("Hello", substring = true)
+    }
+
+    @Test(expected = AssertionError::class)
+    fun assertTextFieldText_substring_fails() {
+        rule.setContent {
+            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
+        }
+
+        rule.onNodeWithTag("test")
+            .assertTextContains("hello")
+    }
+
+    @Test
+    fun assertTextFieldText_substring_ignoreCase_isOk() {
+        rule.setContent {
+            BoundaryNode { testTag = "test"; editableText = AnnotatedString("Hello World") }
+        }
+
+        rule.onNodeWithTag("test")
+            .assertTextContains("hello", ignoreCase = true, substring = true)
+    }
+
+    @Composable
+    fun TestContent() {
+        Box(Modifier.semantics(mergeDescendants = true) { testTag = "test" }) {
+            Text("Hello")
+            Text("World")
+        }
+    }
+
+    @Composable
+    fun BoundaryNode(props: (SemanticsPropertyReceiver.() -> Unit)) {
+        Column(Modifier.semantics(properties = props)) {}
+    }
+}
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Assertions.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Assertions.kt
index 971485c..6c9e153 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Assertions.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Assertions.kt
@@ -129,64 +129,89 @@
     assert(isNotFocused())
 
 /**
- * Asserts that the node's content description equals the given [value].
+ * Asserts that the node's content description contains exactly the given [values] and nothing else.
  *
- * Throws [AssertionError] if the node's value is not equal to `value`, or if the node has no value
+ * Note that in merged semantics tree there can be a list of content descriptions that got merged
+ * from the child nodes. Typically an accessibility tooling will decide based on its heuristics
+ * which ones to announce.
  *
- * @param ignoreCase Whether case should be ignored.
+ * Throws [AssertionError] if the node's descriptions don't contain all items from [values], or
+ * if the descriptions contain extra items that are not in [values].
+ *
+ * @param values List of values to match (the order does not matter)
  * @see SemanticsProperties.ContentDescription
  */
 fun SemanticsNodeInteraction.assertContentDescriptionEquals(
-    value: String,
-    ignoreCase: Boolean = false
-): SemanticsNodeInteraction = assert(hasContentDescription(value, ignoreCase = ignoreCase))
+    vararg values: String
+): SemanticsNodeInteraction = assert(hasContentDescriptionExactly(*values))
 
 /**
- * Asserts that the node's content description contains the given [value] as a substring.
+ * Asserts that the node's content description contains the given [value].
+ *
+ * Note that in merged semantics tree there can be a list of content descriptions that got merged
+ * from the child nodes. Typically an accessibility tooling will decide based on its heuristics
+ * which ones to announce.
  *
  * Throws [AssertionError] if the node's value does not contain `value`, or if the node has no value
  *
+ * @param value Value to match as one of the items in the list of content descriptions.
+ * @param substring Whether this can be satisfied as a substring match of an item in the list of
+ * descriptions.
  * @param ignoreCase Whether case should be ignored.
  * @see SemanticsProperties.ContentDescription
  */
 fun SemanticsNodeInteraction.assertContentDescriptionContains(
     value: String,
+    substring: Boolean = false,
     ignoreCase: Boolean = false
 ): SemanticsNodeInteraction =
-    assert(hasContentDescription(value, substring = true, ignoreCase = ignoreCase))
+    assert(hasContentDescription(value, substring = substring, ignoreCase = ignoreCase))
 
 /**
- * Asserts that the node's text equals the given [value].
+ * Asserts that the node's text contains exactly the given [values] and nothing else.
  *
- * If the node is a text field, it will compare input text and other texts that the text field
- * might have, for example label or placeholder.
+ * This will also search in [SemanticsProperties.EditableText] by default.
  *
- * Throws [AssertionError] if the node's value is not equal to `value`, or if the node has no value
+ * Note that in merged semantics tree there can be a list of text items that got merged from
+ * the child nodes. Typically an accessibility tooling will decide based on its heuristics which
+ * ones to use.
  *
- * @param ignoreCase Whether case should be ignored.
- * @see SemanticsProperties.Text
+ * Throws [AssertionError] if the node's text values don't contain all items from [values], or
+ * if the text values contain extra items that are not in [values].
+ *
+ * @param values List of values to match (the order does not matter)
+ * @param includeEditableText Whether to also assert against the editable text.
+ * @see SemanticsProperties.ContentDescription
  */
 fun SemanticsNodeInteraction.assertTextEquals(
-    value: String,
-    ignoreCase: Boolean = false
+    vararg values: String,
+    includeEditableText: Boolean = true
 ): SemanticsNodeInteraction =
-    assert(hasText(value, ignoreCase = ignoreCase))
+    assert(hasTextExactly(*values, includeEditableText = includeEditableText))
 
 /**
- * Asserts that the node's text contains the given [value] as a substring.
+ * Asserts that the node's text contains the given [value].
  *
- * If the node is a text field, it will compare input text and other texts that the text field
- * might have, for example label or placeholder.
-
+ * This will also search in [SemanticsProperties.EditableText].
+ *
+ * Note that in merged semantics tree there can be a list of text items that got merged from
+ * the child nodes. Typically an accessibility tooling will decide based on its heuristics which
+ * ones to use.
+ *
  * Throws [AssertionError] if the node's value does not contain `value`, or if the node has no value
  *
+ * @param value Value to match as one of the items in the list of text values.
+ * @param substring Whether this can be satisfied as a substring match of an item in the list of
+ * text.
  * @param ignoreCase Whether case should be ignored.
  * @see SemanticsProperties.Text
  */
 fun SemanticsNodeInteraction.assertTextContains(
     value: String,
+    substring: Boolean = false,
     ignoreCase: Boolean = false
-): SemanticsNodeInteraction = assert(hasText(value, substring = true, ignoreCase = ignoreCase))
+): SemanticsNodeInteraction =
+    assert(hasText(value, substring = substring, ignoreCase = ignoreCase))
 
 /**
  * Asserts the node's value equals the given value.
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt
index 7a83f37..4ba3ea8 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt
@@ -156,43 +156,78 @@
     SemanticsMatcher.keyNotDefined(SemanticsActions.ScrollBy)
 
 /**
- * Returns whether the node's label matches exactly to the given text.
+ * Returns whether the node's content description contains the given [value].
  *
- * @param label Text to match.
+ * Note that in merged semantics tree there can be a list of content descriptions that got merged
+ * from the child nodes. Typically an accessibility tooling will decide based on its heuristics
+ * which ones to announce.
+ *
+ * @param value Value to match as one of the items in the list of content descriptions.
  * @param substring Whether to use substring matching.
  * @param ignoreCase Whether case should be ignored.
  *
  * @see SemanticsProperties.ContentDescription
  */
 fun hasContentDescription(
-    label: String,
+    value: String,
     substring: Boolean = false,
     ignoreCase: Boolean = false
 ): SemanticsMatcher {
     return if (substring) {
         SemanticsMatcher(
-            "${SemanticsProperties.ContentDescription.name} contains '$label' " +
+            "${SemanticsProperties.ContentDescription.name} contains '$value' " +
                 "(ignoreCase: $ignoreCase)"
         ) {
-            it.config.getOrNull(SemanticsProperties.ContentDescription)?.contains(label, ignoreCase)
-                ?: false
+            it.config.getOrNull(SemanticsProperties.ContentDescription)
+                ?.any { item -> item.contains(value, ignoreCase) } ?: false
         }
     } else {
         SemanticsMatcher(
-            "${SemanticsProperties.ContentDescription.name} = '$label' (ignoreCase: $ignoreCase)"
+            "${SemanticsProperties.ContentDescription.name} = '$value' (ignoreCase: $ignoreCase)"
         ) {
-            it.config.getOrNull(SemanticsProperties.ContentDescription).equals(label, ignoreCase)
+            it.config.getOrNull(SemanticsProperties.ContentDescription)
+                ?.any { item -> item.equals(value, ignoreCase) } ?: false
         }
     }
 }
 
 /**
- * Returns whether the node's text matches exactly to the given text.
+ * Returns whether the node's content description contains exactly the given [values] and nothing
+ * else.
  *
- * In case of text field it will compare the given [text] with the input text and other texts like
- * label or placeholder.
+ * Note that in merged semantics tree there can be a list of content descriptions that got merged
+ * from the child nodes. Typically an accessibility tooling will decide based on its heuristics
+ * which ones to announce.
  *
- * @param text Text to match.
+ * @param values List of values to match (the order does not matter)
+ *
+ * @see SemanticsProperties.ContentDescription
+ */
+fun hasContentDescriptionExactly(
+    vararg values: String
+): SemanticsMatcher {
+    val expected = values.toList()
+    return SemanticsMatcher(
+        "${SemanticsProperties.ContentDescription.name} = " +
+            "[${values.joinToString(",")}]"
+    ) { node ->
+        node.config.getOrNull(SemanticsProperties.ContentDescription)
+            ?.let { given ->
+                given.containsAll(expected) && expected.containsAll(given)
+            } ?: values.isEmpty()
+    }
+}
+
+/**
+ * Returns whether the node's text contains the given [text].
+ *
+ * This will also search in [SemanticsProperties.EditableText].
+ *
+ * Note that in merged semantics tree there can be a list of text items that got merged from
+ * the child nodes. Typically an accessibility tooling will decide based on its heuristics which
+ * ones to use.
+ *
+ * @param text Value to match as one of the items in the list of text values.
  * @param substring Whether to use substring matching.
  * @param ignoreCase Whether case should be ignored.
  *
@@ -204,26 +239,71 @@
     substring: Boolean = false,
     ignoreCase: Boolean = false
 ): SemanticsMatcher {
+    val propertyName = "${SemanticsProperties.Text.name} + ${SemanticsProperties.EditableText.name}"
     return if (substring) {
         SemanticsMatcher(
-            "${SemanticsProperties.Text.name} contains '$text' (ignoreCase: $ignoreCase)"
+            "$propertyName contains '$text' (ignoreCase: $ignoreCase) as substring"
         ) {
-            val editableTextValue = it.config.getOrNull(SemanticsProperties.EditableText)?.text
-            val textValue = it.config.getOrNull(SemanticsProperties.Text)?.text
-            (editableTextValue?.contains(text, ignoreCase) == true) or
-                (textValue?.contains(text, ignoreCase) == true)
+            val isInEditableTextValue = it.config.getOrNull(SemanticsProperties.EditableText)
+                ?.text?.contains(text, ignoreCase) ?: false
+            val isInTextValue = it.config.getOrNull(SemanticsProperties.Text)
+                ?.any { item -> item.text.contains(text, ignoreCase) } ?: false
+            isInEditableTextValue || isInTextValue
         }
     } else {
         SemanticsMatcher(
-            "${SemanticsProperties.Text.name} = '$text' (ignoreCase: $ignoreCase)"
+            "$propertyName contains '$text' (ignoreCase: $ignoreCase)"
         ) {
-            it.config.getOrNull(SemanticsProperties.EditableText)?.text.equals(text, ignoreCase) or
-                it.config.getOrNull(SemanticsProperties.Text)?.text.equals(text, ignoreCase)
+            val isInEditableTextValue = it.config.getOrNull(SemanticsProperties.EditableText)
+                ?.text?.equals(text, ignoreCase) ?: false
+            val isInTextValue = it.config.getOrNull(SemanticsProperties.Text)
+                ?.any { item -> item.text.equals(text, ignoreCase) } ?: false
+            isInEditableTextValue || isInTextValue
         }
     }
 }
 
 /**
+ * Returns whether the node's text contains exactly the given [values] and nothing else.
+ *
+ * This will also search in [SemanticsProperties.EditableText] by default.
+ *
+ * Note that in merged semantics tree there can be a list of text items that got merged from
+ * the child nodes. Typically an accessibility tooling will decide based on its heuristics which
+ * ones to use.
+ *
+ * @param textValues List of values to match (the order does not matter)
+ * @param includeEditableText Whether to also assert against the editable text.
+ *
+ * @see SemanticsProperties.Text
+ * @see SemanticsProperties.EditableText
+ */
+fun hasTextExactly(
+    vararg textValues: String,
+    includeEditableText: Boolean = true
+): SemanticsMatcher {
+    val expected = textValues.toList()
+    val given = mutableListOf<String>()
+    val propertyName = if (includeEditableText) {
+        "${SemanticsProperties.Text.name} + ${SemanticsProperties.EditableText.name}"
+    } else {
+        SemanticsProperties.Text.name
+    }
+    return SemanticsMatcher(
+        "$propertyName = [${textValues.joinToString(",")}]"
+    ) { node ->
+        given.clear()
+        if (includeEditableText) {
+            node.config.getOrNull(SemanticsProperties.EditableText)
+                ?.let { given.add(it.text) }
+        }
+        node.config.getOrNull(SemanticsProperties.Text)
+            ?.let { given.addAll(it.map { anStr -> anStr.text }) }
+        given.containsAll(expected) && expected.containsAll(given)
+    }
+}
+
+/**
  * Returns whether the node's value matches exactly to the given accessibility value.
  *
  * @param value Value to match.
diff --git a/compose/ui/ui-text/api/1.0.0-beta08.txt b/compose/ui/ui-text/api/1.0.0-beta08.txt
index ee4cd82..d0abc49 100644
--- a/compose/ui/ui-text/api/1.0.0-beta08.txt
+++ b/compose/ui/ui-text/api/1.0.0-beta08.txt
@@ -77,7 +77,7 @@
   public final class JvmAnnotatedString_jvmKt {
   }
 
-  public final class JvmCharHelpers_jvmKt {
+  public final class JvmCharHelpers_androidKt {
   }
 
   public final class MultiParagraph {
diff --git a/compose/ui/ui-text/api/current.ignore b/compose/ui/ui-text/api/current.ignore
index 9b440ea..5bb1213 100644
--- a/compose/ui/ui-text/api/current.ignore
+++ b/compose/ui/ui-text/api/current.ignore
@@ -15,6 +15,10 @@
     Attempted to remove @NonNull annotation from Field ImeOptions.keyboardType
 
 
+RemovedClass: androidx.compose.ui.text.JvmCharHelpers_jvmKt:
+    Removed class androidx.compose.ui.text.JvmCharHelpers_jvmKt
+
+
 RemovedDeprecatedMethod: androidx.compose.ui.text.input.InputEventCallback#onImeAction(androidx.compose.ui.text.input.ImeAction):
     Removed deprecated method androidx.compose.ui.text.input.InputEventCallback.onImeAction(androidx.compose.ui.text.input.ImeAction)
 
diff --git a/compose/ui/ui-text/api/current.txt b/compose/ui/ui-text/api/current.txt
index ee4cd82..d0abc49 100644
--- a/compose/ui/ui-text/api/current.txt
+++ b/compose/ui/ui-text/api/current.txt
@@ -77,7 +77,7 @@
   public final class JvmAnnotatedString_jvmKt {
   }
 
-  public final class JvmCharHelpers_jvmKt {
+  public final class JvmCharHelpers_androidKt {
   }
 
   public final class MultiParagraph {
diff --git a/compose/ui/ui-text/api/public_plus_experimental_1.0.0-beta08.txt b/compose/ui/ui-text/api/public_plus_experimental_1.0.0-beta08.txt
index 8bc2de0..2f0a4c8 100644
--- a/compose/ui/ui-text/api/public_plus_experimental_1.0.0-beta08.txt
+++ b/compose/ui/ui-text/api/public_plus_experimental_1.0.0-beta08.txt
@@ -86,7 +86,7 @@
   public final class JvmAnnotatedString_jvmKt {
   }
 
-  public final class JvmCharHelpers_jvmKt {
+  public final class JvmCharHelpers_androidKt {
   }
 
   public final class MultiParagraph {
diff --git a/compose/ui/ui-text/api/public_plus_experimental_current.txt b/compose/ui/ui-text/api/public_plus_experimental_current.txt
index 8bc2de0..2f0a4c8 100644
--- a/compose/ui/ui-text/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-text/api/public_plus_experimental_current.txt
@@ -86,7 +86,7 @@
   public final class JvmAnnotatedString_jvmKt {
   }
 
-  public final class JvmCharHelpers_jvmKt {
+  public final class JvmCharHelpers_androidKt {
   }
 
   public final class MultiParagraph {
diff --git a/compose/ui/ui-text/api/restricted_1.0.0-beta08.txt b/compose/ui/ui-text/api/restricted_1.0.0-beta08.txt
index ee4cd82..d0abc49 100644
--- a/compose/ui/ui-text/api/restricted_1.0.0-beta08.txt
+++ b/compose/ui/ui-text/api/restricted_1.0.0-beta08.txt
@@ -77,7 +77,7 @@
   public final class JvmAnnotatedString_jvmKt {
   }
 
-  public final class JvmCharHelpers_jvmKt {
+  public final class JvmCharHelpers_androidKt {
   }
 
   public final class MultiParagraph {
diff --git a/compose/ui/ui-text/api/restricted_current.ignore b/compose/ui/ui-text/api/restricted_current.ignore
index 9b440ea..5bb1213 100644
--- a/compose/ui/ui-text/api/restricted_current.ignore
+++ b/compose/ui/ui-text/api/restricted_current.ignore
@@ -15,6 +15,10 @@
     Attempted to remove @NonNull annotation from Field ImeOptions.keyboardType
 
 
+RemovedClass: androidx.compose.ui.text.JvmCharHelpers_jvmKt:
+    Removed class androidx.compose.ui.text.JvmCharHelpers_jvmKt
+
+
 RemovedDeprecatedMethod: androidx.compose.ui.text.input.InputEventCallback#onImeAction(androidx.compose.ui.text.input.ImeAction):
     Removed deprecated method androidx.compose.ui.text.input.InputEventCallback.onImeAction(androidx.compose.ui.text.input.ImeAction)
 
diff --git a/compose/ui/ui-text/api/restricted_current.txt b/compose/ui/ui-text/api/restricted_current.txt
index ee4cd82..d0abc49 100644
--- a/compose/ui/ui-text/api/restricted_current.txt
+++ b/compose/ui/ui-text/api/restricted_current.txt
@@ -77,7 +77,7 @@
   public final class JvmAnnotatedString_jvmKt {
   }
 
-  public final class JvmCharHelpers_jvmKt {
+  public final class JvmCharHelpers_androidKt {
   }
 
   public final class MultiParagraph {
diff --git a/compose/ui/ui-text/benchmark/lint-baseline.xml b/compose/ui/ui-text/benchmark/lint-baseline.xml
index 079ca1b..42a176b 100644
--- a/compose/ui/ui-text/benchmark/lint-baseline.xml
+++ b/compose/ui/ui-text/benchmark/lint-baseline.xml
@@ -1,74 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt`. Referenced from `com.sun.jna.Native.AWT`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna/5.5.0/jna-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.datatransfer`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.dnd`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.event`. Referenced from `com.sun.jna.platform.WindowUtils.NativeWindowUtils.1`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.geom`. Referenced from `com.sun.jna.platform.WindowUtils.NativeWindowUtils`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.awt.image`. Referenced from `com.sun.jna.platform.RasterRangesUtils`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `javax.swing.text`. Referenced from `com.sun.jna.platform.dnd.DragHandler`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `javax.swing`. Referenced from `com.sun.jna.platform.WindowUtils.MacWindowUtils`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/net/java/dev/jna/jna-platform/5.5.0/jna-platform-5.5.0.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.lang.instrument`. Referenced from `kotlinx.coroutines.repackaged.net.bytebuddy.agent.ByteBuddyAgent`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.4.3/kotlinx-coroutines-debug-1.4.3.jar"/>
-    </issue>
-
-    <issue
-        id="InvalidPackage"
-        message="Invalid package reference in library; not included in Android: `java.lang.management`. Referenced from `kotlinx.coroutines.repackaged.net.bytebuddy.agent.ByteBuddyAgent.ProcessProvider.ForCurrentVm.ForLegacyVm`.">
-        <location
-            file="../../../../../../prebuilts/androidx/external/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.4.3/kotlinx-coroutines-debug-1.4.3.jar"/>
-    </issue>
-
 </issues>
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
index 92925fc..a18abd7 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
@@ -166,7 +166,7 @@
                 Rect(0f, fontSizeInPx * 2, fontSizeInPx, fontSizeInPx * 3)
             )
 
-            val diff = Path.combine(PathOperation.difference, expectedPath, actualPath).getBounds()
+            val diff = Path.combine(PathOperation.Difference, expectedPath, actualPath).getBounds()
             assertThat(diff).isEqualTo(Rect.Zero)
         }
     }
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt
index 587a9cc..904c195 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt
@@ -3496,7 +3496,7 @@
             // Select "ab"
             val actualPath = paragraph.getPathForRange(0, 2)
 
-            val diff = Path.combine(PathOperation.difference, expectedPath, actualPath).getBounds()
+            val diff = Path.combine(PathOperation.Difference, expectedPath, actualPath).getBounds()
             assertThat(diff).isEqualTo(Rect.Zero)
         }
     }
@@ -3540,7 +3540,7 @@
             // Select "bc\nab"
             val actualPath = paragraph.getPathForRange(1, 6)
 
-            val diff = Path.combine(PathOperation.difference, expectedPath, actualPath).getBounds()
+            val diff = Path.combine(PathOperation.Difference, expectedPath, actualPath).getBounds()
             assertThat(diff).isEqualTo(Rect.Zero)
         }
     }
@@ -3587,7 +3587,7 @@
             val actualPath =
                 paragraph.getPathForRange(selectionLTRStart, textLTR.length + selectionRTLEnd)
 
-            val diff = Path.combine(PathOperation.difference, expectedPath, actualPath).getBounds()
+            val diff = Path.combine(PathOperation.Difference, expectedPath, actualPath).getBounds()
             assertThat(diff).isEqualTo(Rect.Zero)
         }
     }
@@ -3645,7 +3645,7 @@
             // Try to select "\uDD1E\uD834\uDD1F", only "\uD834\uDD1F" is selected.
             val actualPath = paragraph.getPathForRange(1, text.length)
 
-            val diff = Path.combine(PathOperation.difference, expectedPath, actualPath).getBounds()
+            val diff = Path.combine(PathOperation.Difference, expectedPath, actualPath).getBounds()
             assertThat(diff).isEqualTo(Rect.Zero)
         }
     }
@@ -3671,7 +3671,7 @@
             // Try to select "\uDD1E\uD834", actually "\uD834\uDD1F" is selected.
             val actualPath = paragraph.getPathForRange(1, text.length - 1)
 
-            val diff = Path.combine(PathOperation.difference, expectedPath, actualPath).getBounds()
+            val diff = Path.combine(PathOperation.Difference, expectedPath, actualPath).getBounds()
             assertThat(diff).isEqualTo(Rect.Zero)
         }
     }
@@ -3697,7 +3697,7 @@
             // Try to select "\uDD1E", get vertical line segment after this character.
             val actualPath = paragraph.getPathForRange(1, 2)
 
-            val diff = Path.combine(PathOperation.difference, expectedPath, actualPath).getBounds()
+            val diff = Path.combine(PathOperation.Difference, expectedPath, actualPath).getBounds()
             assertThat(diff).isEqualTo(Rect.Zero)
         }
     }
@@ -3731,7 +3731,7 @@
             // Select "\u1F603\u1F604"
             val actualPath = paragraph.getPathForRange(1, text.length - 1)
 
-            val diff = Path.combine(PathOperation.difference, expectedPath, actualPath).getBounds()
+            val diff = Path.combine(PathOperation.Difference, expectedPath, actualPath).getBounds()
             assertThat(diff).isEqualTo(Rect.Zero)
         }
     }
@@ -3758,7 +3758,7 @@
             val actualPath = paragraph.getPathForRange(0, 1)
 
             assertThat(lineLeft).isEqualTo(lineRight)
-            val diff = Path.combine(PathOperation.difference, expectedPath, actualPath).getBounds()
+            val diff = Path.combine(PathOperation.Difference, expectedPath, actualPath).getBounds()
             assertThat(diff).isEqualTo(Rect.Zero)
         }
     }
@@ -3785,7 +3785,7 @@
             val actualPath = paragraph.getPathForRange(0, 1)
 
             assertThat(lineLeft).isEqualTo(lineRight)
-            val diff = Path.combine(PathOperation.difference, expectedPath, actualPath).getBounds()
+            val diff = Path.combine(PathOperation.Difference, expectedPath, actualPath).getBounds()
             assertThat(diff).isEqualTo(Rect.Zero)
         }
     }
diff --git a/compose/ui/ui-text/src/jvmMain/kotlin/androidx/compose/ui/text/JvmCharHelpers.jvm.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/JvmCharHelpers.android.kt
similarity index 100%
rename from compose/ui/ui-text/src/jvmMain/kotlin/androidx/compose/ui/text/JvmCharHelpers.jvm.kt
rename to compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/JvmCharHelpers.android.kt
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/JvmCharHelpers.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/JvmCharHelpers.desktop.kt
new file mode 100644
index 0000000..71dcbc2e
--- /dev/null
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/JvmCharHelpers.desktop.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.compose.ui.text
+
+import org.jetbrains.skija.BreakIterator
+
+internal actual fun String.findPrecedingBreak(index: Int): Int {
+    val it = BreakIterator.makeCharacterInstance()
+    it.setText(this)
+    return it.preceding(index)
+}
+
+internal actual fun String.findFollowingBreak(index: Int): Int {
+    val it = BreakIterator.makeCharacterInstance()
+    it.setText(this)
+    return it.following(index)
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/TestUtils.kt b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/TestUtils.kt
index 3f0df87..e283426 100644
--- a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/TestUtils.kt
+++ b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/TestUtils.kt
@@ -16,9 +16,7 @@
 
 package androidx.compose.ui.text
 
-import java.util.Locale
-
-private val os = System.getProperty("os.name").toLowerCase(Locale.US)
+private val os = System.getProperty("os.name").lowercase()
 internal val isLinux = os.startsWith("linux")
 internal val isWindows = os.startsWith("win")
 internal val isMacOs = os.startsWith("mac")
\ No newline at end of file
diff --git a/compose/ui/ui-tooling/lint-baseline.xml b/compose/ui/ui-tooling/lint-baseline.xml
index 6b9fc7f..42a176b 100644
--- a/compose/ui/ui-tooling/lint-baseline.xml
+++ b/compose/ui/ui-tooling/lint-baseline.xml
@@ -1,26 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling Method.invoke without an SDK check"
-        errorLine1="    return invoke(instance, *arguments)"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/tooling/preview/PreviewUtils.kt"
-            line="141"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.compose.ui.tooling.preview.LayoutlibFontResourceLoader is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            is ResourceFont -> context.resources.getFont(font.resId)"
-        errorLine2="                                                 ~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/tooling/preview/LayoutlibFontResourceLoader.kt"
-            line="33"
-            column="50"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
 </issues>
diff --git a/compose/ui/ui/api/1.0.0-beta08.txt b/compose/ui/ui/api/1.0.0-beta08.txt
index 5b85842..ef6a13d 100644
--- a/compose/ui/ui/api/1.0.0-beta08.txt
+++ b/compose/ui/ui/api/1.0.0-beta08.txt
@@ -281,7 +281,8 @@
   }
 
   public final class FocusModifierKt {
-    method public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
   }
 
   public final class FocusNodeUtilsKt {
@@ -460,7 +461,7 @@
     method public float getDefaultWidth-D9Ej5fM();
     method public String getName();
     method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
-    method public androidx.compose.ui.graphics.BlendMode getTintBlendMode();
+    method public int getTintBlendMode-0nO6VwU();
     method public long getTintColor-0d7_KjU();
     method public float getViewportHeight();
     method public float getViewportWidth();
@@ -468,7 +469,7 @@
     property public final float defaultWidth;
     property public final String name;
     property public final androidx.compose.ui.graphics.vector.VectorGroup root;
-    property public final androidx.compose.ui.graphics.BlendMode tintBlendMode;
+    property public final int tintBlendMode;
     property public final long tintColor;
     property public final float viewportHeight;
     property public final float viewportWidth;
@@ -477,7 +478,7 @@
 
   public static final class ImageVector.Builder {
     method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
-    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional androidx.compose.ui.graphics.PathFillType pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath-MBUPpgE(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
     method public androidx.compose.ui.graphics.vector.ImageVector build();
     method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
   }
@@ -487,7 +488,7 @@
 
   public final class ImageVectorKt {
     method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
-    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional androidx.compose.ui.graphics.PathFillType pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path-XZu8tSg(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
   }
 
   public abstract sealed class VNode {
@@ -506,7 +507,7 @@
 
   public final class VectorComposeKt {
     method @androidx.compose.runtime.Composable public static void Group(optional String name, optional float rotation, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional androidx.compose.ui.graphics.PathFillType pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method @androidx.compose.runtime.Composable public static void Path-MBUPpgE(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
   }
 
   @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
@@ -537,10 +538,10 @@
   public final class VectorKt {
     method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
-    method public static androidx.compose.ui.graphics.PathFillType getDefaultFillType();
-    method public static androidx.compose.ui.graphics.StrokeCap getDefaultStrokeLineCap();
-    method public static androidx.compose.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
-    method public static androidx.compose.ui.graphics.BlendMode getDefaultTintBlendMode();
+    method public static int getDefaultFillType();
+    method public static int getDefaultStrokeLineCap();
+    method public static int getDefaultStrokeLineJoin();
+    method public static int getDefaultTintBlendMode();
     method public static long getDefaultTintColor();
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
     field public static final String DefaultGroupName = "";
@@ -570,7 +571,7 @@
 
   public final class VectorPainterKt {
     method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
-    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional androidx.compose.ui.graphics.BlendMode tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
     field public static final String RootGroupName = "VectorRootGroup";
   }
 
@@ -579,11 +580,11 @@
     method public float getFillAlpha();
     method public String getName();
     method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
-    method public androidx.compose.ui.graphics.PathFillType getPathFillType();
+    method public int getPathFillType-Rg-k1Os();
     method public androidx.compose.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeLineCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeLineJoin();
+    method public int getStrokeLineCap-KaPHkGw();
+    method public int getStrokeLineJoin-LxFBmk8();
     method public float getStrokeLineMiter();
     method public float getStrokeLineWidth();
     method public float getTrimPathEnd();
@@ -593,11 +594,11 @@
     property public final float fillAlpha;
     property public final String name;
     property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
-    property public final androidx.compose.ui.graphics.PathFillType pathFillType;
+    property public final int pathFillType;
     property public final androidx.compose.ui.graphics.Brush? stroke;
     property public final float strokeAlpha;
-    property public final androidx.compose.ui.graphics.StrokeCap strokeLineCap;
-    property public final androidx.compose.ui.graphics.StrokeJoin strokeLineJoin;
+    property public final int strokeLineCap;
+    property public final int strokeLineJoin;
     property public final float strokeLineMiter;
     property public final float strokeLineWidth;
     property public final float trimPathEnd;
@@ -1382,7 +1383,7 @@
   }
 
   @androidx.compose.runtime.Immutable public final class PointerInputChange {
-    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional androidx.compose.ui.input.pointer.PointerType type);
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
     method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
     method public long getId-J3iCeTQ();
     method public long getPosition-F1C5BW0();
@@ -1390,7 +1391,7 @@
     method public long getPreviousPosition-F1C5BW0();
     method public boolean getPreviousPressed();
     method public long getPreviousUptimeMillis();
-    method public androidx.compose.ui.input.pointer.PointerType getType();
+    method public int getType-T8wyACA();
     method public long getUptimeMillis();
     property public final androidx.compose.ui.input.pointer.ConsumedData consumed;
     property public final long id;
@@ -1399,7 +1400,7 @@
     property public final long previousPosition;
     property public final boolean previousPressed;
     property public final long previousUptimeMillis;
-    property public final androidx.compose.ui.input.pointer.PointerType type;
+    property public final int type;
     property public final long uptimeMillis;
   }
 
@@ -1437,12 +1438,28 @@
   public final class PointerInteropUtils_androidKt {
   }
 
-  public enum PointerType {
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Eraser;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Mouse;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Stylus;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Touch;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Unknown;
+  public final inline class PointerType {
+    ctor public PointerType();
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.input.pointer.PointerType.Companion Companion;
+  }
+
+  public static final class PointerType.Companion {
+    method public int getEraser-T8wyACA();
+    method public int getMouse-T8wyACA();
+    method public int getStylus-T8wyACA();
+    method public int getTouch-T8wyACA();
+    method public int getUnknown-T8wyACA();
+    property public final int Eraser;
+    property public final int Mouse;
+    property public final int Stylus;
+    property public final int Touch;
+    property public final int Unknown;
   }
 
   public final class RequestDisallowInterceptTouchEvent implements kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> {
@@ -2351,7 +2368,7 @@
   public final class SemanticsProperties {
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
-    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
@@ -2372,13 +2389,13 @@
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
-    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
-    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
@@ -2399,7 +2416,7 @@
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
-    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
@@ -2447,7 +2464,7 @@
     method public static void selectableGroup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static void setCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionInfo p);
     method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
-    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String value);
     method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
     method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
     method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
@@ -2462,7 +2479,7 @@
     method public static void setSelection(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Boolean,java.lang.Boolean>? action);
     method public static void setStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
     method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
-    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString value);
     method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
     method public static void setTextSelectionRange-Hy0MoUY(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long p);
     method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState p);
@@ -2558,13 +2575,17 @@
   }
 
   @androidx.compose.runtime.Immutable public final class PopupProperties {
-    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
+    method public boolean getClippingEnabled();
     method public boolean getDismissOnBackPress();
     method public boolean getDismissOnClickOutside();
+    method public boolean getExcludeFromSystemGesture();
     method public boolean getFocusable();
     method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property public final boolean clippingEnabled;
     property public final boolean dismissOnBackPress;
     property public final boolean dismissOnClickOutside;
+    property public final boolean excludeFromSystemGesture;
     property public final boolean focusable;
     property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
   }
diff --git a/compose/ui/ui/api/current.ignore b/compose/ui/ui/api/current.ignore
index b392991..f30e81b 100644
--- a/compose/ui/ui/api/current.ignore
+++ b/compose/ui/ui/api/current.ignore
@@ -11,14 +11,54 @@
     Class androidx.compose.ui.focus.FocusState changed class/interface declaration
 
 
+ChangedSuperclass: androidx.compose.ui.input.pointer.PointerType:
+    Class androidx.compose.ui.input.pointer.PointerType superclass changed from java.lang.Enum to java.lang.Object
+
+
+ChangedType: androidx.compose.ui.graphics.vector.VectorKt#getDefaultFillType():
+    Method androidx.compose.ui.graphics.vector.VectorKt.getDefaultFillType has changed return type from androidx.compose.ui.graphics.PathFillType to int
+ChangedType: androidx.compose.ui.graphics.vector.VectorKt#getDefaultStrokeLineCap():
+    Method androidx.compose.ui.graphics.vector.VectorKt.getDefaultStrokeLineCap has changed return type from androidx.compose.ui.graphics.StrokeCap to int
+ChangedType: androidx.compose.ui.graphics.vector.VectorKt#getDefaultStrokeLineJoin():
+    Method androidx.compose.ui.graphics.vector.VectorKt.getDefaultStrokeLineJoin has changed return type from androidx.compose.ui.graphics.StrokeJoin to int
+ChangedType: androidx.compose.ui.graphics.vector.VectorKt#getDefaultTintBlendMode():
+    Method androidx.compose.ui.graphics.vector.VectorKt.getDefaultTintBlendMode has changed return type from androidx.compose.ui.graphics.BlendMode to int
+ChangedType: androidx.compose.ui.semantics.SemanticsProperties#getContentDescription():
+    Method androidx.compose.ui.semantics.SemanticsProperties.getContentDescription has changed return type from androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> to androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>>
+ChangedType: androidx.compose.ui.semantics.SemanticsProperties#getText():
+    Method androidx.compose.ui.semantics.SemanticsProperties.getText has changed return type from androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> to androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>>
 ChangedType: androidx.compose.ui.semantics.SemanticsPropertiesKt#getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver):
     Method androidx.compose.ui.semantics.SemanticsPropertiesKt.getImeAction has changed return type from androidx.compose.ui.text.input.ImeAction to int
 
 
+InvalidNullConversion: Field ImageVector.tintBlendMode:
+    Attempted to remove @NonNull annotation from Field ImageVector.tintBlendMode
+InvalidNullConversion: Field PointerInputChange.type:
+    Attempted to remove @NonNull annotation from Field PointerInputChange.type
+InvalidNullConversion: Field VectorPath.pathFillType:
+    Attempted to remove @NonNull annotation from Field VectorPath.pathFillType
+InvalidNullConversion: Field VectorPath.strokeLineCap:
+    Attempted to remove @NonNull annotation from Field VectorPath.strokeLineCap
+InvalidNullConversion: Field VectorPath.strokeLineJoin:
+    Attempted to remove @NonNull annotation from Field VectorPath.strokeLineJoin
+InvalidNullConversion: androidx.compose.ui.graphics.vector.VectorKt#getDefaultFillType():
+    Attempted to remove @NonNull annotation from method androidx.compose.ui.graphics.vector.VectorKt.getDefaultFillType()
+InvalidNullConversion: androidx.compose.ui.graphics.vector.VectorKt#getDefaultStrokeLineCap():
+    Attempted to remove @NonNull annotation from method androidx.compose.ui.graphics.vector.VectorKt.getDefaultStrokeLineCap()
+InvalidNullConversion: androidx.compose.ui.graphics.vector.VectorKt#getDefaultStrokeLineJoin():
+    Attempted to remove @NonNull annotation from method androidx.compose.ui.graphics.vector.VectorKt.getDefaultStrokeLineJoin()
+InvalidNullConversion: androidx.compose.ui.graphics.vector.VectorKt#getDefaultTintBlendMode():
+    Attempted to remove @NonNull annotation from method androidx.compose.ui.graphics.vector.VectorKt.getDefaultTintBlendMode()
 InvalidNullConversion: androidx.compose.ui.semantics.SemanticsPropertiesKt#getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver):
     Attempted to remove @NonNull annotation from method androidx.compose.ui.semantics.SemanticsPropertiesKt.getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver)
 
 
+ParameterNameChange: androidx.compose.ui.semantics.SemanticsPropertiesKt#setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String) parameter #1:
+    Attempted to change parameter name from p to value in method androidx.compose.ui.semantics.SemanticsPropertiesKt.setContentDescription
+ParameterNameChange: androidx.compose.ui.semantics.SemanticsPropertiesKt#setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString) parameter #1:
+    Attempted to change parameter name from p to value in method androidx.compose.ui.semantics.SemanticsPropertiesKt.setText
+
+
 RemovedClass: androidx.compose.ui.focus.FocusStateKt:
     Removed class androidx.compose.ui.focus.FocusStateKt
 RemovedClass: androidx.compose.ui.platform.ComposeView_androidKt:
@@ -35,7 +75,39 @@
     Removed enum constant androidx.compose.ui.focus.FocusState.Disabled
 RemovedField: androidx.compose.ui.focus.FocusState#Inactive:
     Removed enum constant androidx.compose.ui.focus.FocusState.Inactive
+RemovedField: androidx.compose.ui.input.pointer.PointerType#Eraser:
+    Removed enum constant androidx.compose.ui.input.pointer.PointerType.Eraser
+RemovedField: androidx.compose.ui.input.pointer.PointerType#Mouse:
+    Removed enum constant androidx.compose.ui.input.pointer.PointerType.Mouse
+RemovedField: androidx.compose.ui.input.pointer.PointerType#Stylus:
+    Removed enum constant androidx.compose.ui.input.pointer.PointerType.Stylus
+RemovedField: androidx.compose.ui.input.pointer.PointerType#Touch:
+    Removed enum constant androidx.compose.ui.input.pointer.PointerType.Touch
+RemovedField: androidx.compose.ui.input.pointer.PointerType#Unknown:
+    Removed enum constant androidx.compose.ui.input.pointer.PointerType.Unknown
 
 
+RemovedMethod: androidx.compose.ui.graphics.vector.ImageVector#getTintBlendMode():
+    Removed method androidx.compose.ui.graphics.vector.ImageVector.getTintBlendMode()
+RemovedMethod: androidx.compose.ui.graphics.vector.ImageVector.Builder#addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>, androidx.compose.ui.graphics.PathFillType, String, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.Brush, float, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.StrokeJoin, float, float, float, float):
+    Removed method androidx.compose.ui.graphics.vector.ImageVector.Builder.addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>,androidx.compose.ui.graphics.PathFillType,String,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.Brush,float,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.StrokeJoin,float,float,float,float)
+RemovedMethod: androidx.compose.ui.graphics.vector.ImageVectorKt#path(androidx.compose.ui.graphics.vector.ImageVector.Builder, String, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.Brush, float, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.StrokeJoin, float, androidx.compose.ui.graphics.PathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit>):
+    Removed method androidx.compose.ui.graphics.vector.ImageVectorKt.path(androidx.compose.ui.graphics.vector.ImageVector.Builder,String,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.Brush,float,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.StrokeJoin,float,androidx.compose.ui.graphics.PathFillType,kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit>)
+RemovedMethod: androidx.compose.ui.graphics.vector.VectorComposeKt#Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>, androidx.compose.ui.graphics.PathFillType, String, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.Brush, float, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.StrokeJoin, float, float, float, float):
+    Removed method androidx.compose.ui.graphics.vector.VectorComposeKt.Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>,androidx.compose.ui.graphics.PathFillType,String,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.Brush,float,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.StrokeJoin,float,float,float,float)
+RemovedMethod: androidx.compose.ui.graphics.vector.VectorPainterKt#rememberVectorPainter-u_AqRoo(float, float, float, float, String, long, androidx.compose.ui.graphics.BlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit>):
+    Removed method androidx.compose.ui.graphics.vector.VectorPainterKt.rememberVectorPainter-u_AqRoo(float,float,float,float,String,long,androidx.compose.ui.graphics.BlendMode,kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit>)
+RemovedMethod: androidx.compose.ui.graphics.vector.VectorPath#getPathFillType():
+    Removed method androidx.compose.ui.graphics.vector.VectorPath.getPathFillType()
+RemovedMethod: androidx.compose.ui.graphics.vector.VectorPath#getStrokeLineCap():
+    Removed method androidx.compose.ui.graphics.vector.VectorPath.getStrokeLineCap()
+RemovedMethod: androidx.compose.ui.graphics.vector.VectorPath#getStrokeLineJoin():
+    Removed method androidx.compose.ui.graphics.vector.VectorPath.getStrokeLineJoin()
+RemovedMethod: androidx.compose.ui.input.pointer.PointerInputChange#copy-aJ2ieLA(long, long, long, boolean, long, long, boolean, androidx.compose.ui.input.pointer.ConsumedData, androidx.compose.ui.input.pointer.PointerType):
+    Removed method androidx.compose.ui.input.pointer.PointerInputChange.copy-aJ2ieLA(long,long,long,boolean,long,long,boolean,androidx.compose.ui.input.pointer.ConsumedData,androidx.compose.ui.input.pointer.PointerType)
+RemovedMethod: androidx.compose.ui.input.pointer.PointerInputChange#getType():
+    Removed method androidx.compose.ui.input.pointer.PointerInputChange.getType()
 RemovedMethod: androidx.compose.ui.semantics.SemanticsPropertiesKt#setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.input.ImeAction):
     Removed method androidx.compose.ui.semantics.SemanticsPropertiesKt.setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver,androidx.compose.ui.text.input.ImeAction)
+RemovedMethod: androidx.compose.ui.window.PopupProperties#PopupProperties(boolean, boolean, boolean, androidx.compose.ui.window.SecureFlagPolicy):
+    Removed constructor androidx.compose.ui.window.PopupProperties(boolean,boolean,boolean,androidx.compose.ui.window.SecureFlagPolicy)
diff --git a/compose/ui/ui/api/current.txt b/compose/ui/ui/api/current.txt
index 5b85842..ef6a13d 100644
--- a/compose/ui/ui/api/current.txt
+++ b/compose/ui/ui/api/current.txt
@@ -281,7 +281,8 @@
   }
 
   public final class FocusModifierKt {
-    method public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
   }
 
   public final class FocusNodeUtilsKt {
@@ -460,7 +461,7 @@
     method public float getDefaultWidth-D9Ej5fM();
     method public String getName();
     method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
-    method public androidx.compose.ui.graphics.BlendMode getTintBlendMode();
+    method public int getTintBlendMode-0nO6VwU();
     method public long getTintColor-0d7_KjU();
     method public float getViewportHeight();
     method public float getViewportWidth();
@@ -468,7 +469,7 @@
     property public final float defaultWidth;
     property public final String name;
     property public final androidx.compose.ui.graphics.vector.VectorGroup root;
-    property public final androidx.compose.ui.graphics.BlendMode tintBlendMode;
+    property public final int tintBlendMode;
     property public final long tintColor;
     property public final float viewportHeight;
     property public final float viewportWidth;
@@ -477,7 +478,7 @@
 
   public static final class ImageVector.Builder {
     method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
-    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional androidx.compose.ui.graphics.PathFillType pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath-MBUPpgE(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
     method public androidx.compose.ui.graphics.vector.ImageVector build();
     method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
   }
@@ -487,7 +488,7 @@
 
   public final class ImageVectorKt {
     method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
-    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional androidx.compose.ui.graphics.PathFillType pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path-XZu8tSg(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
   }
 
   public abstract sealed class VNode {
@@ -506,7 +507,7 @@
 
   public final class VectorComposeKt {
     method @androidx.compose.runtime.Composable public static void Group(optional String name, optional float rotation, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional androidx.compose.ui.graphics.PathFillType pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method @androidx.compose.runtime.Composable public static void Path-MBUPpgE(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
   }
 
   @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
@@ -537,10 +538,10 @@
   public final class VectorKt {
     method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
-    method public static androidx.compose.ui.graphics.PathFillType getDefaultFillType();
-    method public static androidx.compose.ui.graphics.StrokeCap getDefaultStrokeLineCap();
-    method public static androidx.compose.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
-    method public static androidx.compose.ui.graphics.BlendMode getDefaultTintBlendMode();
+    method public static int getDefaultFillType();
+    method public static int getDefaultStrokeLineCap();
+    method public static int getDefaultStrokeLineJoin();
+    method public static int getDefaultTintBlendMode();
     method public static long getDefaultTintColor();
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
     field public static final String DefaultGroupName = "";
@@ -570,7 +571,7 @@
 
   public final class VectorPainterKt {
     method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
-    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional androidx.compose.ui.graphics.BlendMode tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
     field public static final String RootGroupName = "VectorRootGroup";
   }
 
@@ -579,11 +580,11 @@
     method public float getFillAlpha();
     method public String getName();
     method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
-    method public androidx.compose.ui.graphics.PathFillType getPathFillType();
+    method public int getPathFillType-Rg-k1Os();
     method public androidx.compose.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeLineCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeLineJoin();
+    method public int getStrokeLineCap-KaPHkGw();
+    method public int getStrokeLineJoin-LxFBmk8();
     method public float getStrokeLineMiter();
     method public float getStrokeLineWidth();
     method public float getTrimPathEnd();
@@ -593,11 +594,11 @@
     property public final float fillAlpha;
     property public final String name;
     property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
-    property public final androidx.compose.ui.graphics.PathFillType pathFillType;
+    property public final int pathFillType;
     property public final androidx.compose.ui.graphics.Brush? stroke;
     property public final float strokeAlpha;
-    property public final androidx.compose.ui.graphics.StrokeCap strokeLineCap;
-    property public final androidx.compose.ui.graphics.StrokeJoin strokeLineJoin;
+    property public final int strokeLineCap;
+    property public final int strokeLineJoin;
     property public final float strokeLineMiter;
     property public final float strokeLineWidth;
     property public final float trimPathEnd;
@@ -1382,7 +1383,7 @@
   }
 
   @androidx.compose.runtime.Immutable public final class PointerInputChange {
-    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional androidx.compose.ui.input.pointer.PointerType type);
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
     method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
     method public long getId-J3iCeTQ();
     method public long getPosition-F1C5BW0();
@@ -1390,7 +1391,7 @@
     method public long getPreviousPosition-F1C5BW0();
     method public boolean getPreviousPressed();
     method public long getPreviousUptimeMillis();
-    method public androidx.compose.ui.input.pointer.PointerType getType();
+    method public int getType-T8wyACA();
     method public long getUptimeMillis();
     property public final androidx.compose.ui.input.pointer.ConsumedData consumed;
     property public final long id;
@@ -1399,7 +1400,7 @@
     property public final long previousPosition;
     property public final boolean previousPressed;
     property public final long previousUptimeMillis;
-    property public final androidx.compose.ui.input.pointer.PointerType type;
+    property public final int type;
     property public final long uptimeMillis;
   }
 
@@ -1437,12 +1438,28 @@
   public final class PointerInteropUtils_androidKt {
   }
 
-  public enum PointerType {
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Eraser;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Mouse;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Stylus;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Touch;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Unknown;
+  public final inline class PointerType {
+    ctor public PointerType();
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.input.pointer.PointerType.Companion Companion;
+  }
+
+  public static final class PointerType.Companion {
+    method public int getEraser-T8wyACA();
+    method public int getMouse-T8wyACA();
+    method public int getStylus-T8wyACA();
+    method public int getTouch-T8wyACA();
+    method public int getUnknown-T8wyACA();
+    property public final int Eraser;
+    property public final int Mouse;
+    property public final int Stylus;
+    property public final int Touch;
+    property public final int Unknown;
   }
 
   public final class RequestDisallowInterceptTouchEvent implements kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> {
@@ -2351,7 +2368,7 @@
   public final class SemanticsProperties {
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
-    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
@@ -2372,13 +2389,13 @@
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
-    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
-    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
@@ -2399,7 +2416,7 @@
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
-    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
@@ -2447,7 +2464,7 @@
     method public static void selectableGroup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static void setCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionInfo p);
     method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
-    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String value);
     method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
     method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
     method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
@@ -2462,7 +2479,7 @@
     method public static void setSelection(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Boolean,java.lang.Boolean>? action);
     method public static void setStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
     method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
-    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString value);
     method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
     method public static void setTextSelectionRange-Hy0MoUY(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long p);
     method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState p);
@@ -2558,13 +2575,17 @@
   }
 
   @androidx.compose.runtime.Immutable public final class PopupProperties {
-    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
+    method public boolean getClippingEnabled();
     method public boolean getDismissOnBackPress();
     method public boolean getDismissOnClickOutside();
+    method public boolean getExcludeFromSystemGesture();
     method public boolean getFocusable();
     method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property public final boolean clippingEnabled;
     property public final boolean dismissOnBackPress;
     property public final boolean dismissOnClickOutside;
+    property public final boolean excludeFromSystemGesture;
     property public final boolean focusable;
     property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
   }
diff --git a/compose/ui/ui/api/public_plus_experimental_1.0.0-beta08.txt b/compose/ui/ui/api/public_plus_experimental_1.0.0-beta08.txt
index 89d1056..e989440 100644
--- a/compose/ui/ui/api/public_plus_experimental_1.0.0-beta08.txt
+++ b/compose/ui/ui/api/public_plus_experimental_1.0.0-beta08.txt
@@ -354,7 +354,8 @@
   }
 
   public final class FocusModifierKt {
-    method public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
   }
 
   public final class FocusNodeUtilsKt {
@@ -562,7 +563,7 @@
     method public float getDefaultWidth-D9Ej5fM();
     method public String getName();
     method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
-    method public androidx.compose.ui.graphics.BlendMode getTintBlendMode();
+    method public int getTintBlendMode-0nO6VwU();
     method public long getTintColor-0d7_KjU();
     method public float getViewportHeight();
     method public float getViewportWidth();
@@ -570,7 +571,7 @@
     property public final float defaultWidth;
     property public final String name;
     property public final androidx.compose.ui.graphics.vector.VectorGroup root;
-    property public final androidx.compose.ui.graphics.BlendMode tintBlendMode;
+    property public final int tintBlendMode;
     property public final long tintColor;
     property public final float viewportHeight;
     property public final float viewportWidth;
@@ -579,7 +580,7 @@
 
   public static final class ImageVector.Builder {
     method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
-    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional androidx.compose.ui.graphics.PathFillType pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath-MBUPpgE(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
     method public androidx.compose.ui.graphics.vector.ImageVector build();
     method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
   }
@@ -589,7 +590,7 @@
 
   public final class ImageVectorKt {
     method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
-    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional androidx.compose.ui.graphics.PathFillType pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path-XZu8tSg(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
   }
 
   public abstract sealed class VNode {
@@ -608,7 +609,7 @@
 
   public final class VectorComposeKt {
     method @androidx.compose.runtime.Composable public static void Group(optional String name, optional float rotation, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional androidx.compose.ui.graphics.PathFillType pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method @androidx.compose.runtime.Composable public static void Path-MBUPpgE(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
   }
 
   @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
@@ -639,10 +640,10 @@
   public final class VectorKt {
     method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
-    method public static androidx.compose.ui.graphics.PathFillType getDefaultFillType();
-    method public static androidx.compose.ui.graphics.StrokeCap getDefaultStrokeLineCap();
-    method public static androidx.compose.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
-    method public static androidx.compose.ui.graphics.BlendMode getDefaultTintBlendMode();
+    method public static int getDefaultFillType();
+    method public static int getDefaultStrokeLineCap();
+    method public static int getDefaultStrokeLineJoin();
+    method public static int getDefaultTintBlendMode();
     method public static long getDefaultTintColor();
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
     field public static final String DefaultGroupName = "";
@@ -672,7 +673,7 @@
 
   public final class VectorPainterKt {
     method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
-    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional androidx.compose.ui.graphics.BlendMode tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
     field public static final String RootGroupName = "VectorRootGroup";
   }
 
@@ -681,11 +682,11 @@
     method public float getFillAlpha();
     method public String getName();
     method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
-    method public androidx.compose.ui.graphics.PathFillType getPathFillType();
+    method public int getPathFillType-Rg-k1Os();
     method public androidx.compose.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeLineCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeLineJoin();
+    method public int getStrokeLineCap-KaPHkGw();
+    method public int getStrokeLineJoin-LxFBmk8();
     method public float getStrokeLineMiter();
     method public float getStrokeLineWidth();
     method public float getTrimPathEnd();
@@ -695,11 +696,11 @@
     property public final float fillAlpha;
     property public final String name;
     property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
-    property public final androidx.compose.ui.graphics.PathFillType pathFillType;
+    property public final int pathFillType;
     property public final androidx.compose.ui.graphics.Brush? stroke;
     property public final float strokeAlpha;
-    property public final androidx.compose.ui.graphics.StrokeCap strokeLineCap;
-    property public final androidx.compose.ui.graphics.StrokeJoin strokeLineJoin;
+    property public final int strokeLineCap;
+    property public final int strokeLineJoin;
     property public final float strokeLineMiter;
     property public final float strokeLineWidth;
     property public final float trimPathEnd;
@@ -1484,7 +1485,7 @@
   }
 
   @androidx.compose.runtime.Immutable public final class PointerInputChange {
-    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional androidx.compose.ui.input.pointer.PointerType type);
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
     method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
     method public long getId-J3iCeTQ();
     method public long getPosition-F1C5BW0();
@@ -1492,7 +1493,7 @@
     method public long getPreviousPosition-F1C5BW0();
     method public boolean getPreviousPressed();
     method public long getPreviousUptimeMillis();
-    method public androidx.compose.ui.input.pointer.PointerType getType();
+    method public int getType-T8wyACA();
     method public long getUptimeMillis();
     property public final androidx.compose.ui.input.pointer.ConsumedData consumed;
     property public final long id;
@@ -1501,7 +1502,7 @@
     property public final long previousPosition;
     property public final boolean previousPressed;
     property public final long previousUptimeMillis;
-    property public final androidx.compose.ui.input.pointer.PointerType type;
+    property public final int type;
     property public final long uptimeMillis;
   }
 
@@ -1539,12 +1540,28 @@
   public final class PointerInteropUtils_androidKt {
   }
 
-  public enum PointerType {
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Eraser;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Mouse;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Stylus;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Touch;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Unknown;
+  public final inline class PointerType {
+    ctor public PointerType();
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.input.pointer.PointerType.Companion Companion;
+  }
+
+  public static final class PointerType.Companion {
+    method public int getEraser-T8wyACA();
+    method public int getMouse-T8wyACA();
+    method public int getStylus-T8wyACA();
+    method public int getTouch-T8wyACA();
+    method public int getUnknown-T8wyACA();
+    property public final int Eraser;
+    property public final int Mouse;
+    property public final int Stylus;
+    property public final int Touch;
+    property public final int Unknown;
   }
 
   public final class RequestDisallowInterceptTouchEvent implements kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> {
@@ -2504,7 +2521,7 @@
   public final class SemanticsProperties {
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
-    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
@@ -2525,13 +2542,13 @@
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
-    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
-    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
@@ -2552,7 +2569,7 @@
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
-    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
@@ -2601,7 +2618,7 @@
     method public static void selectableGroup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static void setCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionInfo p);
     method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
-    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String value);
     method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
     method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
     method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
@@ -2616,7 +2633,7 @@
     method public static void setSelection(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Boolean,java.lang.Boolean>? action);
     method public static void setStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
     method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
-    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString value);
     method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
     method public static void setTextSelectionRange-Hy0MoUY(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long p);
     method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState p);
@@ -2712,18 +2729,17 @@
   }
 
   @androidx.compose.runtime.Immutable public final class PopupProperties {
-    ctor @androidx.compose.ui.ExperimentalComposeUiApi public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
-    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
-    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getClippingEnabled();
+    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
+    method public boolean getClippingEnabled();
     method public boolean getDismissOnBackPress();
     method public boolean getDismissOnClickOutside();
-    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getExcludeFromSystemGesture();
+    method public boolean getExcludeFromSystemGesture();
     method public boolean getFocusable();
     method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
-    property @androidx.compose.ui.ExperimentalComposeUiApi public final boolean clippingEnabled;
+    property public final boolean clippingEnabled;
     property public final boolean dismissOnBackPress;
     property public final boolean dismissOnClickOutside;
-    property @androidx.compose.ui.ExperimentalComposeUiApi public final boolean excludeFromSystemGesture;
+    property public final boolean excludeFromSystemGesture;
     property public final boolean focusable;
     property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
   }
diff --git a/compose/ui/ui/api/public_plus_experimental_current.txt b/compose/ui/ui/api/public_plus_experimental_current.txt
index 89d1056..e989440 100644
--- a/compose/ui/ui/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui/api/public_plus_experimental_current.txt
@@ -354,7 +354,8 @@
   }
 
   public final class FocusModifierKt {
-    method public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
   }
 
   public final class FocusNodeUtilsKt {
@@ -562,7 +563,7 @@
     method public float getDefaultWidth-D9Ej5fM();
     method public String getName();
     method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
-    method public androidx.compose.ui.graphics.BlendMode getTintBlendMode();
+    method public int getTintBlendMode-0nO6VwU();
     method public long getTintColor-0d7_KjU();
     method public float getViewportHeight();
     method public float getViewportWidth();
@@ -570,7 +571,7 @@
     property public final float defaultWidth;
     property public final String name;
     property public final androidx.compose.ui.graphics.vector.VectorGroup root;
-    property public final androidx.compose.ui.graphics.BlendMode tintBlendMode;
+    property public final int tintBlendMode;
     property public final long tintColor;
     property public final float viewportHeight;
     property public final float viewportWidth;
@@ -579,7 +580,7 @@
 
   public static final class ImageVector.Builder {
     method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
-    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional androidx.compose.ui.graphics.PathFillType pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath-MBUPpgE(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
     method public androidx.compose.ui.graphics.vector.ImageVector build();
     method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
   }
@@ -589,7 +590,7 @@
 
   public final class ImageVectorKt {
     method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
-    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional androidx.compose.ui.graphics.PathFillType pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path-XZu8tSg(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
   }
 
   public abstract sealed class VNode {
@@ -608,7 +609,7 @@
 
   public final class VectorComposeKt {
     method @androidx.compose.runtime.Composable public static void Group(optional String name, optional float rotation, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional androidx.compose.ui.graphics.PathFillType pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method @androidx.compose.runtime.Composable public static void Path-MBUPpgE(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
   }
 
   @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
@@ -639,10 +640,10 @@
   public final class VectorKt {
     method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
-    method public static androidx.compose.ui.graphics.PathFillType getDefaultFillType();
-    method public static androidx.compose.ui.graphics.StrokeCap getDefaultStrokeLineCap();
-    method public static androidx.compose.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
-    method public static androidx.compose.ui.graphics.BlendMode getDefaultTintBlendMode();
+    method public static int getDefaultFillType();
+    method public static int getDefaultStrokeLineCap();
+    method public static int getDefaultStrokeLineJoin();
+    method public static int getDefaultTintBlendMode();
     method public static long getDefaultTintColor();
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
     field public static final String DefaultGroupName = "";
@@ -672,7 +673,7 @@
 
   public final class VectorPainterKt {
     method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
-    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional androidx.compose.ui.graphics.BlendMode tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
     field public static final String RootGroupName = "VectorRootGroup";
   }
 
@@ -681,11 +682,11 @@
     method public float getFillAlpha();
     method public String getName();
     method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
-    method public androidx.compose.ui.graphics.PathFillType getPathFillType();
+    method public int getPathFillType-Rg-k1Os();
     method public androidx.compose.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeLineCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeLineJoin();
+    method public int getStrokeLineCap-KaPHkGw();
+    method public int getStrokeLineJoin-LxFBmk8();
     method public float getStrokeLineMiter();
     method public float getStrokeLineWidth();
     method public float getTrimPathEnd();
@@ -695,11 +696,11 @@
     property public final float fillAlpha;
     property public final String name;
     property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
-    property public final androidx.compose.ui.graphics.PathFillType pathFillType;
+    property public final int pathFillType;
     property public final androidx.compose.ui.graphics.Brush? stroke;
     property public final float strokeAlpha;
-    property public final androidx.compose.ui.graphics.StrokeCap strokeLineCap;
-    property public final androidx.compose.ui.graphics.StrokeJoin strokeLineJoin;
+    property public final int strokeLineCap;
+    property public final int strokeLineJoin;
     property public final float strokeLineMiter;
     property public final float strokeLineWidth;
     property public final float trimPathEnd;
@@ -1484,7 +1485,7 @@
   }
 
   @androidx.compose.runtime.Immutable public final class PointerInputChange {
-    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional androidx.compose.ui.input.pointer.PointerType type);
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
     method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
     method public long getId-J3iCeTQ();
     method public long getPosition-F1C5BW0();
@@ -1492,7 +1493,7 @@
     method public long getPreviousPosition-F1C5BW0();
     method public boolean getPreviousPressed();
     method public long getPreviousUptimeMillis();
-    method public androidx.compose.ui.input.pointer.PointerType getType();
+    method public int getType-T8wyACA();
     method public long getUptimeMillis();
     property public final androidx.compose.ui.input.pointer.ConsumedData consumed;
     property public final long id;
@@ -1501,7 +1502,7 @@
     property public final long previousPosition;
     property public final boolean previousPressed;
     property public final long previousUptimeMillis;
-    property public final androidx.compose.ui.input.pointer.PointerType type;
+    property public final int type;
     property public final long uptimeMillis;
   }
 
@@ -1539,12 +1540,28 @@
   public final class PointerInteropUtils_androidKt {
   }
 
-  public enum PointerType {
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Eraser;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Mouse;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Stylus;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Touch;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Unknown;
+  public final inline class PointerType {
+    ctor public PointerType();
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.input.pointer.PointerType.Companion Companion;
+  }
+
+  public static final class PointerType.Companion {
+    method public int getEraser-T8wyACA();
+    method public int getMouse-T8wyACA();
+    method public int getStylus-T8wyACA();
+    method public int getTouch-T8wyACA();
+    method public int getUnknown-T8wyACA();
+    property public final int Eraser;
+    property public final int Mouse;
+    property public final int Stylus;
+    property public final int Touch;
+    property public final int Unknown;
   }
 
   public final class RequestDisallowInterceptTouchEvent implements kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> {
@@ -2504,7 +2521,7 @@
   public final class SemanticsProperties {
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
-    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
@@ -2525,13 +2542,13 @@
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
-    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
-    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
@@ -2552,7 +2569,7 @@
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
-    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
@@ -2601,7 +2618,7 @@
     method public static void selectableGroup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static void setCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionInfo p);
     method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
-    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String value);
     method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
     method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
     method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
@@ -2616,7 +2633,7 @@
     method public static void setSelection(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Boolean,java.lang.Boolean>? action);
     method public static void setStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
     method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
-    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString value);
     method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
     method public static void setTextSelectionRange-Hy0MoUY(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long p);
     method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState p);
@@ -2712,18 +2729,17 @@
   }
 
   @androidx.compose.runtime.Immutable public final class PopupProperties {
-    ctor @androidx.compose.ui.ExperimentalComposeUiApi public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
-    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
-    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getClippingEnabled();
+    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
+    method public boolean getClippingEnabled();
     method public boolean getDismissOnBackPress();
     method public boolean getDismissOnClickOutside();
-    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getExcludeFromSystemGesture();
+    method public boolean getExcludeFromSystemGesture();
     method public boolean getFocusable();
     method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
-    property @androidx.compose.ui.ExperimentalComposeUiApi public final boolean clippingEnabled;
+    property public final boolean clippingEnabled;
     property public final boolean dismissOnBackPress;
     property public final boolean dismissOnClickOutside;
-    property @androidx.compose.ui.ExperimentalComposeUiApi public final boolean excludeFromSystemGesture;
+    property public final boolean excludeFromSystemGesture;
     property public final boolean focusable;
     property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
   }
diff --git a/compose/ui/ui/api/restricted_1.0.0-beta08.txt b/compose/ui/ui/api/restricted_1.0.0-beta08.txt
index aaca412..7938cd4 100644
--- a/compose/ui/ui/api/restricted_1.0.0-beta08.txt
+++ b/compose/ui/ui/api/restricted_1.0.0-beta08.txt
@@ -281,7 +281,8 @@
   }
 
   public final class FocusModifierKt {
-    method public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
   }
 
   public final class FocusNodeUtilsKt {
@@ -460,7 +461,7 @@
     method public float getDefaultWidth-D9Ej5fM();
     method public String getName();
     method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
-    method public androidx.compose.ui.graphics.BlendMode getTintBlendMode();
+    method public int getTintBlendMode-0nO6VwU();
     method public long getTintColor-0d7_KjU();
     method public float getViewportHeight();
     method public float getViewportWidth();
@@ -468,7 +469,7 @@
     property public final float defaultWidth;
     property public final String name;
     property public final androidx.compose.ui.graphics.vector.VectorGroup root;
-    property public final androidx.compose.ui.graphics.BlendMode tintBlendMode;
+    property public final int tintBlendMode;
     property public final long tintColor;
     property public final float viewportHeight;
     property public final float viewportWidth;
@@ -477,7 +478,7 @@
 
   public static final class ImageVector.Builder {
     method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
-    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional androidx.compose.ui.graphics.PathFillType pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath-MBUPpgE(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
     method public androidx.compose.ui.graphics.vector.ImageVector build();
     method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
   }
@@ -487,7 +488,7 @@
 
   public final class ImageVectorKt {
     method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
-    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional androidx.compose.ui.graphics.PathFillType pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path-XZu8tSg(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
   }
 
   public abstract sealed class VNode {
@@ -506,7 +507,7 @@
 
   public final class VectorComposeKt {
     method @androidx.compose.runtime.Composable public static void Group(optional String name, optional float rotation, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional androidx.compose.ui.graphics.PathFillType pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method @androidx.compose.runtime.Composable public static void Path-MBUPpgE(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
   }
 
   @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
@@ -537,10 +538,10 @@
   public final class VectorKt {
     method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
-    method public static androidx.compose.ui.graphics.PathFillType getDefaultFillType();
-    method public static androidx.compose.ui.graphics.StrokeCap getDefaultStrokeLineCap();
-    method public static androidx.compose.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
-    method public static androidx.compose.ui.graphics.BlendMode getDefaultTintBlendMode();
+    method public static int getDefaultFillType();
+    method public static int getDefaultStrokeLineCap();
+    method public static int getDefaultStrokeLineJoin();
+    method public static int getDefaultTintBlendMode();
     method public static long getDefaultTintColor();
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
     field public static final String DefaultGroupName = "";
@@ -570,7 +571,7 @@
 
   public final class VectorPainterKt {
     method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
-    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional androidx.compose.ui.graphics.BlendMode tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
     field public static final String RootGroupName = "VectorRootGroup";
   }
 
@@ -579,11 +580,11 @@
     method public float getFillAlpha();
     method public String getName();
     method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
-    method public androidx.compose.ui.graphics.PathFillType getPathFillType();
+    method public int getPathFillType-Rg-k1Os();
     method public androidx.compose.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeLineCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeLineJoin();
+    method public int getStrokeLineCap-KaPHkGw();
+    method public int getStrokeLineJoin-LxFBmk8();
     method public float getStrokeLineMiter();
     method public float getStrokeLineWidth();
     method public float getTrimPathEnd();
@@ -593,11 +594,11 @@
     property public final float fillAlpha;
     property public final String name;
     property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
-    property public final androidx.compose.ui.graphics.PathFillType pathFillType;
+    property public final int pathFillType;
     property public final androidx.compose.ui.graphics.Brush? stroke;
     property public final float strokeAlpha;
-    property public final androidx.compose.ui.graphics.StrokeCap strokeLineCap;
-    property public final androidx.compose.ui.graphics.StrokeJoin strokeLineJoin;
+    property public final int strokeLineCap;
+    property public final int strokeLineJoin;
     property public final float strokeLineMiter;
     property public final float strokeLineWidth;
     property public final float trimPathEnd;
@@ -1382,7 +1383,7 @@
   }
 
   @androidx.compose.runtime.Immutable public final class PointerInputChange {
-    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional androidx.compose.ui.input.pointer.PointerType type);
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
     method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
     method public long getId-J3iCeTQ();
     method public long getPosition-F1C5BW0();
@@ -1390,7 +1391,7 @@
     method public long getPreviousPosition-F1C5BW0();
     method public boolean getPreviousPressed();
     method public long getPreviousUptimeMillis();
-    method public androidx.compose.ui.input.pointer.PointerType getType();
+    method public int getType-T8wyACA();
     method public long getUptimeMillis();
     property public final androidx.compose.ui.input.pointer.ConsumedData consumed;
     property public final long id;
@@ -1399,7 +1400,7 @@
     property public final long previousPosition;
     property public final boolean previousPressed;
     property public final long previousUptimeMillis;
-    property public final androidx.compose.ui.input.pointer.PointerType type;
+    property public final int type;
     property public final long uptimeMillis;
   }
 
@@ -1437,12 +1438,28 @@
   public final class PointerInteropUtils_androidKt {
   }
 
-  public enum PointerType {
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Eraser;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Mouse;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Stylus;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Touch;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Unknown;
+  public final inline class PointerType {
+    ctor public PointerType();
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.input.pointer.PointerType.Companion Companion;
+  }
+
+  public static final class PointerType.Companion {
+    method public int getEraser-T8wyACA();
+    method public int getMouse-T8wyACA();
+    method public int getStylus-T8wyACA();
+    method public int getTouch-T8wyACA();
+    method public int getUnknown-T8wyACA();
+    property public final int Eraser;
+    property public final int Mouse;
+    property public final int Stylus;
+    property public final int Touch;
+    property public final int Unknown;
   }
 
   public final class RequestDisallowInterceptTouchEvent implements kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> {
@@ -2381,7 +2398,7 @@
   public final class SemanticsProperties {
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
-    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
@@ -2402,13 +2419,13 @@
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
-    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
-    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
@@ -2429,7 +2446,7 @@
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
-    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
@@ -2477,7 +2494,7 @@
     method public static void selectableGroup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static void setCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionInfo p);
     method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
-    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String value);
     method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
     method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
     method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
@@ -2492,7 +2509,7 @@
     method public static void setSelection(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Boolean,java.lang.Boolean>? action);
     method public static void setStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
     method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
-    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString value);
     method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
     method public static void setTextSelectionRange-Hy0MoUY(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long p);
     method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState p);
@@ -2588,13 +2605,17 @@
   }
 
   @androidx.compose.runtime.Immutable public final class PopupProperties {
-    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
+    method public boolean getClippingEnabled();
     method public boolean getDismissOnBackPress();
     method public boolean getDismissOnClickOutside();
+    method public boolean getExcludeFromSystemGesture();
     method public boolean getFocusable();
     method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property public final boolean clippingEnabled;
     property public final boolean dismissOnBackPress;
     property public final boolean dismissOnClickOutside;
+    property public final boolean excludeFromSystemGesture;
     property public final boolean focusable;
     property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
   }
diff --git a/compose/ui/ui/api/restricted_current.ignore b/compose/ui/ui/api/restricted_current.ignore
index b392991..f30e81b 100644
--- a/compose/ui/ui/api/restricted_current.ignore
+++ b/compose/ui/ui/api/restricted_current.ignore
@@ -11,14 +11,54 @@
     Class androidx.compose.ui.focus.FocusState changed class/interface declaration
 
 
+ChangedSuperclass: androidx.compose.ui.input.pointer.PointerType:
+    Class androidx.compose.ui.input.pointer.PointerType superclass changed from java.lang.Enum to java.lang.Object
+
+
+ChangedType: androidx.compose.ui.graphics.vector.VectorKt#getDefaultFillType():
+    Method androidx.compose.ui.graphics.vector.VectorKt.getDefaultFillType has changed return type from androidx.compose.ui.graphics.PathFillType to int
+ChangedType: androidx.compose.ui.graphics.vector.VectorKt#getDefaultStrokeLineCap():
+    Method androidx.compose.ui.graphics.vector.VectorKt.getDefaultStrokeLineCap has changed return type from androidx.compose.ui.graphics.StrokeCap to int
+ChangedType: androidx.compose.ui.graphics.vector.VectorKt#getDefaultStrokeLineJoin():
+    Method androidx.compose.ui.graphics.vector.VectorKt.getDefaultStrokeLineJoin has changed return type from androidx.compose.ui.graphics.StrokeJoin to int
+ChangedType: androidx.compose.ui.graphics.vector.VectorKt#getDefaultTintBlendMode():
+    Method androidx.compose.ui.graphics.vector.VectorKt.getDefaultTintBlendMode has changed return type from androidx.compose.ui.graphics.BlendMode to int
+ChangedType: androidx.compose.ui.semantics.SemanticsProperties#getContentDescription():
+    Method androidx.compose.ui.semantics.SemanticsProperties.getContentDescription has changed return type from androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> to androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>>
+ChangedType: androidx.compose.ui.semantics.SemanticsProperties#getText():
+    Method androidx.compose.ui.semantics.SemanticsProperties.getText has changed return type from androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> to androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>>
 ChangedType: androidx.compose.ui.semantics.SemanticsPropertiesKt#getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver):
     Method androidx.compose.ui.semantics.SemanticsPropertiesKt.getImeAction has changed return type from androidx.compose.ui.text.input.ImeAction to int
 
 
+InvalidNullConversion: Field ImageVector.tintBlendMode:
+    Attempted to remove @NonNull annotation from Field ImageVector.tintBlendMode
+InvalidNullConversion: Field PointerInputChange.type:
+    Attempted to remove @NonNull annotation from Field PointerInputChange.type
+InvalidNullConversion: Field VectorPath.pathFillType:
+    Attempted to remove @NonNull annotation from Field VectorPath.pathFillType
+InvalidNullConversion: Field VectorPath.strokeLineCap:
+    Attempted to remove @NonNull annotation from Field VectorPath.strokeLineCap
+InvalidNullConversion: Field VectorPath.strokeLineJoin:
+    Attempted to remove @NonNull annotation from Field VectorPath.strokeLineJoin
+InvalidNullConversion: androidx.compose.ui.graphics.vector.VectorKt#getDefaultFillType():
+    Attempted to remove @NonNull annotation from method androidx.compose.ui.graphics.vector.VectorKt.getDefaultFillType()
+InvalidNullConversion: androidx.compose.ui.graphics.vector.VectorKt#getDefaultStrokeLineCap():
+    Attempted to remove @NonNull annotation from method androidx.compose.ui.graphics.vector.VectorKt.getDefaultStrokeLineCap()
+InvalidNullConversion: androidx.compose.ui.graphics.vector.VectorKt#getDefaultStrokeLineJoin():
+    Attempted to remove @NonNull annotation from method androidx.compose.ui.graphics.vector.VectorKt.getDefaultStrokeLineJoin()
+InvalidNullConversion: androidx.compose.ui.graphics.vector.VectorKt#getDefaultTintBlendMode():
+    Attempted to remove @NonNull annotation from method androidx.compose.ui.graphics.vector.VectorKt.getDefaultTintBlendMode()
 InvalidNullConversion: androidx.compose.ui.semantics.SemanticsPropertiesKt#getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver):
     Attempted to remove @NonNull annotation from method androidx.compose.ui.semantics.SemanticsPropertiesKt.getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver)
 
 
+ParameterNameChange: androidx.compose.ui.semantics.SemanticsPropertiesKt#setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String) parameter #1:
+    Attempted to change parameter name from p to value in method androidx.compose.ui.semantics.SemanticsPropertiesKt.setContentDescription
+ParameterNameChange: androidx.compose.ui.semantics.SemanticsPropertiesKt#setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString) parameter #1:
+    Attempted to change parameter name from p to value in method androidx.compose.ui.semantics.SemanticsPropertiesKt.setText
+
+
 RemovedClass: androidx.compose.ui.focus.FocusStateKt:
     Removed class androidx.compose.ui.focus.FocusStateKt
 RemovedClass: androidx.compose.ui.platform.ComposeView_androidKt:
@@ -35,7 +75,39 @@
     Removed enum constant androidx.compose.ui.focus.FocusState.Disabled
 RemovedField: androidx.compose.ui.focus.FocusState#Inactive:
     Removed enum constant androidx.compose.ui.focus.FocusState.Inactive
+RemovedField: androidx.compose.ui.input.pointer.PointerType#Eraser:
+    Removed enum constant androidx.compose.ui.input.pointer.PointerType.Eraser
+RemovedField: androidx.compose.ui.input.pointer.PointerType#Mouse:
+    Removed enum constant androidx.compose.ui.input.pointer.PointerType.Mouse
+RemovedField: androidx.compose.ui.input.pointer.PointerType#Stylus:
+    Removed enum constant androidx.compose.ui.input.pointer.PointerType.Stylus
+RemovedField: androidx.compose.ui.input.pointer.PointerType#Touch:
+    Removed enum constant androidx.compose.ui.input.pointer.PointerType.Touch
+RemovedField: androidx.compose.ui.input.pointer.PointerType#Unknown:
+    Removed enum constant androidx.compose.ui.input.pointer.PointerType.Unknown
 
 
+RemovedMethod: androidx.compose.ui.graphics.vector.ImageVector#getTintBlendMode():
+    Removed method androidx.compose.ui.graphics.vector.ImageVector.getTintBlendMode()
+RemovedMethod: androidx.compose.ui.graphics.vector.ImageVector.Builder#addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>, androidx.compose.ui.graphics.PathFillType, String, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.Brush, float, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.StrokeJoin, float, float, float, float):
+    Removed method androidx.compose.ui.graphics.vector.ImageVector.Builder.addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>,androidx.compose.ui.graphics.PathFillType,String,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.Brush,float,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.StrokeJoin,float,float,float,float)
+RemovedMethod: androidx.compose.ui.graphics.vector.ImageVectorKt#path(androidx.compose.ui.graphics.vector.ImageVector.Builder, String, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.Brush, float, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.StrokeJoin, float, androidx.compose.ui.graphics.PathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit>):
+    Removed method androidx.compose.ui.graphics.vector.ImageVectorKt.path(androidx.compose.ui.graphics.vector.ImageVector.Builder,String,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.Brush,float,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.StrokeJoin,float,androidx.compose.ui.graphics.PathFillType,kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit>)
+RemovedMethod: androidx.compose.ui.graphics.vector.VectorComposeKt#Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>, androidx.compose.ui.graphics.PathFillType, String, androidx.compose.ui.graphics.Brush, float, androidx.compose.ui.graphics.Brush, float, float, androidx.compose.ui.graphics.StrokeCap, androidx.compose.ui.graphics.StrokeJoin, float, float, float, float):
+    Removed method androidx.compose.ui.graphics.vector.VectorComposeKt.Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>,androidx.compose.ui.graphics.PathFillType,String,androidx.compose.ui.graphics.Brush,float,androidx.compose.ui.graphics.Brush,float,float,androidx.compose.ui.graphics.StrokeCap,androidx.compose.ui.graphics.StrokeJoin,float,float,float,float)
+RemovedMethod: androidx.compose.ui.graphics.vector.VectorPainterKt#rememberVectorPainter-u_AqRoo(float, float, float, float, String, long, androidx.compose.ui.graphics.BlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit>):
+    Removed method androidx.compose.ui.graphics.vector.VectorPainterKt.rememberVectorPainter-u_AqRoo(float,float,float,float,String,long,androidx.compose.ui.graphics.BlendMode,kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit>)
+RemovedMethod: androidx.compose.ui.graphics.vector.VectorPath#getPathFillType():
+    Removed method androidx.compose.ui.graphics.vector.VectorPath.getPathFillType()
+RemovedMethod: androidx.compose.ui.graphics.vector.VectorPath#getStrokeLineCap():
+    Removed method androidx.compose.ui.graphics.vector.VectorPath.getStrokeLineCap()
+RemovedMethod: androidx.compose.ui.graphics.vector.VectorPath#getStrokeLineJoin():
+    Removed method androidx.compose.ui.graphics.vector.VectorPath.getStrokeLineJoin()
+RemovedMethod: androidx.compose.ui.input.pointer.PointerInputChange#copy-aJ2ieLA(long, long, long, boolean, long, long, boolean, androidx.compose.ui.input.pointer.ConsumedData, androidx.compose.ui.input.pointer.PointerType):
+    Removed method androidx.compose.ui.input.pointer.PointerInputChange.copy-aJ2ieLA(long,long,long,boolean,long,long,boolean,androidx.compose.ui.input.pointer.ConsumedData,androidx.compose.ui.input.pointer.PointerType)
+RemovedMethod: androidx.compose.ui.input.pointer.PointerInputChange#getType():
+    Removed method androidx.compose.ui.input.pointer.PointerInputChange.getType()
 RemovedMethod: androidx.compose.ui.semantics.SemanticsPropertiesKt#setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.input.ImeAction):
     Removed method androidx.compose.ui.semantics.SemanticsPropertiesKt.setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver,androidx.compose.ui.text.input.ImeAction)
+RemovedMethod: androidx.compose.ui.window.PopupProperties#PopupProperties(boolean, boolean, boolean, androidx.compose.ui.window.SecureFlagPolicy):
+    Removed constructor androidx.compose.ui.window.PopupProperties(boolean,boolean,boolean,androidx.compose.ui.window.SecureFlagPolicy)
diff --git a/compose/ui/ui/api/restricted_current.txt b/compose/ui/ui/api/restricted_current.txt
index aaca412..7938cd4 100644
--- a/compose/ui/ui/api/restricted_current.txt
+++ b/compose/ui/ui/api/restricted_current.txt
@@ -281,7 +281,8 @@
   }
 
   public final class FocusModifierKt {
-    method public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
   }
 
   public final class FocusNodeUtilsKt {
@@ -460,7 +461,7 @@
     method public float getDefaultWidth-D9Ej5fM();
     method public String getName();
     method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
-    method public androidx.compose.ui.graphics.BlendMode getTintBlendMode();
+    method public int getTintBlendMode-0nO6VwU();
     method public long getTintColor-0d7_KjU();
     method public float getViewportHeight();
     method public float getViewportWidth();
@@ -468,7 +469,7 @@
     property public final float defaultWidth;
     property public final String name;
     property public final androidx.compose.ui.graphics.vector.VectorGroup root;
-    property public final androidx.compose.ui.graphics.BlendMode tintBlendMode;
+    property public final int tintBlendMode;
     property public final long tintColor;
     property public final float viewportHeight;
     property public final float viewportWidth;
@@ -477,7 +478,7 @@
 
   public static final class ImageVector.Builder {
     method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
-    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional androidx.compose.ui.graphics.PathFillType pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath-MBUPpgE(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
     method public androidx.compose.ui.graphics.vector.ImageVector build();
     method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
   }
@@ -487,7 +488,7 @@
 
   public final class ImageVectorKt {
     method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
-    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional androidx.compose.ui.graphics.PathFillType pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path-XZu8tSg(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
   }
 
   public abstract sealed class VNode {
@@ -506,7 +507,7 @@
 
   public final class VectorComposeKt {
     method @androidx.compose.runtime.Composable public static void Group(optional String name, optional float rotation, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional androidx.compose.ui.graphics.PathFillType pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method @androidx.compose.runtime.Composable public static void Path-MBUPpgE(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
   }
 
   @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
@@ -537,10 +538,10 @@
   public final class VectorKt {
     method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
-    method public static androidx.compose.ui.graphics.PathFillType getDefaultFillType();
-    method public static androidx.compose.ui.graphics.StrokeCap getDefaultStrokeLineCap();
-    method public static androidx.compose.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
-    method public static androidx.compose.ui.graphics.BlendMode getDefaultTintBlendMode();
+    method public static int getDefaultFillType();
+    method public static int getDefaultStrokeLineCap();
+    method public static int getDefaultStrokeLineJoin();
+    method public static int getDefaultTintBlendMode();
     method public static long getDefaultTintColor();
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
     field public static final String DefaultGroupName = "";
@@ -570,7 +571,7 @@
 
   public final class VectorPainterKt {
     method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
-    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional androidx.compose.ui.graphics.BlendMode tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
     field public static final String RootGroupName = "VectorRootGroup";
   }
 
@@ -579,11 +580,11 @@
     method public float getFillAlpha();
     method public String getName();
     method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
-    method public androidx.compose.ui.graphics.PathFillType getPathFillType();
+    method public int getPathFillType-Rg-k1Os();
     method public androidx.compose.ui.graphics.Brush? getStroke();
     method public float getStrokeAlpha();
-    method public androidx.compose.ui.graphics.StrokeCap getStrokeLineCap();
-    method public androidx.compose.ui.graphics.StrokeJoin getStrokeLineJoin();
+    method public int getStrokeLineCap-KaPHkGw();
+    method public int getStrokeLineJoin-LxFBmk8();
     method public float getStrokeLineMiter();
     method public float getStrokeLineWidth();
     method public float getTrimPathEnd();
@@ -593,11 +594,11 @@
     property public final float fillAlpha;
     property public final String name;
     property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
-    property public final androidx.compose.ui.graphics.PathFillType pathFillType;
+    property public final int pathFillType;
     property public final androidx.compose.ui.graphics.Brush? stroke;
     property public final float strokeAlpha;
-    property public final androidx.compose.ui.graphics.StrokeCap strokeLineCap;
-    property public final androidx.compose.ui.graphics.StrokeJoin strokeLineJoin;
+    property public final int strokeLineCap;
+    property public final int strokeLineJoin;
     property public final float strokeLineMiter;
     property public final float strokeLineWidth;
     property public final float trimPathEnd;
@@ -1382,7 +1383,7 @@
   }
 
   @androidx.compose.runtime.Immutable public final class PointerInputChange {
-    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional androidx.compose.ui.input.pointer.PointerType type);
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
     method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
     method public long getId-J3iCeTQ();
     method public long getPosition-F1C5BW0();
@@ -1390,7 +1391,7 @@
     method public long getPreviousPosition-F1C5BW0();
     method public boolean getPreviousPressed();
     method public long getPreviousUptimeMillis();
-    method public androidx.compose.ui.input.pointer.PointerType getType();
+    method public int getType-T8wyACA();
     method public long getUptimeMillis();
     property public final androidx.compose.ui.input.pointer.ConsumedData consumed;
     property public final long id;
@@ -1399,7 +1400,7 @@
     property public final long previousPosition;
     property public final boolean previousPressed;
     property public final long previousUptimeMillis;
-    property public final androidx.compose.ui.input.pointer.PointerType type;
+    property public final int type;
     property public final long uptimeMillis;
   }
 
@@ -1437,12 +1438,28 @@
   public final class PointerInteropUtils_androidKt {
   }
 
-  public enum PointerType {
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Eraser;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Mouse;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Stylus;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Touch;
-    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Unknown;
+  public final inline class PointerType {
+    ctor public PointerType();
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.input.pointer.PointerType.Companion Companion;
+  }
+
+  public static final class PointerType.Companion {
+    method public int getEraser-T8wyACA();
+    method public int getMouse-T8wyACA();
+    method public int getStylus-T8wyACA();
+    method public int getTouch-T8wyACA();
+    method public int getUnknown-T8wyACA();
+    property public final int Eraser;
+    property public final int Mouse;
+    property public final int Stylus;
+    property public final int Touch;
+    property public final int Unknown;
   }
 
   public final class RequestDisallowInterceptTouchEvent implements kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> {
@@ -2381,7 +2398,7 @@
   public final class SemanticsProperties {
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
-    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
@@ -2402,13 +2419,13 @@
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
-    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
     method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
-    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
@@ -2429,7 +2446,7 @@
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
-    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
     property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
@@ -2477,7 +2494,7 @@
     method public static void selectableGroup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
     method public static void setCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionInfo p);
     method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
-    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String value);
     method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
     method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
     method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
@@ -2492,7 +2509,7 @@
     method public static void setSelection(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Boolean,java.lang.Boolean>? action);
     method public static void setStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
     method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
-    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString value);
     method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
     method public static void setTextSelectionRange-Hy0MoUY(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long p);
     method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState p);
@@ -2588,13 +2605,17 @@
   }
 
   @androidx.compose.runtime.Immutable public final class PopupProperties {
-    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
+    method public boolean getClippingEnabled();
     method public boolean getDismissOnBackPress();
     method public boolean getDismissOnClickOutside();
+    method public boolean getExcludeFromSystemGesture();
     method public boolean getFocusable();
     method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property public final boolean clippingEnabled;
     property public final boolean dismissOnBackPress;
     property public final boolean dismissOnClickOutside;
+    property public final boolean excludeFromSystemGesture;
     property public final boolean focusable;
     property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
   }
diff --git a/compose/ui/ui/build.gradle b/compose/ui/ui/build.gradle
index ca8989f..9cd93c5 100644
--- a/compose/ui/ui/build.gradle
+++ b/compose/ui/ui/build.gradle
@@ -79,10 +79,11 @@
         testImplementation(project(":compose:ui:ui-test-junit4"))
         testImplementation(project(":compose:test-utils"))
 
-        androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
-        androidTestImplementation(ANDROIDX_TEST_RULES)
-        androidTestImplementation(ANDROIDX_TEST_RUNNER)
+        androidTestImplementation(ANDROIDX_TEST_CORE_LATEST)
+        androidTestImplementation(ANDROIDX_TEST_RULES_LATEST)
+        androidTestImplementation(ANDROIDX_TEST_RUNNER_LATEST)
         androidTestImplementation(ANDROIDX_TEST_EXT_KTX)
+        androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
         androidTestImplementation(KOTLIN_COROUTINES_TEST)
         androidTestImplementation(ESPRESSO_CORE)
         androidTestImplementation(JUNIT)
@@ -261,26 +262,17 @@
             project.rootDir.absolutePath + "/../../golden/compose/ui/ui"
 }
 
-if(AndroidXUiPlugin.isMultiplatformEnabled(project)) {
-    // An ugly hack to workaround b/159426957
-    // causing MPP+AGP to conflict.
-    // See also: https://youtrack.jetbrains.com/issue/KT-34650
-    // See also: https://youtrack.jetbrains.com/issue/KT-39712
-    afterEvaluate {
-        ["Api", "Implementation", "CompileOnly", "RuntimeOnly"].each { scope ->
-            def erroneousExtendsFrom = [
-                    "androidTest$scope",
-                    "androidTestDebug$scope",
-            ].collect { configurations[it] }
-            [
-                    "androidDebugUnitTest$scope",
-                    "test$scope",
-                    "testDebug$scope",
-                    "testRelease$scope"
-            ].each {
-                def configuration = configurations[it]
-                configuration.setExtendsFrom(configuration.extendsFrom - erroneousExtendsFrom)
+// Diagnostics for b/188565660
+if (!AndroidXUiPlugin.isMultiplatformEnabled(project)) {
+    project.afterEvaluate {
+        tasks.named("compileReleaseKotlin").configure { t ->
+            t.doLast {
+                def moduleFile = project.file("${buildDir}/tmp/kotlin-classes/release/META-INF/ui_release.kotlin_module")
+                // This file should be large, about 3.2K. If this file is short then many symbols will fail to resolve
+                if (moduleFile.length() < 250) {
+                    throw new GradleException("kotlin_module file ($moduleFile) too short! See b/188565660 for more information. File text: ${moduleFile.text}")
+                }
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CustomFocusOrderDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CustomFocusOrderDemo.kt
index 616d79d..6b6f051 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CustomFocusOrderDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CustomFocusOrderDemo.kt
@@ -34,9 +34,9 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusModifier
 import androidx.compose.ui.focus.focusOrder
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.focus.focusTarget
 import androidx.compose.ui.focus.onFocusChanged
 import androidx.compose.ui.graphics.Color.Companion.Black
 import androidx.compose.ui.graphics.Color.Companion.Green
@@ -115,7 +115,7 @@
             .requiredWidth(50.dp)
             .focusRequester(focusRequester)
             .onFocusChanged { color = if (it.isFocused) Green else Black }
-            .focusModifier()
+            .focusTarget()
             .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } },
         text = text,
         fontSize = 40.sp,
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt
index ae97067..8392ddc 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt
@@ -43,9 +43,9 @@
 import androidx.compose.ui.focus.FocusDirection.Companion.Right
 import androidx.compose.ui.focus.FocusDirection.Companion.Up
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusModifier
 import androidx.compose.ui.focus.focusOrder
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.focus.focusTarget
 import androidx.compose.ui.focus.onFocusChanged
 import androidx.compose.ui.graphics.Color.Companion.Black
 import androidx.compose.ui.graphics.Color.Companion.Green
@@ -142,7 +142,7 @@
             .requiredWidth(50.dp)
             .focusRequester(focusRequester)
             .onFocusChanged { color = if (it.isFocused) Green else Black }
-            .focusModifier()
+            .focusTarget()
             .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } },
         text = text,
         fontSize = 40.sp,
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt
index 0fe1ea5..d7928de 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt
@@ -29,8 +29,8 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusModifier
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.focus.focusTarget
 import androidx.compose.ui.focus.onFocusChanged
 import androidx.compose.ui.graphics.Color.Companion.Black
 import androidx.compose.ui.graphics.Color.Companion.Green
@@ -64,7 +64,7 @@
         modifier = Modifier
             .focusRequester(focusRequester)
             .onFocusChanged { color = if (it.isFocused) Green else Black }
-            .focusModifier()
+            .focusTarget()
             .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } },
         text = text,
         color = color
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusReference.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusReference.kt
index 6c4b1e8..e81ebf2 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusReference.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusReference.kt
@@ -31,8 +31,8 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusModifier
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.focus.focusTarget
 import androidx.compose.ui.focus.onFocusChanged
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Size
@@ -87,7 +87,7 @@
         modifier
             .onFocusChanged { isFocused = it.isFocused }
             .fillMaxSize()
-            .focusModifier()
+            .focusTarget()
     ) {
         drawCircle(
             color = if (isFocused) Color.Red else Color.Blue,
@@ -110,7 +110,7 @@
         modifier
             .onFocusChanged { isFocused = it.isFocused }
             .fillMaxSize()
-            .focusModifier()
+            .focusTarget()
     ) {
         drawRect(
             color = if (isFocused) Color.Red else Color.Blue,
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
index 91b686b..4ed3a64 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
@@ -31,7 +31,6 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.input.pointer.consumeAllChanges
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
@@ -61,9 +60,8 @@
                         onDragStart = { color.value = Blue },
                         onDragEnd = { color.value = Grey },
                         onDragCancel = { color.value = Grey }
-                    ) { change, dragAmount ->
+                    ) { _, dragAmount ->
                         offset.value += dragAmount
-                        change.consumeAllChanges()
                     }
                 }
                 .background(color.value)
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
index c7cb00d..ea7df23 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
@@ -30,7 +30,6 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.input.pointer.consumeAllChanges
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.dp
@@ -52,9 +51,8 @@
                 Box(
                     Modifier
                         .pointerInput(Unit) {
-                            detectDragGestures { change, dragAmount ->
+                            detectDragGestures { _, dragAmount ->
                                 offset.value = offset.value + dragAmount
-                                change.consumeAllChanges()
                             }
                         }
                         .size(70.dp)
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
index 0118823..ae77561 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
@@ -33,7 +33,6 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.input.pointer.consumeAllChanges
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
@@ -78,18 +77,16 @@
                     if (canStartVertically.value) {
                         detectVerticalDragGestures(
                             onDragEnd = { canStartVertically.value = !canStartVertically.value }
-                        ) { change, dragDistance ->
+                        ) { _, dragDistance ->
                             offset.value =
                                 Offset(x = offset.value.x, y = offset.value.y + dragDistance)
-                            change.consumeAllChanges()
                         }
                     } else {
                         detectHorizontalDragGestures(
                             onDragEnd = { canStartVertically.value = !canStartVertically.value }
-                        ) { change, dragDistance ->
+                        ) { _, dragDistance ->
                             offset.value =
                                 Offset(x = offset.value.x + dragDistance, y = offset.value.y)
-                            change.consumeAllChanges()
                         }
                     }
                 }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
index 2e89965..0f762ae 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
@@ -30,8 +30,8 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusModifier
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.focus.focusTarget
 import androidx.compose.ui.focus.onFocusChanged
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.input.key.KeyEventType.Companion.KeyDown
@@ -70,7 +70,7 @@
         modifier = Modifier
             .focusRequester(focusRequester)
             .onFocusChanged { color = if (it.isFocused) Color.Green else Color.Black }
-            .focusModifier()
+            .focusTarget()
             .pointerInput(Unit) { detectTapGestures { focusRequester.requestFocus() } }
             .onKeyEvent {
                 if (it.type == KeyDown) {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
index 65bb050..4885f43 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
@@ -1892,9 +1892,9 @@
 
     private fun getTraversedText(textNode: SemanticsNode): String? {
         return (
-            textNode.config.getOrNull(SemanticsProperties.EditableText)
-                ?: textNode.config.getOrNull(SemanticsProperties.Text)
-            )?.text
+            textNode.config.getOrNull(SemanticsProperties.EditableText)?.text
+                ?: textNode.config.getOrNull(SemanticsProperties.Text)?.joinToString(",")
+            )
     }
 }
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ClipDrawTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ClipDrawTest.kt
index d43ec0a..7195ed1 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ClipDrawTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ClipDrawTest.kt
@@ -275,7 +275,7 @@
                     op(
                         Path().apply { addRect(Rect(0f, 0f, 30f, 30f)) },
                         Path().apply { addRect(Rect(10f, 10f, 20f, 20f)) },
-                        PathOperation.difference
+                        PathOperation.Difference
                     )
                 }
             )
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawReorderingTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawReorderingTest.kt
index a8e70df..568809a 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawReorderingTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/DrawReorderingTest.kt
@@ -1038,6 +1038,62 @@
         )
     }
 
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun placingInDifferentOrderTriggersRedraw() {
+        var reverseOrder by mutableStateOf(false)
+        rule.runOnUiThread {
+            activity.setContent {
+                Layout(
+                    content = {
+                        FixedSize(30) {
+                            FixedSize(
+                                10,
+                                Modifier.padding(10)
+                                    .background(Color.White)
+                            )
+                        }
+                        FixedSize(30) {
+                            FixedSize(
+                                30,
+                                Modifier.background(Color.Red)
+                            )
+                        }
+                    },
+                    modifier = Modifier.drawLatchModifier()
+                ) { measurables, _ ->
+                    val newConstraints = Constraints.fixed(30, 30)
+                    val placeables = measurables.map { m ->
+                        m.measure(newConstraints)
+                    }
+                    layout(newConstraints.maxWidth, newConstraints.maxWidth) {
+                        if (!reverseOrder) {
+                            placeables[0].place(0, 0)
+                            placeables[1].place(0, 0)
+                        } else {
+                            placeables[1].place(0, 0)
+                            placeables[0].place(0, 0)
+                        }
+                    }
+                }
+            }
+        }
+
+        assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
+
+        rule.runOnUiThread {
+            drawLatch = CountDownLatch(1)
+            reverseOrder = true
+        }
+
+        rule.validateSquareColors(
+            outerColor = Color.Red,
+            innerColor = Color.White,
+            size = 10,
+            drawLatch = drawLatch
+        )
+    }
+
     fun Modifier.drawLatchModifier() = drawBehind { drawLatch.countDown() }
 }
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/InvalidatingNotPlacedChildTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/InvalidatingNotPlacedChildTest.kt
index aff3562..befd806 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/InvalidatingNotPlacedChildTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/InvalidatingNotPlacedChildTest.kt
@@ -17,20 +17,21 @@
 package androidx.compose.ui.draw
 
 import android.os.Build
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.requiredSize
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.State
-import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.background
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.assertCenterPixelColor
+import androidx.compose.ui.layout.layout
+import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -50,6 +51,9 @@
     @get:Rule
     val composeTestRule = createComposeRule()
 
+    @get:Rule
+    val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
+
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun childIsDisplayedWhenItWasNotPlacedOriginallyButPlacedLater() {
@@ -116,44 +120,6 @@
 
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-    fun grandChildIsDisplayedCorrectlyWhenTheColorWasChangedWhileNotPlaced() {
-        val shouldPlace = mutableStateOf(false)
-        var color by mutableStateOf(Color.Gray)
-        composeTestRule.setContent {
-            ConditionallyPlacedChild(
-                shouldPlace,
-                Modifier.background(Color.Blue)
-                    .testTag("node")
-            ) {
-                MeasureInLayoutBlock {
-                    Spacer(
-                        Modifier.fillMaxSize()
-                            .graphicsLayer()
-                            .background(color)
-                    )
-                }
-            }
-        }
-
-        composeTestRule.runOnIdle {
-            shouldPlace.value = false
-        }
-
-        composeTestRule.runOnIdle {
-            color = Color.Red
-        }
-
-        composeTestRule.runOnIdle {
-            shouldPlace.value = true
-        }
-
-        composeTestRule.onNodeWithTag("node")
-            .captureToImage()
-            .assertCenterPixelColor(Color.Red)
-    }
-
-    @Test
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun childIsNotDisplayedWhenIsNotPlacedAnymore() {
         val shouldPlace = mutableStateOf(true)
         composeTestRule.setContent {
@@ -179,30 +145,289 @@
             .captureToImage()
             .assertCenterPixelColor(Color.Blue)
     }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun childRedrawRequestedWhileNotPlaced() {
+        assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
+            ConditionallyPlacedChild(shouldPlace) {
+                Spacer(
+                    Modifier.fillMaxSize()
+                        .drawBehind {
+                            drawRect(color.value)
+                        }
+                )
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun childRedrawRequestedWhileNotPlaced_hadLayer() {
+        assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
+            ConditionallyPlacedChild(shouldPlace) {
+                Spacer(
+                    Modifier.fillMaxSize()
+                        .graphicsLayer()
+                        .drawBehind {
+                            drawRect(color.value)
+                        }
+                )
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun childRedrawRequestedWhileNotPlaced_hadLayerAsLastModifierInTheChain() {
+        assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
+            ConditionallyPlacedChild(shouldPlace) {
+                Box(Modifier.graphicsLayer()) {
+                    Spacer(
+                        Modifier.fillMaxSize()
+                            .drawBehind {
+                                drawRect(color.value)
+                            }
+                    )
+                }
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun childRedrawRequestedWhileNotPlaced_placedWithLayer() {
+        assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
+            ConditionallyPlacedChild(shouldPlace, placeWithLayer = true) {
+                Spacer(
+                    Modifier.fillMaxSize()
+                        .drawBehind {
+                            drawRect(color.value)
+                        }
+                )
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun childRedrawAndRemeasureRequestedWhileNotPlaced() {
+        assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
+            ConditionallyPlacedChild(shouldPlace) {
+                Spacer(
+                    Modifier.fillMaxSize()
+                        .layout(useDuringMeasure = color)
+                        .drawBehind {
+                            drawRect(color.value)
+                        }
+                )
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun childRedrawAndRelayoutRequestedWhileNotPlaced() {
+        assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
+            ConditionallyPlacedChild(shouldPlace) {
+                Spacer(
+                    Modifier.fillMaxSize()
+                        .layout(useDuringLayout = color)
+                        .drawBehind {
+                            drawRect(color.value)
+                        }
+                )
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun grandChildRedrawRequestedWhileNotPlaced() {
+        assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
+            ConditionallyPlacedChild(shouldPlace) {
+                MeasureInLayoutBlock {
+                    Spacer(
+                        Modifier.fillMaxSize()
+                            .drawBehind {
+                                drawRect(color.value)
+                            }
+                    )
+                }
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun grandChildRedrawRequestedWhileNotPlaced_hadLayer() {
+        assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
+            ConditionallyPlacedChild(shouldPlace) {
+                MeasureInLayoutBlock {
+                    Spacer(
+                        Modifier.fillMaxSize()
+                            .graphicsLayer()
+                            .drawBehind {
+                                drawRect(color.value)
+                            }
+                    )
+                }
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun grandChildRedrawRequestedWhileNotPlaced_hadLayerAsLastModifierInTheChain() {
+        assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
+            ConditionallyPlacedChild(shouldPlace) {
+                MeasureInLayoutBlock {
+                    Box(Modifier.graphicsLayer()) {
+                        Spacer(
+                            Modifier.fillMaxSize()
+                                .drawBehind {
+                                    drawRect(color.value)
+                                }
+                        )
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun grandChildRedrawRequestedWhileNotPlaced_placedWithLayer() {
+        assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
+            ConditionallyPlacedChild(shouldPlace) {
+                MeasureInLayoutBlock(placeWithLayer = true) {
+                    Spacer(
+                        Modifier.fillMaxSize()
+                            .drawBehind {
+                                drawRect(color.value)
+                            }
+                    )
+                }
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun grandChildRedrawAndRemeasureRequestedWhileNotPlaced() {
+        assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
+            ConditionallyPlacedChild(shouldPlace) {
+                MeasureInLayoutBlock {
+                    Spacer(
+                        Modifier.fillMaxSize()
+                            .layout(useDuringMeasure = color)
+                            .drawBehind {
+                                drawRect(color.value)
+                            }
+                    )
+                }
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun grandChildRedrawAndRelayoutRequestedWhileNotPlaced() {
+        assertChangeWhileNotPlacedIsApplied { shouldPlace, color ->
+            ConditionallyPlacedChild(shouldPlace) {
+                MeasureInLayoutBlock {
+                    Spacer(
+                        Modifier.fillMaxSize()
+                            .layout(useDuringLayout = color)
+                            .drawBehind {
+                                drawRect(color.value)
+                            }
+                    )
+                }
+            }
+        }
+    }
+
+    fun assertChangeWhileNotPlacedIsApplied(
+        content: @Composable (State<Boolean>, State<Color>) -> Unit
+    ) {
+        val shouldPlace = mutableStateOf(true)
+        var color = mutableStateOf(Color.Gray)
+        composeTestRule.setContent {
+            Box(
+                Modifier.background(Color.Blue)
+                    .testTag("node")
+            ) {
+                content(shouldPlace, color)
+            }
+        }
+
+        composeTestRule.runOnIdle {
+            shouldPlace.value = false
+        }
+
+        composeTestRule.runOnIdle {
+            color.value = Color.Red
+        }
+
+        composeTestRule.runOnIdle {
+            shouldPlace.value = true
+        }
+
+        composeTestRule.onNodeWithTag("node")
+            .captureToImage()
+            .assertCenterPixelColor(Color.Red)
+    }
 }
 
 @Composable
 private fun ConditionallyPlacedChild(
     shouldPlace: State<Boolean>,
-    modifier: Modifier,
+    modifier: Modifier = Modifier,
+    placeWithLayer: Boolean = false,
     content: @Composable () -> Unit
 ) {
     Layout(content = content, modifier = modifier) { measurables, constraints ->
         val placeable = measurables.first().measure(constraints)
         layout(placeable.width, placeable.height) {
             if (shouldPlace.value) {
-                placeable.place(0, 0)
+                if (placeWithLayer) {
+                    placeable.placeWithLayer(0, 0)
+                } else {
+                    placeable.place(0, 0)
+                }
             }
         }
     }
 }
 
 @Composable
-private fun MeasureInLayoutBlock(content: @Composable () -> Unit) {
-    Layout(content = content) { measurables, constraints ->
+private fun MeasureInLayoutBlock(
+    modifier: Modifier = Modifier,
+    placeWithLayer: Boolean = false,
+    content: @Composable () -> Unit
+) {
+    Layout(content = content, modifier = modifier) { measurables, constraints ->
         val size = 5.dp.roundToPx()
         layout(size, size) {
-            measurables.first().measure(constraints).place(0, 0)
+            val placeable = measurables.first().measure(constraints)
+            if (placeWithLayer) {
+                placeable.placeWithLayer(0, 0)
+            } else {
+                placeable.place(0, 0)
+            }
         }
     }
 }
+
+private fun Modifier.layout(
+    useDuringMeasure: State<*>? = null,
+    useDuringLayout: State<*>? = null,
+): Modifier = layout { measurable, constraints ->
+    useDuringMeasure?.value
+    val placeable = measurable.measure(constraints)
+    layout(placeable.width, placeable.height) {
+        useDuringLayout?.value
+        placeable.place(0, 0)
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/CustomFocusTraversalTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/CustomFocusTraversalTest.kt
index 6295606..8ded62c 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/CustomFocusTraversalTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/CustomFocusTraversalTest.kt
@@ -70,18 +70,18 @@
                     Modifier
                         .focusOrder(item1) { next = item3 }
                         .onFocusChanged { item1Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .onFocusChanged { item2Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .focusOrder(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
@@ -117,18 +117,18 @@
                     Modifier
                         .focusOrder(item1)
                         .onFocusChanged { item1Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .onFocusChanged { item2Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .focusOrder(item3) { previous = item1 }
                         .onFocusChanged { item3Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
@@ -165,18 +165,18 @@
                     Modifier
                         .focusOrder(item1)
                         .onFocusChanged { item1Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .onFocusChanged { item2Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .focusOrder(item3) { up = item1 }
                         .onFocusChanged { item3Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
@@ -213,18 +213,18 @@
                     Modifier
                         .focusOrder(item1) { down = item3 }
                         .onFocusChanged { item1Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .onFocusChanged { item2Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .focusOrder(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
@@ -261,18 +261,18 @@
                     Modifier
                         .focusOrder(item1)
                         .onFocusChanged { item1Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .onFocusChanged { item2Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .focusOrder(item3) { left = item1 }
                         .onFocusChanged { item3Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
@@ -309,18 +309,18 @@
                     Modifier
                         .focusOrder(item1) { right = item3 }
                         .onFocusChanged { item1Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .onFocusChanged { item2Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .focusOrder(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
@@ -359,18 +359,18 @@
                     Modifier
                         .focusOrder(item1)
                         .onFocusChanged { item1Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .onFocusChanged { item2Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .focusOrder(item3) { start = item1 }
                         .onFocusChanged { item3Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
@@ -409,18 +409,18 @@
                     Modifier
                         .focusOrder(item1) { end = item3 }
                         .onFocusChanged { item1Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .onFocusChanged { item2Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .focusOrder(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
@@ -459,25 +459,25 @@
                         Modifier
                             .focusOrder(item1) { next = item3 }
                             .onFocusChanged { item1Focused = it.isFocused }
-                            .focusModifier()
+                            .focusTarget()
                     )
                 }
                 Box(
                     Modifier
                         .onFocusChanged { item2Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .focusOrder(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .focusOrder(item4)
                         .onFocusChanged { item4Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
@@ -515,19 +515,19 @@
                         Modifier
                             .focusOrder(item1) { next = item3 }
                             .onFocusChanged { item1Focused = it.isFocused }
-                            .focusModifier()
+                            .focusTarget()
                     )
                 }
                 Box(
                     Modifier
                         .onFocusChanged { item2Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .focusOrder(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
@@ -566,19 +566,19 @@
                         Modifier
                             .focusOrder(item1) { next = item3 }
                             .onFocusChanged { item1Focused = it.isFocused }
-                            .focusModifier()
+                            .focusTarget()
                     )
                 }
                 Box(
                     Modifier
                         .onFocusChanged { item2Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     Modifier
                         .focusOrder(item3)
                         .onFocusChanged { item3Focused = it.isFocused }
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusChangedCountTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusChangedCountTest.kt
index 65329cc..4fa503a 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusChangedCountTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusChangedCountTest.kt
@@ -48,7 +48,7 @@
                 modifier = Modifier
                     .onFocusChanged { focusStates.add(it) }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
 
@@ -57,7 +57,7 @@
     }
 
     @Test
-    fun initiallyNoFocusModifier_onFocusChangedIsCalledOnce() {
+    fun initiallyNoFocusTarget_onFocusChangedIsCalledOnce() {
         // Arrange.
         val focusStates = mutableListOf<FocusState>()
         rule.setFocusableContent {
@@ -78,7 +78,7 @@
                 modifier = Modifier
                     .onFocusChanged { focusStates.add(it) }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -100,7 +100,7 @@
                 modifier = Modifier
                     .onFocusChanged { focusStates.add(it) }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -127,7 +127,7 @@
                 modifier = Modifier
                     .onFocusChanged { focusStates.add(it) }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -147,14 +147,14 @@
         // Arrange.
         val focusStates = mutableListOf<FocusState>()
         val focusRequester = FocusRequester()
-        lateinit var addFocusModifier: MutableState<Boolean>
+        lateinit var addFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
-            addFocusModifier = remember { mutableStateOf(true) }
+            addFocusTarget = remember { mutableStateOf(true) }
             Box(
                 modifier = Modifier
                     .onFocusChanged { focusStates.add(it) }
                     .focusRequester(focusRequester)
-                    .then(if (addFocusModifier.value) Modifier.focusModifier() else Modifier)
+                    .then(if (addFocusTarget.value) Modifier.focusTarget() else Modifier)
             )
         }
         rule.runOnIdle {
@@ -163,7 +163,7 @@
         }
 
         // Act.
-        rule.runOnIdle { addFocusModifier.value = false }
+        rule.runOnIdle { addFocusTarget.value = false }
 
         // Assert.
         rule.runOnIdle { assertThat(focusStates).containsExactly(Inactive) }
@@ -173,41 +173,41 @@
     fun removingInactiveFocusNode_onFocusChangedIsNotCalled() {
         // Arrange.
         val focusStates = mutableListOf<FocusState>()
-        lateinit var addFocusModifier: MutableState<Boolean>
+        lateinit var addFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
-            addFocusModifier = remember { mutableStateOf(true) }
+            addFocusTarget = remember { mutableStateOf(true) }
             Box(
                 modifier = Modifier
                     .onFocusChanged { focusStates.add(it) }
-                    .then(if (addFocusModifier.value) Modifier.focusModifier() else Modifier)
+                    .then(if (addFocusTarget.value) Modifier.focusTarget() else Modifier)
             )
         }
         rule.runOnIdle { focusStates.clear() }
 
         // Act.
-        rule.runOnIdle { addFocusModifier.value = false }
+        rule.runOnIdle { addFocusTarget.value = false }
 
         // Assert.
         rule.runOnIdle { assertThat(focusStates).isEmpty() }
     }
 
     @Test
-    fun addingFocusModifier_onFocusChangedIsNotCalled() {
+    fun addingFocusTarget_onFocusChangedIsNotCalled() {
         // Arrange.
         val focusStates = mutableListOf<FocusState>()
-        lateinit var addFocusModifier: MutableState<Boolean>
+        lateinit var addFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
-            addFocusModifier = remember { mutableStateOf(false) }
+            addFocusTarget = remember { mutableStateOf(false) }
             Box(
                 modifier = Modifier
                     .onFocusChanged { focusStates.add(it) }
-                    .then(if (addFocusModifier.value) Modifier.focusModifier() else Modifier)
+                    .then(if (addFocusTarget.value) Modifier.focusTarget() else Modifier)
             )
         }
         rule.runOnIdle { focusStates.clear() }
 
         // Act.
-        rule.runOnIdle { addFocusModifier.value = true }
+        rule.runOnIdle { addFocusTarget.value = true }
 
         // Assert.
         rule.runOnIdle { assertThat(focusStates).isEmpty() }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusChangedTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusChangedTest.kt
index c1c3e8b..781fa34 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusChangedTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusChangedTest.kt
@@ -71,12 +71,12 @@
                 modifier = Modifier
                     .onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             ) {
                 Box(
                     modifier = Modifier
                         .focusRequester(childFocusRequester)
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
@@ -212,7 +212,7 @@
     }
 
     @Test
-    fun active_requestFocus_multipleObserversWithExtraFocusModifierInBetween() {
+    fun active_requestFocus_multipleObserversWithExtraFocusTargetInBetween() {
         // Arrange.
         lateinit var focusState1: FocusState
         lateinit var focusState2: FocusState
@@ -224,11 +224,11 @@
                 modifier = Modifier
                     .onFocusChanged { focusState1 = it }
                     .onFocusChanged { focusState2 = it }
-                    .focusModifier()
+                    .focusTarget()
                     .onFocusChanged { focusState3 = it }
                     .onFocusChanged { focusState4 = it }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusEventCountTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusEventCountTest.kt
index e585113..dcafd34 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusEventCountTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusEventCountTest.kt
@@ -48,7 +48,7 @@
                 modifier = Modifier
                     .onFocusEvent { focusStates.add(it) }
                     .focusRequester(focusReferece)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
 
@@ -63,7 +63,7 @@
     }
 
     @Test
-    fun initiallyNoFocusModifier_onFocusEventIsCalledOnce() {
+    fun initiallyNoFocusTarget_onFocusEventIsCalledOnce() {
         // Arrange.
         val focusStates = mutableListOf<FocusState>()
         rule.setFocusableContent {
@@ -84,7 +84,7 @@
                 modifier = Modifier
                     .onFocusEvent { focusStates.add(it) }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
         rule.runOnIdle { focusStates.clear() }
@@ -106,7 +106,7 @@
                 modifier = Modifier
                     .onFocusEvent { focusStates.add(it) }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -133,7 +133,7 @@
                 modifier = Modifier
                     .onFocusEvent { focusStates.add(it) }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -153,14 +153,14 @@
         // Arrange.
         val focusStates = mutableListOf<FocusState>()
         val focusRequester = FocusRequester()
-        lateinit var addFocusModifier: MutableState<Boolean>
+        lateinit var addFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
-            addFocusModifier = remember { mutableStateOf(true) }
+            addFocusTarget = remember { mutableStateOf(true) }
             Box(
                 modifier = Modifier
                     .onFocusEvent { focusStates.add(it) }
                     .focusRequester(focusRequester)
-                    .then(if (addFocusModifier.value) Modifier.focusModifier() else Modifier)
+                    .then(if (addFocusTarget.value) Modifier.focusTarget() else Modifier)
             )
         }
         rule.runOnIdle {
@@ -169,7 +169,7 @@
         }
 
         // Act.
-        rule.runOnIdle { addFocusModifier.value = false }
+        rule.runOnIdle { addFocusTarget.value = false }
 
         // Assert.
         rule.runOnIdle {
@@ -184,41 +184,41 @@
     fun removingInactiveFocusNode_onFocusEventIsCalledOnce() {
         // Arrange.
         val focusStates = mutableListOf<FocusState>()
-        lateinit var addFocusModifier: MutableState<Boolean>
+        lateinit var addFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
-            addFocusModifier = remember { mutableStateOf(true) }
+            addFocusTarget = remember { mutableStateOf(true) }
             Box(
                 modifier = Modifier
                     .onFocusEvent { focusStates.add(it) }
-                    .then(if (addFocusModifier.value) Modifier.focusModifier() else Modifier)
+                    .then(if (addFocusTarget.value) Modifier.focusTarget() else Modifier)
             )
         }
         rule.runOnIdle { focusStates.clear() }
 
         // Act.
-        rule.runOnIdle { addFocusModifier.value = false }
+        rule.runOnIdle { addFocusTarget.value = false }
 
         // Assert.
         rule.runOnIdle { assertThat(focusStates).containsExactly(Inactive) }
     }
 
     @Test
-    fun addingFocusModifier_onFocusEventIsCalledThrice() {
+    fun addingFocusTarget_onFocusEventIsCalledThrice() {
         // Arrange.
         val focusStates = mutableListOf<FocusState>()
-        lateinit var addFocusModifier: MutableState<Boolean>
+        lateinit var addFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
-            addFocusModifier = remember { mutableStateOf(false) }
+            addFocusTarget = remember { mutableStateOf(false) }
             Box(
                 modifier = Modifier
                     .onFocusEvent { focusStates.add(it) }
-                    .then(if (addFocusModifier.value) Modifier.focusModifier() else Modifier)
+                    .then(if (addFocusTarget.value) Modifier.focusTarget() else Modifier)
             )
         }
         rule.runOnIdle { focusStates.clear() }
 
         // Act.
-        rule.runOnIdle { addFocusModifier.value = true }
+        rule.runOnIdle { addFocusTarget.value = true }
 
         // Assert.
         rule.runOnIdle {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusManagerCompositionLocalTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusManagerCompositionLocalTest.kt
index c6bb169..92ab9fd 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusManagerCompositionLocalTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusManagerCompositionLocalTest.kt
@@ -46,7 +46,7 @@
                 modifier = Modifier
                     .focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
-                    .focusModifier()
+                    .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -75,18 +75,18 @@
             Box(
                 modifier = Modifier
                     .onFocusChanged { grandparentFocusState = it }
-                    .focusModifier()
+                    .focusTarget()
             ) {
                 Box(
                     modifier = Modifier
                         .onFocusChanged { parentFocusState = it }
-                        .focusModifier()
+                        .focusTarget()
                 ) {
                     Box(
                         modifier = Modifier
                             .focusRequester(focusRequester)
                             .onFocusChanged { focusState = it }
-                            .focusModifier()
+                            .focusTarget()
                     )
                 }
             }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusRequesterTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusRequesterTest.kt
index 330c71d..89e56e1 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusRequesterTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusRequesterTest.kt
@@ -37,7 +37,7 @@
     val rule = createComposeRule()
 
     @Test
-    fun requestFocus_noFocusModifierInLayoutNode() {
+    fun requestFocus_noFocusTargetInLayoutNode() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
@@ -59,7 +59,7 @@
     }
 
     @Test
-    fun requestFocus_focusModifierInLayoutNode_butBeforeFocusRequester() {
+    fun requestFocus_focusTargetInLayoutNode_butBeforeFocusRequester() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
@@ -67,7 +67,7 @@
             Box(
                 modifier = Modifier
                     .onFocusChanged { focusState = it }
-                    .focusModifier()
+                    .focusTarget()
                     .focusRequester(focusRequester)
             )
         }
@@ -82,7 +82,7 @@
     }
 
     @Test
-    fun requestFocus_focusModifierInLayoutNode() {
+    fun requestFocus_focusTargetInLayoutNode() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
@@ -91,7 +91,7 @@
                 modifier = Modifier
                     .onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
 
@@ -105,7 +105,7 @@
     }
 
     @Test
-    fun requestFocus_focusModifierInChildLayoutNode() {
+    fun requestFocus_focusTargetInChildLayoutNode() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
@@ -115,7 +115,7 @@
                     .focusRequester(focusRequester)
                     .onFocusChanged { focusState = it }
             ) {
-                Box(modifier = Modifier.focusModifier())
+                Box(modifier = Modifier.focusTarget())
             }
         }
 
@@ -129,7 +129,7 @@
     }
 
     @Test
-    fun requestFocus_focusModifierAndReferenceInChildLayoutNode() {
+    fun requestFocus_focusTargetAndReferenceInChildLayoutNode() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
@@ -140,7 +140,7 @@
                 Box(
                     modifier = Modifier
                         .focusRequester(focusRequester)
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
@@ -155,7 +155,7 @@
     }
 
     @Test
-    fun requestFocus_focusModifierAndObserverInChildLayoutNode() {
+    fun requestFocus_focusTargetAndObserverInChildLayoutNode() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
@@ -166,7 +166,7 @@
                 Box(
                     modifier = Modifier
                         .onFocusChanged { focusState = it }
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
@@ -181,7 +181,7 @@
     }
 
     @Test
-    fun requestFocus_focusModifierInDistantDescendantLayoutNode() {
+    fun requestFocus_focusTargetInDistantDescendantLayoutNode() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
@@ -197,7 +197,7 @@
                             Box {
                                 Box {
                                     Box(
-                                        modifier = Modifier.focusModifier()
+                                        modifier = Modifier.focusTarget()
                                     )
                                 }
                             }
@@ -229,12 +229,12 @@
                 Box(
                     modifier = Modifier
                         .onFocusChanged { focusState1 = it }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     modifier = Modifier
                         .onFocusChanged { focusState2 = it }
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
@@ -264,12 +264,12 @@
                 Box(
                     modifier = Modifier
                         .focusRequester(focusRequester1)
-                        .focusModifier()
+                        .focusTarget()
                 )
                 Box(
                     modifier = Modifier
                         .focusRequester(focusRequester2)
-                        .focusModifier()
+                        .focusTarget()
                 )
             }
         }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusModifierAttachDetachTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusTargetAttachDetachTest.kt
similarity index 64%
rename from compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusModifierAttachDetachTest.kt
rename to compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusTargetAttachDetachTest.kt
index 1702666..6939cc9 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusModifierAttachDetachTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusTargetAttachDetachTest.kt
@@ -31,7 +31,7 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-class FocusModifierAttachDetachTest {
+class FocusTargetAttachDetachTest {
     @get:Rule
     val rule = createComposeRule()
 
@@ -40,25 +40,25 @@
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
-        lateinit var observingFocusModifier1: MutableState<Boolean>
+        lateinit var observingFocusTarget1: MutableState<Boolean>
         rule.setFocusableContent {
             val focusRequesterModifier = Modifier.focusRequester(focusRequester)
             val onFocusChanged = Modifier.onFocusChanged { focusState = it }
-            val focusModifier1 = Modifier.focusModifier()
-            val focusModifier2 = Modifier.focusModifier()
+            val focusTarget1 = Modifier.focusTarget()
+            val focusTarget2 = Modifier.focusTarget()
             Box {
-                observingFocusModifier1 = remember { mutableStateOf(true) }
+                observingFocusTarget1 = remember { mutableStateOf(true) }
                 Box(
-                    modifier = if (observingFocusModifier1.value) {
+                    modifier = if (observingFocusTarget1.value) {
                         onFocusChanged
                             .then(focusRequesterModifier)
-                            .then(focusModifier1)
-                            .then(focusModifier2)
+                            .then(focusTarget1)
+                            .then(focusTarget2)
                     } else {
-                        focusModifier1
+                        focusTarget1
                             .then(onFocusChanged)
                             .then(focusRequesterModifier)
-                            .then(focusModifier2)
+                            .then(focusTarget2)
                     }
                 )
             }
@@ -69,31 +69,31 @@
         }
 
         // Act.
-        rule.runOnIdle { observingFocusModifier1.value = false }
+        rule.runOnIdle { observingFocusTarget1.value = false }
 
         // Assert.
         rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @Test
-    fun removedModifier_onFocusChangedDoesNotHaveAFocusModifier() {
+    fun removedModifier_onFocusChangedDoesNotHaveAFocusTarget() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
-        lateinit var onFocusChangedHasFocusModifier: MutableState<Boolean>
+        lateinit var onFocusChangedHasFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
             val focusRequesterModifier = Modifier.focusRequester(focusRequester)
             val onFocusChanged = Modifier.onFocusChanged { focusState = it }
-            val focusModifier = Modifier.focusModifier()
+            val focusTarget = Modifier.focusTarget()
             Box {
-                onFocusChangedHasFocusModifier = remember { mutableStateOf(true) }
+                onFocusChangedHasFocusTarget = remember { mutableStateOf(true) }
                 Box(
-                    modifier = if (onFocusChangedHasFocusModifier.value) {
+                    modifier = if (onFocusChangedHasFocusTarget.value) {
                         onFocusChanged
                             .then(focusRequesterModifier)
-                            .then(focusModifier)
+                            .then(focusTarget)
                     } else {
-                        focusModifier
+                        focusTarget
                             .then(onFocusChanged)
                             .then(focusRequesterModifier)
                     }
@@ -106,24 +106,24 @@
         }
 
         // Act.
-        rule.runOnIdle { onFocusChangedHasFocusModifier.value = false }
+        rule.runOnIdle { onFocusChangedHasFocusTarget.value = false }
 
         // Assert.
         rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @Test
-    fun removedFocusModifier_withNoNextFocusModifier() {
+    fun removedFocusTarget_withNoNextFocusTarget() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
-        lateinit var optionalFocusModifier: MutableState<Boolean>
+        lateinit var optionalFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
-            optionalFocusModifier = remember { mutableStateOf(true) }
+            optionalFocusTarget = remember { mutableStateOf(true) }
             Box(
                 modifier = Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
-                    .then(if (optionalFocusModifier.value) Modifier.focusModifier() else Modifier)
+                    .then(if (optionalFocusTarget.value) Modifier.focusTarget() else Modifier)
             )
         }
         rule.runOnIdle {
@@ -132,26 +132,26 @@
         }
 
         // Act.
-        rule.runOnIdle { optionalFocusModifier.value = false }
+        rule.runOnIdle { optionalFocusTarget.value = false }
 
         // Assert.
         rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @Test
-    fun removedActiveFocusModifier_pointsToNextFocusModifier() {
+    fun removedActiveFocusTarget_pointsToNextFocusTarget() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
-        lateinit var optionalFocusModifier: MutableState<Boolean>
+        lateinit var optionalFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
-            optionalFocusModifier = remember { mutableStateOf(true) }
+            optionalFocusTarget = remember { mutableStateOf(true) }
             Box(
                 modifier = Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
-                    .then(if (optionalFocusModifier.value) Modifier.focusModifier() else Modifier)
+                    .then(if (optionalFocusTarget.value) Modifier.focusTarget() else Modifier)
             ) {
-                Box(modifier = Modifier.focusModifier())
+                Box(modifier = Modifier.focusTarget())
             }
         }
         rule.runOnIdle {
@@ -160,26 +160,26 @@
         }
 
         // Act.
-        rule.runOnIdle { optionalFocusModifier.value = false }
+        rule.runOnIdle { optionalFocusTarget.value = false }
 
         // Assert.
         rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @Test
-    fun removedCapturedFocusModifier_pointsToNextFocusModifier() {
+    fun removedCapturedFocusTarget_pointsToNextFocusTarget() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
-        lateinit var optionalFocusModifier: MutableState<Boolean>
+        lateinit var optionalFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
-            optionalFocusModifier = remember { mutableStateOf(true) }
+            optionalFocusTarget = remember { mutableStateOf(true) }
             Box(
                 modifier = Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
-                    .then(if (optionalFocusModifier.value) Modifier.focusModifier() else Modifier)
+                    .then(if (optionalFocusTarget.value) Modifier.focusTarget() else Modifier)
             ) {
-                Box(modifier = Modifier.focusModifier())
+                Box(modifier = Modifier.focusTarget())
             }
         }
         rule.runOnIdle {
@@ -189,26 +189,26 @@
         }
 
         // Act.
-        rule.runOnIdle { optionalFocusModifier.value = false }
+        rule.runOnIdle { optionalFocusTarget.value = false }
 
         // Assert.
         rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @Test
-    fun removedActiveParentFocusModifier_pointsToNextFocusModifier() {
+    fun removedActiveParentFocusTarget_pointsToNextFocusTarget() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
-        lateinit var optionalFocusModifier: MutableState<Boolean>
+        lateinit var optionalFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
-            optionalFocusModifier = remember { mutableStateOf(true) }
+            optionalFocusTarget = remember { mutableStateOf(true) }
             Box(
                 modifier = Modifier.onFocusChanged { focusState = it }
-                    .then(if (optionalFocusModifier.value) Modifier.focusModifier() else Modifier)
+                    .then(if (optionalFocusTarget.value) Modifier.focusTarget() else Modifier)
                     .focusRequester(focusRequester)
             ) {
-                Box(modifier = Modifier.focusModifier())
+                Box(modifier = Modifier.focusTarget())
             }
         }
         rule.runOnIdle {
@@ -217,28 +217,28 @@
         }
 
         // Act.
-        rule.runOnIdle { optionalFocusModifier.value = false }
+        rule.runOnIdle { optionalFocusTarget.value = false }
 
         // Assert.
         rule.runOnIdle { assertThat(focusState.isFocused).isTrue() }
     }
 
     @Test
-    fun removedActiveParentFocusModifier_withNoNextFocusModifier() {
+    fun removedActiveParentFocusTarget_withNoNextFocusTarget() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
-        lateinit var optionalFocusModifier: MutableState<Boolean>
+        lateinit var optionalFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
-            optionalFocusModifier = remember { mutableStateOf(true) }
+            optionalFocusTarget = remember { mutableStateOf(true) }
             Box(
                 modifier = Modifier.onFocusChanged { focusState = it }
                     .then(
-                        if (optionalFocusModifier.value) {
+                        if (optionalFocusTarget.value) {
                             Modifier
-                                .focusModifier()
+                                .focusTarget()
                                 .focusRequester(focusRequester)
-                                .focusModifier()
+                                .focusTarget()
                         } else {
                             Modifier
                         }
@@ -251,32 +251,32 @@
         }
 
         // Act.
-        rule.runOnIdle { optionalFocusModifier.value = false }
+        rule.runOnIdle { optionalFocusTarget.value = false }
 
         // Assert.
         rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @Test
-    fun removedActiveParentFocusModifierAndFocusedChild_clearsFocusFromAllParents() {
+    fun removedActiveParentFocusTargetAndFocusedChild_clearsFocusFromAllParents() {
         // Arrange.
         lateinit var focusState: FocusState
         lateinit var parentFocusState: FocusState
         val focusRequester = FocusRequester()
-        lateinit var optionalFocusModifiers: MutableState<Boolean>
+        lateinit var optionalFocusTargets: MutableState<Boolean>
         rule.setFocusableContent {
-            optionalFocusModifiers = remember { mutableStateOf(true) }
+            optionalFocusTargets = remember { mutableStateOf(true) }
             Box(
                 modifier = Modifier
                     .onFocusChanged { parentFocusState = it }
-                    .focusModifier()
+                    .focusTarget()
             ) {
                 Box(
                     modifier = Modifier.onFocusChanged { focusState = it }.then(
-                        if (optionalFocusModifiers.value) {
-                            Modifier.focusModifier()
+                        if (optionalFocusTargets.value) {
+                            Modifier.focusTarget()
                                 .focusRequester(focusRequester)
-                                .focusModifier()
+                                .focusTarget()
                         } else {
                             Modifier
                         }
@@ -291,7 +291,7 @@
         }
 
         // Act.
-        rule.runOnIdle { optionalFocusModifiers.value = false }
+        rule.runOnIdle { optionalFocusTargets.value = false }
 
         // Assert.
         rule.runOnIdle {
@@ -301,42 +301,42 @@
     }
 
     @Test
-    fun removedInactiveFocusModifier_pointsToNextFocusModifier() {
+    fun removedInactiveFocusTarget_pointsToNextFocusTarget() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
-        lateinit var optionalFocusModifier: MutableState<Boolean>
+        lateinit var optionalFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
-            optionalFocusModifier = remember { mutableStateOf(true) }
+            optionalFocusTarget = remember { mutableStateOf(true) }
             Box(
                 modifier = Modifier.onFocusChanged { focusState = it }
-                    .then(if (optionalFocusModifier.value) Modifier.focusModifier() else Modifier)
+                    .then(if (optionalFocusTarget.value) Modifier.focusTarget() else Modifier)
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
 
         // Act.
-        rule.runOnIdle { optionalFocusModifier.value = false }
+        rule.runOnIdle { optionalFocusTarget.value = false }
 
         // Assert.
         rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @Test
-    fun addedFocusModifier_pointsToTheFocusModifierJustAdded() {
+    fun addedFocusTarget_pointsToTheFocusTargetJustAdded() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
-        lateinit var addFocusModifier: MutableState<Boolean>
+        lateinit var addFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
-            addFocusModifier = remember { mutableStateOf(false) }
+            addFocusTarget = remember { mutableStateOf(false) }
             Box(
                 modifier = Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
-                    .then(if (addFocusModifier.value) Modifier.focusModifier() else Modifier)
+                    .then(if (addFocusTarget.value) Modifier.focusTarget() else Modifier)
             ) {
-                Box(modifier = Modifier.focusModifier())
+                Box(modifier = Modifier.focusTarget())
             }
         }
         rule.runOnIdle {
@@ -345,24 +345,24 @@
         }
 
         // Act.
-        rule.runOnIdle { addFocusModifier.value = true }
+        rule.runOnIdle { addFocusTarget.value = true }
 
         // Assert.
         rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
     }
 
     @Test
-    fun addedFocusModifier_withNoNextFocusModifier() {
+    fun addedFocusTarget_withNoNextFocusTarget() {
         // Arrange.
         lateinit var focusState: FocusState
         val focusRequester = FocusRequester()
-        lateinit var addFocusModifier: MutableState<Boolean>
+        lateinit var addFocusTarget: MutableState<Boolean>
         rule.setFocusableContent {
-            addFocusModifier = remember { mutableStateOf(false) }
+            addFocusTarget = remember { mutableStateOf(false) }
             Box(
                 modifier = Modifier.onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
-                    .then(if (addFocusModifier.value) Modifier.focusModifier() else Modifier)
+                    .then(if (addFocusTarget.value) Modifier.focusTarget() else Modifier)
             )
         }
         rule.runOnIdle {
@@ -371,7 +371,7 @@
         }
 
         // Act.
-        rule.runOnIdle { addFocusModifier.value = true }
+        rule.runOnIdle { addFocusTarget.value = true }
 
         // Assert.
         rule.runOnIdle { assertThat(focusState.isFocused).isFalse() }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusTestUtils.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusTestUtils.kt
index 60f29e2..8dce219 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusTestUtils.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusTestUtils.kt
@@ -59,7 +59,7 @@
             .offset { IntOffset(x, y) }
             .focusRequester(focusRequester ?: FocusRequester())
             .onFocusChanged { isFocused.value = it.isFocused }
-            .focusModifier(),
+            .focusTarget(),
         measurePolicy = remember(width, height) {
             MeasurePolicy { measurables, constraint ->
                 layout(width, height) {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
index 15503e5..bfeff0b 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
@@ -48,7 +48,7 @@
             Box(
                 modifier = Modifier
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
 
@@ -76,7 +76,7 @@
                 modifier = Modifier
                     .onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
 
@@ -104,7 +104,7 @@
                 modifier = Modifier
                     .onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
 
@@ -131,7 +131,7 @@
                 modifier = Modifier
                     .onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
         rule.runOnIdle {
@@ -161,7 +161,7 @@
                 modifier = Modifier
                     .onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
         rule.runOnIdle {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterTest.kt
index 15200ab..1e34391 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/ReusedFocusRequesterTest.kt
@@ -42,7 +42,7 @@
                 modifier = Modifier
                     .onFocusChanged { focusState = it }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
 
@@ -66,13 +66,13 @@
                 modifier = Modifier
                     .onFocusChanged { focusState1 = it }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
             Box(
                 modifier = Modifier
                     .onFocusChanged { focusState2 = it }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
 
@@ -98,19 +98,19 @@
                 modifier = Modifier
                     .onFocusChanged { focusState1 = it }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
             Box(
                 modifier = Modifier
                     .onFocusChanged { focusState2 = it }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
             Box(
                 modifier = Modifier
                     .onFocusChanged { focusState3 = it }
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
             )
         }
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/SetRootFocusTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/SetRootFocusTest.kt
index 1e3b648..771dad1 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/SetRootFocusTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/SetRootFocusTest.kt
@@ -61,7 +61,7 @@
                             isFocused = it.isFocused
                             focusChanged.countDown()
                         }
-                        .focusModifier()
+                        .focusTarget()
                 )
                 BasicText(
                     text = "Non Clickable Text",
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt
index 2980541..ddf186e 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt
@@ -141,7 +141,7 @@
                 Modifier
                     .focusRequester(initialFocusRequester)
                     .onFocusChanged { isColumnFocused = it.isFocused }
-                    .focusModifier()
+                    .focusTarget()
             ) {
                 Row {
                     FocusableBox(isFocused[0])
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt
index 60dfe8c..383b749 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorTest.kt
@@ -305,6 +305,44 @@
         rule.onNodeWithTag(testTag).captureToImage().assertPixels { Color.Blue }
     }
 
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun testVectorChangeSize() {
+        val size = mutableStateOf(200)
+        val color = mutableStateOf(Color.Magenta)
+
+        rule.setContent {
+            val background = Modifier.background(Color.Red).paint(
+                createTestVectorPainter(size.value, color.value),
+                alignment = Alignment.TopStart
+            )
+            AtLeastSize(size = 400, modifier = background) {
+            }
+        }
+
+        takeScreenShot(400).apply {
+            assertEquals(getPixel(100, 100), Color.Magenta.toArgb())
+            assertEquals(getPixel(300, 300), Color.Red.toArgb())
+        }
+
+        size.value = 400
+        color.value = Color.Cyan
+
+        takeScreenShot(400).apply {
+            assertEquals(getPixel(100, 100), Color.Cyan.toArgb())
+            assertEquals(getPixel(300, 300), Color.Cyan.toArgb())
+        }
+
+        size.value = 50
+        color.value = Color.Yellow
+
+        takeScreenShot(400).apply {
+            assertEquals(getPixel(10, 10), Color.Yellow.toArgb())
+            assertEquals(getPixel(100, 100), Color.Red.toArgb())
+            assertEquals(getPixel(300, 300), Color.Red.toArgb())
+        }
+    }
+
     @Composable
     private fun VectorTint(
         size: Int = 200,
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt
index 085ecbd..6238323 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt
@@ -23,8 +23,8 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusModifier
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.focus.focusTarget
 import androidx.compose.ui.focus.setFocusableContent
 import androidx.compose.ui.input.key.Key.Companion.A
 import androidx.compose.ui.input.key.KeyEventType.Companion.KeyDown
@@ -66,7 +66,7 @@
             Box(
                 modifier = Modifier
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
                     .onKeyEvent {
                         receivedKeyEvent = it
                         true
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/ProcessKeyInputTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/ProcessKeyInputTest.kt
index 7aad0ba..0f389a1 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/ProcessKeyInputTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/ProcessKeyInputTest.kt
@@ -19,13 +19,13 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusModifier
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.focus.setFocusableContent
 import android.view.KeyEvent.KEYCODE_A as KeyCodeA
 import android.view.KeyEvent as AndroidKeyEvent
 import android.view.KeyEvent.ACTION_DOWN
 import android.view.KeyEvent.ACTION_UP
+import androidx.compose.ui.focus.focusTarget
 import androidx.compose.ui.input.key.Key.Companion.A
 import androidx.compose.ui.input.key.KeyEventType.Companion.KeyDown
 import androidx.compose.ui.input.key.KeyEventType.Companion.KeyUp
@@ -47,7 +47,7 @@
     val rule = createComposeRule()
 
     @Test(expected = IllegalStateException::class)
-    fun noRootFocusModifier_throwsException() {
+    fun noRootFocusTarget_throwsException() {
         // Arrange.
         rule.setContent {
             Box(modifier = KeyInputModifier(null, null))
@@ -58,7 +58,7 @@
     }
 
     @Test(expected = IllegalStateException::class)
-    fun noFocusModifier_throwsException() {
+    fun noFocusTarget_throwsException() {
         // Arrange.
         rule.setFocusableContent {
             Box(modifier = Modifier.onKeyEvent { true })
@@ -69,11 +69,11 @@
     }
 
     @Test(expected = IllegalStateException::class)
-    fun focusModifierNotFocused_throwsException() {
+    fun focusTargetNotFocused_throwsException() {
 
         // Arrange.
         rule.setFocusableContent {
-            Box(modifier = Modifier.focusModifier().onKeyEvent { true })
+            Box(modifier = Modifier.focusTarget().onKeyEvent { true })
         }
 
         // Act.
@@ -89,7 +89,7 @@
             Box(
                 modifier = Modifier
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
                     .onKeyEvent {
                         receivedKeyEvent = it
                         true
@@ -121,7 +121,7 @@
             Box(
                 modifier = Modifier
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
                     .onPreviewKeyEvent {
                         receivedKeyEvent = it
                         true
@@ -154,7 +154,7 @@
             Box(
                 modifier = Modifier
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
                     .onKeyEvent {
                         receivedKeyEvent = it
                         true
@@ -191,7 +191,7 @@
             Box(
                 modifier = Modifier
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
                     .onKeyEvent {
                         onKeyEventTrigger = triggerIndex++
                         true
@@ -228,7 +228,7 @@
         rule.setFocusableContent {
             Box(
                 modifier = Modifier
-                    .focusModifier()
+                    .focusTarget()
                     .onKeyEvent {
                         parentOnKeyEventTrigger = triggerIndex++
                         false
@@ -241,7 +241,7 @@
                 Box(
                     modifier = Modifier
                         .focusRequester(focusRequester)
-                        .focusModifier()
+                        .focusTarget()
                         .onKeyEvent {
                             childOnKeyEventTrigger = triggerIndex++
                             false
@@ -293,7 +293,7 @@
                 Box(
                     modifier = Modifier
                         .focusRequester(focusRequester)
-                        .focusModifier()
+                        .focusTarget()
                         .onKeyEvent {
                             childOnKeyEventTrigger = triggerIndex++
                             false
@@ -335,7 +335,7 @@
         rule.setFocusableContent {
             Box(
                 modifier = Modifier
-                    .focusModifier()
+                    .focusTarget()
                     .onKeyEvent {
                         grandParentOnKeyEventTrigger = triggerIndex++
                         false
@@ -347,7 +347,7 @@
             ) {
                 Box(
                     modifier = Modifier
-                        .focusModifier()
+                        .focusTarget()
                         .onKeyEvent {
                             parentOnKeyEventTrigger = triggerIndex++
                             false
@@ -360,7 +360,7 @@
                     Box(
                         modifier = Modifier
                             .focusRequester(focusRequester)
-                            .focusModifier()
+                            .focusTarget()
                             .onKeyEvent {
                                 childOnKeyEventTrigger = triggerIndex++
                                 false
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
index f67e8b7..3e51d7d 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
@@ -109,7 +109,13 @@
 
     @Test
     fun pointerTypePassed() {
-        val pointerTypes = PointerType.values()
+        val pointerTypes = listOf(
+            PointerType.Unknown,
+            PointerType.Touch,
+            PointerType.Mouse,
+            PointerType.Stylus,
+            PointerType.Eraser
+        )
 
         // Arrange
         val pointerInputFilter = PointerInputFilterMock()
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/AndroidViewCompatTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/AndroidViewCompatTest.kt
index 3aa73c6..b55814c 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/AndroidViewCompatTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/AndroidViewCompatTest.kt
@@ -639,6 +639,50 @@
             .assertPixels(expectedColorProvider = offsetColorProvider)
     }
 
+    @Test
+    fun testInvalidationsDuringDraw_withLayerInBetween() {
+        var view: InvalidateDuringComputeScroll? = null
+        rule.setContent {
+            val context = LocalContext.current
+            view = remember { InvalidateDuringComputeScroll(context) }
+            // Note having a graphics layer here will cause the updateDisplayList to not happen
+            // in the initial redraw traversal.
+            AndroidView(factory = { view!! }, modifier = Modifier.graphicsLayer().graphicsLayer())
+        }
+
+        val invalidatesDuringScroll = 4
+        rule.runOnIdle {
+            view!!.apply {
+                draws = 0
+                this.invalidatesDuringScroll = invalidatesDuringScroll
+                invalidate()
+            }
+        }
+
+        rule.runOnIdle { assertEquals(invalidatesDuringScroll + 1, view!!.draws) }
+    }
+
+    @Test
+    fun testInvalidationsDuringDraw_sameLayerAsAndroidComposeView() {
+        var view: InvalidateDuringComputeScroll? = null
+        rule.setContent {
+            val context = LocalContext.current
+            view = remember { InvalidateDuringComputeScroll(context) }
+            AndroidView(factory = { view!! })
+        }
+
+        val invalidatesDuringScroll = 4
+        rule.runOnIdle {
+            view!!.apply {
+                draws = 0
+                this.invalidatesDuringScroll = invalidatesDuringScroll
+                invalidate()
+            }
+        }
+
+        rule.runOnIdle { assertEquals(invalidatesDuringScroll + 1, view!!.draws) }
+    }
+
     class ColoredSquareView(context: Context) : View(context) {
         var size: Int = 100
             set(value) {
@@ -696,6 +740,23 @@
         }
     }
 
+    class InvalidateDuringComputeScroll(context: Context) : View(context) {
+        var draws = 0
+        var invalidatesDuringScroll = 0
+
+        override fun computeScroll() {
+            if (invalidatesDuringScroll > 0) {
+                --invalidatesDuringScroll
+                invalidate()
+            }
+        }
+
+        override fun onDraw(canvas: Canvas?) {
+            super.onDraw(canvas)
+            ++draws
+        }
+    }
+
     fun Modifier.layoutConstraints(childConstraints: Constraints): Modifier =
         this.then(object : LayoutModifier {
             override fun MeasureScope.measure(
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/semantics/SemanticsTests.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/semantics/SemanticsTests.kt
index b76d2e9..9df6b5b 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/semantics/SemanticsTests.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/semantics/SemanticsTests.kt
@@ -721,9 +721,9 @@
                 Modifier.testTag(TestTag)
             ) {
                 SimpleTestLayout(
-                    Modifier.zIndex(1f).semantics { contentDescription = child1 }
+                    Modifier.zIndex(1f).semantics { testTag = child1 }
                 ) {}
-                SimpleTestLayout(Modifier.semantics { contentDescription = child2 }) { }
+                SimpleTestLayout(Modifier.semantics { testTag = child2 }) { }
             }
         }
 
@@ -731,11 +731,11 @@
         assertEquals(2, root.children.size)
         assertEquals(
             child2,
-            root.children[0].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.children[0].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             child1,
-            root.children[1].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.children[1].config.getOrNull(SemanticsProperties.TestTag)
         )
     }
 
@@ -751,10 +751,10 @@
                     Modifier
                         .requiredSize(50.dp)
                         .zIndex(1f)
-                        .semantics { contentDescription = child1 }
+                        .semantics { testTag = child1 }
                 ) {}
                 SimpleTestLayout(
-                    Modifier.requiredSize(50.dp).semantics { contentDescription = child2 }
+                    Modifier.requiredSize(50.dp).semantics { testTag = child2 }
                 ) {}
             }
         }
@@ -763,11 +763,11 @@
         assertEquals(2, root.childrenSortedByBounds.size)
         assertEquals(
             child1,
-            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             child2,
-            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
         )
     }
 
@@ -783,10 +783,10 @@
                     Modifier
                         .requiredSize(50.dp)
                         .zIndex(1f)
-                        .semantics { contentDescription = child1 }
+                        .semantics { testTag = child1 }
                 ) {}
                 SimpleTestLayout(
-                    Modifier.requiredSize(50.dp).semantics { contentDescription = child2 }
+                    Modifier.requiredSize(50.dp).semantics { testTag = child2 }
                 ) {}
             }
         }
@@ -795,11 +795,11 @@
         assertEquals(2, root.childrenSortedByBounds.size)
         assertEquals(
             child1,
-            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             child2,
-            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
         )
     }
 
@@ -815,10 +815,10 @@
                     Modifier
                         .requiredSize(50.dp)
                         .offset(x = 0.dp, y = 50.dp)
-                        .semantics { contentDescription = child1 }
+                        .semantics { testTag = child1 }
                 ) {}
                 SimpleTestLayout(
-                    Modifier.requiredSize(50.dp).semantics { contentDescription = child2 }
+                    Modifier.requiredSize(50.dp).semantics { testTag = child2 }
                 ) {}
             }
         }
@@ -827,11 +827,11 @@
         assertEquals(2, root.childrenSortedByBounds.size)
         assertEquals(
             child2,
-            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             child1,
-            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
         )
     }
 
@@ -847,10 +847,10 @@
                     Modifier
                         .requiredSize(50.dp)
                         .offset(x = 50.dp, y = 0.dp)
-                        .semantics { contentDescription = child1 }
+                        .semantics { testTag = child1 }
                 ) {}
                 SimpleTestLayout(
-                    Modifier.requiredSize(50.dp).semantics { contentDescription = child2 }
+                    Modifier.requiredSize(50.dp).semantics { testTag = child2 }
                 ) {}
             }
         }
@@ -859,11 +859,11 @@
         assertEquals(2, root.childrenSortedByBounds.size)
         assertEquals(
             child2,
-            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             child1,
-            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
         )
     }
 
@@ -879,10 +879,10 @@
                     Modifier
                         .requiredSize(50.dp)
                         .offset(x = 0.dp, y = 20.dp)
-                        .semantics { contentDescription = child1 }
+                        .semantics { testTag = child1 }
                 ) {}
                 SimpleTestLayout(
-                    Modifier.requiredSize(50.dp).semantics { contentDescription = child2 }
+                    Modifier.requiredSize(50.dp).semantics { testTag = child2 }
                 ) {}
             }
         }
@@ -891,11 +891,11 @@
         assertEquals(2, root.childrenSortedByBounds.size)
         assertEquals(
             child2,
-            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             child1,
-            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
         )
     }
 
@@ -911,13 +911,13 @@
                     Modifier
                         .requiredSize(50.dp)
                         .offset(x = 20.dp, y = 0.dp)
-                        .semantics { contentDescription = child1 }
+                        .semantics { testTag = child1 }
                 ) {}
                 SimpleTestLayout(
                     Modifier
                         .requiredSize(50.dp)
                         .offset(x = 0.dp, y = 20.dp)
-                        .semantics { contentDescription = child2 }
+                        .semantics { testTag = child2 }
                 ) {}
             }
         }
@@ -926,11 +926,11 @@
         assertEquals(2, root.childrenSortedByBounds.size)
         assertEquals(
             child2,
-            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             child1,
-            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
         )
     }
 
@@ -946,13 +946,13 @@
                     Modifier
                         .requiredSize(100.dp)
                         .offset(x = 25.dp, y = 20.dp)
-                        .semantics { contentDescription = child1 }
+                        .semantics { testTag = child1 }
                 ) {}
                 SimpleTestLayout(
                     Modifier
                         .requiredSize(100.dp)
                         .padding(25.dp)
-                        .semantics { contentDescription = child2 }
+                        .semantics { testTag = child2 }
                 ) {}
             }
         }
@@ -961,11 +961,11 @@
         assertEquals(2, root.childrenSortedByBounds.size)
         assertEquals(
             child1,
-            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             child2,
-            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
         )
     }
 
@@ -981,13 +981,13 @@
                     Modifier
                         .requiredSize(100.dp)
                         .offset(x = 20.dp, y = 25.dp)
-                        .semantics { contentDescription = child1 }
+                        .semantics { testTag = child1 }
                 ) {}
                 SimpleTestLayout(
                     Modifier
                         .requiredSize(100.dp)
                         .padding(25.dp)
-                        .semantics { contentDescription = child2 }
+                        .semantics { testTag = child2 }
                 ) {}
             }
         }
@@ -996,11 +996,11 @@
         assertEquals(2, root.childrenSortedByBounds.size)
         assertEquals(
             child1,
-            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             child2,
-            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
         )
     }
 
@@ -1018,7 +1018,7 @@
                         SimpleTestLayout(
                             Modifier
                                 .requiredSize(100.dp)
-                                .semantics { contentDescription = child1 }
+                                .semantics { testTag = child1 }
                         ) {}
                     },
                     Offset(0f, size),
@@ -1026,7 +1026,7 @@
                         SimpleTestLayout(
                             Modifier
                                 .requiredSize(100.dp)
-                                .semantics { contentDescription = child2 }
+                                .semantics { testTag = child2 }
                         ) {}
                     },
                     Offset(0f, 0f)
@@ -1038,11 +1038,11 @@
         assertEquals(2, root.childrenSortedByBounds.size)
         assertEquals(
             child2,
-            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             child1,
-            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
         )
     }
 
@@ -1060,7 +1060,7 @@
                         SimpleTestLayout(
                             Modifier
                                 .requiredSize(100.dp)
-                                .semantics { contentDescription = child1 }
+                                .semantics { testTag = child1 }
                         ) {}
                     },
                     Offset(size, 0f),
@@ -1068,7 +1068,7 @@
                         SimpleTestLayout(
                             Modifier
                                 .requiredSize(100.dp)
-                                .semantics { contentDescription = child2 }
+                                .semantics { testTag = child2 }
                         ) {}
                     },
                     Offset(0f, 0f)
@@ -1080,11 +1080,11 @@
         assertEquals(2, root.childrenSortedByBounds.size)
         assertEquals(
             child2,
-            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             child1,
-            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
         )
     }
 
@@ -1102,17 +1102,17 @@
                     SimpleTestLayout(
                         Modifier
                             .requiredSize(100.dp)
-                            .semantics { contentDescription = child1 }
+                            .semantics { testTag = child1 }
                     ) {}
                     SimpleTestLayout(
                         Modifier
                             .requiredSize(100.dp)
-                            .semantics { contentDescription = child2 }
+                            .semantics { testTag = child2 }
                     ) {}
                     SimpleTestLayout(
                         Modifier
                             .requiredSize(100.dp)
-                            .semantics { contentDescription = child3 }
+                            .semantics { testTag = child3 }
                     ) {}
                 }
                 CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
@@ -1121,17 +1121,17 @@
                         SimpleTestLayout(
                             Modifier
                                 .requiredSize(100.dp)
-                                .semantics { contentDescription = rtlChild1 }
+                                .semantics { testTag = rtlChild1 }
                         ) {}
                         SimpleTestLayout(
                             Modifier
                                 .requiredSize(100.dp)
-                                .semantics { contentDescription = rtlChild2 }
+                                .semantics { testTag = rtlChild2 }
                         ) {}
                         SimpleTestLayout(
                             Modifier
                                 .requiredSize(100.dp)
-                                .semantics { contentDescription = rtlChild3 }
+                                .semantics { testTag = rtlChild3 }
                         ) {}
                     }
                 }
@@ -1144,29 +1144,29 @@
         // Ltr
         assertEquals(
             child1,
-            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[0].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             child2,
-            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[1].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             child3,
-            root.childrenSortedByBounds[2].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[2].config.getOrNull(SemanticsProperties.TestTag)
         )
 
         // Rtl
         assertEquals(
             rtlChild1,
-            root.childrenSortedByBounds[3].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[3].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             rtlChild2,
-            root.childrenSortedByBounds[4].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[4].config.getOrNull(SemanticsProperties.TestTag)
         )
         assertEquals(
             rtlChild3,
-            root.childrenSortedByBounds[5].config.getOrNull(SemanticsProperties.ContentDescription)
+            root.childrenSortedByBounds[5].config.getOrNull(SemanticsProperties.TestTag)
         )
     }
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
index cdff2ff..d22435d 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
@@ -191,7 +191,12 @@
     override val autofillTree = AutofillTree()
 
     // OwnedLayers that are dirty and should be redrawn.
-    internal val dirtyLayers = mutableListOf<OwnedLayer>()
+    private val dirtyLayers = mutableListOf<OwnedLayer>()
+    // OwnerLayers that invalidated themselves during their last draw. They will be redrawn
+    // during the next AndroidComposeView dispatchDraw pass.
+    private var postponedDirtyLayers: MutableList<OwnedLayer>? = null
+
+    private var isDrawingContent = false
 
     private val motionEventAdapter = MotionEventAdapter()
     private val pointerInputEventProcessor = PointerInputEventProcessor(root)
@@ -639,6 +644,7 @@
         }
         measureAndLayout()
 
+        isDrawingContent = true
         // we don't have to observe here because the root has a layer modifier
         // that will observe all children. The AndroidComposeView has only the
         // root, so it doesn't have to invalidate itself based on model changes.
@@ -649,7 +655,6 @@
                 val layer = dirtyLayers[i]
                 layer.updateDisplayList()
             }
-            dirtyLayers.clear()
         }
 
         if (ViewLayer.shouldUseDispatchDraw) {
@@ -662,6 +667,33 @@
             super.dispatchDraw(canvas)
             canvas.restoreToCount(saveCount)
         }
+
+        dirtyLayers.clear()
+        isDrawingContent = false
+
+        // updateDisplayList operations performed above (during root.draw and during the explicit
+        // layer.updateDisplayList() calls) can result in the same layers being invalidated. These
+        // layers have been added to postponedDirtyLayers and will be redrawn during the next
+        // dispatchDraw.
+        if (postponedDirtyLayers != null) {
+            val postponed = postponedDirtyLayers!!
+            dirtyLayers.addAll(postponed)
+            postponed.clear()
+        }
+    }
+
+    internal fun notifyLayerIsDirty(layer: OwnedLayer, isDirty: Boolean) {
+        if (!isDirty) {
+            // It is correct to remove the layer here regardless of this if, but for performance
+            // we are hackily not doing the removal here in order to just do clear() a bit later.
+            if (!isDrawingContent) require(dirtyLayers.remove(layer))
+        } else if (!isDrawingContent) {
+            dirtyLayers += layer
+        } else {
+            val postponed = postponedDirtyLayers
+                ?: mutableListOf<OwnedLayer>().also { postponedDirtyLayers = it }
+            postponed += layer
+        }
     }
 
     /**
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
index a11842b..f0ae381 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
@@ -67,6 +67,7 @@
 import androidx.compose.ui.semantics.LiveRegionMode
 import androidx.compose.ui.semantics.ProgressBarRangeInfo
 import androidx.compose.ui.text.InternalTextApi
+import androidx.compose.ui.text.buildAnnotatedString
 import androidx.compose.ui.util.fastForEachIndexed
 import androidx.core.view.AccessibilityDelegateCompat
 import androidx.core.view.ViewCompat
@@ -716,8 +717,19 @@
                 ?.toAccessibilitySpannableString(density = view.density, view.fontLoader),
             ParcelSafeTextLength
         )
+
         val textToAssign = trimToSize(
             node.config.getOrNull(SemanticsProperties.Text)
+                ?.let { list ->
+                    buildAnnotatedString {
+                        list.fastForEach { item ->
+                            if (length > 0) {
+                                append(",")
+                            }
+                            append(item)
+                        }
+                    }
+                }
                 ?.toAccessibilitySpannableString(density = view.density, view.fontLoader),
             ParcelSafeTextLength
         )
@@ -1992,13 +2004,15 @@
         // prioritize content description, even for Text.
         if (node.unmergedConfig.contains(SemanticsProperties.ContentDescription)) {
             return node.unmergedConfig[SemanticsProperties.ContentDescription]
+                .fastJoinToString(",")
         }
 
         if (node.isTextField) {
             return getTextForTextField(node)
         }
 
-        return node.config.getOrNull(SemanticsProperties.Text)?.text
+        return node.config.getOrNull(SemanticsProperties.Text)
+            ?.map { it.text }?.fastJoinToString(",")
     }
 
     /**
@@ -2010,7 +2024,8 @@
 
         val editableText = node.config.getOrNull(SemanticsProperties.EditableText)
         return if (editableText.isNullOrEmpty()) {
-            node.config.getOrNull(SemanticsProperties.Text)?.text
+            node.config.getOrNull(SemanticsProperties.Text)
+                ?.map { it.text }?.fastJoinToString(",")
         } else {
             editableText.text
         }
@@ -2029,7 +2044,7 @@
         val contentDescription =
             node.unmergedConfig.getOrNull(SemanticsProperties.ContentDescription)
         if (!contentDescription.isNullOrEmpty()) {
-            return contentDescription
+            return contentDescription.joinToString(",")
         }
 
         if (node.unmergedConfig.contains(SemanticsProperties.Text) ||
@@ -2060,7 +2075,7 @@
                 val contentDescription =
                     childNode.unmergedConfig.getOrNull(SemanticsProperties.ContentDescription)
                 if (!contentDescription.isNullOrEmpty()) {
-                    childDescriptions.add(contentDescription)
+                    childDescriptions.add(contentDescription.joinToString(","))
                     return@fastForEach
                 }
 
@@ -2076,7 +2091,7 @@
                 // check if it's a text node
                 val text = childNode.unmergedConfig.getOrNull(SemanticsProperties.Text)
                 if (!text.isNullOrEmpty()) {
-                    childDescriptions.add(text.text)
+                    childDescriptions.add(text.map { it.text }.fastJoinToString(","))
                     return@fastForEach
                 }
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.android.kt
index 061407a..94f6758 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.android.kt
@@ -50,6 +50,12 @@
      * True when the RenderNodeLayer has been invalidated and not yet drawn.
      */
     private var isDirty = false
+        set(value) {
+            if (value != field) {
+                field = value
+                ownerView.notifyLayerIsDirty(this, value)
+            }
+        }
     private val outlineResolver = OutlineResolver(ownerView.density)
     private var isDestroyed = false
     private var drawnWithZ = false
@@ -180,7 +186,6 @@
     override fun invalidate() {
         if (!isDirty && !isDestroyed) {
             ownerView.invalidate()
-            ownerView.dirtyLayers += this
             isDirty = true
         }
     }
@@ -213,23 +218,21 @@
             }
         } else {
             drawBlock(canvas)
+            isDirty = false
         }
-        isDirty = false
     }
 
     override fun updateDisplayList() {
         if (isDirty || !renderNode.hasDisplayList) {
-            val clipPath = if (renderNode.clipToOutline) outlineResolver.clipPath else null
-
-            renderNode.record(canvasHolder, clipPath, drawBlock)
-
             isDirty = false
+            val clipPath = if (renderNode.clipToOutline) outlineResolver.clipPath else null
+            renderNode.record(canvasHolder, clipPath, drawBlock)
         }
     }
 
     override fun destroy() {
         isDestroyed = true
-        ownerView.dirtyLayers -= this
+        isDirty = false
         ownerView.requestClearInvalidObservations()
     }
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayer.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayer.android.kt
index 2ce77b3..2c33801 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayer.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayer.android.kt
@@ -56,7 +56,12 @@
     private val manualClipPath: Path? get() =
         if (!clipToOutline) null else outlineResolver.clipPath
     var isInvalidated = false
-        private set
+        private set(value) {
+            if (value != field) {
+                field = value
+                ownerView.notifyLayerIsDirty(this, value)
+            }
+        }
     private var drawnWithZ = false
     private val canvasHolder = CanvasHolder()
 
@@ -225,6 +230,7 @@
     }
 
     override fun dispatchDraw(canvas: android.graphics.Canvas) {
+        isInvalidated = false
         canvasHolder.drawInto(canvas) {
             val clipPath = manualClipPath
             if (clipPath != null) {
@@ -235,7 +241,6 @@
             if (clipPath != null) {
                 restore()
             }
-            isInvalidated = false
         }
     }
 
@@ -243,7 +248,6 @@
         if (!isInvalidated) {
             isInvalidated = true
             super.invalidate()
-            ownerView.dirtyLayers += this
             ownerView.invalidate()
         }
     }
@@ -255,14 +259,14 @@
         container.postOnAnimation {
             container.removeView(this)
         }
-        ownerView.dirtyLayers -= this
+        isInvalidated = false
         ownerView.requestClearInvalidObservations()
     }
 
     override fun updateDisplayList() {
         if (isInvalidated && !shouldUseDispatchDraw) {
-            updateDisplayList(this)
             isInvalidated = false
+            updateDisplayList(this)
         }
     }
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayerContainer.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayerContainer.android.kt
index 4a3f22c..a4282ee 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayerContainer.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayerContainer.android.kt
@@ -19,6 +19,7 @@
 import android.content.Context
 import android.view.View
 import android.view.ViewGroup
+import androidx.compose.ui.R
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.nativeCanvas
 
@@ -45,6 +46,9 @@
 internal open class DrawChildContainer(context: Context) : ViewGroup(context) {
     init {
         clipChildren = false
+
+        // Hide this view and its children in tools:
+        setTag(R.id.hide_in_inspector_tag, true)
     }
 
     override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
index 807327f..45c4c1a 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
@@ -95,32 +95,14 @@
  * The default value is true.
  */
 @Immutable
-class PopupProperties @ExperimentalComposeUiApi constructor(
+class PopupProperties(
     val focusable: Boolean = false,
     val dismissOnBackPress: Boolean = true,
     val dismissOnClickOutside: Boolean = true,
     val securePolicy: SecureFlagPolicy = SecureFlagPolicy.Inherit,
-    @get:ExperimentalComposeUiApi
     val excludeFromSystemGesture: Boolean = true,
-    @get:ExperimentalComposeUiApi
     val clippingEnabled: Boolean = true
 ) {
-    @OptIn(ExperimentalComposeUiApi::class)
-    constructor(
-        focusable: Boolean = false,
-        dismissOnBackPress: Boolean = true,
-        dismissOnClickOutside: Boolean = true,
-        securePolicy: SecureFlagPolicy = SecureFlagPolicy.Inherit,
-    ) : this (
-        focusable,
-        dismissOnBackPress,
-        dismissOnClickOutside,
-        securePolicy,
-        excludeFromSystemGesture = true,
-        clippingEnabled = true
-    )
-
-    @OptIn(ExperimentalComposeUiApi::class)
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is PopupProperties) return false
@@ -135,7 +117,6 @@
         return true
     }
 
-    @OptIn(ExperimentalComposeUiApi::class)
     override fun hashCode(): Int {
         var result = dismissOnBackPress.hashCode()
         result = 31 * result + focusable.hashCode()
@@ -502,7 +483,6 @@
     /**
      * Updates the position of the popup based on current position properties.
      */
-    @OptIn(ExperimentalComposeUiApi::class)
     fun updatePosition() {
         val parentBounds = parentBounds ?: return
         val popupContentSize = popupContentSize ?: return
diff --git a/compose/ui/ui/src/androidMain/res/values/ids.xml b/compose/ui/ui/src/androidMain/res/values/ids.xml
index caa764c..3c04edc 100644
--- a/compose/ui/ui/src/androidMain/res/values/ids.xml
+++ b/compose/ui/ui/src/androidMain/res/values/ids.xml
@@ -52,4 +52,5 @@
     <item name="inspection_slot_table_set" type="id" />
     <item name="androidx_compose_ui_view_composition_context" type="id" />
     <item name="compose_view_saveable_id_tag" type="id" />
+    <item name="hide_in_inspector_tag" type="id" />
 </resources>
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusModifier.kt
index 4a040c4..5c53268 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusModifier.kt
@@ -38,6 +38,9 @@
     inspectorInfo: InspectorInfo.() -> Unit = NoInspectorInfo
 ) : Modifier.Element, InspectorValueInfo(inspectorInfo) {
 
+    // TODO(b/188684110): Move focusState and focusedChild to ModiedFocusNode and make this
+    //  modifier stateless.
+
     var focusState: FocusStateImpl = initialFocus
 
     var focusedChild: ModifiedFocusNode? = null
@@ -48,6 +51,17 @@
 /**
  * Add this modifier to a component to make it focusable.
  */
+fun Modifier.focusTarget(): Modifier = composed(debugInspectorInfo { name = "focusTarget" }) {
+    remember { FocusModifier(Inactive) }
+}
+
+/**
+ * Add this modifier to a component to make it focusable.
+ */
+@Deprecated(
+    "Replaced by focusTarget",
+    ReplaceWith("focusTarget()", "androidx.compose.ui.focus.focusTarget")
+)
 fun Modifier.focusModifier(): Modifier = composed(debugInspectorInfo { name = "focusModifier" }) {
     remember { FocusModifier(Inactive) }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/DrawCache.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/DrawCache.kt
index 99a0886..c11e511 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/DrawCache.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/graphics/vector/DrawCache.kt
@@ -16,7 +16,6 @@
 
 package androidx.compose.ui.graphics.vector
 
-import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.BlendMode
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
@@ -43,6 +42,7 @@
     private var cachedCanvas: Canvas? = null
     private var scopeDensity: Density? = null
     private var layoutDirection: LayoutDirection = LayoutDirection.Ltr
+    private var size: IntSize = IntSize.Zero
 
     private val cacheScope = CanvasDrawScope()
 
@@ -72,6 +72,7 @@
             mCachedImage = targetImage
             cachedCanvas = targetCanvas
         }
+        this.size = size
         cacheScope.draw(density, layoutDirection, targetCanvas, size.toSize()) {
             clear()
             block()
@@ -92,7 +93,7 @@
             "drawCachedImage must be invoked first before attempting to draw the result " +
                 "into another destination"
         }
-        target.drawImage(targetImage, Offset.Zero, alpha = alpha, colorFilter = colorFilter)
+        target.drawImage(targetImage, srcSize = size, alpha = alpha, colorFilter = colorFilter)
     }
 
     /**
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt
index 4b2626a..ecc32f5 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt
@@ -101,31 +101,42 @@
 /**
  * The device type that produces a [PointerInputChange], such as a mouse or stylus.
  */
-enum class PointerType {
-    /**
-     * An unknown device type or the device type isn't relevant.
-     */
-    Unknown,
+inline class PointerType internal constructor(val value: Int) {
 
-    /**
-     * Touch (finger) input.
-     */
-    Touch,
+    override fun toString(): String = when (value) {
+        1 -> "Touch"
+        2 -> "Mouse"
+        3 -> "Stylus"
+        4 -> "Eraser"
+        else -> "Unknown"
+    }
 
-    /**
-     * A mouse pointer.
-     */
-    Mouse,
+    companion object {
+        /**
+         * An unknown device type or the device type isn't relevant.
+         */
+        val Unknown = PointerType(0)
 
-    /**
-     * A stylus.
-     */
-    Stylus,
+        /**
+         * Touch (finger) input.
+         */
+        val Touch = PointerType(1)
 
-    /**
-     * An eraser or an inverted stylus.
-     */
-    Eraser
+        /**
+         * A mouse pointer.
+         */
+        val Mouse = PointerType(2)
+
+        /**
+         * A stylus.
+         */
+        val Stylus = PointerType(3)
+
+        /**
+         * An eraser or an inverted stylus.
+         */
+        val Eraser = PointerType(4)
+    }
 }
 
 /**
@@ -351,4 +362,4 @@
     val width = size.width
     val height = size.height
     return x < 0f || x > width || y < 0f || y > height
-}
\ No newline at end of file
+}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
index 07483f5..023b63d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
@@ -373,6 +373,7 @@
             child.detach()
         }
         placeOrder = NotPlacedPlaceOrder
+        previousPlaceOrder = NotPlacedPlaceOrder
         isPlaced = false
     }
 
@@ -535,7 +536,14 @@
      * every placed node assigns this variable to [parent]s [nextChildPlaceOrder] and increments
      * this counter. Not placed items will still have [NotPlacedPlaceOrder] set.
      */
-    private var placeOrder: Int = NotPlacedPlaceOrder
+    internal var placeOrder: Int = NotPlacedPlaceOrder
+        private set
+
+    /**
+     * The value [placeOrder] had during the previous parent [layoutChildren]. Helps us to
+     * understand if the order did change.
+     */
+    private var previousPlaceOrder: Int = NotPlacedPlaceOrder
 
     /**
      * The counter on a parent node which is used by its children to understand the order in which
@@ -840,17 +848,10 @@
         }
 
         if (!isPlaced) {
-            isPlaced = true
             // when the visibility of a child has been changed we need to invalidate
             // parents inner layer - the layer in which this child will be drawn
             parent?.invalidateLayer()
-            // plus all the inner layers that were invalidated while the node was not placed
-            forEachDelegate {
-                if (it.lastLayerDrawingWasSkipped) {
-                    it.invalidateLayer()
-                }
-            }
-            markSubtreeAsPlaced()
+            markNodeAndSubtreeAsPlaced()
         }
 
         if (parent != null) {
@@ -888,6 +889,7 @@
                 nextChildPlaceOrder = 0
                 _children.forEach { child ->
                     // and reset the place order for all the children before placing them
+                    child.previousPlaceOrder = child.placeOrder
                     child.placeOrder = NotPlacedPlaceOrder
                     child.alignmentLines.usedDuringParentLayout = false
                 }
@@ -897,11 +899,12 @@
                     // we set `placeOrder` to NotPlacedPlaceOrder for all the children, then
                     // during the placeChildren() invocation the real order will be assigned for
                     // all the placed children.
-                    if (child.placeOrder == NotPlacedPlaceOrder) {
-                        child.markSubtreeAsNotPlaced()
-                        // we have to invalidate here in order to stop displaying the child
-                        // which is not placed anymore.
+                    if (child.previousPlaceOrder != child.placeOrder) {
+                        onZSortedChildrenInvalidated()
                         invalidateLayer()
+                        if (child.placeOrder == NotPlacedPlaceOrder) {
+                            child.markSubtreeAsNotPlaced()
+                        }
                     }
                     child.alignmentLines.previousUsedDuringParentLayout =
                         child.alignmentLines.usedDuringParentLayout
@@ -917,14 +920,44 @@
         if (alignmentLines.dirty && alignmentLines.required) alignmentLines.recalculate()
     }
 
-    private fun markSubtreeAsPlaced() {
-        _children.forEach {
-            // if the layout state is not Ready then isPlaced will be set during the layout
-            if (it.layoutState == Ready && it.placeOrder != NotPlacedPlaceOrder) {
-                it.isPlaced = true
-                it.markSubtreeAsPlaced()
+    private fun markNodeAndSubtreeAsPlaced() {
+        isPlaced = true
+        // invalidate all the nodes layers that were invalidated while the node was not placed
+        forEachDelegateIncludingInner {
+            if (it.lastLayerDrawingWasSkipped) {
+                it.invalidateLayer()
             }
         }
+        _children.forEach {
+            // this child was placed during the previous parent's layoutChildren(). this means that
+            // before the parent became not placed this child was placed. we need to restore that
+            if (it.placeOrder != NotPlacedPlaceOrder) {
+                it.markNodeAndSubtreeAsPlaced()
+                rescheduleRemeasureOrRelayout(it)
+            }
+        }
+    }
+
+    private fun rescheduleRemeasureOrRelayout(it: LayoutNode) {
+        when (val state = it.layoutState) {
+            NeedsRemeasure, NeedsRelayout -> {
+                // we need to reset the state before requesting as otherwise the request
+                // would be ignored.
+                it.layoutState = Ready
+                // this node was scheduled for remeasure or relayout while it was not
+                // placed. such requests are ignored for non-placed nodes so we have to
+                // re-schedule remeasure or relayout.
+                if (state == NeedsRemeasure) {
+                    it.requestRemeasure()
+                } else {
+                    it.requestRelayout()
+                }
+            }
+            Ready -> {
+                // no extra work required and node is ready to be displayed
+            }
+            else -> throw IllegalStateException("Unexpected state ${it.layoutState}")
+        }
     }
 
     private fun markSubtreeAsNotPlaced() {
@@ -1252,7 +1285,7 @@
         /**
          * Constant used by [placeOrder].
          */
-        private const val NotPlacedPlaceOrder = Int.MAX_VALUE
+        internal const val NotPlacedPlaceOrder = Int.MAX_VALUE
 
         /**
          * Pre-allocated constructor to be used with ComposeNode
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt
index 2fa6f6c..6073d13 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt
@@ -299,6 +299,7 @@
                 }
             }
             layer = null
+            lastLayerDrawingWasSkipped = false
         }
     }
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutTreeConsistencyChecker.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutTreeConsistencyChecker.kt
index 337e2b0..be1fb03 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutTreeConsistencyChecker.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutTreeConsistencyChecker.kt
@@ -49,7 +49,10 @@
     }
 
     private fun LayoutNode.consistentLayoutState(): Boolean {
-        if (isPlaced) {
+        val parent = this.parent
+        if (isPlaced ||
+            placeOrder != LayoutNode.NotPlacedPlaceOrder && parent?.isPlaced == true
+        ) {
             if (layoutState == LayoutNode.LayoutState.NeedsRemeasure &&
                 postponedMeasureRequests.contains(this)
             ) {
@@ -58,7 +61,7 @@
                 return true
             }
             // remeasure or relayout is scheduled
-            val parentLayoutState = this.parent?.layoutState
+            val parentLayoutState = parent?.layoutState
             if (layoutState == LayoutNode.LayoutState.NeedsRemeasure) {
                 return relayoutNodes.contains(this) ||
                     parentLayoutState == LayoutNode.LayoutState.NeedsRemeasure ||
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
index d99109b..6f4ebf9 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
@@ -21,7 +21,6 @@
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextRange
-import androidx.compose.ui.text.buildAnnotatedString
 import androidx.compose.ui.text.input.ImeAction
 import kotlin.reflect.KProperty
 
@@ -36,9 +35,11 @@
     /**
      * @see SemanticsPropertyReceiver.contentDescription
      */
-    val ContentDescription = SemanticsPropertyKey<String>(
+    val ContentDescription = SemanticsPropertyKey<List<String>>(
         name = "ContentDescription",
-        mergePolicy = { parentValue, _ -> parentValue }
+        mergePolicy = { parentValue, childValue ->
+            parentValue?.toMutableList()?.also { it.addAll(childValue) } ?: childValue
+        }
     )
 
     /**
@@ -167,18 +168,10 @@
     /**
      * @see SemanticsPropertyReceiver.text
      */
-    val Text = SemanticsPropertyKey<AnnotatedString>(
+    val Text = SemanticsPropertyKey<List<AnnotatedString>>(
         name = "Text",
         mergePolicy = { parentValue, childValue ->
-            if (parentValue == null) {
-                childValue
-            } else {
-                buildAnnotatedString {
-                    append(parentValue)
-                    append(", ")
-                    append(childValue)
-                }
-            }
+            parentValue?.toMutableList()?.also { it.addAll(childValue) } ?: childValue
         }
     )
 
@@ -345,10 +338,7 @@
     // TODO(KT-6519): Remove this getter
     // TODO(KT-32770): Cannot deprecate this either as the getter is considered called by "by"
     final operator fun getValue(thisRef: SemanticsPropertyReceiver, property: KProperty<*>): T {
-        throw UnsupportedOperationException(
-            "You cannot retrieve a semantics property directly - " +
-                "use one of the SemanticsConfiguration.getOr* methods instead"
-        )
+        return throwSemanticsGetNotSupported()
     }
 
     final operator fun setValue(
@@ -364,6 +354,13 @@
     }
 }
 
+private fun <T> throwSemanticsGetNotSupported(): T {
+    throw UnsupportedOperationException(
+        "You cannot retrieve a semantics property directly - " +
+            "use one of the SemanticsConfiguration.getOr* methods instead"
+    )
+}
+
 /**
  * Standard accessibility action.
  *
@@ -610,10 +607,12 @@
 /**
  * Developer-set content description of the semantics node.
  *
- * If this is not set, accessibility services will present the text of this node as the content
- * description.
+ * If this is not set, accessibility services will present the [text][SemanticsProperties.Text] of
+ * this node as the content.
  */
-var SemanticsPropertyReceiver.contentDescription by SemanticsProperties.ContentDescription
+var SemanticsPropertyReceiver.contentDescription: String
+    get() = throwSemanticsGetNotSupported()
+    set(value) { set(SemanticsProperties.ContentDescription, listOf(value)) }
 
 /**
  * Developer-set state description of the semantics node.
@@ -746,7 +745,9 @@
  *
  * @see SemanticsPropertyReceiver.editableText
  */
-var SemanticsPropertyReceiver.text by SemanticsProperties.Text
+var SemanticsPropertyReceiver.text: AnnotatedString
+    get() = throwSemanticsGetNotSupported()
+    set(value) { set(SemanticsProperties.Text, listOf(value)) }
 
 /**
  * Input text of the text field. It must be real text entered by the user instead of
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppFrame.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppFrame.desktop.kt
index a24a204..cf41892 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppFrame.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppFrame.desktop.kt
@@ -18,6 +18,8 @@
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.window.MenuBar
+import java.awt.event.MouseListener
+import java.awt.event.MouseMotionListener
 import java.awt.image.BufferedImage
 import javax.swing.JFrame
 
@@ -190,6 +192,32 @@
      */
     abstract fun setSize(width: Int, height: Int)
 
+    /**
+     * Adds the specified mouse listener to receive mouse events from layer component.
+     * @param listener the mouse listener.
+     */
+    abstract fun addMouseListener(listener: MouseListener)
+
+    /**
+     * Removes the specified mouse listener so that it no longer receives mouse events
+     * from layer component.
+     * @param listener the mouse listener.
+     */
+    abstract fun removeMouseListener(listener: MouseListener)
+
+    /**
+     * Adds the specified mouse motion listener to receive mouse events from layer component.
+     * @param listener the mouse listener.
+     */
+    abstract fun addMouseMotionListener(listener: MouseMotionListener)
+
+    /**
+     * Removes the specified mouse motion listener so that it no longer receives mouse events
+     * from layer component.
+     * @param listener the mouse listener.
+     */
+    abstract fun removeMouseMotionListener(listener: MouseMotionListener)
+
     // TODO(demin): uncomment this after b/175234629 will be fixed
 //    /**
 //     * Shows a window with the given Compose content.
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.desktop.kt
index 071661a..ac4cfd6 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.desktop.kt
@@ -27,6 +27,8 @@
 import java.awt.Frame
 import java.awt.event.ComponentAdapter
 import java.awt.event.ComponentEvent
+import java.awt.event.MouseListener
+import java.awt.event.MouseMotionListener
 import java.awt.event.WindowAdapter
 import java.awt.event.WindowEvent
 import java.awt.image.BufferedImage
@@ -482,6 +484,40 @@
     }
 
     /**
+     * Adds the specified mouse listener to receive mouse events from layer component.
+     * @param listener the mouse listener.
+     */
+    override fun addMouseListener(listener: MouseListener) {
+        window.layer.component.addMouseListener(listener)
+    }
+
+    /**
+     * Removes the specified mouse listener so that it no longer receives mouse events
+     * from layer component.
+     * @param listener the mouse listener.
+     */
+    override fun removeMouseListener(listener: MouseListener) {
+        window.layer.component.removeMouseListener(listener)
+    }
+
+    /**
+     * Adds the specified mouse motion listener to receive mouse events from layer component.
+     * @param listener the mouse listener.
+     */
+    override fun addMouseMotionListener(listener: MouseMotionListener) {
+        window.layer.component.addMouseMotionListener(listener)
+    }
+
+    /**
+     * Removes the specified mouse motion listener so that it no longer receives mouse events
+     * from layer component.
+     * @param listener the mouse listener.
+     */
+    override fun removeMouseMotionListener(listener: MouseMotionListener) {
+        window.layer.component.removeMouseMotionListener(listener)
+    }
+
+    /**
      * Gets the Keyboard object of the window.
      */
     val keyboard: Keyboard = Keyboard()
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/ComposeWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/ComposeWindow.desktop.kt
index 9b865cf..2e100d8 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/ComposeWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/ComposeWindow.desktop.kt
@@ -37,6 +37,19 @@
             layer.wrapped.setSize(width, height)
             super.setBounds(x, y, width, height)
         }
+
+        override fun add(component: Component): Component {
+            val clipComponent = ClipComponent(component)
+            clipMap.put(component, clipComponent)
+            layer.wrapped.clipComponents.add(clipComponent)
+            return add(component, Integer.valueOf(0))
+        }
+
+        override fun remove(component: Component) {
+            layer.wrapped.clipComponents.remove(clipMap.get(component)!!)
+            clipMap.remove(component)
+            super.remove(component)
+        }
     }
 
     private val clipMap = mutableMapOf<Component, ClipComponent>()
@@ -48,15 +61,10 @@
     }
 
     override fun add(component: Component): Component {
-        val clipComponent = ClipComponent(component)
-        clipMap.put(component, clipComponent)
-        layer.wrapped.clipComponents.add(clipComponent)
-        return pane.add(component, Integer.valueOf(0))
+        return pane.add(component)
     }
 
     override fun remove(component: Component) {
-        layer.wrapped.clipComponents.remove(clipMap.get(component)!!)
-        clipMap.remove(component)
         pane.remove(component)
     }
 
@@ -76,7 +84,7 @@
             parentComposition = parentComposition,
         ) {
             CompositionLocalProvider(
-                LocalLayerContainer provides this
+                LocalLayerContainer provides pane
             ) {
                 content()
             }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
index 14430a6..e5bb607 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
@@ -16,9 +16,11 @@
 
 package androidx.compose.ui.platform
 
-// TODO(demin): implement UriHandler
+import java.awt.Desktop
+import java.net.URI
+
 internal class DesktopUriHandler : UriHandler {
     override fun openUri(uri: String) {
-        println("UriHandler.openUri not implemented yet")
+        Desktop.getDesktop().browse(URI(uri))
     }
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
index 949a8ad..f4c2d75 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
@@ -40,7 +40,6 @@
 import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.round
-import java.awt.Point
 
 /**
  * Opens a popup with the given content.
@@ -98,19 +97,17 @@
 @Composable
 fun Popup(
     popupPositionProvider: PopupPositionProvider,
-    offset: IntOffset = IntOffset.Zero,
     onDismissRequest: (() -> Unit)? = null,
     focusable: Boolean = false,
     contextMenu: Boolean = false,
     content: @Composable () -> Unit
 ) {
-    PopupLayout(popupPositionProvider, offset, focusable, contextMenu, onDismissRequest, content)
+    PopupLayout(popupPositionProvider, focusable, contextMenu, onDismissRequest, content)
 }
 
 @Composable
 private fun PopupLayout(
     popupPositionProvider: PopupPositionProvider,
-    offset: IntOffset,
     focusable: Boolean,
     contextMenu: Boolean,
     onDismissRequest: (() -> Unit)?,
@@ -118,11 +115,11 @@
 ) {
     val owners = LocalDesktopOwners.current
     val density = LocalDensity.current
-    val container = LocalLayerContainer.current
+    val component = if (contextMenu) LocalLayerContainer.current else null
 
     var parentBounds by remember { mutableStateOf(IntRect.Zero) }
     var popupBounds by remember { mutableStateOf(IntRect.Zero) }
-    val pointClick = remember { container.getMousePosition() }
+    val pointClick = remember { component?.getMousePosition() }
 
     // getting parent bounds
     Layout(
@@ -168,11 +165,9 @@
                             val placeable = it.measure(constraints)
                             var position: IntOffset
                             if (contextMenu) {
-                                position = calculateContextMenuPosition(
-                                    pointClick,
-                                    offset,
-                                    parentBounds,
-                                    density.density
+                                position = IntOffset(
+                                    (pointClick!!.x * density.density).toInt(),
+                                    (pointClick.y * density.density).toInt()
                                 )
                             } else {
                                 position = popupPositionProvider.calculatePosition(
@@ -218,15 +213,3 @@
         }
     }
 }
-
-private fun calculateContextMenuPosition(
-    point: Point,
-    dropdownMenuPadding: IntOffset,
-    parentRect: IntRect,
-    density: Float
-): IntOffset {
-    return IntOffset(
-        (point.x * density).toInt(),
-        ((point.y + dropdownMenuPadding.y) * density).toInt() - parentRect.height
-    )
-}
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/ShortcutsTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/ShortcutsTest.kt
index 3f10ac0..c6cda886 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/ShortcutsTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/ShortcutsTest.kt
@@ -22,9 +22,9 @@
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.focus.focusModifier
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.focus.focusTarget
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onRoot
 import androidx.compose.ui.test.performKeyPress
@@ -49,7 +49,7 @@
                 modifier = Modifier
                     .size(10.dp, 10.dp)
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
                     .shortcuts {
                         on(Key.MetaLeft + Key.Enter) {
                             triggered += 1
@@ -100,7 +100,7 @@
                 modifier = Modifier
                     .size(10.dp, 10.dp)
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
                     .shortcuts {
                         if (setShortcuts) {
                             on(Key.Enter) {
@@ -157,7 +157,7 @@
                 modifier = Modifier
                     .size(10.dp, 10.dp)
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
                     .shortcuts {
                         on(Key.Enter) {
                             enterTriggered += 1
@@ -225,7 +225,7 @@
                 modifier = Modifier
                     .size(10.dp, 10.dp)
                     .focusRequester(focusRequester)
-                    .focusModifier()
+                    .focusTarget()
                     .shortcuts {
                         on(Key.MetaLeft + Key.A) {
                             aTriggered += 1
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/res/DesktopSvgResourcesTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/res/DesktopSvgResourcesTest.kt
index ca3eefb..ee37c55 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/res/DesktopSvgResourcesTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/res/DesktopSvgResourcesTest.kt
@@ -75,7 +75,7 @@
     }
 
     private fun assumeLinuxOrWindows() {
-        val os = System.getProperty("os.name").toLowerCase(Locale.US)
+        val os = System.getProperty("os.name").lowercase(Locale.US)
         assumeTrue(os.startsWith("linux") || os.startsWith("win"))
     }
 }
\ No newline at end of file
diff --git a/concurrent/futures/lint-baseline.xml b/concurrent/futures/lint-baseline.xml
index dcd5ad3..e3e9c00 100644
--- a/concurrent/futures/lint-baseline.xml
+++ b/concurrent/futures/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
@@ -27,17 +27,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public final V get(long timeout, TimeUnit unit)"
-        errorLine2="                 ~">
-        <location
-            file="src/main/java/androidx/concurrent/futures/AbstractResolvableFuture.java"
-            line="354"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public final V get(long timeout, TimeUnit unit)"
         errorLine2="                                     ~~~~~~~~">
         <location
             file="src/main/java/androidx/concurrent/futures/AbstractResolvableFuture.java"
@@ -48,17 +37,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public final V get() throws InterruptedException, ExecutionException {"
-        errorLine2="                 ~">
-        <location
-            file="src/main/java/androidx/concurrent/futures/AbstractResolvableFuture.java"
-            line="469"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public final void addListener(Runnable listener, Executor executor) {"
         errorLine2="                                  ~~~~~~~~">
         <location
@@ -103,17 +81,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public boolean set(T value) {"
-        errorLine2="                           ~">
-        <location
-            file="src/main/java/androidx/concurrent/futures/CallbackToFutureAdapter.java"
-            line="246"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public void execute(Runnable command) {"
         errorLine2="                        ~~~~~~~~">
         <location
diff --git a/contentpager/contentpager/lint-baseline.xml b/contentpager/contentpager/lint-baseline.xml
index e8504e7..cbcf5fe 100644
--- a/contentpager/contentpager/lint-baseline.xml
+++ b/contentpager/contentpager/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/coordinatorlayout/coordinatorlayout/lint-baseline.xml b/coordinatorlayout/coordinatorlayout/lint-baseline.xml
index 059c772..be43f6b 100644
--- a/coordinatorlayout/coordinatorlayout/lint-baseline.xml
+++ b/coordinatorlayout/coordinatorlayout/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/core/core-google-shortcuts/build.gradle b/core/core-google-shortcuts/build.gradle
index ea77000..7f7bf68 100644
--- a/core/core-google-shortcuts/build.gradle
+++ b/core/core-google-shortcuts/build.gradle
@@ -32,7 +32,7 @@
 }
 
 dependencies {
-    api(project(":core:core"))
+    api("androidx.core:core:1.6.0-beta01")
 
     implementation("com.google.firebase:firebase-appindexing:19.2.0")
     implementation("com.google.crypto.tink:tink-android:1.5.0")
diff --git a/core/core-ktx/lint-baseline.xml b/core/core-ktx/lint-baseline.xml
index 0a482c4..718509e 100644
--- a/core/core-ktx/lint-baseline.xml
+++ b/core/core-ktx/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index 2cf275c..83d6a2d 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -1542,6 +1542,7 @@
     method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
     method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
     method @ChecksSdkIntAtLeast(codename="S") public static boolean isAtLeastS();
+    method @ChecksSdkIntAtLeast(codename="T") public static boolean isAtLeastT();
   }
 
   public final class CancellationSignal {
diff --git a/core/core/api/public_plus_experimental_current.txt b/core/core/api/public_plus_experimental_current.txt
index 3934ab1..ebb5dfb 100644
--- a/core/core/api/public_plus_experimental_current.txt
+++ b/core/core/api/public_plus_experimental_current.txt
@@ -1540,6 +1540,7 @@
     method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
     method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
     method @ChecksSdkIntAtLeast(codename="S") public static boolean isAtLeastS();
+    method @ChecksSdkIntAtLeast(codename="T") public static boolean isAtLeastT();
   }
 
   public final class CancellationSignal {
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index 46113a6..34557d9 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -1861,6 +1861,7 @@
     method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
     method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
     method @ChecksSdkIntAtLeast(codename="S") public static boolean isAtLeastS();
+    method @ChecksSdkIntAtLeast(codename="T") public static boolean isAtLeastT();
   }
 
   public final class CancellationSignal {
diff --git a/core/core/lint-baseline.xml b/core/core/lint-baseline.xml
index 80828d4..63626a6 100644
--- a/core/core/lint-baseline.xml
+++ b/core/core/lint-baseline.xml
@@ -19,7 +19,7 @@
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1999"
+            line="2006"
             column="34"/>
     </issue>
 
@@ -30,7 +30,7 @@
         errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2033"
+            line="2040"
             column="35"/>
     </issue>
 
@@ -46,227 +46,6 @@
     </issue>
 
     <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return mInfo.getStateDescription();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2813"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mInfo.setStateDescription(stateDescription);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2848"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.view.DisplayCutoutCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return new DisplayCutout(safeInsets.toPlatformInsets(), boundLeft,"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
-            line="85"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.view.DisplayCutoutCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return Insets.toCompatInsets(((DisplayCutout) mDisplayCutout).getWaterfallInsets());"
-        errorLine2="                                                                          ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
-            line="183"
-            column="75"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.location.GnssStatusWrapper is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return mWrapped.hasBasebandCn0DbHz(satelliteIndex);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/GnssStatusWrapper.java"
-            line="107"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.location.GnssStatusWrapper is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return mWrapped.getBasebandCn0DbHz(satelliteIndex);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/GnssStatusWrapper.java"
-            line="116"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    icon = Icon.createWithAdaptiveBitmapContentUri(getUri());"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="567"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.location.LocationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                if (locationManager.registerGnssStatusCallback(executor, transport)) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/LocationManagerCompat.java"
-            line="281"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mParentId = channel.getParentChannelId();"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="297"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mConversationId = channel.getConversationId();"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="298"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mImportantConversation = channel.isImportantConversation();"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="307"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            channel.setConversationId(mParentId, mConversationId);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="330"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        &amp;&amp; channelIds.contains(channel.getParentChannelId())) {"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="456"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return mNotificationManager.getNotificationChannel(channelId, conversationId);"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="505"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                mInfo.mIsCached = shortcutInfo.isCached();"
-        errorLine2="                                               ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="578"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    context.getSystemService(ShortcutManager.class).getShortcuts(matchFlags);"
-        errorLine2="                                                                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="276"
-            column="69"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        context.getSystemService(ShortcutManager.class).removeLongLivedShortcuts(shortcutIds);"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="681"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            context.getSystemService(ShortcutManager.class).pushDynamicShortcut("
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="734"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return view.getStateDescription();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4265"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                view.setStateDescription(value);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4271"
-            column="22"/>
-    </issue>
-
-
-    <issue
         id="BanSynchronizedMethods"
         message="Use of synchronized methods is not recommended"
         errorLine1="    /**"
@@ -493,7 +272,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
-            line="679"
+            line="689"
             column="29"/>
     </issue>
 
@@ -625,7 +404,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2456"
+            line="2463"
             column="13"/>
     </issue>
 
@@ -1346,6 +1125,17 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getStateDescription();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2813"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return mInfo.getExtras().getCharSequence(STATE_DESCRIPTION_KEY);"
         errorLine2="                         ~~~~~~~~~">
@@ -1357,6 +1147,17 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setStateDescription(stateDescription);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2848"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mInfo.getExtras().putCharSequence(STATE_DESCRIPTION_KEY, stateDescription);"
         errorLine2="                  ~~~~~~~~~">
@@ -3293,6 +3094,17 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.view.DisplayCutoutCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new DisplayCutout(safeInsets.toPlatformInsets(), boundLeft,"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
+            line="85"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 29; however, the containing class androidx.core.view.DisplayCutoutCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return new DisplayCutout(safeInsets.toPlatformInsets(), boundLeft,"
         errorLine2="                   ~~~~~~~~~~~~~~~~~">
@@ -3370,6 +3182,17 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.view.DisplayCutoutCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return Insets.toCompatInsets(((DisplayCutout) mDisplayCutout).getWaterfallInsets());"
+        errorLine2="                                                                          ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
+            line="183"
+            column="75"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 17; however, the containing class androidx.core.hardware.display.DisplayManagerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .getDisplay(displayId);"
         errorLine2="                     ~~~~~~~~~~">
@@ -3953,6 +3776,28 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.location.GnssStatusWrapper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mWrapped.hasBasebandCn0DbHz(satelliteIndex);"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/GnssStatusWrapper.java"
+            line="107"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.location.GnssStatusWrapper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mWrapped.getBasebandCn0DbHz(satelliteIndex);"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/GnssStatusWrapper.java"
+            line="116"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 17; however, the containing class androidx.core.view.GravityCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            Gravity.apply(gravity, w, h, container, outRect, layoutDirection);"
         errorLine2="                    ~~~~~">
@@ -4140,6 +3985,17 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    icon = Icon.createWithAdaptiveBitmapContentUri(getUri());"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="567"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    icon = Icon.createWithAdaptiveBitmap(BitmapFactory.decodeStream(is));"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -4481,6 +4337,17 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.location.LocationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (locationManager.registerGnssStatusCallback(executor, transport)) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationManagerCompat.java"
+            line="281"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 24; however, the containing class androidx.core.location.LocationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                if (locationManager.registerGnssStatusCallback(transport, baseHandler)) {"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -5075,6 +4942,28 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mParentId = channel.getParentChannelId();"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="297"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mConversationId = channel.getConversationId();"
+        errorLine2="                                      ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="298"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        mBypassDnd = channel.canBypassDnd();"
         errorLine2="                             ~~~~~~~~~~~~">
@@ -5108,6 +4997,17 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mImportantConversation = channel.isImportantConversation();"
+        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="307"
+            column="46"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        NotificationChannel channel = new NotificationChannel(mId, mName, mImportance);"
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~">
@@ -5207,6 +5107,17 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            channel.setConversationId(mParentId, mConversationId);"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="330"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        this(group.getId());"
         errorLine2="                   ~~~~~">
@@ -7165,6 +7076,17 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        &amp;&amp; channelIds.contains(channel.getParentChannelId())) {"
+        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="456"
+            column="56"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mNotificationManager.deleteNotificationChannel(channel.getId());"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -7198,6 +7120,17 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mNotificationManager.getNotificationChannel(channelId, conversationId);"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="505"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return mNotificationManager.getNotificationChannelGroup(channelGroupId);"
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -9112,6 +9045,17 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mInfo.mIsCached = shortcutInfo.isCached();"
+        errorLine2="                                               ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="578"
+            column="48"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mInfo.mIsDynamic = shortcutInfo.isDynamic();"
         errorLine2="                                            ~~~~~~~~~">
@@ -9332,6 +9276,17 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    context.getSystemService(ShortcutManager.class).getShortcuts(matchFlags);"
+        errorLine2="                                                                    ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="276"
+            column="69"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            final ShortcutManager manager = context.getSystemService(ShortcutManager.class);"
         errorLine2="                                                    ~~~~~~~~~~~~~~~~">
@@ -9673,6 +9628,17 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        context.getSystemService(ShortcutManager.class).removeLongLivedShortcuts(shortcutIds);"
+        errorLine2="                                                        ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="681"
+            column="57"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            context.getSystemService(ShortcutManager.class).pushDynamicShortcut("
         errorLine2="                    ~~~~~~~~~~~~~~~~">
@@ -9684,6 +9650,17 @@
 
     <issue
         id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            context.getSystemService(ShortcutManager.class).pushDynamicShortcut("
+        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="734"
+            column="61"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
         message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            final ShortcutManager sm = context.getSystemService(ShortcutManager.class);"
         errorLine2="                                               ~~~~~~~~~~~~~~~~">
@@ -10481,7 +10458,7 @@
         errorLine2="                                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1437"
+            line="1444"
             column="55"/>
     </issue>
 
@@ -10492,7 +10469,7 @@
         errorLine2="                        ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1532"
+            line="1539"
             column="25"/>
     </issue>
 
@@ -10503,7 +10480,7 @@
         errorLine2="                 ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1546"
+            line="1553"
             column="18"/>
     </issue>
 
@@ -10514,7 +10491,7 @@
         errorLine2="                 ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1582"
+            line="1589"
             column="18"/>
     </issue>
 
@@ -10525,7 +10502,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1605"
+            line="1612"
             column="25"/>
     </issue>
 
@@ -10536,7 +10513,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1629"
+            line="1636"
             column="18"/>
     </issue>
 
@@ -10547,7 +10524,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1643"
+            line="1650"
             column="25"/>
     </issue>
 
@@ -10558,7 +10535,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1666"
+            line="1673"
             column="25"/>
     </issue>
 
@@ -10569,7 +10546,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1783"
+            line="1790"
             column="25"/>
     </issue>
 
@@ -10580,7 +10557,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1819"
+            line="1826"
             column="18"/>
     </issue>
 
@@ -10591,7 +10568,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1834"
+            line="1841"
             column="25"/>
     </issue>
 
@@ -10602,7 +10579,7 @@
         errorLine2="                        ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1850"
+            line="1857"
             column="25"/>
     </issue>
 
@@ -10613,7 +10590,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1871"
+            line="1878"
             column="18"/>
     </issue>
 
@@ -10624,7 +10601,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1894"
+            line="1901"
             column="18"/>
     </issue>
 
@@ -10635,7 +10612,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1917"
+            line="1924"
             column="18"/>
     </issue>
 
@@ -10646,7 +10623,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1994"
+            line="2001"
             column="25"/>
     </issue>
 
@@ -10657,7 +10634,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2028"
+            line="2035"
             column="25"/>
     </issue>
 
@@ -10668,7 +10645,7 @@
         errorLine2="                 ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2335"
+            line="2342"
             column="18"/>
     </issue>
 
@@ -10679,7 +10656,7 @@
         errorLine2="                        ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2346"
+            line="2353"
             column="25"/>
     </issue>
 
@@ -10690,7 +10667,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2356"
+            line="2363"
             column="18"/>
     </issue>
 
@@ -10701,7 +10678,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2367"
+            line="2374"
             column="25"/>
     </issue>
 
@@ -10712,7 +10689,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2381"
+            line="2388"
             column="18"/>
     </issue>
 
@@ -10723,7 +10700,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2403"
+            line="2410"
             column="25"/>
     </issue>
 
@@ -10734,7 +10711,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2416"
+            line="2423"
             column="25"/>
     </issue>
 
@@ -10745,7 +10722,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2427"
+            line="2434"
             column="18"/>
     </issue>
 
@@ -10756,7 +10733,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2429"
+            line="2436"
             column="18"/>
     </issue>
 
@@ -10767,7 +10744,7 @@
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2472"
+            line="2479"
             column="22"/>
     </issue>
 
@@ -10778,7 +10755,7 @@
         errorLine2="                                           ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2533"
+            line="2540"
             column="44"/>
     </issue>
 
@@ -10789,7 +10766,7 @@
         errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2561"
+            line="2568"
             column="50"/>
     </issue>
 
@@ -10800,7 +10777,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2585"
+            line="2592"
             column="18"/>
     </issue>
 
@@ -10811,7 +10788,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2600"
+            line="2607"
             column="25"/>
     </issue>
 
@@ -10822,7 +10799,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2866"
+            line="2873"
             column="25"/>
     </issue>
 
@@ -10833,7 +10810,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2879"
+            line="2886"
             column="25"/>
     </issue>
 
@@ -10844,7 +10821,7 @@
         errorLine2="                 ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2892"
+            line="2899"
             column="18"/>
     </issue>
 
@@ -10855,7 +10832,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2906"
+            line="2913"
             column="25"/>
     </issue>
 
@@ -10866,7 +10843,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2922"
+            line="2929"
             column="18"/>
     </issue>
 
@@ -10877,7 +10854,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2928"
+            line="2935"
             column="41"/>
     </issue>
 
@@ -10888,7 +10865,7 @@
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2929"
+            line="2936"
             column="34"/>
     </issue>
 
@@ -10899,7 +10876,7 @@
         errorLine2="                         ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2934"
+            line="2941"
             column="26"/>
     </issue>
 
@@ -10910,7 +10887,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2951"
+            line="2958"
             column="25"/>
     </issue>
 
@@ -10921,7 +10898,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2969"
+            line="2976"
             column="18"/>
     </issue>
 
@@ -10932,7 +10909,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2975"
+            line="2982"
             column="41"/>
     </issue>
 
@@ -10943,7 +10920,7 @@
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2976"
+            line="2983"
             column="34"/>
     </issue>
 
@@ -10954,7 +10931,7 @@
         errorLine2="                         ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2981"
+            line="2988"
             column="26"/>
     </issue>
 
@@ -10965,7 +10942,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3007"
+            line="3014"
             column="18"/>
     </issue>
 
@@ -10976,7 +10953,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3030"
+            line="3037"
             column="25"/>
     </issue>
 
@@ -10987,7 +10964,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3052"
+            line="3059"
             column="25"/>
     </issue>
 
@@ -10998,7 +10975,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3071"
+            line="3078"
             column="18"/>
     </issue>
 
@@ -11009,7 +10986,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3088"
+            line="3095"
             column="25"/>
     </issue>
 
@@ -11020,7 +10997,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3117"
+            line="3124"
             column="25"/>
     </issue>
 
@@ -11031,7 +11008,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3148"
+            line="3155"
             column="25"/>
     </issue>
 
@@ -11042,7 +11019,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3372"
+            line="3379"
             column="25"/>
     </issue>
 
@@ -11053,7 +11030,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3415"
+            line="3422"
             column="25"/>
     </issue>
 
@@ -11064,7 +11041,7 @@
         errorLine2="                        ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3437"
+            line="3444"
             column="25"/>
     </issue>
 
@@ -11075,7 +11052,7 @@
         errorLine2="                        ~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3448"
+            line="3455"
             column="25"/>
     </issue>
 
@@ -11086,7 +11063,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3465"
+            line="3472"
             column="25"/>
     </issue>
 
@@ -11097,7 +11074,7 @@
         errorLine2="                        ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3479"
+            line="3486"
             column="25"/>
     </issue>
 
@@ -11108,7 +11085,7 @@
         errorLine2="                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3498"
+            line="3505"
             column="18"/>
     </issue>
 
@@ -11119,7 +11096,7 @@
         errorLine2="                 ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3617"
+            line="3624"
             column="18"/>
     </issue>
 
@@ -11130,7 +11107,7 @@
         errorLine2="                        ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3632"
+            line="3639"
             column="25"/>
     </issue>
 
@@ -11141,7 +11118,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3642"
+            line="3649"
             column="25"/>
     </issue>
 
@@ -11152,7 +11129,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3654"
+            line="3661"
             column="25"/>
     </issue>
 
@@ -11163,7 +11140,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3672"
+            line="3679"
             column="18"/>
     </issue>
 
@@ -11174,7 +11151,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3706"
+            line="3713"
             column="18"/>
     </issue>
 
@@ -11185,7 +11162,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3724"
+            line="3731"
             column="25"/>
     </issue>
 
@@ -11196,7 +11173,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3735"
+            line="3742"
             column="18"/>
     </issue>
 
@@ -11207,7 +11184,7 @@
         errorLine2="                        ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3754"
+            line="3761"
             column="25"/>
     </issue>
 
@@ -11218,7 +11195,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3774"
+            line="3781"
             column="18"/>
     </issue>
 
@@ -11229,7 +11206,7 @@
         errorLine2="                     ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3784"
+            line="3791"
             column="22"/>
     </issue>
 
@@ -11240,7 +11217,7 @@
         errorLine2="              ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3795"
+            line="3802"
             column="15"/>
     </issue>
 
@@ -11251,7 +11228,7 @@
         errorLine2="              ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3804"
+            line="3811"
             column="15"/>
     </issue>
 
@@ -11262,7 +11239,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3816"
+            line="3823"
             column="25"/>
     </issue>
 
@@ -11273,7 +11250,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3830"
+            line="3837"
             column="18"/>
     </issue>
 
@@ -11284,7 +11261,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3842"
+            line="3849"
             column="25"/>
     </issue>
 
@@ -11295,7 +11272,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3856"
+            line="3863"
             column="18"/>
     </issue>
 
@@ -11306,7 +11283,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3871"
+            line="3878"
             column="25"/>
     </issue>
 
@@ -11317,7 +11294,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3890"
+            line="3897"
             column="18"/>
     </issue>
 
@@ -11328,7 +11305,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3908"
+            line="3915"
             column="25"/>
     </issue>
 
@@ -11339,7 +11316,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3924"
+            line="3931"
             column="18"/>
     </issue>
 
@@ -11350,7 +11327,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3938"
+            line="3945"
             column="25"/>
     </issue>
 
@@ -11361,7 +11338,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3960"
+            line="3967"
             column="25"/>
     </issue>
 
@@ -11372,7 +11349,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3973"
+            line="3980"
             column="25"/>
     </issue>
 
@@ -11383,7 +11360,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4170"
+            line="4177"
             column="29"/>
     </issue>
 
@@ -11394,7 +11371,7 @@
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4176"
+            line="4183"
             column="22"/>
     </issue>
 
@@ -11405,7 +11382,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4242"
+            line="4249"
             column="29"/>
     </issue>
 
@@ -11416,7 +11393,29 @@
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4248"
+            line="4255"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return view.getStateDescription();"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="4272"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 30; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                view.setStateDescription(value);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="4278"
             column="22"/>
     </issue>
 
@@ -11427,7 +11426,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4322"
+            line="4329"
             column="29"/>
     </issue>
 
@@ -11438,7 +11437,7 @@
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4328"
+            line="4335"
             column="22"/>
     </issue>
 
@@ -11449,7 +11448,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4423"
+            line="4430"
             column="19"/>
     </issue>
 
@@ -11460,7 +11459,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4433"
+            line="4440"
             column="19"/>
     </issue>
 
@@ -11471,7 +11470,7 @@
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4440"
+            line="4447"
             column="34"/>
     </issue>
 
@@ -11482,7 +11481,7 @@
         errorLine2="                     ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4500"
+            line="4507"
             column="22"/>
     </issue>
 
@@ -11493,7 +11492,7 @@
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4531"
+            line="4538"
             column="40"/>
     </issue>
 
@@ -11872,7 +11871,8 @@
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
             line="2179"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -11887,7 +11887,8 @@
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
             line="2998"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -11902,7 +11903,8 @@
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
             line="3007"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -11917,7 +11919,8 @@
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
             line="3225"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -11932,7 +11935,8 @@
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
             line="3276"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -11958,7 +11962,8 @@
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
             line="3555"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -11973,7 +11978,8 @@
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
             line="3620"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -11988,7 +11994,8 @@
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
             line="97"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -14503,17 +14510,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public &lt;T extends ExtraData> T getExtraData(Class&lt;T> extraDataClass) {"
-        errorLine2="                                 ~">
-        <location
-            file="src/main/java/androidx/core/app/ComponentActivity.java"
-            line="106"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public &lt;T extends ExtraData> T getExtraData(Class&lt;T> extraDataClass) {"
         errorLine2="                                                ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/app/ComponentActivity.java"
@@ -14557,17 +14553,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    void accept(T t);"
-        errorLine2="                ~">
-        <location
-            file="src/main/java/androidx/core/util/Consumer.java"
-            line="30"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public static Cursor query(ContentResolver resolver,"
         errorLine2="                  ~~~~~~">
         <location
@@ -14942,17 +14927,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static &lt;T extends Drawable> T unwrap(@NonNull Drawable drawable) {"
-        errorLine2="                                       ~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="333"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public EdgeEffectCompat(Context context) {"
         errorLine2="                            ~~~~~~~">
         <location
@@ -17429,17 +17403,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    T createFromParcel(Parcel in, ClassLoader loader);"
-        errorLine2="    ~">
-        <location
-            file="src/main/java/androidx/core/os/ParcelableCompatCreatorCallbacks.java"
-            line="40"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    T createFromParcel(Parcel in, ClassLoader loader);"
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/core/os/ParcelableCompatCreatorCallbacks.java"
@@ -17769,28 +17732,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T acquire() {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/core/util/Pools.java"
-            line="103"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T acquire() {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/core/util/Pools.java"
-            line="157"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="            public Builder setBreakStrategy(int strategy) {"
         errorLine2="                   ~~~~~~~">
         <location
@@ -18169,7 +18110,7 @@
         errorLine2="                                                     ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
-            line="433"
+            line="435"
             column="54"/>
     </issue>
 
@@ -18180,7 +18121,7 @@
         errorLine2="                  ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
-            line="502"
+            line="504"
             column="19"/>
     </issue>
 
@@ -18191,7 +18132,7 @@
         errorLine2="                                                                              ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
-            line="502"
+            line="504"
             column="79"/>
     </issue>
 
@@ -18385,17 +18326,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        void onReply(T value);"
-        errorLine2="                     ~">
-        <location
-            file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
-            line="132"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public &lt;T> void postAndReply(final Callable&lt;T> callable, final ReplyCallback&lt;T> reply) {"
         errorLine2="                                       ~~~~~~~~~~~">
         <location
@@ -18419,17 +18349,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public &lt;T> T postAndWait(final Callable&lt;T> callable, int timeoutMillis)"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
-            line="169"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public &lt;T> T postAndWait(final Callable&lt;T> callable, int timeoutMillis)"
         errorLine2="                                   ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
@@ -18694,17 +18613,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public abstract T addShortcuts(List&lt;ShortcutInfoCompat> shortcuts);"
-        errorLine2="                    ~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
-            line="38"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public abstract T addShortcuts(List&lt;ShortcutInfoCompat> shortcuts);"
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
@@ -18716,17 +18624,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public abstract T removeShortcuts(List&lt;String> shortcutIds);"
-        errorLine2="                    ~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
-            line="41"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public abstract T removeShortcuts(List&lt;String> shortcutIds);"
         errorLine2="                                      ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
@@ -18737,17 +18634,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public abstract T removeAllShortcuts();"
-        errorLine2="                    ~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
-            line="44"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public List&lt;ShortcutInfoCompat> getShortcuts() throws Exception {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -18814,17 +18700,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    T get();"
-        errorLine2="    ~">
-        <location
-            file="src/main/java/androidx/core/util/Supplier.java"
-            line="30"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    MenuItem setShowAsActionFlags(int actionEnum);"
         errorLine2="    ~~~~~~~~">
         <location
@@ -19973,7 +19848,7 @@
         errorLine2="                                                            ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1406"
+            line="1413"
             column="61"/>
     </issue>
 
@@ -19984,7 +19859,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1435"
+            line="1442"
             column="19"/>
     </issue>
 
@@ -19995,7 +19870,7 @@
         errorLine2="                                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1455"
+            line="1462"
             column="34"/>
     </issue>
 
@@ -20006,7 +19881,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1494"
+            line="1501"
             column="37"/>
     </issue>
 
@@ -20017,7 +19892,7 @@
         errorLine2="                                                                         ~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1494"
+            line="1501"
             column="74"/>
     </issue>
 
@@ -20028,7 +19903,7 @@
         errorLine2="                                   ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1518"
+            line="1525"
             column="36"/>
     </issue>
 
@@ -20039,7 +19914,7 @@
         errorLine2="                                                         ~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1580"
+            line="1587"
             column="58"/>
     </issue>
 
@@ -20050,7 +19925,7 @@
         errorLine2="                  ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1641"
+            line="1648"
             column="19"/>
     </issue>
 
@@ -20061,7 +19936,7 @@
         errorLine2="                                   ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1685"
+            line="1692"
             column="36"/>
     </issue>
 
@@ -20072,7 +19947,7 @@
         errorLine2="                                               ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1722"
+            line="1729"
             column="48"/>
     </issue>
 
@@ -20083,7 +19958,7 @@
         errorLine2="                                                ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1739"
+            line="1746"
             column="49"/>
     </issue>
 
@@ -20094,7 +19969,7 @@
         errorLine2="                                       ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1753"
+            line="1760"
             column="40"/>
     </issue>
 
@@ -20105,7 +19980,7 @@
         errorLine2="                                        ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1945"
+            line="1952"
             column="41"/>
     </issue>
 
@@ -20116,7 +19991,7 @@
         errorLine2="                                        ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1959"
+            line="1966"
             column="41"/>
     </issue>
 
@@ -20127,7 +20002,7 @@
         errorLine2="                                   ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1981"
+            line="1988"
             column="36"/>
     </issue>
 
@@ -20138,7 +20013,7 @@
         errorLine2="                                       ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2083"
+            line="2090"
             column="40"/>
     </issue>
 
@@ -20149,7 +20024,7 @@
         errorLine2="                                       ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2100"
+            line="2107"
             column="40"/>
     </issue>
 
@@ -20160,7 +20035,7 @@
         errorLine2="                                ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2117"
+            line="2124"
             column="33"/>
     </issue>
 
@@ -20171,7 +20046,7 @@
         errorLine2="                            ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2132"
+            line="2139"
             column="29"/>
     </issue>
 
@@ -20182,7 +20057,7 @@
         errorLine2="                            ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2147"
+            line="2154"
             column="29"/>
     </issue>
 
@@ -20193,7 +20068,7 @@
         errorLine2="                                   ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2160"
+            line="2167"
             column="36"/>
     </issue>
 
@@ -20204,7 +20079,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2174"
+            line="2181"
             column="37"/>
     </issue>
 
@@ -20215,7 +20090,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2188"
+            line="2195"
             column="37"/>
     </issue>
 
@@ -20226,7 +20101,7 @@
         errorLine2="                                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2201"
+            line="2208"
             column="34"/>
     </issue>
 
@@ -20237,7 +20112,7 @@
         errorLine2="                                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2214"
+            line="2221"
             column="34"/>
     </issue>
 
@@ -20248,7 +20123,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2225"
+            line="2232"
             column="35"/>
     </issue>
 
@@ -20259,7 +20134,7 @@
         errorLine2="                                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2241"
+            line="2248"
             column="34"/>
     </issue>
 
@@ -20270,7 +20145,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2254"
+            line="2261"
             column="35"/>
     </issue>
 
@@ -20281,7 +20156,7 @@
         errorLine2="                                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2270"
+            line="2277"
             column="34"/>
     </issue>
 
@@ -20292,7 +20167,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2278"
+            line="2285"
             column="37"/>
     </issue>
 
@@ -20303,7 +20178,7 @@
         errorLine2="                                     ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2286"
+            line="2293"
             column="38"/>
     </issue>
 
@@ -20314,7 +20189,7 @@
         errorLine2="                                     ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2294"
+            line="2301"
             column="38"/>
     </issue>
 
@@ -20325,7 +20200,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2302"
+            line="2309"
             column="35"/>
     </issue>
 
@@ -20336,7 +20211,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2310"
+            line="2317"
             column="35"/>
     </issue>
 
@@ -20347,7 +20222,7 @@
         errorLine2="                             ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2318"
+            line="2325"
             column="30"/>
     </issue>
 
@@ -20358,7 +20233,7 @@
         errorLine2="                             ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2326"
+            line="2333"
             column="30"/>
     </issue>
 
@@ -20369,7 +20244,7 @@
         errorLine2="                                                             ~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2379"
+            line="2386"
             column="62"/>
     </issue>
 
@@ -20380,7 +20255,7 @@
         errorLine2="                                                      ~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2445"
+            line="2452"
             column="55"/>
     </issue>
 
@@ -20391,7 +20266,7 @@
         errorLine2="                                            ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2486"
+            line="2493"
             column="45"/>
     </issue>
 
@@ -20402,7 +20277,7 @@
         errorLine2="                                                   ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2500"
+            line="2507"
             column="52"/>
     </issue>
 
@@ -20413,7 +20288,7 @@
         errorLine2="                                                ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2830"
+            line="2837"
             column="49"/>
     </issue>
 
@@ -20424,7 +20299,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2846"
+            line="2853"
             column="37"/>
     </issue>
 
@@ -20435,7 +20310,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2904"
+            line="2911"
             column="19"/>
     </issue>
 
@@ -20446,7 +20321,7 @@
         errorLine2="                                                                 ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2920"
+            line="2927"
             column="66"/>
     </issue>
 
@@ -20457,7 +20332,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2949"
+            line="2956"
             column="19"/>
     </issue>
 
@@ -20468,7 +20343,7 @@
         errorLine2="                                                                 ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2967"
+            line="2974"
             column="66"/>
     </issue>
 
@@ -20479,7 +20354,7 @@
         errorLine2="                                                         ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3615"
+            line="3622"
             column="58"/>
     </issue>
 
@@ -20490,7 +20365,7 @@
         errorLine2="                                                          ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3733"
+            line="3740"
             column="59"/>
     </issue>
 
@@ -20501,7 +20376,7 @@
         errorLine2="                                                            ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3781"
+            line="3788"
             column="61"/>
     </issue>
 
@@ -20512,7 +20387,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3782"
+            line="3789"
             column="13"/>
     </issue>
 
@@ -20523,7 +20398,7 @@
         errorLine2="                                                  ~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3782"
+            line="3789"
             column="51"/>
     </issue>
 
@@ -20534,7 +20409,7 @@
         errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3802"
+            line="3809"
             column="58"/>
     </issue>
 
@@ -20545,7 +20420,7 @@
         errorLine2="                  ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3905"
+            line="3912"
             column="19"/>
     </issue>
 
@@ -20556,7 +20431,7 @@
         errorLine2="                                                                           ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3905"
+            line="3912"
             column="76"/>
     </issue>
 
@@ -20567,7 +20442,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4103"
+            line="4110"
             column="37"/>
     </issue>
 
@@ -20578,7 +20453,7 @@
         errorLine2="                                            ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4103"
+            line="4110"
             column="45"/>
     </issue>
 
@@ -20589,7 +20464,7 @@
         errorLine2="                                                ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4139"
+            line="4146"
             column="49"/>
     </issue>
 
@@ -20600,7 +20475,7 @@
         errorLine2="                                                  ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4158"
+            line="4165"
             column="51"/>
     </issue>
 
@@ -20611,7 +20486,7 @@
         errorLine2="                                                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4205"
+            line="4212"
             column="50"/>
     </issue>
 
@@ -20622,7 +20497,7 @@
         errorLine2="                                                            ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4205"
+            line="4212"
             column="61"/>
     </issue>
 
@@ -20633,7 +20508,7 @@
         errorLine2="                  ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4231"
+            line="4238"
             column="19"/>
     </issue>
 
@@ -20644,7 +20519,7 @@
         errorLine2="                                                         ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4231"
+            line="4238"
             column="58"/>
     </issue>
 
@@ -20655,7 +20530,7 @@
         errorLine2="                                                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4294"
+            line="4301"
             column="50"/>
     </issue>
 
@@ -20666,7 +20541,7 @@
         errorLine2="                                               ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4311"
+            line="4318"
             column="48"/>
     </issue>
 
diff --git a/core/core/src/androidTest/java/androidx/core/app/RemoteInputTest.java b/core/core/src/androidTest/java/androidx/core/app/RemoteInputTest.java
index 0a15761..2dc8cae 100644
--- a/core/core/src/androidTest/java/androidx/core/app/RemoteInputTest.java
+++ b/core/core/src/androidTest/java/androidx/core/app/RemoteInputTest.java
@@ -24,6 +24,7 @@
 
 import android.content.Intent;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.support.v4.BaseInstrumentationTestCase;
 
@@ -47,6 +48,60 @@
         super(TestActivity.class);
     }
 
+    @SdkSuppress(minSdkVersion = 20)
+    @Test
+    public void testRemoteInputBuilder_toAndFromPlatform() throws Throwable {
+        RemoteInput originalInput = new RemoteInput.Builder(RESULT_KEY)
+                .setAllowFreeFormInput(false)
+                .setAllowDataType(MIME_TYPE, true)
+                .setEditChoicesBeforeSending(RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED)
+                .setChoices(new CharSequence[]{"first", "second"})
+                .build();
+
+        assertFalse(originalInput.isDataOnly());
+        assertFalse(originalInput.getAllowFreeFormInput());
+        assertEquals(2, originalInput.getChoices().length);
+        assertEquals("first", originalInput.getChoices()[0]);
+        assertEquals("second", originalInput.getChoices()[1]);
+        assertEquals(RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED,
+                originalInput.getEditChoicesBeforeSending());
+        assertEquals(1, originalInput.getAllowedDataTypes().size());
+        assertTrue(originalInput.getAllowedDataTypes().contains(MIME_TYPE));
+
+        android.app.RemoteInput platformInput =
+                RemoteInput.fromCompat(originalInput);
+        if (Build.VERSION.SDK_INT >= 26) {
+            assertFalse(platformInput.isDataOnly());
+        }
+        assertFalse(platformInput.getAllowFreeFormInput());
+        assertEquals(2, platformInput.getChoices().length);
+        assertEquals("first", platformInput.getChoices()[0]);
+        assertEquals("second", platformInput.getChoices()[1]);
+        if (Build.VERSION.SDK_INT >= 29) {
+            assertEquals(RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED,
+                    platformInput.getEditChoicesBeforeSending());
+        }
+        if (Build.VERSION.SDK_INT >= 26) {
+            assertEquals(1, platformInput.getAllowedDataTypes().size());
+            assertTrue(platformInput.getAllowedDataTypes().contains(MIME_TYPE));
+        }
+
+        RemoteInput compatInput = RemoteInput.fromPlatform(platformInput);
+        assertFalse(compatInput.isDataOnly());
+        assertFalse(compatInput.getAllowFreeFormInput());
+        assertEquals(2, compatInput.getChoices().length);
+        assertEquals("first", compatInput.getChoices()[0]);
+        assertEquals("second", compatInput.getChoices()[1]);
+        if (Build.VERSION.SDK_INT >= 29) {
+            assertEquals(RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED,
+                    compatInput.getEditChoicesBeforeSending());
+        }
+        if (Build.VERSION.SDK_INT >= 26) {
+            assertEquals(1, compatInput.getAllowedDataTypes().size());
+            assertTrue(compatInput.getAllowedDataTypes().contains(MIME_TYPE));
+        }
+    }
+
     @Test
     public void testRemoteInputBuilder_setDataOnly() throws Throwable {
         RemoteInput input = newDataOnlyRemoteInput();
diff --git a/core/core/src/androidTest/java/androidx/core/widget/TextViewOnReceiveContentListenerTest.java b/core/core/src/androidTest/java/androidx/core/widget/TextViewOnReceiveContentListenerTest.java
index 8ffc978..8da0f4a 100644
--- a/core/core/src/androidTest/java/androidx/core/widget/TextViewOnReceiveContentListenerTest.java
+++ b/core/core/src/androidTest/java/androidx/core/widget/TextViewOnReceiveContentListenerTest.java
@@ -159,8 +159,16 @@
         ClipData clip = ClipData.newPlainText("test", "ONE");
         clip.addItem(new ClipData.Item("TWO"));
         clip.addItem(new ClipData.Item("THREE"));
-        boolean result = onReceive(mReceiver, clip, SOURCE_CLIPBOARD, 0);
 
+        // Verify the resulting text when pasting a clip that contains multiple text items.
+        boolean result = onReceive(mReceiver, clip, SOURCE_CLIPBOARD, 0);
+        assertThat(result).isTrue();
+        assertTextAndCursorPosition("xONE\nTWO\nTHREEz", 14);
+
+        // Verify the resulting text when inserting the same clip via drag-and-drop. The result
+        // should be the same as when pasting from the clipboard.
+        setTextAndCursor("xz", 1);
+        result = onReceive(mReceiver, clip, SOURCE_DRAG_AND_DROP, 0);
         assertThat(result).isTrue();
         assertTextAndCursorPosition("xONE\nTWO\nTHREEz", 14);
     }
@@ -251,20 +259,6 @@
         assertTextAndCursorPosition("xyz", 2);
     }
 
-    @UiThreadTest
-    @Test
-    public void testOnReceive_dragAndDrop_multipleItemsInClipData() throws Exception {
-        setTextAndCursor("xz", 1);
-
-        ClipData clip = ClipData.newPlainText("test", "ONE");
-        clip.addItem(new ClipData.Item("TWO"));
-        clip.addItem(new ClipData.Item("THREE"));
-        boolean result = onReceive(mReceiver, clip, SOURCE_DRAG_AND_DROP, 0);
-
-        assertThat(result).isTrue();
-        assertTextAndCursorPosition("xONETWOTHREEz", 12);
-    }
-
     private boolean onReceive(final OnReceiveContentListener receiver, ClipData clip,
             @Source int source, @Flags int flags) {
         ContentInfoCompat payload = new ContentInfoCompat.Builder(clip, source)
diff --git a/core/core/src/main/java/androidx/core/app/RemoteInput.java b/core/core/src/main/java/androidx/core/app/RemoteInput.java
index 3b2f7e1..ecbe7de 100644
--- a/core/core/src/main/java/androidx/core/app/RemoteInput.java
+++ b/core/core/src/main/java/androidx/core/app/RemoteInput.java
@@ -564,6 +564,14 @@
                         .setChoices(src.getChoices())
                         .setAllowFreeFormInput(src.getAllowFreeFormInput())
                         .addExtras(src.getExtras());
+        if (Build.VERSION.SDK_INT >= 26) {
+            Set<String> allowedDataTypes = src.getAllowedDataTypes();
+            if (allowedDataTypes != null) {
+                for (String allowedDataType : allowedDataTypes) {
+                    builder.setAllowDataType(allowedDataType, true);
+                }
+            }
+        }
         if (Build.VERSION.SDK_INT >= 29) {
             builder.setEditChoicesBeforeSending(src.getEditChoicesBeforeSending());
         }
@@ -578,6 +586,14 @@
                         .setChoices(src.getChoices())
                         .setAllowFreeFormInput(src.getAllowFreeFormInput())
                         .addExtras(src.getExtras());
+        if (Build.VERSION.SDK_INT >= 26) {
+            Set<String> allowedDataTypes = src.getAllowedDataTypes();
+            if (allowedDataTypes != null) {
+                for (String allowedDataType : allowedDataTypes) {
+                    builder.setAllowDataType(allowedDataType, true);
+                }
+            }
+        }
         if (Build.VERSION.SDK_INT >= 29) {
             builder.setEditChoicesBeforeSending(src.getEditChoicesBeforeSending());
         }
diff --git a/core/core/src/main/java/androidx/core/os/BuildCompat.java b/core/core/src/main/java/androidx/core/os/BuildCompat.java
index ba91322..389622f 100644
--- a/core/core/src/main/java/androidx/core/os/BuildCompat.java
+++ b/core/core/src/main/java/androidx/core/os/BuildCompat.java
@@ -139,6 +139,21 @@
      */
     @ChecksSdkIntAtLeast(codename = "S")
     public static boolean isAtLeastS() {
-        return VERSION.CODENAME.equals("S");
+        return VERSION.CODENAME.equals("S") || VERSION.CODENAME.equals("T");
+    }
+
+    /**
+     * Checks if the device is running on a pre-release version of Android T or a release version of
+     * Android T or newer.
+     * <p>
+     * <strong>Note:</strong> When Android T is finalized for release, this method will be
+     * deprecated and all calls should be replaced with {@code Build.VERSION.SDK_INT >=
+     * Build.VERSION_CODES.T}.
+     *
+     * @return {@code true} if T APIs are available for use, {@code false} otherwise
+     */
+    @ChecksSdkIntAtLeast(codename = "T")
+    public static boolean isAtLeastT() {
+        return VERSION.CODENAME.equals("T");
     }
 }
diff --git a/core/core/src/main/java/androidx/core/view/GestureDetectorCompat.java b/core/core/src/main/java/androidx/core/view/GestureDetectorCompat.java
index 755e44d..77c59b6 100644
--- a/core/core/src/main/java/androidx/core/view/GestureDetectorCompat.java
+++ b/core/core/src/main/java/androidx/core/view/GestureDetectorCompat.java
@@ -59,7 +59,6 @@
         private int mMinimumFlingVelocity;
         private int mMaximumFlingVelocity;
 
-        private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout();
         private static final int TAP_TIMEOUT = ViewConfiguration.getTapTimeout();
         private static final int DOUBLE_TAP_TIMEOUT = ViewConfiguration.getDoubleTapTimeout();
 
@@ -319,7 +318,7 @@
                     if (mIsLongpressEnabled) {
                         mHandler.removeMessages(LONG_PRESS);
                         mHandler.sendEmptyMessageAtTime(LONG_PRESS, mCurrentDownEvent.getDownTime()
-                                + TAP_TIMEOUT + LONGPRESS_TIMEOUT);
+                                + TAP_TIMEOUT + ViewConfiguration.getLongPressTimeout());
                     }
                     mHandler.sendEmptyMessageAtTime(SHOW_PRESS,
                             mCurrentDownEvent.getDownTime() + TAP_TIMEOUT);
diff --git a/core/core/src/main/java/androidx/core/view/OnReceiveContentListener.java b/core/core/src/main/java/androidx/core/view/OnReceiveContentListener.java
index 9031f8c..4682dce 100644
--- a/core/core/src/main/java/androidx/core/view/OnReceiveContentListener.java
+++ b/core/core/src/main/java/androidx/core/view/OnReceiveContentListener.java
@@ -80,16 +80,40 @@
      * implementation and see {@link ContentInfoCompat#partition} for a convenient way to split the
      * passed-in content.
      *
-     * <p>If implementing handling for text: if the view has a selection, the selection should
-     * be overwritten by the passed-in content; if there's no selection, the passed-in content
-     * should be inserted at the current cursor position.
+     * <h3>Handling different content</h3>
+     * <ul>
+     *     <li>Text. The passed-in text should overwrite the current selection or be inserted at
+     *     the current cursor position if there is no selection.
+     *     <li>Non-text content (e.g. images). The content may be inserted inline if the widget
+     *     supports this, or it may be added as an attachment (could potentially be shown in a
+     *     completely separate view).
+     * </ul>
      *
-     * <p>If implementing handling for non-text content (e.g. images): the content may be
-     * inserted inline, or it may be added as an attachment (could potentially be shown in a
-     * completely separate view).
+     * <h3>URI permissions</h3>
+     * <p>{@link android.content.Intent#FLAG_GRANT_READ_URI_PERMISSION Read permissions} are
+     * granted automatically by the platform for any
+     * {@link android.content.ContentResolver#SCHEME_CONTENT content URIs} in the payload passed
+     * to this listener. Permissions are transient and will be released automatically by the
+     * platform.
+     * <p>Processing of content should normally be done in a service or activity.
+     * For long-running processing, using {@code androidx.work.WorkManager} is recommended.
+     * When implementing this, permissions should be extended to the target service or activity
+     * by passing the content using {@link android.content.Intent#setClipData Intent.setClipData}
+     * and {@link android.content.Intent#addFlags(int) setting} the flag
+     * {@link android.content.Intent#FLAG_GRANT_READ_URI_PERMISSION FLAG_GRANT_READ_URI_PERMISSION}.
+     * <p>Alternatively, if using a background thread within the current context to process the
+     * content, a reference to the {@code payload} object should be maintained to ensure that
+     * permissions are not revoked prematurely.
      *
      * @param view The view where the content insertion was requested.
-     * @param payload The content to insert and related metadata.
+     * @param payload The content to insert and related metadata. The payload may contain multiple
+     *                items and their MIME types may be different (e.g. an image item and a text
+     *                item). The payload may also contain items whose MIME type is not in the list
+     *                of MIME types specified when
+     *                {@link ViewCompat#setOnReceiveContentListener setting} the listener. For
+     *                those items, the listener may reject the content (defer to the default
+     *                platform behavior) or execute some other fallback logic (e.g. show an
+     *                appropriate message to the user).
      *
      * @return The portion of the passed-in content whose processing should be delegated to
      * the platform. Return null if all content was handled in some way. Actual insertion of
diff --git a/core/core/src/main/java/androidx/core/view/ViewCompat.java b/core/core/src/main/java/androidx/core/view/ViewCompat.java
index 88180d1..52df3c3 100644
--- a/core/core/src/main/java/androidx/core/view/ViewCompat.java
+++ b/core/core/src/main/java/androidx/core/view/ViewCompat.java
@@ -2701,19 +2701,25 @@
      * Sets the listener to be used to handle insertion of content into the given view.
      *
      * <p>Depending on the type of view, this listener may be invoked for different scenarios. For
-     * example, for an AppCompatEditText, this listener will be invoked for the following scenarios:
+     * example, for an {@code AppCompatEditText}, this listener will be invoked for the following
+     * scenarios:
      * <ol>
      *     <li>Paste from the clipboard (e.g. "Paste" or "Paste as plain text" action in the
      *     insertion/selection menu)
      *     <li>Content insertion from the keyboard (from {@link InputConnection#commitContent})
+     *     <li>Drag and drop (drop events from {@link View#onDragEvent})
      * </ol>
      *
-     * <p>When setting a listener, clients should also declare the MIME types accepted by it.
-     * When invoked with other types of content, the listener may reject the content (defer to
-     * the default platform behavior) or execute some other fallback logic. The MIME types
-     * declared here allow different features to optionally alter their behavior. For example,
-     * the soft keyboard may choose to hide its UI for inserting GIFs for a particular input
-     * field if the MIME types set here for that field don't include "image/gif" or "image/*".
+     * <p>When setting a listener, clients must also declare the accepted MIME types.
+     * The listener will still be invoked even if the MIME type of the content is not one of the
+     * declared MIME types (e.g. if the user pastes content whose type is not one of the declared
+     * MIME types).
+     * In that case, the listener may reject the content (defer to the default platform behavior)
+     * or execute some other fallback logic (e.g. show an appropriate message to the user).
+     * The declared MIME types serve as a hint to allow different features to optionally alter
+     * their behavior. For example, a soft keyboard may optionally choose to hide its UI for
+     * inserting GIFs for a particular input field if the MIME types set here for that field
+     * don't include "image/gif" or "image/*".
      *
      * <p>Note: MIME type matching in the Android framework is case-sensitive, unlike formal RFC
      * MIME types. As a result, you should always write your MIME types with lowercase letters,
diff --git a/core/core/src/main/java/androidx/core/widget/TextViewOnReceiveContentListener.java b/core/core/src/main/java/androidx/core/widget/TextViewOnReceiveContentListener.java
index 93e3eb1..336fcc3 100644
--- a/core/core/src/main/java/androidx/core/widget/TextViewOnReceiveContentListener.java
+++ b/core/core/src/main/java/androidx/core/widget/TextViewOnReceiveContentListener.java
@@ -18,7 +18,6 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 import static androidx.core.view.ContentInfoCompat.FLAG_CONVERT_TO_PLAIN_TEXT;
-import static androidx.core.view.ContentInfoCompat.SOURCE_DRAG_AND_DROP;
 import static androidx.core.view.ContentInfoCompat.SOURCE_INPUT_METHOD;
 
 import android.content.ClipData;
@@ -26,7 +25,6 @@
 import android.os.Build;
 import android.text.Editable;
 import android.text.Selection;
-import android.text.SpannableStringBuilder;
 import android.text.Spanned;
 import android.util.Log;
 import android.view.View;
@@ -64,10 +62,6 @@
             // supported by the default implementation.
             return payload;
         }
-        if (source == SOURCE_DRAG_AND_DROP) {
-            onReceiveForDragAndDrop((TextView) view, payload);
-            return null;
-        }
 
         // The code here follows the platform logic in TextView:
         // https://cs.android.com/android/_/android/platform/frameworks/base/+/9fefb65aa9e7beae9ca8306b925b9fbfaeffecc9:core/java/android/widget/TextView.java;l=12644
@@ -95,26 +89,6 @@
         return null;
     }
 
-    private static void onReceiveForDragAndDrop(@NonNull TextView view,
-            @NonNull ContentInfoCompat payload) {
-        final CharSequence text = coerceToText(payload.getClip(), view.getContext(),
-                payload.getFlags());
-        replaceSelection((Editable) view.getText(), text);
-    }
-
-    @NonNull
-    private static CharSequence coerceToText(@NonNull ClipData clip, @NonNull Context context,
-            @Flags int flags) {
-        SpannableStringBuilder ssb = new SpannableStringBuilder();
-        for (int i = 0; i < clip.getItemCount(); i++) {
-            CharSequence itemText = coerceToText(context, clip.getItemAt(i), flags);
-            if (itemText != null) {
-                ssb.append(itemText);
-            }
-        }
-        return ssb;
-    }
-
     private static CharSequence coerceToText(@NonNull Context context, @NonNull ClipData.Item item,
             @Flags int flags) {
         if (Build.VERSION.SDK_INT >= 16) {
diff --git a/cursoradapter/cursoradapter/lint-baseline.xml b/cursoradapter/cursoradapter/lint-baseline.xml
index 7bb7737..9850951 100644
--- a/cursoradapter/cursoradapter/lint-baseline.xml
+++ b/cursoradapter/cursoradapter/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/customview/customview/lint-baseline.xml b/customview/customview/lint-baseline.xml
index 411ede8..cdb72ad 100644
--- a/customview/customview/lint-baseline.xml
+++ b/customview/customview/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
@@ -93,17 +93,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        void obtainBounds(T data, Rect outBounds);"
-        errorLine2="                          ~">
-        <location
-            file="src/main/java/androidx/customview/widget/FocusStrategy.java"
-            line="443"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        void obtainBounds(T data, Rect outBounds);"
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/customview/widget/FocusStrategy.java"
@@ -114,39 +103,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        V get(T collection, int index);"
-        errorLine2="        ~">
-        <location
-            file="src/main/java/androidx/customview/widget/FocusStrategy.java"
-            line="450"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        V get(T collection, int index);"
-        errorLine2="              ~">
-        <location
-            file="src/main/java/androidx/customview/widget/FocusStrategy.java"
-            line="450"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        int size(T collection);"
-        errorLine2="                 ~">
-        <location
-            file="src/main/java/androidx/customview/widget/FocusStrategy.java"
-            line="451"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public static ViewDragHelper create(@NonNull ViewGroup forParent, @NonNull Callback cb) {"
         errorLine2="                  ~~~~~~~~~~~~~~">
         <location
diff --git a/datastore/datastore-sampleapp/lint-baseline.xml b/datastore/datastore-sampleapp/lint-baseline.xml
index def8360..42a176b 100644
--- a/datastore/datastore-sampleapp/lint-baseline.xml
+++ b/datastore/datastore-sampleapp/lint-baseline.xml
@@ -1,59 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="EnforceSampledAnnotation"
-        message="onCreate is annotated with @Sampled, but is not inside a project/directory named samples."
-        errorLine1="    override fun onCreate(savedInstanceState: Bundle?) {"
-        errorLine2="                 ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/datastoresampleapp/PreferencesDataStoreActivity.kt"
-            line="49"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="EnforceSampledAnnotation"
-        message="setUpPreferenceStoreUi is annotated with @Sampled, but is not inside a project/directory named samples."
-        errorLine1="    private fun setUpPreferenceStoreUi() {"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/datastoresampleapp/PreferencesDataStoreActivity.kt"
-            line="66"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="EnforceSampledAnnotation"
-        message="onCreate is annotated with @Sampled, but is not inside a project/directory named samples."
-        errorLine1="    override fun onCreate(savedInstanceState: Bundle?) {"
-        errorLine2="                 ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/datastoresampleapp/ProtoDataStoreActivity.kt"
-            line="55"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="EnforceSampledAnnotation"
-        message="setUpProtoDataStoreUi is annotated with @Sampled, but is not inside a project/directory named samples."
-        errorLine1="    private fun setUpProtoDataStoreUi() {"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/datastoresampleapp/ProtoDataStoreActivity.kt"
-            line="72"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.layout.settings_fragment` appears to be unused"
-        errorLine1="&lt;androidx.constraintlayout.widget.ConstraintLayout"
-        errorLine2="^">
-        <location
-            file="src/main/res/layout/settings_fragment.xml"
-            line="18"
-            column="1"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
 </issues>
diff --git a/datastore/datastore/lint-baseline.xml b/datastore/datastore/lint-baseline.xml
index d1c7de0..ebe3a22 100644
--- a/datastore/datastore/lint-baseline.xml
+++ b/datastore/datastore/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/development/build_log_simplifier/message-flakes.ignore b/development/build_log_simplifier/message-flakes.ignore
index 843e9d4..f19cee7 100644
--- a/development/build_log_simplifier/message-flakes.ignore
+++ b/development/build_log_simplifier/message-flakes.ignore
@@ -75,3 +75,29 @@
 warning: ATTENTION!
 # b/185474400
 at org.gradle.*
+# > Task :internal-testutils-common:lintAnalyze
+Scanning .*:
+Failure reading binary cache file .*\.android\/cache\/api\-versions\-[0-9]+\-[0-9A-Z]+rev[0-9]+\.bin
+Please delete the file and restart the IDE\/lint\: .*\.android\/cache\/api\-versions\-[0-9]+\-[0-9]+rev[0-9]+\.bin
+java\.io\.FileNotFoundException\: .*\.android\/cache\/api\-versions\-[0-9]+\-[0-9]+rev[0-9]+\.bin \(No such file or directory\)
+at com\.google\.common\.io\.Files\$FileByteSource\.openStream\(Files\.java\:[0-9]+\)
+at com\.google\.common\.io\.Files\$FileByteSource\.read\(Files\.java\:[0-9]+\)
+at com\.google\.common\.io\.Files\.toByteArray\(Files\.java\:[0-9]+\)
+at com\.android\.tools\.lint\.checks\.ApiDatabase\.readData\(ApiDatabase\.java\:[0-9]+\)
+at com\.android\.tools\.lint\.checks\.ApiLookup\.\<init\>\(ApiLookup\.java\:[0-9]+\)
+at com\.android\.tools\.lint\.checks\.ApiLookup\.get\(ApiLookup\.java\:[0-9]+\)
+at com\.android\.tools\.lint\.checks\.ApiDetector\.beforeCheckRootProject\(ApiDetector\.kt\:[0-9]+\)
+at com\.android\.tools\.lint\.client\.api\.LintDriver\.checkProject\(LintDriver\.kt\:[0-9]+\)
+at com\.android\.tools\.lint\.client\.api\.LintDriver\.checkProjectRoot\(LintDriver\.kt\:[0-9]+\)
+at com\.android\.tools\.lint\.client\.api\.LintDriver\.access\$checkProjectRoot\(LintDriver\.kt\:[0-9]+\)
+at com\.android\.tools\.lint\.client\.api\.LintDriver\$analyzeOnly\$[0-9]+\.invoke\(LintDriver\.kt\:[0-9]+\)
+at com\.android\.tools\.lint\.client\.api\.LintDriver\.doAnalyze\(LintDriver\.kt\:[0-9]+\)
+at com\.android\.tools\.lint\.client\.api\.LintDriver\.analyzeOnly\(LintDriver\.kt\:[0-9]+\)
+at com\.android\.tools\.lint\.LintCliClient\$analyzeOnly\$[0-9]+\.invoke\(LintCliClient\.kt\:[0-9]+\)
+at com\.android\.tools\.lint\.LintCliClient\.run\(LintCliClient\.kt\:[0-9]+\)
+at com\.android\.tools\.lint\.LintCliClient\.run\$default\(LintCliClient\.kt\:[0-9]+\)
+at com\.android\.tools\.lint\.LintCliClient\.analyzeOnly\(LintCliClient\.kt\:[0-9]+\)
+at com\.android\.tools\.lint\.Main\.run\(Main\.java\:[0-9]+\)
+at com\.android\.build\.gradle\.internal\.lint\.AndroidLintWorkAction\.invokeLintMainRunMethod\(AndroidLintWorkAction\.kt\:[0-9]+\)
+at com\.android\.build\.gradle\.internal\.lint\.AndroidLintWorkAction\.runLint\(AndroidLintWorkAction\.kt\:[0-9]+\)
+at com\.android\.build\.gradle\.internal\.lint\.AndroidLintWorkAction\.execute\(AndroidLintWorkAction\.kt\:[0-9]+\)
diff --git a/development/build_log_simplifier/messages.ignore b/development/build_log_simplifier/messages.ignore
index dff780e..958fbca 100644
--- a/development/build_log_simplifier/messages.ignore
+++ b/development/build_log_simplifier/messages.ignore
@@ -1128,3 +1128,5 @@
 # > Task :compose:foundation:foundation:integration-tests:foundation-demos:reportLibraryMetrics
 Stripped invalid locals information from [0-9]+ method\.
 java\.lang\.Object androidx\.compose\.foundation\.demos\.ListDemosKt\$ListHoistedStateDemo\$[0-9]+\$[0-9]+\$[0-9]+\$[0-9]+\$[0-9]+\.invokeSuspend\(java\.lang\.Object\)
+# > Task :compose:runtime:runtime-saveable-lint:compileKotlin
+at org\.jetbrains\.kotlin\.compilerRunner\.GradleCompilerRunnerWithWorkers\$GradleKotlinCompilerWorkAction\.execute\(GradleCompilerRunnerWithWorkers\.kt\:[0-9]+\)
\ No newline at end of file
diff --git a/development/lintBaselineToCsv.main.kts b/development/lintBaselineToCsv.main.kts
new file mode 100755
index 0000000..82606f2
--- /dev/null
+++ b/development/lintBaselineToCsv.main.kts
@@ -0,0 +1,247 @@
+#!/usr/bin/env kotlin
+
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@file:Repository("https://repo1.maven.org/maven2")
+@file:DependsOn("junit:junit:4.11")
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.w3c.dom.Document
+import org.w3c.dom.Element
+import org.w3c.dom.Node
+import org.w3c.dom.NodeList
+import org.xml.sax.InputSource
+import java.io.File
+import java.io.StringReader
+import javax.xml.parsers.DocumentBuilderFactory
+import kotlin.system.exitProcess
+
+if (args[0] == "test") {
+    runTests()
+    println("All tests passed")
+    exitProcess(0)
+}
+
+if (args.isEmpty()) {
+    println("Expected space-delimited list of files. Consider parsing all baselines with:")
+    println("  ./<path-to-script> `find . -name lint-baseline.xml`")
+    println("Also, consider updating baselines before running the script using:")
+    println("  ./gradlew lintDebug -PupdateLintBaseline --continue")
+    exitProcess(1)
+}
+
+val missingFiles = args.filter { arg -> !File(arg).exists() }
+if (missingFiles.isNotEmpty()) {
+    println("Could not find files:\n  ${missingFiles.joinToString("\n  ")}")
+    exitProcess(1)
+}
+
+val executionPath = File(".")
+// TODO: Consider adding argument "--output <output-file-path>"
+val csvOutputFile = File("output.csv")
+val csvData = StringBuilder()
+val columnLabels = listOf(
+    "Baseline",
+    "ID",
+    "Message",
+    "Error",
+    "Location",
+    "Line"
+)
+
+// Emit labels into the CSV if it's being created from scratch.
+if (!csvOutputFile.exists()) {
+    csvData.append(columnLabels.joinToString(","))
+    csvData.append("\n")
+}
+
+// For each file, emit one issue per line into the CSV.
+args.forEach { lintBaselinePath ->
+    val lintBaselineFile = File(lintBaselinePath)
+    println("Parsing ${lintBaselineFile.path}...")
+
+    val lintIssuesList = LintBaselineParser.parse(lintBaselineFile)
+    lintIssuesList.forEach { lintIssues ->
+        lintIssues.issues.forEach { lintIssue ->
+            val columns = listOf(
+                lintIssues.file.toRelativeString(executionPath),
+                lintIssue.id,
+                lintIssue.message,
+                lintIssue.errorLines.joinToString("\n"),
+                lintIssue.locations.getOrNull(0)?.file ?: "",
+                lintIssue.locations.getOrNull(0)?.line?.toString() ?: "",
+            )
+            csvData.append(columns.joinToString(",") { data ->
+                // Wrap every item with quotes and escape existing quotes.
+                "\"${data.replace("\"", "\"\"")}\""
+            })
+            csvData.append("\n")
+        }
+    }
+}
+
+csvOutputFile.appendText(csvData.toString())
+
+println("Wrote CSV output to ${csvOutputFile.path} for ${args.size} baselines")
+
+object LintBaselineParser {
+    fun parse(lintBaselineFile: File): List<LintIssues> {
+        val builderFactory = DocumentBuilderFactory.newInstance()!!
+        val docBuilder = builderFactory.newDocumentBuilder()!!
+        val doc: Document = docBuilder.parse(lintBaselineFile)
+        return parseIssuesListFromDocument(doc, lintBaselineFile)
+    }
+
+    fun parse(lintBaselineText: String): List<LintIssues> {
+        val builderFactory = DocumentBuilderFactory.newInstance()!!
+        val docBuilder = builderFactory.newDocumentBuilder()!!
+        val doc: Document = docBuilder.parse(InputSource(StringReader(lintBaselineText)))
+        return parseIssuesListFromDocument(doc, File("."))
+    }
+
+    private fun parseIssuesListFromDocument(doc: Document, file: File): List<LintIssues> =
+        doc.getElementsByTagName("issues").mapElementsNotNull { issues ->
+            LintIssues(
+                file = file,
+                issues = parseIssueListFromIssues(issues),
+            )
+        }
+
+    private fun parseIssueListFromIssues(issues: Element): List<LintIssue> =
+        issues.getElementsByTagName("issue").mapElementsNotNull { issue ->
+            LintIssue(
+                id = issue.getAttribute("id"),
+                message = issue.getAttribute("message"),
+                errorLines = parseErrorLineListFromIssue(issue),
+                locations = parseLocationListFromIssue(issue),
+            )
+        }
+
+    private fun parseLocationListFromIssue(issue: Element): List<LintLocation> =
+        issue.getElementsByTagName("location").mapElementsNotNull { location ->
+            LintLocation(
+                file = location.getAttribute("file"),
+                line = location.getAttribute("line")?.toIntOrNull() ?: 0,
+                column = location.getAttribute("column")?.toIntOrNull() ?: 0,
+            )
+        }
+
+    private fun parseErrorLineListFromIssue(issue: Element): List<String> {
+        val list = mutableListOf<String>()
+        var i = 1
+        while (issue.hasAttribute("errorLine$i")) {
+            issue.getAttribute("errorLine$i")?.let{ list.add(it) }
+            i++
+        }
+        return list.toList()
+    }
+
+    // This MUST be inside the class, otherwise we'll get a compilation error.
+    private fun <T> NodeList.mapElementsNotNull(transform: (element: Element) -> T?): List<T> {
+        val list = mutableListOf<T>()
+        for (i in 0 until length) {
+            val node = item(i)
+            if (node.nodeType == Node.ELEMENT_NODE && node is Element) {
+                transform(node)?.let { list.add(it) }
+            }
+        }
+        return list.toList()
+    }
+}
+
+data class LintIssues(
+    val file: File,
+    val issues: List<LintIssue>,
+)
+
+data class LintIssue(
+    val id: String,
+    val message: String,
+    val errorLines: List<String>,
+    val locations: List<LintLocation>,
+)
+
+data class LintLocation(
+    val file: String,
+    val line: Int,
+    val column: Int,
+)
+
+fun runTests() {
+    `Baseline with one issue parses contents correctly`()
+    `Empty baseline has no issues`()
+}
+
+@Test
+fun `Baseline with one issue parses contents correctly`() {
+    /* ktlint-disable max-line-length */
+    var lintBaselineText = """
+        <?xml version="1.0" encoding="UTF-8"?>
+        <issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+        
+            <issue
+                id="ClassVerificationFailure"
+                message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
+                errorLine1="        PrintAttributes attr = new PrintAttributes.Builder()"
+                errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+                <location
+                    file="src/main/java/androidx/print/PrintHelper.java"
+                    line="271"
+                    column="32"/>
+            </issue>
+        </issues>
+    """.trimIndent()
+    /* ktlint-enable max-line-length */
+
+    var listIssues = LintBaselineParser.parse(lintBaselineText)
+    assertEquals(1, listIssues.size)
+
+    var issues = listIssues[0].issues
+    assertEquals(1, issues.size)
+
+    var issue = issues[0]
+    assertEquals("ClassVerificationFailure", issue.id)
+    assertEquals("This call references a method added in API level 19; however, the containing " +
+        "class androidx.print.PrintHelper is reachable from earlier API levels and will fail " +
+        "run-time class verification.", issue.message)
+    assertEquals(2, issue.errorLines.size)
+    assertEquals(1, issue.locations.size)
+
+    var location = issue.locations[0]
+    assertEquals("src/main/java/androidx/print/PrintHelper.java", location.file)
+    assertEquals(271, location.line)
+    assertEquals(32, location.column)
+}
+
+@Test
+fun `Empty baseline has no issues`() {
+    /* ktlint-disable max-line-length */
+    var lintBaselineText = """
+        <?xml version="1.0" encoding="UTF-8"?>
+        <issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
+
+        </issues>
+    """.trimIndent()
+    /* ktlint-enable max-line-length */
+
+    var listIssues = LintBaselineParser.parse(lintBaselineText)
+    assertEquals(1, listIssues.size)
+
+    var issues = listIssues[0].issues
+    assertEquals(0, issues.size)
+}
diff --git a/development/referenceDocs/stageReferenceDocsWithDackka.sh b/development/referenceDocs/stageReferenceDocsWithDackka.sh
index b5689aa..cc34502 100755
--- a/development/referenceDocs/stageReferenceDocsWithDackka.sh
+++ b/development/referenceDocs/stageReferenceDocsWithDackka.sh
@@ -26,6 +26,7 @@
 #  "collection"
   "navigation"
   "paging"
+  "window"
 )
 readonly kotlinLibraryDirs=(
 #  "benchmark"
@@ -33,6 +34,7 @@
 #  "collection"
   "navigation"
 #  "paging"
+  "window"
 )
 
 
diff --git a/development/versionCatalogMigrate.sh b/development/versionCatalogMigrate.sh
index f7079fd..da5fa97 100755
--- a/development/versionCatalogMigrate.sh
+++ b/development/versionCatalogMigrate.sh
@@ -3,6 +3,7 @@
 find -iname build.gradle | xargs sed -i "s/AGP_LATEST/libs.androidGradlePlugin/"
 find -iname build.gradle | xargs sed -i "s/LINT_CORE/libs.androidLint/"
 find -iname build.gradle | xargs sed -i "s/LINT_API_LATEST/libs.androidLintApi/"
+find -iname build.gradle | xargs sed -i "s/LINT_API_MIN/libs.androidLintMinApi/"
 find -iname build.gradle | xargs sed -i "s/LINT_TESTS/libs.androidLintTests/"
 find -iname build.gradle | xargs sed -i "s/AUTO_COMMON/libs.autoCommon/"
 find -iname build.gradle | xargs sed -i "s/AUTO_SERVICE_ANNOTATIONS/libs.autoServiceAnnotations/"
@@ -25,9 +26,9 @@
 find -iname build.gradle | xargs sed -i "s/ESPRESSO_WEB/libs.espressoWeb/"
 find -iname build.gradle | xargs sed -i "s/FINDBUGS/libs.findbugs/"
 find -iname build.gradle | xargs sed -i "s/FIREBASE_APPINDEXING/libs.firebaseAppindexing/"
-find -iname build.gradle | xargs sed -i "s/HILT_ANDROID/libs.hiltAndroid/"
 find -iname build.gradle | xargs sed -i "s/HILT_ANDROID_TESTING/libs.hiltAndroidTesting/"
 find -iname build.gradle | xargs sed -i "s/HILT_ANDROID_GRADLE_PLUGIN/libs.hiltAndroidGradlePlugin/"
+find -iname build.gradle | xargs sed -i "s/HILT_ANDROID/libs.hiltAndroid/"
 find -iname build.gradle | xargs sed -i "s/HILT_COMPILER/libs.hiltCompiler/"
 find -iname build.gradle | xargs sed -i "s/HILT_CORE/libs.hiltCore/"
 find -iname build.gradle | xargs sed -i "s/INTELLIJ_ANNOTATIONS/libs.intellijAnnotations/"
@@ -64,9 +65,6 @@
 find -iname build.gradle | xargs sed -i "s/KOTLIN_TEST_JS/libs.kotlinTestJs/"
 find -iname build.gradle | xargs sed -i "s/KOTLIN_TEST/libs.kotlinTest/"
 find -iname build.gradle | xargs sed -i "s/KOTLIN_REFLECT/libs.kotlinReflect/"
-find -iname build.gradle | xargs sed -i "s/KOTLINPOET_METADATA/libs.kotlinPoetMetadata/"
-find -iname build.gradle | xargs sed -i "s/KOTLINPOET_METADATA_SPECS/libs.kotlinPoetMetadataSpecs/"
-find -iname build.gradle | xargs sed -i "s/KOTLINPOET_CLASSINSPECTOR_ELEMENTS/libs.kotlinPoetClassinspector/"
 find -iname build.gradle | xargs sed -i "s/KOTLINPOET/libs.kotlinPoet/"
 find -iname build.gradle | xargs sed -i "s/LEAKCANARY_INSTRUMENTATION/libs.leakcanaryInstrumentation/"
 find -iname build.gradle | xargs sed -i "s/LEAKCANARY/libs.leakcanary/"
@@ -79,6 +77,7 @@
 find -iname build.gradle | xargs sed -i "s/OKHTTP_MOCKWEBSERVER/libs.okhttpMockwebserver/"
 find -iname build.gradle | xargs sed -i "s/PLAY_CORE/libs.playCore/"
 find -iname build.gradle | xargs sed -i "s/PLAY_SERVICES_BASE/libs.playServicesBase/"
+find -iname build.gradle | xargs sed -i "s/PLAY_SERVICES_BASEMENT/libs.playServicesBasement/"
 find -iname build.gradle | xargs sed -i "s/PROTOBUF_COMPILER/libs.protobufCompiler/"
 find -iname build.gradle | xargs sed -i "s/PROTOBUF_LITE/libs.protobufLite/"
 find -iname build.gradle | xargs sed -i "s/PROTOBUF/libs.protobuf/"
diff --git a/docs-tip-of-tree/build.gradle b/docs-tip-of-tree/build.gradle
index 3c0edab..1ffc337 100644
--- a/docs-tip-of-tree/build.gradle
+++ b/docs-tip-of-tree/build.gradle
@@ -216,6 +216,7 @@
     docs(project(":savedstate:savedstate"))
     docs(project(":savedstate:savedstate-ktx"))
     docs(project(":security:security-app-authenticator"))
+    docs(project(":security:security-app-authenticator-testing"))
     docs(project(":security:security-biometric"))
     docs(project(":security:security-crypto"))
     docs(project(":security:security-crypto-ktx"))
@@ -273,6 +274,9 @@
     docs(project(":wear:wear-watchface-style"))
     docs(project(":webkit:webkit"))
     docs(project(":window:window"))
+    docs(project(":window:window-java"))
+    docs(project(":window:window-rxjava2"))
+    docs(project(":window:window-rxjava3"))
     stubs(project(":window:window-sidecar"))
     stubs(project(":window:window-extensions"))
     docs(project(":work:work-gcm"))
diff --git a/documentfile/documentfile/lint-baseline.xml b/documentfile/documentfile/lint-baseline.xml
index 9e66853..292e7cc 100644
--- a/documentfile/documentfile/lint-baseline.xml
+++ b/documentfile/documentfile/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/drawerlayout/drawerlayout/lint-baseline.xml b/drawerlayout/drawerlayout/lint-baseline.xml
index f0017c4..dbfb443 100644
--- a/drawerlayout/drawerlayout/lint-baseline.xml
+++ b/drawerlayout/drawerlayout/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/dynamic-animation/dynamic-animation/lint-baseline.xml b/dynamic-animation/dynamic-animation/lint-baseline.xml
index d329927..dddc744 100644
--- a/dynamic-animation/dynamic-animation/lint-baseline.xml
+++ b/dynamic-animation/dynamic-animation/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
@@ -15,61 +15,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public T setStartValue(float startValue) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/dynamicanimation/animation/DynamicAnimation.java"
-            line="390"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public T setStartVelocity(float startVelocity) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/dynamicanimation/animation/DynamicAnimation.java"
-            line="415"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public T setMaxValue(float max) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/dynamicanimation/animation/DynamicAnimation.java"
-            line="429"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public T setMinValue(float min) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/dynamicanimation/animation/DynamicAnimation.java"
-            line="447"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public T addEndListener(OnAnimationEndListener listener) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/dynamicanimation/animation/DynamicAnimation.java"
-            line="460"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public T addEndListener(OnAnimationEndListener listener) {"
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -93,17 +38,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public T addUpdateListener(OnAnimationUpdateListener listener) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/dynamicanimation/animation/DynamicAnimation.java"
-            line="489"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public T addUpdateListener(OnAnimationUpdateListener listener) {"
         errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/dynamicanimation/animation/DynamicAnimation.java"
@@ -125,17 +59,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public T setMinimumVisibleChange(@FloatRange(from = 0.0, fromInclusive = false)"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/dynamicanimation/animation/DynamicAnimation.java"
-            line="540"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        void onAnimationEnd(DynamicAnimation animation, boolean canceled, float value,"
         errorLine2="                            ~~~~~~~~~~~~~~~~">
         <location
@@ -170,17 +93,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public &lt;K> FlingAnimation(K object, FloatPropertyCompat&lt;K> property) {"
-        errorLine2="                              ~">
-        <location
-            file="src/main/java/androidx/dynamicanimation/animation/FlingAnimation.java"
-            line="69"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public &lt;K> FlingAnimation(K object, FloatPropertyCompat&lt;K> property) {"
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/dynamicanimation/animation/FlingAnimation.java"
@@ -268,28 +180,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public abstract float getValue(T object);"
-        errorLine2="                                   ~">
-        <location
-            file="src/main/java/androidx/dynamicanimation/animation/FloatPropertyCompat.java"
-            line="77"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public abstract void setValue(T object, float value);"
-        errorLine2="                                  ~">
-        <location
-            file="src/main/java/androidx/dynamicanimation/animation/FloatPropertyCompat.java"
-            line="85"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public SpringAnimation(FloatValueHolder floatValueHolder) {"
         errorLine2="                           ~~~~~~~~~~~~~~~~">
         <location
@@ -313,17 +203,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public &lt;K> SpringAnimation(K object, FloatPropertyCompat&lt;K> property) {"
-        errorLine2="                               ~">
-        <location
-            file="src/main/java/androidx/dynamicanimation/animation/SpringAnimation.java"
-            line="112"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public &lt;K> SpringAnimation(K object, FloatPropertyCompat&lt;K> property) {"
         errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/dynamicanimation/animation/SpringAnimation.java"
@@ -335,17 +214,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public &lt;K> SpringAnimation(K object, FloatPropertyCompat&lt;K> property,"
-        errorLine2="                               ~">
-        <location
-            file="src/main/java/androidx/dynamicanimation/animation/SpringAnimation.java"
-            line="126"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public &lt;K> SpringAnimation(K object, FloatPropertyCompat&lt;K> property,"
         errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/dynamicanimation/animation/SpringAnimation.java"
diff --git a/emoji/appcompat/lint-baseline.xml b/emoji/appcompat/lint-baseline.xml
index 2384ba1..0d655a9 100644
--- a/emoji/appcompat/lint-baseline.xml
+++ b/emoji/appcompat/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/emoji/core/lint-baseline.xml b/emoji/core/lint-baseline.xml
index 0e7a875..9751702 100644
--- a/emoji/core/lint-baseline.xml
+++ b/emoji/core/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
@@ -123,7 +123,8 @@
         <location
             file="src/main/java/androidx/emoji/text/EmojiMetadata.java"
             line="193"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
diff --git a/exifinterface/exifinterface/lint-baseline.xml b/exifinterface/exifinterface/lint-baseline.xml
index 9542238..54da8b6 100644
--- a/exifinterface/exifinterface/lint-baseline.xml
+++ b/exifinterface/exifinterface/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/fragment/fragment-ktx/build.gradle b/fragment/fragment-ktx/build.gradle
index cd841ce..2f24481 100644
--- a/fragment/fragment-ktx/build.gradle
+++ b/fragment/fragment-ktx/build.gradle
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.Publish
 
 plugins {
@@ -27,10 +25,10 @@
 
 dependencies {
     api(project(":fragment:fragment"))
-    api("androidx.activity:activity-ktx:1.2.2") {
+    api("androidx.activity:activity-ktx:1.2.3") {
         because "Mirror fragment dependency graph for -ktx artifacts"
     }
-    api("androidx.core:core-ktx:1.1.0") {
+    api("androidx.core:core-ktx:1.2.0") {
         because "Mirror fragment dependency graph for -ktx artifacts"
     }
     api("androidx.collection:collection-ktx:1.1.0") {
@@ -43,13 +41,13 @@
     api("androidx.savedstate:savedstate-ktx:1.1.0") {
         because 'Mirror fragment dependency graph for -ktx artifacts'
     }
-    api(KOTLIN_STDLIB)
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
+    api(libs.kotlinStdlib)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
     androidTestImplementation(project(":internal-testutils-runtime"), {
         exclude group: "androidx.fragment", module: "fragment"
     })
diff --git a/fragment/fragment-lint/build.gradle b/fragment/fragment-lint/build.gradle
index da2c726..c660740 100644
--- a/fragment/fragment-lint/build.gradle
+++ b/fragment/fragment-lint/build.gradle
@@ -25,14 +25,14 @@
 }
 
 dependencies {
-    compileOnly(LINT_API_MIN)
-    compileOnly(KOTLIN_STDLIB)
+    compileOnly(libs.androidLintMinApi)
+    compileOnly(libs.kotlinStdlib)
 
-    testImplementation(KOTLIN_STDLIB)
-    testImplementation(LINT_CORE)
-    testImplementation(LINT_TESTS)
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
+    testImplementation(libs.kotlinStdlib)
+    testImplementation(libs.androidLint)
+    testImplementation(libs.androidLintTests)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
 }
 
 androidx {
diff --git a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/FragmentIssueRegistry.kt b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/FragmentIssueRegistry.kt
index 33330a3..bba9973 100644
--- a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/FragmentIssueRegistry.kt
+++ b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/FragmentIssueRegistry.kt
@@ -32,6 +32,7 @@
         UnsafeFragmentLifecycleObserverDetector.LIVEDATA_ISSUE,
         UseRequireInsteadOfGet.ISSUE,
         UseGetLayoutInflater.ISSUE,
-        OnCreateDialogIncorrectCallbackDetector.ISSUE
+        OnCreateDialogIncorrectCallbackDetector.ISSUE,
+        UnsafeRepeatOnLifecycleDetector.ISSUE
     )
 }
diff --git a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UnsafeRepeatOnLifecycleDetector.kt b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UnsafeRepeatOnLifecycleDetector.kt
new file mode 100644
index 0000000..500c462
--- /dev/null
+++ b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UnsafeRepeatOnLifecycleDetector.kt
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.fragment.lint
+
+import com.android.tools.lint.detector.api.Category
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.JavaContext
+import com.android.tools.lint.detector.api.Scope
+import com.android.tools.lint.detector.api.Severity
+import com.android.tools.lint.detector.api.SourceCodeScanner
+import com.intellij.psi.PsiMethod
+import com.intellij.psi.PsiType
+import org.jetbrains.uast.UCallExpression
+import org.jetbrains.uast.UClass
+import org.jetbrains.uast.getParentOfType
+
+/**
+ * Lint check for detecting calls to the suspend `repeatOnLifecycle` APIs using `lifecycleOwner`
+ * instead of `viewLifecycleOwner` in [androidx.fragment.app.Fragment] classes but not in
+ * [androidx.fragment.app.DialogFragment] classes.
+ *
+ * DialogFragments are allowed to use `lifecycleOwner` since they don't always have a `view`
+ * attached to them.
+ */
+class UnsafeRepeatOnLifecycleDetector : Detector(), SourceCodeScanner {
+
+    companion object {
+        val ISSUE = Issue.create(
+            id = "UnsafeRepeatOnLifecycleDetector",
+            briefDescription = "RepeatOnLifecycle should be used with viewLifecycleOwner in " +
+                "Fragments.",
+            explanation = """The repeatOnLifecycle APIs should be used with the viewLifecycleOwner \
+                in Fragments as opposed to lifecycleOwner.""",
+            category = Category.CORRECTNESS,
+            severity = Severity.ERROR,
+            implementation = Implementation(
+                UnsafeRepeatOnLifecycleDetector::class.java, Scope.JAVA_FILE_SCOPE
+            ),
+            androidSpecific = true
+        )
+    }
+
+    override fun getApplicableMethodNames() = listOf("repeatOnLifecycle")
+
+    override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
+        // Check that repeatOnLifecycle is called in a Fragment
+        if (!hasFragmentAsAncestorType(node.getParentOfType<UClass>())) return
+
+        // Report issue if the receiver is not using viewLifecycleOwner
+        if (node.receiver?.sourcePsi?.text?.contains(SAFE_RECEIVER, ignoreCase = true) != true) {
+            context.report(
+                ISSUE,
+                context.getLocation(node),
+                "The repeatOnLifecycle API should be used with viewLifecycleOwner"
+            )
+        }
+    }
+
+    /**
+     * Check if `uClass` has FRAGMENT as a super type but not DIALOG_FRAGMENT
+     */
+    @Suppress("UNCHECKED_CAST")
+    private fun hasFragmentAsAncestorType(uClass: UClass?): Boolean {
+        if (uClass == null) return false
+        return hasFragmentAsSuperType(uClass.superTypes as Array<PsiType>)
+    }
+
+    private fun hasFragmentAsSuperType(superTypes: Array<PsiType>): Boolean {
+        for (superType in superTypes) {
+            if (superType.canonicalText == DIALOG_FRAGMENT_CLASS) return false
+            if (superType.canonicalText == FRAGMENT_CLASS) return true
+            if (hasFragmentAsSuperType(superType.superTypes)) return true
+        }
+        return false
+    }
+}
+
+private const val SAFE_RECEIVER = "viewLifecycleOwner"
+private const val FRAGMENT_CLASS = "androidx.fragment.app.Fragment"
+private const val DIALOG_FRAGMENT_CLASS = "androidx.fragment.app.DialogFragment"
diff --git a/fragment/fragment-lint/src/test/java/androidx/fragment/lint/UnsafeRepeatOnLifecycleDetectorTest.kt b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/UnsafeRepeatOnLifecycleDetectorTest.kt
new file mode 100644
index 0000000..bb2084d
--- /dev/null
+++ b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/UnsafeRepeatOnLifecycleDetectorTest.kt
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.fragment.lint
+
+import androidx.fragment.lint.stubs.REPEAT_ON_LIFECYCLE_STUBS
+import com.android.tools.lint.checks.infrastructure.TestFiles
+import com.android.tools.lint.checks.infrastructure.TestLintTask
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RunWith(Parameterized::class)
+class UnsafeRepeatOnLifecycleDetectorTest(private val config: TestConfig) {
+
+    data class TestConfig(
+        val fragmentExtensions: String,
+        val apiCall: String,
+        val shouldWarn: Boolean
+    )
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun spec(): List<TestConfig> =
+            // Adding permutations manually to manually control if something should give a warning
+            listOf(
+                TestConfig(
+                    "Fragment()",
+                    "repeatOnLifecycle(Lifecycle.State.STARTED) { }",
+                    true
+                ),
+                TestConfig(
+                    "Fragment()",
+                    "lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { }",
+                    true
+                ),
+                TestConfig(
+                    "Fragment()",
+                    "viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { }",
+                    false
+                ),
+                TestConfig(
+                    "Fragment()",
+                    "lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { }",
+                    true
+                ),
+                TestConfig(
+                    "Fragment()",
+                    "getViewLifecycleOwner().repeatOnLifecycle(Lifecycle.State.STARTED) { }",
+                    false
+                ),
+                TestConfig(
+                    "Fragment()",
+                    "getLifecycleOwner().repeatOnLifecycle(Lifecycle.State.STARTED) { }",
+                    true
+                ),
+                TestConfig(
+                    "Fragment()",
+                    "viewLifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { }",
+                    false
+                ),
+                TestConfig(
+                    "Fragment()",
+                    "lifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { }",
+                    true
+                ),
+                TestConfig(
+                    "Fragment()",
+                    "getViewLifecycleOwner().lifecycle." +
+                        "repeatOnLifecycle(Lifecycle.State.STARTED) { }",
+                    false
+                ),
+                TestConfig(
+                    "Fragment()",
+                    "getLifecycleOwner().lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { }",
+                    true
+                ),
+                TestConfig(
+                    "BaseFragment(), FragmentListener",
+                    "getLifecycleOwner().lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { }",
+                    true
+                ),
+                TestConfig(
+                    "FragmentListener, OtherFragmentListener, BaseFragment()",
+                    "getLifecycleOwner().lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { }",
+                    true
+                ),
+                TestConfig(
+                    "DialogFragment()",
+                    "getLifecycleOwner().lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { }",
+                    false
+                ),
+            )
+    }
+
+    private val TEMPLATE = """
+        package foo
+
+        import androidx.lifecycle.Lifecycle
+        import androidx.lifecycle.LifecycleOwner
+        import androidx.lifecycle.repeatOnLifecycle
+        import kotlinx.coroutines.CoroutineScope
+        import kotlinx.coroutines.GlobalScope
+        import androidx.fragment.app.Fragment
+
+        class MyFragment : %s {
+            fun onCreateView() {
+                GlobalScope.launch {
+                    %s
+                }
+            }
+        }
+
+        class BaseFragment : Fragment()
+        interface FragmentListener
+        interface OtherFragmentListener
+    """.trimIndent()
+
+    @Test
+    fun basicTest() {
+        val testLintResult = TestLintTask.lint()
+            .files(
+                *REPEAT_ON_LIFECYCLE_STUBS,
+                TestFiles.kt(TEMPLATE.format(config.fragmentExtensions, config.apiCall))
+            )
+            .issues(UnsafeRepeatOnLifecycleDetector.ISSUE)
+            .run()
+
+        if (config.shouldWarn) {
+            /* ktlint-disable max-line-length */
+            testLintResult.expect(
+                """
+                src/foo/MyFragment.kt:13: Error: The repeatOnLifecycle API should be used with viewLifecycleOwner [UnsafeRepeatOnLifecycleDetector]
+                            ${config.apiCall}
+                            ${"~".repeat(config.apiCall.length)}
+                1 errors, 0 warnings
+                """.trimIndent()
+            )
+            /* ktlint-enable max-line-length */
+        } else {
+            testLintResult.expectClean()
+        }
+    }
+}
diff --git a/fragment/fragment-lint/src/test/java/androidx/fragment/lint/stubs/Stubs.kt b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/stubs/Stubs.kt
index d9f8b42..4e94f6f 100644
--- a/fragment/fragment-lint/src/test/java/androidx/fragment/lint/stubs/Stubs.kt
+++ b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/stubs/Stubs.kt
@@ -18,6 +18,7 @@
 
 import com.android.tools.lint.checks.infrastructure.LintDetectorTest.java
 import com.android.tools.lint.checks.infrastructure.LintDetectorTest.kotlin
+import com.android.tools.lint.checks.infrastructure.TestFiles
 
 private val BACK_PRESSED_CALLBACK = java(
     """
@@ -43,23 +44,22 @@
     """
     package androidx.fragment.app;
 
+    import androidx.lifecycle.Lifecycle;
     import androidx.lifecycle.LifecycleOwner;
 
-    public class Fragment {
+    public class Fragment implements LifecycleOwner {
         public LifecycleOwner getViewLifecycleOwner() {}
+        public LifecycleOwner getLifecycleOwner() {}
+        public Lifecycle getLifecycle() {}
     }
-"""
+    """
 )
 
 private val DIALOG_FRAGMENT = java(
     """
     package androidx.fragment.app;
 
-    import androidx.lifecycle.LifecycleOwner;
-
-    public class DialogFragment extends Fragment {
-        public LifecycleOwner getViewLifecycleOwner() {}
-    }
+    public class DialogFragment extends Fragment { }
 """
 )
 
@@ -67,7 +67,9 @@
     """
     package androidx.lifecycle;
 
-    public interface LifecycleOwner {}
+    public interface LifecycleOwner {
+        Lifecycle getLifecycle();
+    }
 """
 )
 
@@ -101,6 +103,20 @@
 """
 )
 
+private val LIFECYCLE = TestFiles.kt(
+    "androidx/lifecycle/Lifecycle.kt",
+    """
+        package androidx.lifecycle;
+
+        abstract class Lifecycle {
+            enum class State { CREATED, STARTED }
+            fun isAtLeast(state: State): Boolean {
+                return true
+            }
+        }
+    """
+).indented().within("src")
+
 private val LIVEDATA_OBSERVE_EXTENSION = kotlin(
     "androidx/lifecycle/LiveDataKt.kt",
     """
@@ -119,10 +135,52 @@
 """
 ).indented().within("src")
 
+private val COROUTINES = TestFiles.kt(
+    "kotlinx/coroutines/GlobalScope.kt",
+    """
+        package kotlinx.coroutines;
+
+        import kotlinx.coroutines.CoroutineScope
+
+        interface CoroutineScope {}
+
+        object GlobalScope {
+            fun launch(block: suspend () -> Unit) {}
+        }
+
+    """
+).indented().within("src")
+
+private val REPEAT_ON_LIFECYCLE = TestFiles.kt(
+    "androidx/lifecycle/RepeatOnLifecycle.kt",
+    """
+        package androidx.lifecycle;
+
+        import androidx.lifecycle.Lifecycle
+        import androidx.lifecycle.LifecycleOwner
+        import kotlinx.coroutines.CoroutineScope
+
+        public suspend fun Lifecycle.repeatOnLifecycle(
+            state: Lifecycle.State,
+            block: suspend CoroutineScope.() -> Unit
+        ) {
+            throw Error()
+        }
+
+        public suspend fun LifecycleOwner.repeatOnLifecycle(
+            state: Lifecycle.State,
+            block: suspend CoroutineScope.() -> Unit
+        ) {
+            throw Error()
+        }
+    """
+).indented().within("src")
+
 // stubs for testing calls to LiveData.observe calls
 internal val LIVEDATA_STUBS = arrayOf(
     FRAGMENT,
     DIALOG_FRAGMENT,
+    LIFECYCLE,
     LIFECYCLE_OWNER,
     LIVEDATA,
     MUTABLE_LIVEDATA,
@@ -135,5 +193,16 @@
     BACK_PRESSED_CALLBACK,
     BACK_PRESSED_DISPATCHER,
     FRAGMENT,
+    LIFECYCLE,
+    LIFECYCLE_OWNER
+)
+
+// stubs for testing calls to LifecycleOwner.repeatOnLifecycle
+internal val REPEAT_ON_LIFECYCLE_STUBS = arrayOf(
+    REPEAT_ON_LIFECYCLE,
+    DIALOG_FRAGMENT,
+    FRAGMENT,
+    COROUTINES,
+    LIFECYCLE,
     LIFECYCLE_OWNER
 )
diff --git a/fragment/fragment-testing-lint/build.gradle b/fragment/fragment-testing-lint/build.gradle
index 9242788..e4170a6 100644
--- a/fragment/fragment-testing-lint/build.gradle
+++ b/fragment/fragment-testing-lint/build.gradle
@@ -17,22 +17,20 @@
 import androidx.build.LibraryGroups
 import androidx.build.LibraryType
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("kotlin")
 }
 
 dependencies {
-    compileOnly(LINT_API_MIN)
-    compileOnly(KOTLIN_STDLIB)
+    compileOnly(libs.androidLintMinApi)
+    compileOnly(libs.kotlinStdlib)
 
-    testImplementation(KOTLIN_STDLIB)
-    testImplementation(LINT_CORE)
-    testImplementation(LINT_TESTS)
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
+    testImplementation(libs.kotlinStdlib)
+    testImplementation(libs.androidLint)
+    testImplementation(libs.androidLintTests)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
 }
 
 androidx {
diff --git a/fragment/fragment-testing/build.gradle b/fragment/fragment-testing/build.gradle
index 6c9828d..6d3ac16 100644
--- a/fragment/fragment-testing/build.gradle
+++ b/fragment/fragment-testing/build.gradle
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.Publish
 
 plugins {
@@ -27,17 +25,17 @@
 
 dependencies {
     api(project(":fragment:fragment-ktx"))
-    api(ANDROIDX_TEST_CORE)
-    api(KOTLIN_STDLIB)
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    api(libs.testCore)
+    api(libs.kotlinStdlib)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.espressoCore)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it"s own MockMaker
 
     lintPublish(project(":fragment:fragment-testing-lint"))
 }
diff --git a/fragment/fragment-truth/build.gradle b/fragment/fragment-truth/build.gradle
index 68c38ca..19a5892 100644
--- a/fragment/fragment-truth/build.gradle
+++ b/fragment/fragment-truth/build.gradle
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.Publish
 
 plugins {
@@ -27,14 +25,14 @@
 
 dependencies {
     api(project(":fragment:fragment-ktx"))
-    api(TRUTH)
-    api(KOTLIN_STDLIB)
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    api(libs.truth)
+    api(libs.kotlinStdlib)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testRunner)
     androidTestImplementation(project(":internal-testutils-truth"))
 }
 
diff --git a/fragment/fragment/api/current.txt b/fragment/fragment/api/current.txt
index 0ab03c8..9bb98ad 100644
--- a/fragment/fragment/api/current.txt
+++ b/fragment/fragment/api/current.txt
@@ -196,6 +196,7 @@
     ctor public FragmentContainerView(android.content.Context);
     ctor public FragmentContainerView(android.content.Context, android.util.AttributeSet?);
     ctor public FragmentContainerView(android.content.Context, android.util.AttributeSet?, int);
+    method @RequiresApi(20) protected boolean fitSystemWindows(android.graphics.Rect);
     method public <F extends androidx.fragment.app.Fragment> F? getFragment();
   }
 
@@ -458,7 +459,7 @@
 package androidx.fragment.app.strictmode {
 
   public final class FragmentReuseViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public FragmentReuseViolation();
+    method public String getPreviousFragmentId();
   }
 
   public final class FragmentStrictMode {
@@ -490,27 +491,23 @@
   }
 
   public final class FragmentTagUsageViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public FragmentTagUsageViolation();
+    method public android.view.ViewGroup? getParentContainer();
   }
 
   public final class RetainInstanceUsageViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public RetainInstanceUsageViolation();
   }
 
   public final class SetUserVisibleHintViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public SetUserVisibleHintViolation();
   }
 
   public final class TargetFragmentUsageViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public TargetFragmentUsageViolation();
   }
 
   public abstract class Violation extends java.lang.RuntimeException {
-    ctor public Violation();
+    method public androidx.fragment.app.Fragment getFragment();
   }
 
   public final class WrongFragmentContainerViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public WrongFragmentContainerViolation();
   }
 
 }
diff --git a/fragment/fragment/api/public_plus_experimental_current.txt b/fragment/fragment/api/public_plus_experimental_current.txt
index dcbd3b6..d90beb5 100644
--- a/fragment/fragment/api/public_plus_experimental_current.txt
+++ b/fragment/fragment/api/public_plus_experimental_current.txt
@@ -196,6 +196,7 @@
     ctor public FragmentContainerView(android.content.Context);
     ctor public FragmentContainerView(android.content.Context, android.util.AttributeSet?);
     ctor public FragmentContainerView(android.content.Context, android.util.AttributeSet?, int);
+    method @RequiresApi(20) protected boolean fitSystemWindows(android.graphics.Rect);
     method public <F extends androidx.fragment.app.Fragment> F? getFragment();
   }
 
@@ -458,13 +459,11 @@
 package androidx.fragment.app.strictmode {
 
   public final class FragmentReuseViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public FragmentReuseViolation();
+    method public String getPreviousFragmentId();
   }
 
   public final class FragmentStrictMode {
     method public static androidx.fragment.app.strictmode.FragmentStrictMode.Policy getDefaultPolicy();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static void onFragmentReuse(androidx.fragment.app.Fragment);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static void onFragmentTagUsage(androidx.fragment.app.Fragment);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static void onRetainInstanceUsage(androidx.fragment.app.Fragment);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static void onSetUserVisibleHint(androidx.fragment.app.Fragment);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static void onTargetFragmentUsage(androidx.fragment.app.Fragment);
@@ -496,27 +495,23 @@
   }
 
   public final class FragmentTagUsageViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public FragmentTagUsageViolation();
+    method public android.view.ViewGroup? getParentContainer();
   }
 
   public final class RetainInstanceUsageViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public RetainInstanceUsageViolation();
   }
 
   public final class SetUserVisibleHintViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public SetUserVisibleHintViolation();
   }
 
   public final class TargetFragmentUsageViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public TargetFragmentUsageViolation();
   }
 
   public abstract class Violation extends java.lang.RuntimeException {
-    ctor public Violation();
+    method public androidx.fragment.app.Fragment getFragment();
   }
 
   public final class WrongFragmentContainerViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public WrongFragmentContainerViolation();
   }
 
 }
diff --git a/fragment/fragment/api/restricted_current.txt b/fragment/fragment/api/restricted_current.txt
index 9fe9aaa..225eb79 100644
--- a/fragment/fragment/api/restricted_current.txt
+++ b/fragment/fragment/api/restricted_current.txt
@@ -201,6 +201,7 @@
     ctor public FragmentContainerView(android.content.Context);
     ctor public FragmentContainerView(android.content.Context, android.util.AttributeSet?);
     ctor public FragmentContainerView(android.content.Context, android.util.AttributeSet?, int);
+    method @RequiresApi(20) protected boolean fitSystemWindows(android.graphics.Rect);
     method public <F extends androidx.fragment.app.Fragment> F? getFragment();
   }
 
@@ -488,13 +489,11 @@
 package androidx.fragment.app.strictmode {
 
   public final class FragmentReuseViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public FragmentReuseViolation();
+    method public String getPreviousFragmentId();
   }
 
   public final class FragmentStrictMode {
     method public static androidx.fragment.app.strictmode.FragmentStrictMode.Policy getDefaultPolicy();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static void onFragmentReuse(androidx.fragment.app.Fragment);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static void onFragmentTagUsage(androidx.fragment.app.Fragment);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static void onRetainInstanceUsage(androidx.fragment.app.Fragment);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static void onSetUserVisibleHint(androidx.fragment.app.Fragment);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static void onTargetFragmentUsage(androidx.fragment.app.Fragment);
@@ -526,27 +525,23 @@
   }
 
   public final class FragmentTagUsageViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public FragmentTagUsageViolation();
+    method public android.view.ViewGroup? getParentContainer();
   }
 
   public final class RetainInstanceUsageViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public RetainInstanceUsageViolation();
   }
 
   public final class SetUserVisibleHintViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public SetUserVisibleHintViolation();
   }
 
   public final class TargetFragmentUsageViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public TargetFragmentUsageViolation();
   }
 
   public abstract class Violation extends java.lang.RuntimeException {
-    ctor public Violation();
+    method public androidx.fragment.app.Fragment getFragment();
   }
 
   public final class WrongFragmentContainerViolation extends androidx.fragment.app.strictmode.Violation {
-    ctor public WrongFragmentContainerViolation();
   }
 
 }
diff --git a/fragment/fragment/build.gradle b/fragment/fragment/build.gradle
index 6225c134..d672ed1 100644
--- a/fragment/fragment/build.gradle
+++ b/fragment/fragment/build.gradle
@@ -1,6 +1,4 @@
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.Publish
 
 plugins {
@@ -30,7 +28,7 @@
     api("androidx.collection:collection:1.1.0")
     api("androidx.viewpager:viewpager:1.0.0")
     api("androidx.loader:loader:1.0.0")
-    api("androidx.activity:activity:1.2.2")
+    api("androidx.activity:activity:1.2.3")
     api("androidx.lifecycle:lifecycle-livedata-core:2.3.1")
     api("androidx.lifecycle:lifecycle-viewmodel:2.3.1")
     api("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.1")
@@ -41,27 +39,27 @@
         exclude group: "androidx.fragment", module: "fragment"
         exclude group: "androidx.activity", module: "activity"
     })
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(MULTIDEX)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.espressoCore, excludes.espresso)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(libs.multidex)
     androidTestImplementation(project(":internal-testutils-runtime"), {
         exclude group: "androidx.fragment", module: "fragment"
     })
 
     testImplementation(project(":fragment:fragment"))
-    testImplementation(KOTLIN_STDLIB)
-    testImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    testImplementation(ANDROIDX_TEST_CORE)
-    testImplementation(ANDROIDX_TEST_RULES)
-    testImplementation(TRUTH)
-    testImplementation(ROBOLECTRIC)
+    testImplementation(libs.kotlinStdlib)
+    testImplementation(libs.testExtJunit)
+    testImplementation(libs.testCore)
+    testImplementation(libs.testRules)
+    testImplementation(libs.truth)
+    testImplementation(libs.robolectric)
 
     lintPublish(project(":fragment:fragment-lint"))
 }
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/strictmode/FragmentStrictModeTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/strictmode/FragmentStrictModeTest.kt
index 44e58d5..39895c6 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/strictmode/FragmentStrictModeTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/strictmode/FragmentStrictModeTest.kt
@@ -59,7 +59,8 @@
 
         var violation: Violation? = null
         try {
-            FragmentStrictMode.onPolicyViolation(StrictFragment(), object : Violation() {})
+            val fragment = StrictFragment()
+            FragmentStrictMode.onPolicyViolation(object : Violation(fragment) {})
         } catch (thrown: Violation) {
             violation = thrown
         }
@@ -69,7 +70,6 @@
     @Test
     public fun policyHierarchy() {
         var lastTriggeredPolicy = ""
-        val violation = object : Violation() {}
 
         fun policy(name: String) = FragmentStrictMode.Policy.Builder()
             .penaltyListener { lastTriggeredPolicy = name }
@@ -90,18 +90,20 @@
                 .commit()
             executePendingTransactions()
 
+            val violation = object : Violation(childFragment) {}
+
             FragmentStrictMode.setDefaultPolicy(policy("Default policy"))
-            FragmentStrictMode.onPolicyViolation(childFragment, violation)
+            FragmentStrictMode.onPolicyViolation(violation)
             InstrumentationRegistry.getInstrumentation().waitForIdleSync()
             assertThat(lastTriggeredPolicy).isEqualTo("Default policy")
 
             fragmentManager.strictModePolicy = policy("Parent policy")
-            FragmentStrictMode.onPolicyViolation(childFragment, violation)
+            FragmentStrictMode.onPolicyViolation(violation)
             InstrumentationRegistry.getInstrumentation().waitForIdleSync()
             assertThat(lastTriggeredPolicy).isEqualTo("Parent policy")
 
             parentFragment.childFragmentManager.strictModePolicy = policy("Child policy")
-            FragmentStrictMode.onPolicyViolation(childFragment, violation)
+            FragmentStrictMode.onPolicyViolation(violation)
             InstrumentationRegistry.getInstrumentation().waitForIdleSync()
             assertThat(lastTriggeredPolicy).isEqualTo("Child policy")
         }
@@ -125,7 +127,7 @@
                 .commit()
             executePendingTransactions()
 
-            FragmentStrictMode.onPolicyViolation(fragment, object : Violation() {})
+            FragmentStrictMode.onPolicyViolation(object : Violation(fragment) {})
             InstrumentationRegistry.getInstrumentation().waitForIdleSync()
             assertThat(thread).isEqualTo(Looper.getMainLooper().thread)
         }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
index 0aa6e47..1bf3be1 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
@@ -276,9 +276,10 @@
     // track it separately.
     boolean mIsCreated;
 
-    // True if the fragment was already added to a FragmentManager, but has since been removed
-    // again.
-    boolean mRemoved;
+    // Holds the unique ID for the previous instance of the fragment if it had already been
+    // added to a FragmentManager and has since been removed.
+    @Nullable
+    String mPreviousWho;
 
     // Max Lifecycle state this Fragment can achieve.
     Lifecycle.State mMaxState = Lifecycle.State.RESUMED;
@@ -2156,6 +2157,7 @@
      */
     void initState() {
         initLifecycle();
+        mPreviousWho = mWho;
         mWho = UUID.randomUUID().toString();
         mAdded = false;
         mRemoving = false;
@@ -2171,7 +2173,6 @@
         mTag = null;
         mHidden = false;
         mDetached = false;
-        mRemoved = true;
     }
 
     /**
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentContainerView.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentContainerView.java
index bc5fe97..b5edacc 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentContainerView.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentContainerView.java
@@ -20,6 +20,7 @@
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.graphics.Canvas;
+import android.graphics.Rect;
 import android.os.Build;
 import android.os.Bundle;
 import android.util.AttributeSet;
@@ -247,6 +248,14 @@
         return insets;
     }
 
+    @RequiresApi(20)
+    @Override
+    @SuppressWarnings("deprecation")
+    protected boolean fitSystemWindows(@NonNull Rect insets) {
+        throw new UnsupportedOperationException("FragmentContainerView does not support "
+                + "fitSystemWindows(). Insets should be handled directly by a fragment's view.");
+    }
+
     @Override
     protected void dispatchDraw(@NonNull Canvas canvas) {
         if (mDrawDisappearingViewsFirst && mDisappearingFragmentChildren != null) {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentLayoutInflaterFactory.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentLayoutInflaterFactory.java
index 7826175..936da23 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentLayoutInflaterFactory.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentLayoutInflaterFactory.java
@@ -131,7 +131,7 @@
                         + "re-attached via the <fragment> tag: id=0x" + Integer.toHexString(id));
             }
         }
-        FragmentStrictMode.onFragmentTagUsage(fragment);
+        FragmentStrictMode.onFragmentTagUsage(fragment, (ViewGroup) parent);
 
         // Explicitly set the container for the fragment as we already know
         // the parent that the fragment will be added to by the LayoutInflater
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
index 9f04df6..afe0e80 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
@@ -1361,8 +1361,8 @@
     }
 
     FragmentStateManager addFragment(@NonNull Fragment fragment) {
-        if (fragment.mRemoved) {
-            FragmentStrictMode.onFragmentReuse(fragment);
+        if (fragment.mPreviousWho != null) {
+            FragmentStrictMode.onFragmentReuse(fragment, fragment.mPreviousWho);
         }
         if (isLoggingEnabled(Log.VERBOSE)) Log.v(TAG, "add: " + fragment);
         FragmentStateManager fragmentStateManager = createOrGetFragmentStateManager(fragment);
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
index 65a30e5..7b930f5 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
@@ -295,8 +295,8 @@
     }
 
     void doAddOp(int containerViewId, Fragment fragment, @Nullable String tag, int opcmd) {
-        if (fragment.mRemoved) {
-            FragmentStrictMode.onFragmentReuse(fragment);
+        if (fragment.mPreviousWho != null) {
+            FragmentStrictMode.onFragmentReuse(fragment, fragment.mPreviousWho);
         }
         final Class<?> fragmentClass = fragment.getClass();
         final int modifiers = fragmentClass.getModifiers();
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentReuseViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentReuseViolation.java
index 360ae01..2a0a9b4 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentReuseViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentReuseViolation.java
@@ -16,6 +16,25 @@
 
 package androidx.fragment.app.strictmode;
 
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+
 /** See #{@link FragmentStrictMode.Policy.Builder#detectFragmentReuse()}. */
 public final class FragmentReuseViolation extends Violation {
+
+    @NonNull
+    private final String mPreviousWho;
+
+    FragmentReuseViolation(@NonNull Fragment fragment, @NonNull String previousWho) {
+        super(fragment);
+        this.mPreviousWho = previousWho;
+    }
+
+    /**
+     * Gets the unique ID of the previous instance of the {@link Fragment} causing the Violation.
+     */
+    @NonNull
+    public String getPreviousFragmentId() {
+        return mPreviousWho;
+    }
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.java
index 4c4368a..75ca89e 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.java
@@ -20,6 +20,7 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.util.Log;
+import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -289,107 +290,110 @@
         return defaultPolicy;
     }
 
+    /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static void onFragmentReuse(@NonNull Fragment fragment) {
-        Violation violation = new FragmentReuseViolation();
-        logIfDebuggingEnabled(fragment.getClass().getName(), violation);
+    public static void onFragmentReuse(@NonNull Fragment fragment, @NonNull String previousWho) {
+        Violation violation = new FragmentReuseViolation(fragment, previousWho);
+        logIfDebuggingEnabled(violation);
 
         Policy policy = getNearestPolicy(fragment);
         if (policy.mFlags.contains(Flag.DETECT_FRAGMENT_REUSE)
                 && shouldHandlePolicyViolation(
-                fragment.getClass(), policy, violation.getClass())) {
-            handlePolicyViolation(fragment, policy, violation);
+                policy, fragment.getClass(), violation.getClass())) {
+            handlePolicyViolation(policy, violation);
         }
     }
 
+    /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static void onFragmentTagUsage(@NonNull Fragment fragment) {
-        Violation violation = new FragmentTagUsageViolation();
-        logIfDebuggingEnabled(fragment.getClass().getName(), violation);
+    public static void onFragmentTagUsage(
+            @NonNull Fragment fragment,
+            @Nullable ViewGroup container) {
+        Violation violation = new FragmentTagUsageViolation(fragment, container);
+        logIfDebuggingEnabled(violation);
 
         Policy policy = getNearestPolicy(fragment);
         if (policy.mFlags.contains(Flag.DETECT_FRAGMENT_TAG_USAGE)
                 && shouldHandlePolicyViolation(
-                fragment.getClass(), policy, violation.getClass())) {
-            handlePolicyViolation(fragment, policy, violation);
+                policy, fragment.getClass(), violation.getClass())) {
+            handlePolicyViolation(policy, violation);
         }
     }
 
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     public static void onRetainInstanceUsage(@NonNull Fragment fragment) {
-        Violation violation = new RetainInstanceUsageViolation();
-        logIfDebuggingEnabled(fragment.getClass().getName(), violation);
+        Violation violation = new RetainInstanceUsageViolation(fragment);
+        logIfDebuggingEnabled(violation);
 
         Policy policy = getNearestPolicy(fragment);
         if (policy.mFlags.contains(Flag.DETECT_RETAIN_INSTANCE_USAGE)
                 && shouldHandlePolicyViolation(
-                fragment.getClass(), policy, violation.getClass())) {
-            handlePolicyViolation(fragment, policy, violation);
+                policy, fragment.getClass(), violation.getClass())) {
+            handlePolicyViolation(policy, violation);
         }
     }
 
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     public static void onSetUserVisibleHint(@NonNull Fragment fragment) {
-        Violation violation = new SetUserVisibleHintViolation();
-        logIfDebuggingEnabled(fragment.getClass().getName(), violation);
+        Violation violation = new SetUserVisibleHintViolation(fragment);
+        logIfDebuggingEnabled(violation);
 
         Policy policy = getNearestPolicy(fragment);
         if (policy.mFlags.contains(Flag.DETECT_SET_USER_VISIBLE_HINT)
                 && shouldHandlePolicyViolation(
-                fragment.getClass(), policy, violation.getClass())) {
-            handlePolicyViolation(fragment, policy, violation);
+                policy, fragment.getClass(), violation.getClass())) {
+            handlePolicyViolation(policy, violation);
         }
     }
 
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     public static void onTargetFragmentUsage(@NonNull Fragment fragment) {
-        Violation violation = new TargetFragmentUsageViolation();
-        logIfDebuggingEnabled(fragment.getClass().getName(), violation);
+        Violation violation = new TargetFragmentUsageViolation(fragment);
+        logIfDebuggingEnabled(violation);
 
         Policy policy = getNearestPolicy(fragment);
         if (policy.mFlags.contains(Flag.DETECT_TARGET_FRAGMENT_USAGE)
                 && shouldHandlePolicyViolation(
-                fragment.getClass(), policy, violation.getClass())) {
-            handlePolicyViolation(fragment, policy, violation);
+                policy, fragment.getClass(), violation.getClass())) {
+            handlePolicyViolation(policy, violation);
         }
     }
 
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     public static void onWrongFragmentContainer(@NonNull Fragment fragment) {
-        Violation violation = new WrongFragmentContainerViolation();
-        logIfDebuggingEnabled(fragment.getClass().getName(), violation);
+        Violation violation = new WrongFragmentContainerViolation(fragment);
+        logIfDebuggingEnabled(violation);
 
         Policy policy = getNearestPolicy(fragment);
         if (policy.mFlags.contains(Flag.DETECT_WRONG_FRAGMENT_CONTAINER)
                 && shouldHandlePolicyViolation(
-                fragment.getClass(), policy, violation.getClass())) {
-            handlePolicyViolation(fragment, policy, violation);
+                policy, fragment.getClass(), violation.getClass())) {
+            handlePolicyViolation(policy, violation);
         }
     }
 
     @VisibleForTesting
-    static void onPolicyViolation(@NonNull Fragment fragment, @NonNull Violation violation) {
-        logIfDebuggingEnabled(fragment.getClass().getName(), violation);
+    static void onPolicyViolation(@NonNull Violation violation) {
+        logIfDebuggingEnabled(violation);
 
+        Fragment fragment = violation.getFragment();
         Policy policy = getNearestPolicy(fragment);
-        if (shouldHandlePolicyViolation(fragment.getClass(), policy, violation.getClass())) {
-            handlePolicyViolation(fragment, policy, violation);
+        if (shouldHandlePolicyViolation(policy, fragment.getClass(), violation.getClass())) {
+            handlePolicyViolation(policy, violation);
         }
     }
 
-    private static void logIfDebuggingEnabled(
-            @NonNull String fragmentName,
-            @NonNull final Violation violation
-    ) {
+    private static void logIfDebuggingEnabled(@NonNull final Violation violation) {
         if (FragmentManager.isLoggingEnabled(Log.DEBUG)) {
-            Log.d(FragmentManager.TAG, "StrictMode violation in " + fragmentName,
+            Log.d(FragmentManager.TAG,
+                    "StrictMode violation in " + violation.getFragment().getClass().getName(),
                     violation);
         }
     }
 
     private static boolean shouldHandlePolicyViolation(
-            @NonNull Class<? extends Fragment> fragmentClass,
             @NonNull final Policy policy,
+            @NonNull Class<? extends Fragment> fragmentClass,
             @NonNull Class<? extends Violation> violationClass) {
         Set<Class<? extends Violation>> violationsToBypass =
                 policy.mAllowedViolations.get(fragmentClass);
@@ -397,10 +401,10 @@
     }
 
     private static void handlePolicyViolation(
-            @NonNull Fragment fragment,
             @NonNull final Policy policy,
             @NonNull final Violation violation
     ) {
+        final Fragment fragment = violation.getFragment();
         final String fragmentName = fragment.getClass().getName();
 
         if (policy.mFlags.contains(Flag.PENALTY_LOG)) {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.java
index c55ffea..c1f1e4b 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.java
@@ -16,6 +16,29 @@
 
 package androidx.fragment.app.strictmode;
 
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
 /** See #{@link FragmentStrictMode.Policy.Builder#detectFragmentTagUsage()}. */
 public final class FragmentTagUsageViolation extends Violation {
+
+    @Nullable
+    private ViewGroup mContainer;
+
+    FragmentTagUsageViolation(@NonNull Fragment fragment, @Nullable ViewGroup container) {
+        super(fragment);
+        this.mContainer = container;
+    }
+
+    /**
+     * Gets the parent container that the {@link Fragment} causing the Violation
+     * would have been added to.
+     */
+    @Nullable
+    public ViewGroup getParentContainer() {
+        return mContainer;
+    }
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
index e989174..9c5b074 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
@@ -16,6 +16,13 @@
 
 package androidx.fragment.app.strictmode;
 
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+
 /** See #{@link FragmentStrictMode.Policy.Builder#detectRetainInstanceUsage()}. */
 public final class RetainInstanceUsageViolation extends Violation {
+
+    RetainInstanceUsageViolation(@NonNull Fragment fragment) {
+        super(fragment);
+    }
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetUserVisibleHintViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetUserVisibleHintViolation.java
index c9545bb..8eea442 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetUserVisibleHintViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetUserVisibleHintViolation.java
@@ -16,6 +16,13 @@
 
 package androidx.fragment.app.strictmode;
 
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+
 /** See #{@link FragmentStrictMode.Policy.Builder#detectSetUserVisibleHint()}. */
 public final class SetUserVisibleHintViolation extends Violation {
+
+    SetUserVisibleHintViolation(@NonNull Fragment fragment) {
+        super(fragment);
+    }
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/TargetFragmentUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/TargetFragmentUsageViolation.java
index 9953393..bfec26c 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/TargetFragmentUsageViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/TargetFragmentUsageViolation.java
@@ -16,6 +16,13 @@
 
 package androidx.fragment.app.strictmode;
 
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+
 /** See #{@link FragmentStrictMode.Policy.Builder#detectTargetFragmentUsage()}. */
 public final class TargetFragmentUsageViolation extends Violation {
+
+    TargetFragmentUsageViolation(@NonNull Fragment fragment) {
+        super(fragment);
+    }
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/Violation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/Violation.java
index cf3594f..2fef49d 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/Violation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/Violation.java
@@ -16,7 +16,21 @@
 
 package androidx.fragment.app.strictmode;
 
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+
 /** Root class for all FragmentStrictMode violations. */
 @SuppressWarnings("ExceptionName")
 public abstract class Violation extends RuntimeException {
+
+    final Fragment mFragment;
+
+    Violation(@NonNull Fragment fragment) {
+        mFragment = fragment;
+    }
+
+    @NonNull
+    public Fragment getFragment() {
+        return mFragment;
+    }
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/WrongFragmentContainerViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/WrongFragmentContainerViolation.java
index 1bd046f..7c85d62 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/WrongFragmentContainerViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/WrongFragmentContainerViolation.java
@@ -16,6 +16,13 @@
 
 package androidx.fragment.app.strictmode;
 
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+
 /** See #{@link FragmentStrictMode.Policy.Builder#detectWrongFragmentContainer()}. */
 public final class WrongFragmentContainerViolation extends Violation {
+
+    WrongFragmentContainerViolation(@NonNull Fragment fragment) {
+        super(fragment);
+    }
 }
diff --git a/fragment/integration-tests/testapp/build.gradle b/fragment/integration-tests/testapp/build.gradle
index 9220e1f..76b4948 100644
--- a/fragment/integration-tests/testapp/build.gradle
+++ b/fragment/integration-tests/testapp/build.gradle
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.application")
@@ -34,7 +32,7 @@
 }
 
 dependencies {
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
     implementation(project(":fragment:fragment-ktx"))
     implementation("androidx.transition:transition:1.3.0")
     implementation("androidx.recyclerview:recyclerview:1.1.0")
diff --git a/fragment/integration-tests/testapp/lint-baseline.xml b/fragment/integration-tests/testapp/lint-baseline.xml
index 69b50de..64d6c6c 100644
--- a/fragment/integration-tests/testapp/lint-baseline.xml
+++ b/fragment/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanTargetApiAnnotation"
@@ -12,70 +12,4 @@
             column="1"/>
     </issue>
 
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.colorPrimary` appears to be unused"
-        errorLine1="    &lt;color name=&quot;colorPrimary&quot;>#3F51B5&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="18"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.colorPrimaryDark` appears to be unused"
-        errorLine1="    &lt;color name=&quot;colorPrimaryDark&quot;>#303F9F&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="19"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_android` appears to be unused"
-        errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/drawable/ic_android.xml"
-            line="17"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_help` appears to be unused"
-        errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/drawable/ic_help.xml"
-            line="17"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_home` appears to be unused"
-        errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/drawable/ic_home.xml"
-            line="17"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_settings` appears to be unused"
-        errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/drawable/ic_settings.xml"
-            line="17"
-            column="1"/>
-    </issue>
-
 </issues>
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 7b7b0a3..767eb12 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -11,6 +11,7 @@
 androidStudio = "2020.3.1.15"
 # -----------------------------------------------------------------------------
 
+androidLintMin = "26.3.0"
 androidxTest = "1.3.0"
 androidxTestExt = "1.1.2"
 autoService = "1.0-rc6"
@@ -19,11 +20,10 @@
 espresso = "3.3.0"
 hilt = "2.35"
 incap = "0.2"
-kotlin = "1.5.0"
-kotlinCompileTesting = "1.3.6"
+kotlin = "1.5.10"
+kotlinCompileTesting = "1.4.0"
 kotlinCoroutines = "1.4.3"
-kotlinPoet = "1.4.0"
-ksp = "1.5.0-1.0.0-alpha09"
+ksp = "1.5.0-1.0.0-alpha10"
 leakcanary = "2.2"
 mockito = "2.25.0"
 sqldelight = "1.3.0"
@@ -32,7 +32,9 @@
 [libraries]
 androidGradlePlugin = { module = "com.android.tools.build:gradle", version.ref = "androidGradlePlugin" }
 androidLint = { module = "com.android.tools.lint:lint", version.ref = "androidLint" }
+androidLintMin = { module = "com.android.tools.lint:lint", version.ref = "androidLintMin" }
 androidLintApi = { module = "com.android.tools.lint:lint-api", version.ref = "androidLint" }
+androidLintMinApi = { module = "com.android.tools.lint:lint-api", version.ref = "androidLintMin" }
 androidLintTests = { module = "com.android.tools.lint:lint-tests", version.ref = "androidLint" }
 autoCommon = { module = "com.google.auto:auto-common", version = "0.11" }
 autoServiceAnnotations = { module = "com.google.auto.service:auto-service-annotations", version.ref = "autoService" }
@@ -99,17 +101,14 @@
 kotlinTestJunit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" }
 kotlinTestJs = { module = "org.jetbrains.kotlin:kotlin-test-js", version.ref = "kotlin" }
 kotlinReflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" }
-kotlinPoet = { module = "com.squareup:kotlinpoet", version.ref = "kotlinPoet" }
-kotlinPoetMetadata = { module = "com.squareup:kotlinpoet-metadata", version.ref = "kotlinPoet" }
-kotlinPoetMetadataSpecs = { module = "com.squareup:kotlinpoet-metadata-specs", version.ref = "kotlinPoet" }
-kotlinPoetClassinspector = { module = "com.squareup:kotlinpoet-classinspector-elements", version.ref = "kotlinPoet" }
-kgpLeakPatcher = { module = "dev.zacsweers:kgp-150-leak-patcher", version="1.1.0" }
+kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.8.0" }
 ksp = { module = "com.google.devtools.ksp:symbol-processing", version.ref = "ksp" }
 kspApi = { module = "com.google.devtools.ksp:symbol-processing-api", version.ref = "ksp" }
 kspGradlePlugin = { module = "com.google.devtools.ksp:symbol-processing-gradle-plugin", version.ref = "ksp" }
 leakcanary = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakcanary" }
 leakcanaryInstrumentation = { module = "com.squareup.leakcanary:leakcanary-android-instrumentation", version.ref = "leakcanary" }
 material = { module = "com.google.android.material:material", version = "1.2.1" }
+mlkitBarcode = { module = "com.google.android.gms:play-services-mlkit-barcode-scanning", version = "16.1.4" }
 mockitoCore = { module = "org.mockito:mockito-core", version.ref = "mockito" }
 mockitoAndroid = { module = "org.mockito:mockito-android", version.ref = "mockito" }
 mockitoKotlin = { module = "com.nhaarman.mockitokotlin2:mockito-kotlin", version = "2.1.0" }
@@ -118,6 +117,7 @@
 okhttpMockwebserver = { module = "com.squareup.okhttp3:mockwebserver", version = "3.14.7" }
 playCore = { module = "com.google.android.play:core", version = "1.9.1" }
 playServicesBase = { module = "com.google.android.gms:play-services-base", version = "17.0.0" }
+playServicesBasement = { module = "com.google.android.gms:play-services-basement", version = "17.0.0" }
 protobuf = { module = "com.google.protobuf:protobuf-java", version = "3.4.0" }
 protobufCompiler = { module = "com.google.protobuf:protoc", version = "3.10.0" }
 protobufGradlePlugin = { module = "com.google.protobuf:protobuf-gradle-plugin", version = "0.8.16" }
@@ -144,4 +144,4 @@
 wireRuntime = { module = "com.squareup.wire:wire-runtime", version.ref = "wire" }
 xerial = { module = "org.xerial:sqlite-jdbc", version = "3.25.2" }
 xpp3 = { module = "xpp3:xpp3", version = "1.1.4c" }
-xmlpull = { module = "xmlpull:xmlpull", version = "1.1.3.1" }
\ No newline at end of file
+xmlpull = { module = "xmlpull:xmlpull", version = "1.1.3.1" }
diff --git a/gradlew b/gradlew
index 481ea9d..bc83001 100755
--- a/gradlew
+++ b/gradlew
@@ -279,16 +279,6 @@
   fi
 done
 
-function tryToDiagnosePossibleDaemonFailure() {
-  # copy daemon logs
-  if [ -n "$GRADLE_USER_HOME" ]; then
-    if [ -n "$DIST_DIR" ]; then
-      cp -r "$GRADLE_USER_HOME/daemon" "$DIST_DIR/gradle-daemon"
-      cp ./hs_err* $DIST_DIR/ 2>/dev/null || true
-    fi
-  fi
-}
-
 function removeCaches() {
   rm -rf $SCRIPT_PATH/.gradle
   rm -rf $SCRIPT_PATH/buildSrc/.gradle
@@ -342,7 +332,6 @@
   if $wrapper "$JAVACMD" "${JVM_OPTS[@]}" $TMPDIR_ARG -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain $HOME_SYSTEM_PROPERTY_ARGUMENT $TMPDIR_ARG $PROJECT_CACHE_DIR_ARGUMENT "$ORG_GRADLE_JVMARGS" "$@"; then
     return 0
   else
-    tryToDiagnosePossibleDaemonFailure
     # Print AndroidX-specific help message if build fails
     # Have to do this build-failure detection in gradlew rather than in build.gradle
     # so that this message still prints even if buildSrc itself fails
diff --git a/gridlayout/gridlayout/lint-baseline.xml b/gridlayout/gridlayout/lint-baseline.xml
index 15cf064..6d404cc 100644
--- a/gridlayout/gridlayout/lint-baseline.xml
+++ b/gridlayout/gridlayout/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/health/health-services-client/lint-baseline.xml b/health/health-services-client/lint-baseline.xml
index d4c6c30..b83c18e 100644
--- a/health/health-services-client/lint-baseline.xml
+++ b/health/health-services-client/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanKeepAnnotation"
diff --git a/heifwriter/heifwriter/lint-baseline.xml b/heifwriter/heifwriter/lint-baseline.xml
index 4dbe59b..9b1eb37 100644
--- a/heifwriter/heifwriter/lint-baseline.xml
+++ b/heifwriter/heifwriter/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/hilt/hilt-common/build.gradle b/hilt/hilt-common/build.gradle
index 197ab1c..0b9d37e 100644
--- a/hilt/hilt-common/build.gradle
+++ b/hilt/hilt-common/build.gradle
@@ -26,8 +26,8 @@
 }
 
 dependencies {
-    implementation(HILT_CORE)
-    annotationProcessor(HILT_COMPILER)
+    implementation(libs.hiltCore)
+    annotationProcessor(libs.hiltCompiler)
 }
 
 androidx {
diff --git a/hilt/hilt-compiler/build.gradle b/hilt/hilt-compiler/build.gradle
index d14a347..e73a989 100644
--- a/hilt/hilt-compiler/build.gradle
+++ b/hilt/hilt-compiler/build.gradle
@@ -29,19 +29,19 @@
 }
 
 dependencies {
-    implementation(KOTLIN_STDLIB)
-    compileOnly(AUTO_SERVICE_ANNOTATIONS)
-    kapt(AUTO_SERVICE_PROCESSOR)
-    compileOnly(GRADLE_INCAP_HELPER)
-    kapt(GRADLE_INCAP_HELPER_PROCESSOR)
-    implementation(AUTO_COMMON)
-    implementation(JAVAPOET)
+    implementation(libs.kotlinStdlib)
+    compileOnly(libs.autoServiceAnnotations)
+    kapt(libs.autoService)
+    compileOnly(libs.gradleIncapHelper)
+    kapt(libs.gradleIncapHelperProcessor)
+    implementation(libs.autoCommon)
+    implementation(libs.javapoet)
 
     testImplementation(project(":hilt:hilt-common"))
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
-    testImplementation(GOOGLE_COMPILE_TESTING)
-    testImplementation(HILT_CORE)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
+    testImplementation(libs.googleCompileTesting)
+    testImplementation(libs.hiltCore)
     testImplementation(fileTree(
             dir: "${new File(project(":hilt:hilt-work").buildDir, "libJar")}",
             include : "*.jar"))
diff --git a/hilt/hilt-navigation-compose/build.gradle b/hilt/hilt-navigation-compose/build.gradle
index b41c57c..f58715e 100644
--- a/hilt/hilt-navigation-compose/build.gradle
+++ b/hilt/hilt-navigation-compose/build.gradle
@@ -40,21 +40,21 @@
 dependencies {
     kotlinPlugin projectOrArtifact(":compose:compiler:compiler")
 
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
     api("androidx.hilt:hilt-navigation:1.0.0")
     api(projectOrArtifact(":compose:runtime:runtime"))
     api(projectOrArtifact(":compose:ui:ui"))
     api(projectOrArtifact(":lifecycle:lifecycle-viewmodel-compose"))
     api(projectOrArtifact(":navigation:navigation-compose"))
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(HILT_ANDROID)
-    androidTestImplementation(HILT_ANDROID_TESTING)
-    kaptAndroidTest(HILT_COMPILER)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.hiltAndroid)
+    androidTestImplementation(libs.hiltAndroidTesting)
+    kaptAndroidTest(libs.hiltCompiler)
     androidTestImplementation projectOrArtifact(":compose:material:material")
     androidTestImplementation projectOrArtifact(":compose:test-utils")
 }
diff --git a/hilt/hilt-navigation-compose/samples/build.gradle b/hilt/hilt-navigation-compose/samples/build.gradle
index cda9b05..6a2bf6a 100644
--- a/hilt/hilt-navigation-compose/samples/build.gradle
+++ b/hilt/hilt-navigation-compose/samples/build.gradle
@@ -30,7 +30,7 @@
 
 dependencies {
     kotlinPlugin(projectOrArtifact(":compose:compiler:compiler"))
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
 
     compileOnly(projectOrArtifact(":annotation:annotation-sampled"))
     implementation(projectOrArtifact(":hilt:hilt-navigation-compose"))
diff --git a/hilt/hilt-navigation-fragment/build.gradle b/hilt/hilt-navigation-fragment/build.gradle
index 39fd6ef..e6f836b 100644
--- a/hilt/hilt-navigation-fragment/build.gradle
+++ b/hilt/hilt-navigation-fragment/build.gradle
@@ -36,19 +36,19 @@
 }
 
 dependencies {
-    api(KOTLIN_STDLIB)
+    api(libs.kotlinStdlib)
     api(project(":hilt:hilt-navigation"))
     api("androidx.navigation:navigation-fragment-ktx:2.3.2")
 
     androidTestImplementation("androidx.fragment:fragment-testing:1.3.0")
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(HILT_ANDROID)
-    androidTestImplementation(HILT_ANDROID_TESTING)
-    kaptAndroidTest(HILT_COMPILER)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.hiltAndroid)
+    androidTestImplementation(libs.hiltAndroidTesting)
+    kaptAndroidTest(libs.hiltCompiler)
     androidTestImplementation(project(":internal-testutils-runtime"))
     androidTestImplementation(project(":internal-testutils-navigation"), {
         exclude group: 'androidx.navigation', module: 'navigation-common'
diff --git a/hilt/hilt-navigation/build.gradle b/hilt/hilt-navigation/build.gradle
index aec467c..4c280e2 100644
--- a/hilt/hilt-navigation/build.gradle
+++ b/hilt/hilt-navigation/build.gradle
@@ -28,11 +28,11 @@
 }
 
 dependencies {
-    api(KOTLIN_STDLIB)
+    api(libs.kotlinStdlib)
     api("androidx.annotation:annotation:1.1.0")
     api("androidx.navigation:navigation-runtime:2.3.2")
-    api(HILT_ANDROID)
-    kapt(HILT_COMPILER)
+    api(libs.hiltAndroid)
+    kapt(libs.hiltCompiler)
 }
 
 androidx {
diff --git a/hilt/hilt-work/build.gradle b/hilt/hilt-work/build.gradle
index 55e6621..7b0f10a 100644
--- a/hilt/hilt-work/build.gradle
+++ b/hilt/hilt-work/build.gradle
@@ -36,8 +36,8 @@
     api("androidx.annotation:annotation:1.1.0")
     api(project(":hilt:hilt-common"))
     api("androidx.work:work-runtime:2.3.4")
-    api(HILT_ANDROID)
-    annotationProcessor(HILT_COMPILER)
+    api(libs.hiltAndroid)
+    annotationProcessor(libs.hiltCompiler)
 }
 
 android.libraryVariants.all { variant ->
diff --git a/hilt/integration-tests/viewmodelapp/build.gradle b/hilt/integration-tests/viewmodelapp/build.gradle
index 5f19472..414f15ce 100644
--- a/hilt/integration-tests/viewmodelapp/build.gradle
+++ b/hilt/integration-tests/viewmodelapp/build.gradle
@@ -39,14 +39,14 @@
 dependencies {
     implementation("androidx.activity:activity:1.2.0")
     implementation("androidx.fragment:fragment-ktx:1.3.0")
-    implementation(KOTLIN_STDLIB)
-    implementation(HILT_ANDROID)
-    kapt(HILT_COMPILER)
+    implementation(libs.kotlinStdlib)
+    implementation(libs.hiltAndroid)
+    kapt(libs.hiltCompiler)
 
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(HILT_ANDROID_TESTING)
-    kaptAndroidTest(HILT_COMPILER)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.hiltAndroidTesting)
+    kaptAndroidTest(libs.hiltCompiler)
 }
diff --git a/hilt/integration-tests/workerapp/build.gradle b/hilt/integration-tests/workerapp/build.gradle
index 2f1c2d3..4e37fdb 100644
--- a/hilt/integration-tests/workerapp/build.gradle
+++ b/hilt/integration-tests/workerapp/build.gradle
@@ -41,15 +41,15 @@
     implementation(project(":work:work-runtime-ktx"))
     implementation(project(":hilt:hilt-work"))
     kapt(project(":hilt:hilt-compiler"))
-    implementation(KOTLIN_STDLIB)
-    implementation(HILT_ANDROID)
-    kapt(HILT_COMPILER)
+    implementation(libs.kotlinStdlib)
+    implementation(libs.hiltAndroid)
+    kapt(libs.hiltCompiler)
 
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testRunner)
     androidTestImplementation(project(":work:work-testing"))
-    androidTestImplementation(HILT_ANDROID_TESTING)
-    kaptAndroidTest(HILT_COMPILER)
+    androidTestImplementation(libs.hiltAndroidTesting)
+    kaptAndroidTest(libs.hiltCompiler)
 }
diff --git a/inspection/inspection/lint-baseline.xml b/inspection/inspection/lint-baseline.xml
index b82825b..42a176b 100644
--- a/inspection/inspection/lint-baseline.xml
+++ b/inspection/inspection/lint-baseline.xml
@@ -1,26 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        T onExit(T result);"
-        errorLine2="        ~">
-        <location
-            file="src/main/java/androidx/inspection/ArtTooling.java"
-            line="86"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        T onExit(T result);"
-        errorLine2="                 ~">
-        <location
-            file="src/main/java/androidx/inspection/ArtTooling.java"
-            line="86"
-            column="18"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
 </issues>
diff --git a/leanback/leanback-preference/lint-baseline.xml b/leanback/leanback-preference/lint-baseline.xml
index 9ec7ae2..71c4fc9 100644
--- a/leanback/leanback-preference/lint-baseline.xml
+++ b/leanback/leanback-preference/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
@@ -635,7 +635,7 @@
         errorLine2="                         ~~~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceDialogFragment.java"
-            line="42"
+            line="39"
             column="26"/>
     </issue>
 
@@ -646,7 +646,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceDialogFragment.java"
-            line="52"
+            line="49"
             column="12"/>
     </issue>
 
@@ -657,7 +657,7 @@
         errorLine2="                         ~~~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceDialogFragmentCompat.java"
-            line="42"
+            line="39"
             column="26"/>
     </issue>
 
@@ -668,7 +668,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceDialogFragmentCompat.java"
-            line="56"
+            line="53"
             column="12"/>
     </issue>
 
@@ -679,7 +679,7 @@
         errorLine2="           ~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceFragment.java"
-            line="51"
+            line="48"
             column="12"/>
     </issue>
 
@@ -690,7 +690,7 @@
         errorLine2="                             ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceFragment.java"
-            line="51"
+            line="48"
             column="30"/>
     </issue>
 
@@ -701,7 +701,7 @@
         errorLine2="                                                      ~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceFragment.java"
-            line="51"
+            line="48"
             column="55"/>
     </issue>
 
@@ -712,7 +712,7 @@
         errorLine2="            ~~~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceFragment.java"
-            line="52"
+            line="49"
             column="13"/>
     </issue>
 
@@ -723,7 +723,7 @@
         errorLine2="                              ~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceFragment.java"
-            line="66"
+            line="63"
             column="31"/>
     </issue>
 
@@ -734,7 +734,7 @@
         errorLine2="                                         ~~~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceFragment.java"
-            line="66"
+            line="63"
             column="42"/>
     </issue>
 
@@ -745,7 +745,7 @@
         errorLine2="                         ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceFragment.java"
-            line="75"
+            line="72"
             column="26"/>
     </issue>
 
@@ -756,7 +756,7 @@
         errorLine2="           ~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceFragmentCompat.java"
-            line="52"
+            line="49"
             column="12"/>
     </issue>
 
@@ -767,7 +767,7 @@
         errorLine2="                                                               ~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceFragmentCompat.java"
-            line="52"
+            line="49"
             column="64"/>
     </issue>
 
@@ -778,7 +778,7 @@
         errorLine2="            ~~~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceFragmentCompat.java"
-            line="53"
+            line="50"
             column="13"/>
     </issue>
 
@@ -789,7 +789,7 @@
         errorLine2="                                                  ~~~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceFragmentCompat.java"
-            line="67"
+            line="64"
             column="51"/>
     </issue>
 
@@ -800,7 +800,7 @@
         errorLine2="                         ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/preference/LeanbackPreferenceFragmentCompat.java"
-            line="77"
+            line="74"
             column="26"/>
     </issue>
 
diff --git a/legacy/core-utils/lint-baseline.xml b/legacy/core-utils/lint-baseline.xml
index e51fb50..e679463 100644
--- a/legacy/core-utils/lint-baseline.xml
+++ b/legacy/core-utils/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/lifecycle/integration-tests/incrementality/build.gradle b/lifecycle/integration-tests/incrementality/build.gradle
index e802401..c877c03 100644
--- a/lifecycle/integration-tests/incrementality/build.gradle
+++ b/lifecycle/integration-tests/incrementality/build.gradle
@@ -16,17 +16,15 @@
 
 import androidx.build.SdkResourceGenerator
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("kotlin")
     id("AndroidXPlugin")
 }
 
 dependencies {
-    implementation(KOTLIN_STDLIB)
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
+    implementation(libs.kotlinStdlib)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
     testImplementation(gradleTestKit())
 }
 
diff --git a/lifecycle/integration-tests/kotlintestapp/build.gradle b/lifecycle/integration-tests/kotlintestapp/build.gradle
index 7033177..bfe9cf1 100644
--- a/lifecycle/integration-tests/kotlintestapp/build.gradle
+++ b/lifecycle/integration-tests/kotlintestapp/build.gradle
@@ -18,8 +18,6 @@
 // -Dorg.gradle.debug=true
 // -Dkotlin.compiler.execution.strategy="in-process"
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.application")
@@ -35,19 +33,19 @@
         because "Used by :activity:activity"
     }
 
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
-    testImplementation(KOTLIN_COROUTINES_ANDROID)
-    testImplementation(KOTLIN_COROUTINES_TEST)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
+    testImplementation(libs.kotlinCoroutinesAndroid)
+    testImplementation(libs.kotlinCoroutinesTest)
     testImplementation(project(":lifecycle:lifecycle-runtime-testing"))
 
     androidTestImplementation(project(":lifecycle:lifecycle-runtime-testing"))
-    androidTestImplementation(KOTLIN_COROUTINES_TEST)
-    androidTestImplementation(KOTLIN_COROUTINES_ANDROID)
-    androidTestImplementation(ANDROIDX_TEST_EXT_KTX)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(libs.kotlinCoroutinesTest)
+    androidTestImplementation(libs.kotlinCoroutinesAndroid)
+    androidTestImplementation(libs.testExtJunitKtx)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.espressoCore)
 }
 
 android {
diff --git a/lifecycle/integration-tests/testapp/build.gradle b/lifecycle/integration-tests/testapp/build.gradle
index 378c58e..e2edd36 100644
--- a/lifecycle/integration-tests/testapp/build.gradle
+++ b/lifecycle/integration-tests/testapp/build.gradle
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.application")
@@ -23,7 +21,7 @@
 }
 
 dependencies {
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
     implementation("androidx.fragment:fragment:1.3.0") {
         exclude group: "androidx.lifecycle", module: "lifecycle-runtime"
     }
@@ -34,13 +32,13 @@
 
     androidTestAnnotationProcessor(project(":lifecycle:lifecycle-compiler"))
     androidTestImplementation(project(":lifecycle:lifecycle-common")) // Added for b/155802460
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.espressoCore)
 
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
     testAnnotationProcessor(project(":lifecycle:lifecycle-compiler"))
 }
diff --git a/lifecycle/integration-tests/testapp/lint-baseline.xml b/lifecycle/integration-tests/testapp/lint-baseline.xml
index 76a3a35..43ce3f8 100644
--- a/lifecycle/integration-tests/testapp/lint-baseline.xml
+++ b/lifecycle/integration-tests/testapp/lint-baseline.xml
@@ -1,16 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.layout.fragment` appears to be unused"
-        errorLine1="&lt;FrameLayout"
-        errorLine2="^">
-        <location
-            file="src/main/res/layout/fragment.xml"
-            line="17"
-            column="1"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/lifecycle/lifecycle-common-java8/build.gradle b/lifecycle/lifecycle-common-java8/build.gradle
index dd3021f..db21aff 100644
--- a/lifecycle/lifecycle-common-java8/build.gradle
+++ b/lifecycle/lifecycle-common-java8/build.gradle
@@ -14,10 +14,8 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions;
-import androidx.build.AndroidXExtension;
 import androidx.build.Publish
 
 plugins {
@@ -29,8 +27,8 @@
     api(project(":lifecycle:lifecycle-common"))
     api("androidx.annotation:annotation:1.1.0")
 
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-common/build.gradle b/lifecycle/lifecycle-common/build.gradle
index 1beb36e..6392520 100644
--- a/lifecycle/lifecycle-common/build.gradle
+++ b/lifecycle/lifecycle-common/build.gradle
@@ -16,9 +16,6 @@
 
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
-
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.Publish
 
 plugins {
@@ -29,8 +26,8 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
 
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-common/lint-baseline.xml b/lifecycle/lifecycle-common/lint-baseline.xml
index c4b7d4c..19217a6 100644
--- a/lifecycle/lifecycle-common/lint-baseline.xml
+++ b/lifecycle/lifecycle-common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanUncheckedReflection"
diff --git a/lifecycle/lifecycle-compiler/build.gradle b/lifecycle/lifecycle-compiler/build.gradle
index f64dfa1..d272608 100644
--- a/lifecycle/lifecycle-compiler/build.gradle
+++ b/lifecycle/lifecycle-compiler/build.gradle
@@ -17,8 +17,7 @@
 import androidx.build.LibraryGroups
 import androidx.build.LibraryType
 import androidx.build.LibraryVersions
-
-import static androidx.build.dependencies.DependenciesKt.*
+import static androidx.build.dependencies.DependenciesKt.GUAVA
 
 plugins {
     id("AndroidXPlugin")
@@ -27,11 +26,11 @@
 
 dependencies {
     implementation(project(":lifecycle:lifecycle-common"))
-    implementation(KOTLIN_STDLIB)
-    implementation(AUTO_COMMON)
-    implementation(JAVAPOET)
-    testImplementation(GOOGLE_COMPILE_TESTING)
-    testImplementation(JSR250)
+    implementation(libs.kotlinStdlib)
+    implementation(libs.autoCommon)
+    implementation(libs.javapoet)
+    testImplementation(libs.googleCompileTesting)
+    testImplementation(libs.jsr250)
 }
 
 // The following tasks are used to regenerate src/test/test-data/lib/src/test-library.jar
diff --git a/lifecycle/lifecycle-extensions/build.gradle b/lifecycle/lifecycle-extensions/build.gradle
index 12f7761..fd2e937 100644
--- a/lifecycle/lifecycle-extensions/build.gradle
+++ b/lifecycle/lifecycle-extensions/build.gradle
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
@@ -39,16 +37,16 @@
     api("androidx.lifecycle:lifecycle-viewmodel:2.2.0")
 
     testImplementation("androidx.arch.core:core-testing:2.1.0")
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
 
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.espressoCore)
     androidTestImplementation("androidx.appcompat:appcompat:1.0.0")
     androidTestImplementation(project(":internal-testutils-runtime"))
 }
diff --git a/lifecycle/lifecycle-extensions/lint-baseline.xml b/lifecycle/lifecycle-extensions/lint-baseline.xml
index 846a634..0e44e2a 100644
--- a/lifecycle/lifecycle-extensions/lint-baseline.xml
+++ b/lifecycle/lifecycle-extensions/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="PrivateConstructorForUtilityClass"
diff --git a/lifecycle/lifecycle-livedata-core-ktx-lint/build.gradle b/lifecycle/lifecycle-livedata-core-ktx-lint/build.gradle
index 193e1c7..34ff630 100644
--- a/lifecycle/lifecycle-livedata-core-ktx-lint/build.gradle
+++ b/lifecycle/lifecycle-livedata-core-ktx-lint/build.gradle
@@ -26,14 +26,14 @@
 }
 
 dependencies {
-    compileOnly(LINT_API_MIN)
-    compileOnly("com.android.tools.lint:lint:$lintMinVersion")
-    compileOnly(KOTLIN_STDLIB)
+    compileOnly(libs.androidLintMinApi)
+    compileOnly(libs.androidLintMin)
+    compileOnly(libs.kotlinStdlib)
 
-    testImplementation(KOTLIN_STDLIB)
-    testImplementation(LINT_CORE)
-    testImplementation(LINT_TESTS)
-    testImplementation(JUNIT)
+    testImplementation(libs.kotlinStdlib)
+    testImplementation(libs.androidLint)
+    testImplementation(libs.androidLintTests)
+    testImplementation(libs.junit)
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-livedata-core-ktx/build.gradle b/lifecycle/lifecycle-livedata-core-ktx/build.gradle
index 040abc1..ab16f08 100644
--- a/lifecycle/lifecycle-livedata-core-ktx/build.gradle
+++ b/lifecycle/lifecycle-livedata-core-ktx/build.gradle
@@ -14,13 +14,10 @@
  * limitations under the License.
  */
 
-
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
     id("AndroidXPlugin")
@@ -30,13 +27,13 @@
 
 dependencies {
     api(project(":lifecycle:lifecycle-livedata-core"))
-    api(KOTLIN_STDLIB)
+    api(libs.kotlinStdlib)
     testImplementation(project(":lifecycle:lifecycle-runtime"))
     testImplementation("androidx.arch.core:core-testing:2.1.0")
     testImplementation(project(":lifecycle:lifecycle-runtime-testing"))
-    testImplementation(KOTLIN_COROUTINES_TEST)
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
+    testImplementation(libs.kotlinCoroutinesTest)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
 
     lintPublish(project(":lifecycle:lifecycle-livedata-core-ktx-lint"))
 }
diff --git a/lifecycle/lifecycle-livedata-core-truth/build.gradle b/lifecycle/lifecycle-livedata-core-truth/build.gradle
index c1f5446..727d7b7 100644
--- a/lifecycle/lifecycle-livedata-core-truth/build.gradle
+++ b/lifecycle/lifecycle-livedata-core-truth/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
@@ -27,10 +26,10 @@
 
 dependencies {
     api(project(":lifecycle:lifecycle-livedata-core-ktx"))
-    api(TRUTH)
-    api(KOTLIN_STDLIB)
-    testImplementation(TRUTH)
-    testImplementation(MOCKITO_CORE)
+    api(libs.truth)
+    api(libs.kotlinStdlib)
+    testImplementation(libs.truth)
+    testImplementation(libs.mockitoCore)
     testImplementation("androidx.arch.core:core-testing:2.1.0")
     testImplementation(project(":internal-testutils-truth"))
 }
diff --git a/lifecycle/lifecycle-livedata-core/build.gradle b/lifecycle/lifecycle-livedata-core/build.gradle
index e61b4ac..a68baa2 100644
--- a/lifecycle/lifecycle-livedata-core/build.gradle
+++ b/lifecycle/lifecycle-livedata-core/build.gradle
@@ -14,10 +14,8 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
@@ -33,9 +31,9 @@
     testImplementation(project(":lifecycle:lifecycle-runtime"))
     testImplementation("androidx.arch.core:core-testing:2.1.0")
     testImplementation(project(":lifecycle:lifecycle-runtime-testing"))
-    testImplementation(KOTLIN_COROUTINES_TEST)
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
+    testImplementation(libs.kotlinCoroutinesTest)
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-livedata-core/lint-baseline.xml b/lifecycle/lifecycle-livedata-core/lint-baseline.xml
index bb15a72..42a176b 100644
--- a/lifecycle/lifecycle-livedata-core/lint-baseline.xml
+++ b/lifecycle/lifecycle-livedata-core/lint-baseline.xml
@@ -1,191 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="            new SafeIterableMap&lt;>();"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveData.java"
-            line="67"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.iteratorWithAdditions can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="                        mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveData.java"
-            line="150"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.putIfAbsent can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);"
-        errorLine2="                                              ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveData.java"
-            line="197"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.putIfAbsent can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);"
-        errorLine2="                                              ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveData.java"
-            line="226"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.remove can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        ObserverWrapper removed = mObservers.remove(observer);"
-        errorLine2="                                             ~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveData.java"
-            line="245"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveData.java"
-            line="293"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor.postToMainThread can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveData.java"
-            line="293"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.size can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        return mObservers.size() > 0;"
-        errorLine2="                          ~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveData.java"
-            line="363"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        if (!ArchTaskExecutor.getInstance().isMainThread()) {"
-        errorLine2="             ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveData.java"
-            line="486"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor.isMainThread can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        if (!ArchTaskExecutor.getInstance().isMainThread()) {"
-        errorLine2="                                            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveData.java"
-            line="486"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public LiveData(T value) {"
-        errorLine2="                    ~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveData.java"
-            line="102"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected void postValue(T value) {"
-        errorLine2="                             ~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveData.java"
-            line="284"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected void setValue(T value) {"
-        errorLine2="                            ~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveData.java"
-            line="305"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public MutableLiveData(T value) {"
-        errorLine2="                           ~">
-        <location
-            file="src/main/java/androidx/lifecycle/MutableLiveData.java"
-            line="32"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void postValue(T value) {"
-        errorLine2="                          ~">
-        <location
-            file="src/main/java/androidx/lifecycle/MutableLiveData.java"
-            line="44"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void setValue(T value) {"
-        errorLine2="                         ~">
-        <location
-            file="src/main/java/androidx/lifecycle/MutableLiveData.java"
-            line="49"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    void onChanged(T t);"
-        errorLine2="                   ~">
-        <location
-            file="src/main/java/androidx/lifecycle/Observer.java"
-            line="31"
-            column="20"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
 </issues>
diff --git a/lifecycle/lifecycle-livedata-ktx/build.gradle b/lifecycle/lifecycle-livedata-ktx/build.gradle
index de01694..27fbede 100644
--- a/lifecycle/lifecycle-livedata-ktx/build.gradle
+++ b/lifecycle/lifecycle-livedata-ktx/build.gradle
@@ -14,13 +14,10 @@
  * limitations under the License.
  */
 
-
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
     id("AndroidXPlugin")
@@ -38,19 +35,19 @@
 dependencies {
     api(project(":lifecycle:lifecycle-livedata"))
     api(project(":lifecycle:lifecycle-livedata-core-ktx"))
-    api(KOTLIN_STDLIB)
-    api(KOTLIN_COROUTINES_CORE)
+    api(libs.kotlinStdlib)
+    api(libs.kotlinCoroutinesCore)
     testImplementation(project(":lifecycle:lifecycle-runtime-testing"))
     testImplementation("androidx.arch.core:core-testing:2.1.0")
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
-    testImplementation(KOTLIN_COROUTINES_TEST)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(KOTLIN_COROUTINES_TEST)
-    androidTestImplementation(KOTLIN_COROUTINES_ANDROID)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
+    testImplementation(libs.kotlinCoroutinesTest)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.kotlinCoroutinesTest)
+    androidTestImplementation(libs.kotlinCoroutinesAndroid)
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-livedata/build.gradle b/lifecycle/lifecycle-livedata/build.gradle
index e936c8a..769df0e 100644
--- a/lifecycle/lifecycle-livedata/build.gradle
+++ b/lifecycle/lifecycle-livedata/build.gradle
@@ -14,10 +14,8 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
@@ -32,9 +30,9 @@
 
     testImplementation(project(":lifecycle:lifecycle-runtime-testing"))
     testImplementation("androidx.arch.core:core-testing:2.1.0")
-    testImplementation(KOTLIN_COROUTINES_TEST)
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
+    testImplementation(libs.kotlinCoroutinesTest)
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-livedata/lint-baseline.xml b/lifecycle/lifecycle-livedata/lint-baseline.xml
index fcdbfa4..42a176b 100644
--- a/lifecycle/lifecycle-livedata/lint-baseline.xml
+++ b/lifecycle/lifecycle-livedata/lint-baseline.xml
@@ -1,70 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        this(ArchTaskExecutor.getIOThreadExecutor());"
-        errorLine2="             ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/ComputableLiveData.java"
-            line="56"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        ArchTaskExecutor.getInstance().executeOnMainThread(mInvalidationRunnable);"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/ComputableLiveData.java"
-            line="143"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="TaskExecutor.executeOnMainThread can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        ArchTaskExecutor.getInstance().executeOnMainThread(mInvalidationRunnable);"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/ComputableLiveData.java"
-            line="143"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="    private SafeIterableMap&lt;LiveData&lt;?>, Source&lt;?>> mSources = new SafeIterableMap&lt;>();"
-        errorLine2="                                                               ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/MediatorLiveData.java"
-            line="70"
-            column="64"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.putIfAbsent can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        Source&lt;?> existing = mSources.putIfAbsent(source, e);"
-        errorLine2="                                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/MediatorLiveData.java"
-            line="87"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.remove can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        Source&lt;?> source = mSources.remove(toRemote);"
-        errorLine2="                                    ~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/MediatorLiveData.java"
-            line="108"
-            column="37"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
 </issues>
diff --git a/lifecycle/lifecycle-process/build.gradle b/lifecycle/lifecycle-process/build.gradle
index 06b3c0b..bc8b86f 100644
--- a/lifecycle/lifecycle-process/build.gradle
+++ b/lifecycle/lifecycle-process/build.gradle
@@ -14,10 +14,8 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
@@ -35,8 +33,8 @@
     api(project(":lifecycle:lifecycle-runtime"))
     api("androidx.startup:startup-runtime:1.0.0")
 
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-process/lint-baseline.xml b/lifecycle/lifecycle-process/lint-baseline.xml
index aedb5b1..12b9fa8 100644
--- a/lifecycle/lifecycle-process/lint-baseline.xml
+++ b/lifecycle/lifecycle-process/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/lifecycle/lifecycle-reactivestreams-ktx/build.gradle b/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
index cd16daa..ba2bd36 100644
--- a/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
+++ b/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
@@ -14,14 +14,10 @@
  * limitations under the License.
  */
 
-
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
   id("AndroidXPlugin")
@@ -31,12 +27,12 @@
 
 dependencies {
   api(project(":lifecycle:lifecycle-reactivestreams"))
-  api(KOTLIN_STDLIB)
+  api(libs.kotlinStdlib)
 
-  testImplementation(JUNIT)
-  testImplementation(RX_JAVA)
-  testImplementation(TRUTH)
-  testImplementation(KOTLIN_COROUTINES_TEST)
+  testImplementation(libs.junit)
+  testImplementation(libs.rxjava2)
+  testImplementation(libs.truth)
+  testImplementation(libs.kotlinCoroutinesTest)
   testImplementation(project(":lifecycle:lifecycle-runtime-testing"))
   testImplementation("androidx.arch.core:core-testing:2.1.0")
 }
diff --git a/lifecycle/lifecycle-reactivestreams/build.gradle b/lifecycle/lifecycle-reactivestreams/build.gradle
index 6572acf..c301bf7 100644
--- a/lifecycle/lifecycle-reactivestreams/build.gradle
+++ b/lifecycle/lifecycle-reactivestreams/build.gradle
@@ -14,10 +14,8 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
@@ -31,13 +29,13 @@
     api(project(":lifecycle:lifecycle-livedata"))
     api(project(":lifecycle:lifecycle-runtime"))
     api("androidx.annotation:annotation:1.1.0")
-    api(REACTIVE_STREAMS)
+    api(libs.reactiveStreams)
 
-    annotationProcessor(NULLAWAY)
+    annotationProcessor(libs.nullaway)
 
-    testImplementation(JUNIT)
-    testImplementation(RX_JAVA)
-    testImplementation(KOTLIN_COROUTINES_TEST)
+    testImplementation(libs.junit)
+    testImplementation(libs.rxjava2)
+    testImplementation(libs.kotlinCoroutinesTest)
     testImplementation(project(":lifecycle:lifecycle-runtime-testing"))
     testImplementation("androidx.arch.core:core-testing:2.1.0")
 }
diff --git a/lifecycle/lifecycle-reactivestreams/lint-baseline.xml b/lifecycle/lifecycle-reactivestreams/lint-baseline.xml
index 42a29d7..f07a798 100644
--- a/lifecycle/lifecycle-reactivestreams/lint-baseline.xml
+++ b/lifecycle/lifecycle-reactivestreams/lint-baseline.xml
@@ -1,71 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="                ArchTaskExecutor.getInstance().executeOnMainThread(new Runnable() {"
-        errorLine2="                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java"
-            line="115"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="TaskExecutor.executeOnMainThread can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="                ArchTaskExecutor.getInstance().executeOnMainThread(new Runnable() {"
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java"
-            line="115"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="                ArchTaskExecutor.getInstance().executeOnMainThread(new Runnable() {"
-        errorLine2="                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java"
-            line="153"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="TaskExecutor.executeOnMainThread can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="                ArchTaskExecutor.getInstance().executeOnMainThread(new Runnable() {"
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java"
-            line="153"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="                ArchTaskExecutor.getInstance().executeOnMainThread(new Runnable() {"
-        errorLine2="                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java"
-            line="260"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="TaskExecutor.executeOnMainThread can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="                ArchTaskExecutor.getInstance().executeOnMainThread(new Runnable() {"
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java"
-            line="260"
-            column="48"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="LambdaLast"
diff --git a/lifecycle/lifecycle-runtime-ktx-lint/build.gradle b/lifecycle/lifecycle-runtime-ktx-lint/build.gradle
index 6a17065..524870d 100644
--- a/lifecycle/lifecycle-runtime-ktx-lint/build.gradle
+++ b/lifecycle/lifecycle-runtime-ktx-lint/build.gradle
@@ -18,21 +18,19 @@
 import androidx.build.LibraryType
 import androidx.build.LibraryVersions
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("kotlin")
 }
 
 dependencies {
-    compileOnly(LINT_API_MIN)
-    compileOnly(KOTLIN_STDLIB)
+    compileOnly(libs.androidLintMinApi)
+    compileOnly(libs.kotlinStdlib)
 
-    testImplementation(KOTLIN_STDLIB)
-    testImplementation(LINT_CORE)
-    testImplementation(LINT_TESTS)
-    testImplementation(JUNIT)
+    testImplementation(libs.kotlinStdlib)
+    testImplementation(libs.androidLint)
+    testImplementation(libs.androidLintTests)
+    testImplementation(libs.junit)
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt
index a0e0e5c..d107f47 100644
--- a/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt
+++ b/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt
@@ -23,5 +23,8 @@
     // tests are run with this version. We ensure that with ApiLintVersionsTest
     override val api = 10
     override val minApi = CURRENT_API
-    override val issues get() = listOf(LifecycleWhenChecks.ISSUE)
+    override val issues get() = listOf(
+        LifecycleWhenChecks.ISSUE,
+        RepeatOnLifecycleDetector.ISSUE
+    )
 }
diff --git a/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleWhenChecks.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleWhenChecks.kt
index 2295a9f..a1d8509 100644
--- a/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleWhenChecks.kt
+++ b/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleWhenChecks.kt
@@ -60,11 +60,13 @@
 
 internal const val SECONDARY_ERROR_MESSAGE = "Internal View access"
 
-internal val APPLICABLE_METHOD_NAMES = listOf("whenCreated", "whenStarted", "whenResumed")
+private val LIFECYCLE_WHEN_APPLICABLE_METHOD_NAMES = listOf(
+    "whenCreated", "whenStarted", "whenResumed"
+)
 
 class LifecycleWhenChecks : Detector(), SourceCodeScanner {
 
-    override fun getApplicableMethodNames() = APPLICABLE_METHOD_NAMES
+    override fun getApplicableMethodNames() = LIFECYCLE_WHEN_APPLICABLE_METHOD_NAMES
 
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
         val valueArguments = node.valueArguments
@@ -194,7 +196,7 @@
 private const val LIFECYCLE_CLASS_NAME = "androidx.lifecycle.Lifecycle"
 
 private fun PsiMethod.isLifecycleWhenExtension(context: JavaContext): Boolean {
-    return name in APPLICABLE_METHOD_NAMES &&
+    return name in LIFECYCLE_WHEN_APPLICABLE_METHOD_NAMES &&
         context.evaluator.isMemberInClass(this, DISPATCHER_CLASS_NAME) &&
         context.evaluator.isStatic(this)
 }
diff --git a/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/RepeatOnLifecycleDetector.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/RepeatOnLifecycleDetector.kt
new file mode 100644
index 0000000..e0c8906
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/RepeatOnLifecycleDetector.kt
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.lifecycle.lint
+
+import com.android.tools.lint.detector.api.Category
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.JavaContext
+import com.android.tools.lint.detector.api.Scope
+import com.android.tools.lint.detector.api.Severity
+import com.android.tools.lint.detector.api.SourceCodeScanner
+import com.android.tools.lint.detector.api.isKotlin
+import com.intellij.psi.PsiMethod
+import org.jetbrains.uast.UCallExpression
+import org.jetbrains.uast.UClass
+import org.jetbrains.uast.visitor.AbstractUastVisitor
+
+/**
+ * Lint check for detecting calls to the suspend `repeatOnLifecycle` APIs in wrong lifecycle
+ * methods of [androidx.fragment.app.Fragment] or [androidx.core.app.ComponentActivity].
+ */
+class RepeatOnLifecycleDetector : Detector(), SourceCodeScanner {
+
+    companion object {
+        val ISSUE = Issue.create(
+            id = "RepeatOnLifecycleWrongUsage",
+            briefDescription = "Wrong usage of repeatOnLifecycle.",
+            explanation = """The repeatOnLifecycle APIs should be used when the View is created, \
+                that is in the `onCreate` lifecycle method for Activities, or `onViewCreated` in \
+                case you're using Fragments.""",
+            category = Category.CORRECTNESS,
+            severity = Severity.ERROR,
+            implementation = Implementation(
+                RepeatOnLifecycleDetector::class.java, Scope.JAVA_FILE_SCOPE
+            ),
+            androidSpecific = true
+        )
+    }
+
+    private val lifecycleMethods = setOf("onStart", "onResume")
+
+    override fun applicableSuperClasses(): List<String>? = listOf(FRAGMENT_CLASS, ACTIVITY_CLASS)
+
+    override fun visitClass(context: JavaContext, declaration: UClass) {
+        if (!isKotlin(context.psiFile)) return // Check only Kotlin files
+
+        val visitedMethods = mutableSetOf<PsiMethod>()
+        declaration.methods.forEach { method ->
+            if (lifecycleMethods.contains(method.name)) {
+                val visitor = RecursiveMethodVisitor(
+                    context, declaration.name, method, visitedMethods
+                )
+                method.uastBody?.accept(visitor)
+            }
+        }
+    }
+}
+
+/**
+ * A UAST Visitor that recursively explores all method calls within an Activity or Fragment
+ * lifecycle method to check for wrong method calls to repeatOnLifecycle.
+ *
+ * @param context The context of the lint request.
+ * @param originClassName The name of the class being checked.
+ * @param lifecycleMethod The originating lifecycle method.
+ */
+private class RecursiveMethodVisitor(
+    private val context: JavaContext,
+    private val originClassName: String?,
+    private val lifecycleMethod: PsiMethod,
+    private val visitedMethods: MutableSet<PsiMethod>
+) : AbstractUastVisitor() {
+
+    override fun visitCallExpression(node: UCallExpression): Boolean {
+        val psiMethod = node.resolve() ?: return super.visitCallExpression(node)
+        if (visitedMethods.contains(psiMethod)) {
+            return super.visitCallExpression(node)
+        }
+        // Don't add UNSAFE_METHOD to the list of visitedMethods
+        if (psiMethod.name != UNSAFE_METHOD.name) {
+            visitedMethods.add(psiMethod)
+        }
+        // Check current method and report if there's a wrong repeatOnLifecycle usage
+        if (!checkMethodCall(psiMethod, node)) {
+            val uastNode = context.uastContext.getMethod(psiMethod)
+            uastNode.uastBody?.accept(this)
+        }
+        return super.visitCallExpression(node)
+    }
+
+    /**
+     * Checks if the current method call is not correct.
+     *
+     * Returns `true` and report the appropriate lint issue if an error is found, otherwise return
+     * `false`.
+     *
+     * @param psiMethod The resolved [PsiMethod] of the call to check.
+     * @param expression Original expression.
+     * @return `true` if a lint error was found and reported, `false` otherwise.
+     */
+    private fun checkMethodCall(psiMethod: PsiMethod, expression: UCallExpression): Boolean {
+        val method = Method(psiMethod.containingClass?.qualifiedName, psiMethod.name)
+        return if (method == UNSAFE_METHOD) {
+            context.report(
+                RepeatOnLifecycleDetector.ISSUE,
+                context.getLocation(expression),
+                "Wrong usage of ${method.name} from $originClassName.${lifecycleMethod.name}."
+            )
+            true
+        } else {
+            false
+        }
+    }
+}
+
+internal data class Method(val cls: String?, val name: String)
+
+private val UNSAFE_METHOD = Method(
+    "androidx.lifecycle.RepeatOnLifecycleKt", "repeatOnLifecycle"
+)
+
+private const val FRAGMENT_CLASS = "androidx.fragment.app.Fragment"
+private const val ACTIVITY_CLASS = "androidx.core.app.ComponentActivity"
diff --git a/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/RepeatOnLifecycleDetectorTest.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/RepeatOnLifecycleDetectorTest.kt
new file mode 100644
index 0000000..b73fbd5
--- /dev/null
+++ b/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/RepeatOnLifecycleDetectorTest.kt
@@ -0,0 +1,208 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.lifecycle.lint
+
+import androidx.lifecycle.lint.stubs.REPEAT_ON_LIFECYCLE_STUBS
+import com.android.tools.lint.checks.infrastructure.TestFiles
+import com.android.tools.lint.checks.infrastructure.TestLintResult
+import com.android.tools.lint.checks.infrastructure.TestLintTask
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RunWith(Parameterized::class)
+class RepeatOnLifecycleDetectorTest(val config: TestConfig) {
+
+    data class TestConfig(
+        val isActivity: Boolean,
+        val lifecycleMethod: String,
+        val apiMethod: String,
+        val methodBody: String,
+        val helperMethodBody: String
+    )
+
+    companion object {
+        private fun generateTestConfigs() = listOf(true, false).flatMap { activity ->
+            listOf(
+                activity to (if (activity) "onCreate" else "onCreateView"),
+                activity to "onStart", activity to "onResume"
+            )
+                .flatMap { (activity, lifecycleMethod) ->
+                    listOf(
+                        Triple(activity, lifecycleMethod, "repeatOnLifecycle"),
+                        Triple(activity, lifecycleMethod, "lifecycle.repeatOnLifecycle"),
+                    )
+                }
+                .flatMap { (activity, lifecycleMethod, apiMethod) ->
+                    listOf(
+                        // apiMethod is called directly from the lifecycleMethod
+                        TestConfig(
+                            activity, lifecycleMethod, apiMethod,
+                            methodBody = """
+                                GlobalScope.launch {
+                                    $apiMethod(Lifecycle.State.STARTED) { }
+                                }
+                            """.trimIndent(),
+                            helperMethodBody = ""
+                        ),
+                        // apiMethod is called from another function called from the lifecycleMethod
+                        TestConfig(
+                            activity, lifecycleMethod, apiMethod,
+                            methodBody = """
+                                GlobalScope.launch {
+                                    helperMethod()
+                                }
+                            """.trimIndent(),
+                            // The helper method body depends on the apiMethod we're testing
+                            helperMethodBody = if (apiMethod == "lifecycle.repeatOnLifecycle") {
+                                "lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { }"
+                            } else {
+                                "repeatOnLifecycle(Lifecycle.State.STARTED) { }"
+                            }
+                        )
+                    )
+                }
+        }
+
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun spec(): List<TestConfig> = generateTestConfigs()
+    }
+
+    @Test
+    fun basicTest() {
+        val fileToAdd = if (config.isActivity) {
+            activityTemplate(config.lifecycleMethod, config.methodBody, config.helperMethodBody)
+        } else {
+            fragmentTemplate(config.lifecycleMethod, config.methodBody, config.helperMethodBody)
+        }
+        val testLintResult = check(fileToAdd)
+        if ((config.isActivity && config.lifecycleMethod == "onCreate") ||
+            (!config.isActivity) && config.lifecycleMethod == "onCreateView"
+        ) {
+            testLintResult.expectClean()
+        } else {
+            testLintResult.expect(error())
+        }
+    }
+
+    private fun check(fileToAdd: String): TestLintResult {
+        return TestLintTask.lint()
+            .files(
+                *REPEAT_ON_LIFECYCLE_STUBS,
+                TestFiles.kt(fileToAdd)
+            )
+            .issues(RepeatOnLifecycleDetector.ISSUE)
+            .run()
+    }
+
+    private fun error(): String {
+        val className = if (config.isActivity) "MyActivity" else "MyFragment"
+        val (error, curlyCharacters, indent, wrongLine) =
+            if (config.methodBody.contains("helperMethod")) {
+                Error(
+                    error = "${config.helperMethodBody} // config.helperMethodBody",
+                    curlyCharacters = config.helperMethodBody.length,
+                    indent = 8,
+                    wrongLine = "18"
+                )
+            } else {
+                val error = "${config.apiMethod}(Lifecycle.State.STARTED) { }"
+                Error(
+                    error = error,
+                    curlyCharacters = error.length,
+                    indent = 4,
+                    wrongLine = "13"
+                )
+            }
+        /* ktlint-disable max-line-length */
+        return """
+            src/foo/$className.kt:$wrongLine: Error: Wrong usage of repeatOnLifecycle from $className.${config.lifecycleMethod}. [RepeatOnLifecycleWrongUsage]
+            ${" ".repeat(indent)}$error
+            ${" ".repeat(indent)}${"~".repeat(curlyCharacters)}
+            1 errors, 0 warnings
+        """.trimIndent()
+        /* ERROR EXAMPLE:
+            src/foo/MyActivity.kt:13: Error: Wrong usage of repeatOnLifecycle from MyActivity.onStart. [RepeatOnLifecycleWrongUsage]
+                repeatOnLifecycle(Lifecycle.State.STARTED) { }
+                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+            1 errors, 0 warnings
+         */
+        /* ktlint-enable max-line-length */
+    }
+
+    private fun fragmentTemplate(
+        lifecycleMethod: String,
+        methodBody: String,
+        helperMethodBody: String
+    ) = FRAGMENT_TEMPLATE.format(lifecycleMethod, methodBody, helperMethodBody)
+
+    private fun activityTemplate(
+        lifecycleMethod: String,
+        methodBody: String,
+        helperMethodBody: String
+    ) = ACTIVITY_TEMPLATE.format(lifecycleMethod, methodBody, helperMethodBody)
+
+    private val FRAGMENT_TEMPLATE = """
+        package foo
+
+        import androidx.lifecycle.Lifecycle
+        import androidx.lifecycle.LifecycleOwner
+        import androidx.lifecycle.repeatOnLifecycle
+        import kotlinx.coroutines.CoroutineScope
+        import kotlinx.coroutines.GlobalScope
+        import androidx.fragment.app.Fragment
+
+        class MyFragment : Fragment() {
+            fun %s() { // config.lifecycleMethod
+                %s // config.methodBody
+            }
+
+            suspend fun helperMethod() {
+                %s // config.helperMethodBody
+            }
+        }
+    """.trimIndent()
+
+    private val ACTIVITY_TEMPLATE = """
+        package foo
+
+        import androidx.core.app.ComponentActivity
+        import androidx.lifecycle.Lifecycle
+        import androidx.lifecycle.LifecycleOwner
+        import androidx.lifecycle.repeatOnLifecycle
+        import kotlinx.coroutines.CoroutineScope
+        import kotlinx.coroutines.GlobalScope
+
+        class MyActivity : ComponentActivity() {
+            fun %s() { // config.lifecycleMethod
+                %s // config.methodBody
+            }
+
+            suspend fun helperMethod() {
+                %s // config.helperMethodBody
+            }
+        }
+    """.trimIndent()
+}
+
+private data class Error(
+    val error: String,
+    val curlyCharacters: Int,
+    val indent: Int,
+    val wrongLine: String
+)
diff --git a/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/stubs/Stubs.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/stubs/Stubs.kt
index 13f39d7..6c04c7f 100644
--- a/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/stubs/Stubs.kt
+++ b/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/stubs/Stubs.kt
@@ -16,6 +16,7 @@
 
 package androidx.lifecycle.lint.stubs
 
+import com.android.tools.lint.checks.infrastructure.LintDetectorTest
 import com.android.tools.lint.checks.infrastructure.TestFiles
 
 internal val LIFECYCLE_STUB = TestFiles.kt(
@@ -88,4 +89,62 @@
             fun foo() {}
         }
     """
-).indented().within("src")
\ No newline at end of file
+).indented().within("src")
+
+private val FRAGMENT_STUB = LintDetectorTest.java(
+    """
+    package androidx.fragment.app;
+
+    import androidx.lifecycle.LifecycleOwner;
+
+    public class Fragment implements LifecycleOwner {
+        public LifecycleOwner getViewLifecycleOwner() {}
+    }
+"""
+)
+
+private val ACTIVITY_STUB = LintDetectorTest.java(
+    """
+    package androidx.core.app;
+
+    import androidx.lifecycle.LifecycleOwner;
+
+    public class ComponentActivity implements LifecycleOwner {}
+"""
+)
+
+private val REPEAT_ON_LIFECYCLE_STUB = TestFiles.kt(
+    "androidx/lifecycle/RepeatOnLifecycle.kt",
+    """
+        package androidx.lifecycle;
+
+        import androidx.lifecycle.LifecycleOwner
+        import kotlinx.coroutines.CoroutineScope
+
+        abstract class Lifecycle {
+            enum class State { CREATED, STARTED }
+            fun isAtLeast(state: State): Boolean {
+                return true
+            }
+        }
+
+        public suspend fun Lifecycle.repeatOnLifecycle(
+            state: Lifecycle.State,
+            block: suspend CoroutineScope.() -> Unit
+        ) {
+            throw Error()
+        }
+
+        public suspend fun LifecycleOwner.repeatOnLifecycle(
+            state: Lifecycle.State,
+            block: suspend CoroutineScope.() -> Unit
+        ) {
+            throw Error()
+        }
+    """
+).indented().within("src")
+
+// stubs for testing calls to LiveData.observe calls
+internal val REPEAT_ON_LIFECYCLE_STUBS = arrayOf(
+    REPEAT_ON_LIFECYCLE_STUB, LIFECYCLE_STUB, FRAGMENT_STUB, ACTIVITY_STUB, COROUTINES_STUB
+)
diff --git a/lifecycle/lifecycle-runtime-ktx/build.gradle b/lifecycle/lifecycle-runtime-ktx/build.gradle
index f638906..e6076bc 100644
--- a/lifecycle/lifecycle-runtime-ktx/build.gradle
+++ b/lifecycle/lifecycle-runtime-ktx/build.gradle
@@ -14,14 +14,11 @@
  * limitations under the License.
  */
 
-
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -30,19 +27,19 @@
 
 dependencies {
     api(project(":lifecycle:lifecycle-runtime"))
-    api(KOTLIN_STDLIB)
-    api(KOTLIN_COROUTINES_ANDROID)
+    api(libs.kotlinStdlib)
+    api(libs.kotlinCoroutinesAndroid)
     api("androidx.annotation:annotation:1.0.0")
 
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
 
     androidTestImplementation(project(":lifecycle:lifecycle-runtime"))
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(KOTLIN_COROUTINES_TEST)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.kotlinCoroutinesTest)
 
     lintPublish(project(":lifecycle:lifecycle-runtime-ktx-lint"))
 }
diff --git a/lifecycle/lifecycle-runtime-testing/build.gradle b/lifecycle/lifecycle-runtime-testing/build.gradle
index ae441d6..3a2a4cd 100644
--- a/lifecycle/lifecycle-runtime-testing/build.gradle
+++ b/lifecycle/lifecycle-runtime-testing/build.gradle
@@ -14,13 +14,10 @@
  * limitations under the License.
  */
 
-
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
     id("AndroidXPlugin")
@@ -30,17 +27,17 @@
 
 dependencies {
     api(project(":lifecycle:lifecycle-runtime-ktx"))
-    api(KOTLIN_STDLIB)
-    api(KOTLIN_COROUTINES_ANDROID)
+    api(libs.kotlinStdlib)
+    api(libs.kotlinCoroutinesAndroid)
 
-    testImplementation(TRUTH)
-    testImplementation(JUNIT)
-    testImplementation(KOTLIN_COROUTINES_TEST)
+    testImplementation(libs.truth)
+    testImplementation(libs.junit)
+    testImplementation(libs.kotlinCoroutinesTest)
 
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-runtime/build.gradle b/lifecycle/lifecycle-runtime/build.gradle
index a053e6d..241d488 100644
--- a/lifecycle/lifecycle-runtime/build.gradle
+++ b/lifecycle/lifecycle-runtime/build.gradle
@@ -1,7 +1,5 @@
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
@@ -22,13 +20,13 @@
     api("androidx.annotation:annotation:1.1.0")
     implementation("androidx.arch.core:core-runtime:2.1.0")
 
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
 
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-runtime/lint-baseline.xml b/lifecycle/lifecycle-runtime/lint-baseline.xml
index da31c8e..42a176b 100644
--- a/lifecycle/lifecycle-runtime/lint-baseline.xml
+++ b/lifecycle/lifecycle-runtime/lint-baseline.xml
@@ -1,169 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="RestrictedApi"
-        message="FastSafeIterableMap can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="            new FastSafeIterableMap&lt;>();"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="52"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.size can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        if (mObserverMap.size() == 0) {"
-        errorLine2="                         ~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="153"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.eldest can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        State eldestObserverState = mObserverMap.eldest().getValue().mState;"
-        errorLine2="                                                 ~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="156"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.newest can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        State newestObserverState = mObserverMap.newest().getValue().mState;"
-        errorLine2="                                                 ~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="157"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="FastSafeIterableMap.ceil can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        Map.Entry&lt;LifecycleObserver, ObserverWithState> previous = mObserverMap.ceil(observer);"
-        errorLine2="                                                                                ~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="162"
-            column="81"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="FastSafeIterableMap.putIfAbsent can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);"
-        errorLine2="                                                  ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="175"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="FastSafeIterableMap.contains can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="                &amp;&amp; mObserverMap.contains(observer))) {"
-        errorLine2="                                ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="190"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="FastSafeIterableMap.remove can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        mObserverMap.remove(observer);"
-        errorLine2="                     ~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="232"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.size can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="        return mObserverMap.size();"
-        errorLine2="                            ~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="243"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.iteratorWithAdditions can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="                mObserverMap.iteratorWithAdditions();"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="254"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="FastSafeIterableMap.contains can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="                    &amp;&amp; mObserverMap.contains(entry.getKey()))) {"
-        errorLine2="                                    ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="259"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.descendingIterator can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="                mObserverMap.descendingIterator();"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="273"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="FastSafeIterableMap.contains can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="                    &amp;&amp; mObserverMap.contains(entry.getKey()))) {"
-        errorLine2="                                    ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="278"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.eldest can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="            if (mState.compareTo(mObserverMap.eldest().getValue().mState) &lt; 0) {"
-        errorLine2="                                              ~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="301"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="SafeIterableMap.newest can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.lifecycle`)"
-        errorLine1="            Map.Entry&lt;LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();"
-        errorLine2="                                                                                  ~~~~~~">
-        <location
-            file="src/main/java/androidx/lifecycle/LifecycleRegistry.java"
-            line="304"
-            column="83"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
 </issues>
diff --git a/lifecycle/lifecycle-service/build.gradle b/lifecycle/lifecycle-service/build.gradle
index 2b81a01..9d07cd7 100644
--- a/lifecycle/lifecycle-service/build.gradle
+++ b/lifecycle/lifecycle-service/build.gradle
@@ -14,10 +14,8 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
@@ -28,9 +26,9 @@
 dependencies {
     api(project(":lifecycle:lifecycle-runtime"))
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
     androidTestImplementation("androidx.localbroadcastmanager:localbroadcastmanager:1.0.0")
 }
 
diff --git a/lifecycle/lifecycle-viewmodel-compose/build.gradle b/lifecycle/lifecycle-viewmodel-compose/build.gradle
index 2bdbb1c..5376e2f 100644
--- a/lifecycle/lifecycle-viewmodel-compose/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-compose/build.gradle
@@ -18,9 +18,6 @@
 import androidx.build.LibraryVersions
 import androidx.build.Publish
 import androidx.build.RunApiTasks
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-import static androidx.build.dependencies.DependenciesKt.*
 
 plugins {
     id("AndroidXPlugin")
@@ -36,14 +33,14 @@
     api projectOrArtifact(":compose:runtime:runtime")
     api projectOrArtifact(":compose:ui:ui")
 
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
 
     androidTestImplementation projectOrArtifact(":compose:ui:ui-test-junit4")
     androidTestImplementation projectOrArtifact(":compose:test-utils")
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(TRUTH)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.truth)
     androidTestImplementation "androidx.fragment:fragment:1.3.0"
     androidTestImplementation "androidx.appcompat:appcompat:1.3.0-beta01"
     androidTestImplementation projectOrArtifact(":activity:activity-compose")
diff --git a/lifecycle/lifecycle-viewmodel-compose/integration-tests/lifecycle-viewmodel-demos/build.gradle b/lifecycle/lifecycle-viewmodel-compose/integration-tests/lifecycle-viewmodel-demos/build.gradle
index 8979c3c..c41787a 100644
--- a/lifecycle/lifecycle-viewmodel-compose/integration-tests/lifecycle-viewmodel-demos/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-compose/integration-tests/lifecycle-viewmodel-demos/build.gradle
@@ -14,11 +14,7 @@
  * limitations under the License.
  */
 
-
 import androidx.build.Publish
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-import static androidx.build.dependencies.DependenciesKt.getKOTLIN_STDLIB
 
 plugins {
     id("AndroidXPlugin")
@@ -29,7 +25,7 @@
 
 dependencies {
     kotlinPlugin projectOrArtifact(":compose:compiler:compiler")
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
     implementation projectOrArtifact(":lifecycle:lifecycle-viewmodel-compose")
     implementation projectOrArtifact(
             ":lifecycle:lifecycle-viewmodel-compose:lifecycle-viewmodel-compose-samples"
diff --git a/lifecycle/lifecycle-viewmodel-compose/samples/build.gradle b/lifecycle/lifecycle-viewmodel-compose/samples/build.gradle
index 3f1d512..df450b1 100644
--- a/lifecycle/lifecycle-viewmodel-compose/samples/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-compose/samples/build.gradle
@@ -14,13 +14,9 @@
  * limitations under the License.
  */
 
-
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.LibraryType
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-import static androidx.build.dependencies.DependenciesKt.*
 
 plugins {
     id("AndroidXPlugin")
@@ -31,7 +27,7 @@
 
 dependencies {
     kotlinPlugin projectOrArtifact(":compose:compiler:compiler")
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
     implementation projectOrArtifact(":lifecycle:lifecycle-viewmodel-compose")
 }
 
diff --git a/lifecycle/lifecycle-viewmodel-ktx/build.gradle b/lifecycle/lifecycle-viewmodel-ktx/build.gradle
index 854918a..43af991 100644
--- a/lifecycle/lifecycle-viewmodel-ktx/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-ktx/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
@@ -27,16 +26,16 @@
 
 dependencies {
     api(project(":lifecycle:lifecycle-viewmodel"))
-    api(KOTLIN_STDLIB)
-    api(KOTLIN_COROUTINES_ANDROID)
+    api(libs.kotlinStdlib)
+    api(libs.kotlinCoroutinesAndroid)
 
-    testImplementation(JUNIT)
-    testImplementation(TRUTH)
+    testImplementation(libs.junit)
+    testImplementation(libs.truth)
 
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
 }
 
 androidx {
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/build.gradle b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
index b6496aa..d628653 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
@@ -14,10 +14,8 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
@@ -52,12 +50,12 @@
         exclude group: "androidx.lifecycle", module: "lifecycle-viewmodel-savedstate"
         exclude group: "androidx.lifecycle", module: "lifecycle-viewmodel"
     }
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
 }
 
 //used by testImplementation safe-args-generator
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/lint-baseline.xml b/lifecycle/lifecycle-viewmodel-savedstate/lint-baseline.xml
index caf0f82..6511368 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/lint-baseline.xml
+++ b/lifecycle/lifecycle-viewmodel-savedstate/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="LambdaLast"
diff --git a/lifecycle/lifecycle-viewmodel/build.gradle b/lifecycle/lifecycle-viewmodel/build.gradle
index fb1af37..50abd68 100644
--- a/lifecycle/lifecycle-viewmodel/build.gradle
+++ b/lifecycle/lifecycle-viewmodel/build.gradle
@@ -14,10 +14,8 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
@@ -35,15 +33,15 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
 
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
 
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
 }
 
 androidx {
diff --git a/lint-checks/lint-baseline.xml b/lint-checks/lint-baseline.xml
index 8794ae8..42a176b 100644
--- a/lint-checks/lint-baseline.xml
+++ b/lint-checks/lint-baseline.xml
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
 </issues>
diff --git a/lint-demos/lint-demo-appcompat/lint-baseline.xml b/lint-demos/lint-demo-appcompat/lint-baseline.xml
index aed50b7..9445a67 100644
--- a/lint-demos/lint-demo-appcompat/lint-baseline.xml
+++ b/lint-demos/lint-demo-appcompat/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
@@ -123,39 +123,6 @@
     </issue>
 
     <issue
-        id="UnusedResources"
-        message="The resource `R.layout.core_switch` appears to be unused"
-        errorLine1="&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/layout/core_switch.xml"
-            line="18"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.layout.image_view_using_android_tint` appears to be unused"
-        errorLine1="&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/layout/image_view_using_android_tint.xml"
-            line="18"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.layout.text_view_using_android_compound_drawables` appears to be unused"
-        errorLine1="&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/layout-v23/text_view_using_android_compound_drawables.xml"
-            line="18"
-            column="1"/>
-    </issue>
-
-    <issue
         id="SyntheticAccessor"
         message="Access to `private` member of class `ResourceLoader` requires synthetic accessor"
         errorLine1="        ColorStateList csl2 = new ResourceLoader().getColorStateList("
diff --git a/media/media/lint-baseline.xml b/media/media/lint-baseline.xml
index 41b05e6..1fe0359 100644
--- a/media/media/lint-baseline.xml
+++ b/media/media/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/media/version-compat-tests/lib/lint-baseline.xml b/media/version-compat-tests/lib/lint-baseline.xml
index 01c5c6f..2c98d21 100644
--- a/media/version-compat-tests/lib/lint-baseline.xml
+++ b/media/version-compat-tests/lib/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/media2/integration-tests/testapp/lint-baseline.xml b/media2/integration-tests/testapp/lint-baseline.xml
index 290fbc9..cfeacea 100644
--- a/media2/integration-tests/testapp/lint-baseline.xml
+++ b/media2/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
@@ -24,17 +24,6 @@
     </issue>
 
     <issue
-        id="RestrictedApi"
-        message="MediaItem.getMediaId can only be called from within the same library group (groupId=androidx.media2)"
-        errorLine1="                    &amp;&amp; TextUtils.equals(currentItem.getMediaId(), mUri.toString())"
-        errorLine2="                                                    ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoPlayerActivity.java"
-            line="328"
-            column="53"/>
-    </issue>
-
-    <issue
         id="SyntheticAccessor"
         message="Access to `private` method `showErrorDialogIfFailed` of class `VideoPlayerActivity` requires synthetic accessor"
         errorLine1="            showErrorDialogIfFailed(controller.setMediaItem(mUri.toString()),"
diff --git a/media2/media2-common/lint-baseline.xml b/media2/media2-common/lint-baseline.xml
index 990d3cb..ec087a8 100644
--- a/media2/media2-common/lint-baseline.xml
+++ b/media2/media2-common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/media2/media2-player/lint-baseline.xml b/media2/media2-player/lint-baseline.xml
index 65b02c9..04da466 100644
--- a/media2/media2-player/lint-baseline.xml
+++ b/media2/media2-player/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/media2/media2-session/lint-baseline.xml b/media2/media2-session/lint-baseline.xml
index 0b8f1f2..a781bd7 100644
--- a/media2/media2-session/lint-baseline.xml
+++ b/media2/media2-session/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/media2/media2-session/version-compat-tests/common/lint-baseline.xml b/media2/media2-session/version-compat-tests/common/lint-baseline.xml
index c2fe66b..e82d8f6 100644
--- a/media2/media2-session/version-compat-tests/common/lint-baseline.xml
+++ b/media2/media2-session/version-compat-tests/common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/media2/media2-widget/lint-baseline.xml b/media2/media2-widget/lint-baseline.xml
index be16962..314a6af 100644
--- a/media2/media2-widget/lint-baseline.xml
+++ b/media2/media2-widget/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/mediarouter/mediarouter/lint-baseline.xml b/mediarouter/mediarouter/lint-baseline.xml
index e41e0ea..7aa92ae 100644
--- a/mediarouter/mediarouter/lint-baseline.xml
+++ b/mediarouter/mediarouter/lint-baseline.xml
@@ -958,15 +958,4 @@
             column="65"/>
     </issue>
 
-    <issue
-        id="ObsoleteSdkInt"
-        message="Unnecessary; SDK_INT is always >= 14"
-        errorLine1="            } else if (Build.VERSION.SDK_INT >= 14) {"
-        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/mediarouter/media/MediaRouter.java"
-            line="3403"
-            column="24"/>
-    </issue>
-
 </issues>
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
index bb450cf..5e09209 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
@@ -66,20 +66,17 @@
  * to select by specifying a {@link MediaRouteSelector selector} with the
  * {@link #setRouteSelector} method.
  * </p><p>
- * When the default route is selected or when the currently selected route does not
- * match the {@link #getRouteSelector() selector}, the button will appear in
- * an inactive state indicating that the application is not connected to a
- * route of the kind that it wants to use.  Clicking on the button opens
+ * When the default route is selected, the button will appear in an inactive state indicating
+ * that the application is not connected to a route. Clicking on the button opens
  * a {@link MediaRouteChooserDialog} to allow the user to select a route.
  * If no non-default routes match the selector and it is not possible for an active
  * scan to discover any matching routes, then the button is disabled and cannot
  * be clicked unless {@link #setAlwaysVisible} is called.
  * </p><p>
- * When a non-default route is selected that matches the selector, the button will
- * appear in an active state indicating that the application is connected
- * to a route of the kind that it wants to use.  The button may also appear
- * in an intermediary connecting state if the route is in the process of connecting
- * to the destination but has not yet completed doing so.  In either case, clicking
+ * When a non-default route is selected, the button will appear in an active state indicating
+ * that the application is connected to a route of the kind that it wants to use.
+ * The button may also appear in an intermediary connecting state if the route is in the process
+ * of connecting to the destination but has not yet completed doing so.  In either case, clicking
  * on the button opens a {@link MediaRouteControllerDialog} to allow the user
  * to control or disconnect from the current route.
  * </p>
@@ -307,8 +304,7 @@
     /**
      * Show the route chooser or controller dialog.
      * <p>
-     * If the default route is selected or if the currently selected route does
-     * not match the {@link #getRouteSelector selector}, then shows the route chooser dialog.
+     * If the default route is selected, then shows the route chooser dialog.
      * Otherwise, shows the route controller dialog to offer the user
      * a choice to disconnect from the route or perform other control actions
      * such as setting the route's volume.
@@ -356,7 +352,7 @@
         }
         MediaRouter.RouteInfo selectedRoute = mRouter.getSelectedRoute();
 
-        if (selectedRoute.isDefaultOrBluetooth() || !selectedRoute.matchesSelector(mSelector)) {
+        if (selectedRoute.isDefaultOrBluetooth()) {
             if (fm.findFragmentByTag(CHOOSER_FRAGMENT_TAG) != null) {
                 Log.w(TAG, "showDialog(): Route chooser dialog already showing!");
                 return false;
@@ -753,7 +749,7 @@
 
     void refreshRoute() {
         final MediaRouter.RouteInfo route = mRouter.getSelectedRoute();
-        final boolean isRemote = !route.isDefaultOrBluetooth() && route.matchesSelector(mSelector);
+        final boolean isRemote = !route.isDefaultOrBluetooth();
         final int connectionState = (isRemote ? route.getConnectionState()
                 : CONNECTION_STATE_DISCONNECTED);
 
@@ -768,7 +764,7 @@
         }
 
         if (mAttachedToWindow) {
-            setEnabled(mAlwaysVisible || mRouter.isRouteAvailable(mSelector,
+            setEnabled(mAlwaysVisible || isRemote || mRouter.isRouteAvailable(mSelector,
                     MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE));
         }
     }
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
index 9e98d05..2e7ff569 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
@@ -3400,7 +3400,7 @@
             mCompatSession = session;
             if (Build.VERSION.SDK_INT >= 21) {
                 setMediaSessionRecord(session != null ? new MediaSessionRecord(session) : null);
-            } else if (Build.VERSION.SDK_INT >= 14) {
+            } else {
                 if (mRccMediaSession != null) {
                     removeRemoteControlClient(mRccMediaSession.getRemoteControlClient());
                     mRccMediaSession.removeOnActiveChangeListener(mSessionActiveListener);
diff --git a/navigation/benchmark/build.gradle b/navigation/benchmark/build.gradle
index 1bf4bf51..deaa318 100644
--- a/navigation/benchmark/build.gradle
+++ b/navigation/benchmark/build.gradle
@@ -13,9 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import static androidx.build.dependencies.DependenciesKt.*
+
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.Publish
 
 plugins {
@@ -29,12 +28,12 @@
     androidTestImplementation(projectOrArtifact(":benchmark:benchmark-junit4"))
     androidTestImplementation(project(":navigation:navigation-runtime"))
     androidTestImplementation(project(":internal-testutils-navigation"))
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(KOTLIN_STDLIB)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.kotlinStdlib)
 }
 
 androidx {
diff --git a/navigation/integration-tests/safeargs-testapp/build.gradle b/navigation/integration-tests/safeargs-testapp/build.gradle
index ac8cc33..d522f1c 100644
--- a/navigation/integration-tests/safeargs-testapp/build.gradle
+++ b/navigation/integration-tests/safeargs-testapp/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 
@@ -66,6 +65,6 @@
 
 dependencies {
     implementation "${LibraryGroups.NAVIGATION}:navigation-runtime:${LibraryVersions.NAVIGATION}"
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
 }
diff --git a/navigation/integration-tests/testapp/build.gradle b/navigation/integration-tests/testapp/build.gradle
index 190bedf..4703da6e 100644
--- a/navigation/integration-tests/testapp/build.gradle
+++ b/navigation/integration-tests/testapp/build.gradle
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 buildscript {
     // TODO: Remove this when this test app no longer depends on 1.0.0 of vectordrawable-animated.
     // vectordrawable and vectordrawable-animated were accidentally using the same package name
@@ -30,7 +28,7 @@
 }
 
 dependencies {
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
     implementation("androidx.appcompat:appcompat:1.1.0")
     implementation(project(":navigation:navigation-fragment-ktx"))
     implementation(project(":navigation:navigation-ui-ktx"))
diff --git a/navigation/integration-tests/testapp/lint-baseline.xml b/navigation/integration-tests/testapp/lint-baseline.xml
index 67b445b..d11926b 100644
--- a/navigation/integration-tests/testapp/lint-baseline.xml
+++ b/navigation/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
@@ -78,48 +78,4 @@
             column="20"/>
     </issue>
 
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.drawer_navigation` appears to be unused"
-        errorLine1="    &lt;string name=&quot;drawer_navigation&quot;>Drawer Nav&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="16"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.drawer_open` appears to be unused"
-        errorLine1="    &lt;string name=&quot;drawer_open&quot;>Open Navigation Drawer&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="17"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.drawer_close` appears to be unused"
-        errorLine1="    &lt;string name=&quot;drawer_close&quot;>Close Navigation Drawer&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="18"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.bottom_navigation` appears to be unused"
-        errorLine1="    &lt;string name=&quot;bottom_navigation&quot;>Bottom Nav&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="19"
-            column="13"/>
-    </issue>
-
 </issues>
diff --git a/navigation/integration-tests/testapp/src/main/java/androidx/navigation/testapp/HelpActivity.kt b/navigation/integration-tests/testapp/src/main/java/androidx/navigation/testapp/HelpActivity.kt
index 55f03b2..5eb47d1 100644
--- a/navigation/integration-tests/testapp/src/main/java/androidx/navigation/testapp/HelpActivity.kt
+++ b/navigation/integration-tests/testapp/src/main/java/androidx/navigation/testapp/HelpActivity.kt
@@ -78,6 +78,7 @@
 }
 
 class BottomSheetNavigationView : BottomSheetDialogFragment() {
+    @Suppress("DEPRECATION")
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
diff --git a/navigation/navigation-common-ktx/build.gradle b/navigation/navigation-common-ktx/build.gradle
index 2e6b8bb..e7791a0 100644
--- a/navigation/navigation-common-ktx/build.gradle
+++ b/navigation/navigation-common-ktx/build.gradle
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode
diff --git a/navigation/navigation-common/api/api_lint.ignore b/navigation/navigation-common/api/api_lint.ignore
index 8610f6c..3812c14 100644
--- a/navigation/navigation-common/api/api_lint.ignore
+++ b/navigation/navigation-common/api/api_lint.ignore
@@ -119,6 +119,8 @@
     androidx.navigation.NavOptions does not declare a `isLaunchSingleTop()` method matching method androidx.navigation.NavOptions.Builder.setLaunchSingleTop(boolean)
 
 
+MissingJvmstatic: androidx.navigation.NavDestination#hierarchy:
+    Companion object constants like hierarchy should be using @JvmField, not @JvmStatic; see https://developer.android.com/kotlin/interop#companion_constants
 MissingJvmstatic: androidx.navigation.NavOptionsBuilder#popUpTo(String, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit>):
     A Kotlin method with default parameter values should be annotated with @JvmOverloads for better Java interoperability; see https://android.github.io/kotlin-guides/interop.html#function-overloads-for-defaults
 MissingJvmstatic: androidx.navigation.NavOptionsBuilder#popUpTo(int, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit>):
diff --git a/navigation/navigation-common/api/current.txt b/navigation/navigation-common/api/current.txt
index afc02e9..a889a60 100644
--- a/navigation/navigation-common/api/current.txt
+++ b/navigation/navigation-common/api/current.txt
@@ -188,6 +188,7 @@
     method public final void addDeepLink(androidx.navigation.NavDeepLink navDeepLink);
     method public final androidx.navigation.NavAction? getAction(@IdRes int id);
     method public final java.util.Map<java.lang.String,androidx.navigation.NavArgument> getArguments();
+    method public static final kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
     method @IdRes public final int getId();
     method public final CharSequence? getLabel();
     method public final String getNavigatorName();
@@ -219,11 +220,13 @@
   }
 
   public static final class NavDestination.Companion {
+    method public kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
     method protected <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
+    property public final kotlin.sequences.Sequence<androidx.navigation.NavDestination> hierarchy;
   }
 
   @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
-    ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+    ctor @Deprecated public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
     ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, String? route);
     method public final void action(int actionId, kotlin.jvm.functions.Function1<? super androidx.navigation.NavActionBuilder,kotlin.Unit> actionBuilder);
     method public final void argument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> argumentBuilder);
@@ -260,6 +263,7 @@
     method public final void clear();
     method public final androidx.navigation.NavDestination? findNode(@IdRes int resId);
     method public final androidx.navigation.NavDestination? findNode(String? route);
+    method public static final androidx.navigation.NavDestination findStartDestination(androidx.navigation.NavGraph);
     method @Deprecated @IdRes public final int getStartDestination();
     method @IdRes public final int getStartDestinationId();
     method public final String? getStartDestinationRoute();
@@ -269,10 +273,15 @@
     method public final void setStartDestination(String startDestRoute);
     property @IdRes public final int startDestinationId;
     property public final String? startDestinationRoute;
+    field public static final androidx.navigation.NavGraph.Companion Companion;
+  }
+
+  public static final class NavGraph.Companion {
+    method public androidx.navigation.NavDestination findStartDestination(androidx.navigation.NavGraph);
   }
 
   @androidx.navigation.NavDestinationDsl public class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
-    ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor @Deprecated public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
     ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, String? route);
     method public final void addDestination(androidx.navigation.NavDestination destination);
     method public androidx.navigation.NavGraph build();
@@ -283,9 +292,9 @@
   }
 
   public final class NavGraphBuilderKt {
-    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
     method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
-    method public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
     method public static inline void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
diff --git a/navigation/navigation-common/api/public_plus_experimental_current.txt b/navigation/navigation-common/api/public_plus_experimental_current.txt
index 7c4b7c6..3dc13449 100644
--- a/navigation/navigation-common/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-common/api/public_plus_experimental_current.txt
@@ -210,6 +210,7 @@
     method public final androidx.navigation.NavAction? getAction(@IdRes int id);
     method public final java.util.Map<java.lang.String,androidx.navigation.NavArgument> getArguments();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public String getDisplayName();
+    method public static final kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
     method @IdRes public final int getId();
     method public final CharSequence? getLabel();
     method public final String getNavigatorName();
@@ -246,8 +247,10 @@
   }
 
   public static final class NavDestination.Companion {
+    method public kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
     method protected <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public <C> Class<? extends C> parseClassFromNameInternal(android.content.Context context, String name, Class<? extends C> expectedClassType);
+    property public final kotlin.sequences.Sequence<androidx.navigation.NavDestination> hierarchy;
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final class NavDestination.DeepLinkMatch implements java.lang.Comparable<androidx.navigation.NavDestination.DeepLinkMatch> {
@@ -260,7 +263,7 @@
   }
 
   @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
-    ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+    ctor @Deprecated public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
     ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, String? route);
     method public final void action(int actionId, kotlin.jvm.functions.Function1<? super androidx.navigation.NavActionBuilder,kotlin.Unit> actionBuilder);
     method public final void argument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> argumentBuilder);
@@ -297,6 +300,7 @@
     method public final void clear();
     method public final androidx.navigation.NavDestination? findNode(@IdRes int resId);
     method public final androidx.navigation.NavDestination? findNode(String? route);
+    method public static final androidx.navigation.NavDestination findStartDestination(androidx.navigation.NavGraph);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final androidx.collection.SparseArrayCompat<androidx.navigation.NavDestination> getNodes();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final String getStartDestDisplayName();
     method @Deprecated @IdRes public final int getStartDestination();
@@ -310,10 +314,15 @@
     property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final String startDestDisplayName;
     property @IdRes public final int startDestinationId;
     property public final String? startDestinationRoute;
+    field public static final androidx.navigation.NavGraph.Companion Companion;
+  }
+
+  public static final class NavGraph.Companion {
+    method public androidx.navigation.NavDestination findStartDestination(androidx.navigation.NavGraph);
   }
 
   @androidx.navigation.NavDestinationDsl public class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
-    ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor @Deprecated public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
     ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, String? route);
     method public final void addDestination(androidx.navigation.NavDestination destination);
     method public androidx.navigation.NavGraph build();
@@ -324,9 +333,9 @@
   }
 
   public final class NavGraphBuilderKt {
-    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
     method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
-    method public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
     method public static inline void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
diff --git a/navigation/navigation-common/api/restricted_current.txt b/navigation/navigation-common/api/restricted_current.txt
index afc02e9..a889a60 100644
--- a/navigation/navigation-common/api/restricted_current.txt
+++ b/navigation/navigation-common/api/restricted_current.txt
@@ -188,6 +188,7 @@
     method public final void addDeepLink(androidx.navigation.NavDeepLink navDeepLink);
     method public final androidx.navigation.NavAction? getAction(@IdRes int id);
     method public final java.util.Map<java.lang.String,androidx.navigation.NavArgument> getArguments();
+    method public static final kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
     method @IdRes public final int getId();
     method public final CharSequence? getLabel();
     method public final String getNavigatorName();
@@ -219,11 +220,13 @@
   }
 
   public static final class NavDestination.Companion {
+    method public kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
     method protected <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
+    property public final kotlin.sequences.Sequence<androidx.navigation.NavDestination> hierarchy;
   }
 
   @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
-    ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+    ctor @Deprecated public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
     ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, String? route);
     method public final void action(int actionId, kotlin.jvm.functions.Function1<? super androidx.navigation.NavActionBuilder,kotlin.Unit> actionBuilder);
     method public final void argument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> argumentBuilder);
@@ -260,6 +263,7 @@
     method public final void clear();
     method public final androidx.navigation.NavDestination? findNode(@IdRes int resId);
     method public final androidx.navigation.NavDestination? findNode(String? route);
+    method public static final androidx.navigation.NavDestination findStartDestination(androidx.navigation.NavGraph);
     method @Deprecated @IdRes public final int getStartDestination();
     method @IdRes public final int getStartDestinationId();
     method public final String? getStartDestinationRoute();
@@ -269,10 +273,15 @@
     method public final void setStartDestination(String startDestRoute);
     property @IdRes public final int startDestinationId;
     property public final String? startDestinationRoute;
+    field public static final androidx.navigation.NavGraph.Companion Companion;
+  }
+
+  public static final class NavGraph.Companion {
+    method public androidx.navigation.NavDestination findStartDestination(androidx.navigation.NavGraph);
   }
 
   @androidx.navigation.NavDestinationDsl public class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
-    ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor @Deprecated public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
     ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, String? route);
     method public final void addDestination(androidx.navigation.NavDestination destination);
     method public androidx.navigation.NavGraph build();
@@ -283,9 +292,9 @@
   }
 
   public final class NavGraphBuilderKt {
-    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
     method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
-    method public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
     method public static inline void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
diff --git a/navigation/navigation-common/build.gradle b/navigation/navigation-common/build.gradle
index fe1af8a2..0a541e1 100644
--- a/navigation/navigation-common/build.gradle
+++ b/navigation/navigation-common/build.gradle
@@ -14,10 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
@@ -35,22 +32,22 @@
     implementation("androidx.core:core-ktx:1.1.0")
     implementation("androidx.collection:collection-ktx:1.1.0")
 
-    api(KOTLIN_STDLIB)
+    api(libs.kotlinStdlib)
     testImplementation(project(":navigation:navigation-testing"))
     testImplementation("androidx.arch.core:core-testing:2.1.0")
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
-    testImplementation(TRUTH)
-    testImplementation(KOTLIN_STDLIB)
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
+    testImplementation(libs.truth)
+    testImplementation(libs.kotlinStdlib)
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
-    androidTestImplementation(KOTLIN_STDLIB)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.espressoCore)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy)
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy)
+    androidTestImplementation(libs.kotlinStdlib)
 }
 
 //used by testImplementation safe-args-generator
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt
index 68fa76a..6572323 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt
@@ -124,6 +124,7 @@
  * a NavDestination directly to allow for testing NavDestinationBuilder in
  * isolation.
  */
+@Suppress("DEPRECATION")
 fun NavigatorProvider.navDestination(
     @IdRes id: Int,
     builder: NavDestinationBuilder<NavDestination>.() -> Unit
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphBuilderTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphBuilderTest.kt
index cb75a08..69d1eda 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphBuilderTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphBuilderTest.kt
@@ -32,6 +32,7 @@
         addNavigator(NoOpNavigator())
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun navigation() {
         val graph = provider.navigation(startDestination = DESTINATION_ID) {
@@ -54,6 +55,7 @@
             .isTrue()
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun navigationUnaryPlus() {
         val graph = provider.navigation(startDestination = DESTINATION_ID) {
@@ -80,6 +82,7 @@
             .isTrue()
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun navigationAddDestination() {
         val graph = provider.navigation(startDestination = DESTINATION_ID) {
@@ -108,6 +111,7 @@
             .isTrue()
     }
 
+    @Suppress("DEPRECATION")
     @Test(expected = IllegalStateException::class)
     fun navigationMissingStartDestination() {
         provider.navigation(startDestination = 0) {
@@ -124,6 +128,7 @@
         fail("NavGraph should throw IllegalStateException if no startDestinationRoute is set")
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun navigationNested() {
         val graph = provider.navigation(startDestination = DESTINATION_ID) {
@@ -158,6 +163,7 @@
  * Create a base NavDestination. Generally, only subtypes of NavDestination should be
  * added to a NavGraph (hence why this is not in the common-ktx library)
  */
+@Suppress("DEPRECATION")
 fun NavGraphBuilder.navDestination(
     @IdRes id: Int,
     builder: NavDestinationBuilder<NavDestination>.() -> Unit
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
index 6143ed8..dc72c88 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
@@ -594,5 +594,14 @@
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         public fun createRoute(route: String?): String =
             if (route != null) "android-app://androidx.navigation/$route" else ""
+
+        /**
+         * Provides a sequence of the NavDestination's hierarchy. The hierarchy starts with this
+         * destination itself and is then followed by this destination's [NavDestination.parent], then that
+         * graph's parent, and up the hierarchy until you've reached the root navigation graph.
+         */
+        @JvmStatic
+        public val NavDestination.hierarchy: Sequence<NavDestination>
+            get() = generateSequence(this) { it.parent }
     }
 }
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestinationBuilder.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestinationBuilder.kt
index f5453fd..22c9fa3 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestinationBuilder.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestinationBuilder.kt
@@ -51,6 +51,10 @@
      *
      * @return the newly constructed [NavDestination]
      */
+    @Deprecated(
+        "Use routes to build your NavDestination instead",
+        ReplaceWith("NavDestinationBuilder(navigator, route = id.toString())")
+    )
     public constructor(navigator: Navigator<out D>, @IdRes id: Int) :
         this(navigator, id, null)
 
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraph.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavGraph.kt
index 4992475..594d969 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraph.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavGraph.kt
@@ -370,6 +370,24 @@
         }
         return sb.toString()
     }
+
+    public companion object {
+        /**
+         * Finds the actual start destination of the graph, handling cases where the graph's starting
+         * destination is itself a NavGraph.
+         *
+         * @return the actual startDestination of the given graph.
+         */
+        @JvmStatic
+        public fun NavGraph.findStartDestination(): NavDestination =
+            generateSequence(findNode(startDestinationId)) {
+                if (it is NavGraph) {
+                    it.findNode(it.startDestinationId)
+                } else {
+                    null
+                }
+            }.last()
+    }
 }
 
 /**
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphBuilder.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphBuilder.kt
index 28a4c0a..d69f5d2 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphBuilder.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphBuilder.kt
@@ -27,6 +27,14 @@
  *
  * @return the newly constructed NavGraph
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to build your NavGraph instead",
+    ReplaceWith(
+        "navigation(startDestination = startDestination.toString(), route = id.toString()) " +
+            "{ builder.invoke() }"
+    )
+)
 public inline fun NavigatorProvider.navigation(
     @IdRes id: Int = 0,
     @IdRes startDestination: Int,
@@ -58,6 +66,14 @@
  *
  * @return the newly constructed nested NavGraph
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to build your nested NavGraph instead",
+    ReplaceWith(
+        "navigation(startDestination = startDestination.toString(), route = id.toString()) " +
+            "{ builder.invoke() }"
+    )
+)
 public inline fun NavGraphBuilder.navigation(
     @IdRes id: Int,
     @IdRes startDestination: Int,
@@ -100,6 +116,14 @@
      *
      * @return the newly created NavGraph
      */
+    @Suppress("Deprecation")
+    @Deprecated(
+        "Use routes to build your NavGraph instead",
+        ReplaceWith(
+            "NavGraphBuilder(provider, startDestination = startDestination.toString(), " +
+                "route = id.toString())"
+        )
+    )
     public constructor(
         provider: NavigatorProvider,
         @IdRes id: Int,
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/NavDestinationTest.kt b/navigation/navigation-common/src/test/java/androidx/navigation/NavDestinationTest.kt
index a0a0af1..b021a95 100644
--- a/navigation/navigation-common/src/test/java/androidx/navigation/NavDestinationTest.kt
+++ b/navigation/navigation-common/src/test/java/androidx/navigation/NavDestinationTest.kt
@@ -18,6 +18,7 @@
 
 import android.content.Context
 import androidx.annotation.IdRes
+import androidx.navigation.NavDestination.Companion.hierarchy
 import com.google.common.truth.Truth.assertThat
 import org.junit.Assert.fail
 import org.junit.Test
@@ -300,4 +301,20 @@
         assertThat(destination.arguments.size).isEqualTo(0)
         assertThat(destination.arguments["stringArg"]).isNull()
     }
+
+    @Test
+    fun hierarchy() {
+        val destination = NoOpNavigator().createDestination()
+        destination.id = DESTINATION_ID
+        val parentId = 2
+        val navGraphNavigator = NavGraphNavigator(mock(NavigatorProvider::class.java))
+        val parent = navGraphNavigator.createDestination().apply {
+            id = parentId
+            setStartDestination(DESTINATION_ID)
+        }
+        destination.parent = parent
+
+        val found = destination.hierarchy.any { it.id == 2 }
+        assertThat(found).isTrue()
+    }
 }
diff --git a/navigation/navigation-compose/build.gradle b/navigation/navigation-compose/build.gradle
index 11e4895..7966a17 100644
--- a/navigation/navigation-compose/build.gradle
+++ b/navigation/navigation-compose/build.gradle
@@ -15,12 +15,9 @@
  */
 
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.Publish
 import androidx.build.RunApiTasks
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -31,7 +28,7 @@
 dependencies {
     kotlinPlugin(projectOrArtifact(":compose:compiler:compiler"))
 
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
     implementation(projectOrArtifact(":compose:foundation:foundation-layout"))
     api(projectOrArtifact(":activity:activity-compose"))
     api(projectOrArtifact(":compose:runtime:runtime"))
@@ -47,9 +44,9 @@
         exclude group: "androidx.navigation", module: "navigation-common"
     })
     androidTestImplementation(projectOrArtifact(":compose:ui:ui-test-junit4"))
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(TRUTH)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.truth)
 }
 
 androidx {
diff --git a/navigation/navigation-compose/integration-tests/navigation-demos/build.gradle b/navigation/navigation-compose/integration-tests/navigation-demos/build.gradle
index cf1461d..fb50bcb 100644
--- a/navigation/navigation-compose/integration-tests/navigation-demos/build.gradle
+++ b/navigation/navigation-compose/integration-tests/navigation-demos/build.gradle
@@ -14,11 +14,8 @@
  * limitations under the License.
  */
 
-
 import androidx.build.Publish
 
-import static androidx.build.dependencies.DependenciesKt.getKOTLIN_STDLIB
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -28,7 +25,7 @@
 
 dependencies {
     kotlinPlugin(projectOrArtifact(":compose:compiler:compiler"))
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
 
     implementation(projectOrArtifact(":compose:integration-tests:demos:common"))
     implementation(projectOrArtifact(":compose:foundation:foundation"))
diff --git a/navigation/navigation-compose/samples/build.gradle b/navigation/navigation-compose/samples/build.gradle
index 778a74f..7dc352f 100644
--- a/navigation/navigation-compose/samples/build.gradle
+++ b/navigation/navigation-compose/samples/build.gradle
@@ -14,13 +14,9 @@
  * limitations under the License.
  */
 
-
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.LibraryType
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -30,7 +26,7 @@
 
 dependencies {
     kotlinPlugin(projectOrArtifact(":compose:compiler:compiler"))
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
 
     compileOnly(projectOrArtifact(":annotation:annotation-sampled"))
     implementation(projectOrArtifact(":compose:foundation:foundation"))
diff --git a/navigation/navigation-dynamic-features-fragment/api/current.txt b/navigation/navigation-dynamic-features-fragment/api/current.txt
index 73124fc8..d42b4d5 100644
--- a/navigation/navigation-dynamic-features-fragment/api/current.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/current.txt
@@ -15,7 +15,8 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DynamicFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
-    ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+    ctor @Deprecated public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+    ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, String route, String fragmentClassName);
     method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination build();
     method public String? getModuleName();
     method public void setModuleName(String? p);
@@ -23,9 +24,12 @@
   }
 
   public final class DynamicFragmentNavigatorDestinationBuilderKt {
-    method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
 
   public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
diff --git a/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt b/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt
index 73124fc8..d42b4d5 100644
--- a/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt
@@ -15,7 +15,8 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DynamicFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
-    ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+    ctor @Deprecated public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+    ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, String route, String fragmentClassName);
     method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination build();
     method public String? getModuleName();
     method public void setModuleName(String? p);
@@ -23,9 +24,12 @@
   }
 
   public final class DynamicFragmentNavigatorDestinationBuilderKt {
-    method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
 
   public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
diff --git a/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt b/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
index 73124fc8..d42b4d5 100644
--- a/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
@@ -15,7 +15,8 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DynamicFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
-    ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+    ctor @Deprecated public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+    ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, String route, String fragmentClassName);
     method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination build();
     method public String? getModuleName();
     method public void setModuleName(String? p);
@@ -23,9 +24,12 @@
   }
 
   public final class DynamicFragmentNavigatorDestinationBuilderKt {
-    method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
 
   public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
diff --git a/navigation/navigation-dynamic-features-fragment/build.gradle b/navigation/navigation-dynamic-features-fragment/build.gradle
index 708a89b..60cf4908 100644
--- a/navigation/navigation-dynamic-features-fragment/build.gradle
+++ b/navigation/navigation-dynamic-features-fragment/build.gradle
@@ -14,10 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
@@ -35,28 +32,28 @@
 dependencies {
     api(project(":navigation:navigation-dynamic-features-runtime"))
     api(project(":navigation:navigation-fragment"))
-    api(KOTLIN_STDLIB)
+    api(libs.kotlinStdlib)
 
-    testImplementation(ANDROIDX_TEST_CORE)
-    testImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    testImplementation(ANDROIDX_TEST_RUNNER)
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
-    testImplementation(TRUTH)
+    testImplementation(libs.testCore)
+    testImplementation(libs.testExtJunit)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
+    testImplementation(libs.truth)
 
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(MULTIDEX)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy)
+    androidTestImplementation(libs.espressoCore)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.multidex)
     androidTestImplementation(project(":internal-testutils-runtime"), {
         exclude group: "androidx.fragment", module: "fragment"
     })
-    androidTestImplementation(MULTIDEX)
+    androidTestImplementation(libs.multidex)
 }
 
 android {
diff --git a/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilderTest.kt b/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilderTest.kt
index 30da2f9..9a18178 100644
--- a/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilderTest.kt
+++ b/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilderTest.kt
@@ -40,6 +40,7 @@
     )
     private val fragmentManager get() = rule.withActivity { supportFragmentManager }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     public fun reified() {
@@ -56,6 +57,7 @@
             .isEqualTo(TestFragment::class.java.name)
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     public fun moduleName() {
@@ -77,6 +79,7 @@
             .isEqualTo(MODULE_NAME)
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     public fun no_moduleName() {
diff --git a/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilder.kt b/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilder.kt
index 46dabd6..d337aa2 100644
--- a/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilder.kt
+++ b/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilder.kt
@@ -29,6 +29,11 @@
  * Construct a new [DynamicFragmentNavigator.Destination]
  * @param id Destination id.
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to create your DynamicFragmentDestination instead",
+    ReplaceWith("fragment(route = id.toString())")
+)
 public inline fun <reified F : Fragment> DynamicNavGraphBuilder.fragment(
     @IdRes id: Int
 ): Unit = fragment<F>(id) {}
@@ -37,6 +42,11 @@
  * Construct a new [DynamicFragmentNavigator.Destination]
  * @param id Destination id.
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to create your DynamicFragmentDestination instead",
+    ReplaceWith("fragment(route = id.toString()) { builder.invoke() }")
+)
 public inline fun <reified F : Fragment> DynamicNavGraphBuilder.fragment(
     @IdRes id: Int,
     builder: DynamicFragmentNavigatorDestinationBuilder.() -> Unit
@@ -47,6 +57,11 @@
  * @param id Destination id.
  * @param fragmentClassName Fully qualified class name of destination Fragment.
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to create your DynamicFragmentDestination instead",
+    ReplaceWith("fragment(route = id.toString(), fragmentClassName) { builder.invoke() }")
+)
 public inline fun DynamicNavGraphBuilder.fragment(
     @IdRes id: Int,
     fragmentClassName: String,
@@ -60,14 +75,71 @@
 )
 
 /**
+ * Construct a new [DynamicFragmentNavigator.Destination]
+ * @param route Destination route.
+ */
+public inline fun <reified F : Fragment> DynamicNavGraphBuilder.fragment(
+    route: String
+): Unit = fragment<F>(route) {}
+
+/**
+ * Construct a new [DynamicFragmentNavigator.Destination]
+ * @param route Destination route.
+ */
+public inline fun <reified F : Fragment> DynamicNavGraphBuilder.fragment(
+    route: String,
+    builder: DynamicFragmentNavigatorDestinationBuilder.() -> Unit
+): Unit = fragment(route, F::class.java.name, builder)
+
+/**
+ * Construct a new [DynamicFragmentNavigator.Destination]
+ * @param route Destination route.
+ * @param fragmentClassName Fully qualified class name of destination Fragment.
+ */
+public inline fun DynamicNavGraphBuilder.fragment(
+    route: String,
+    fragmentClassName: String,
+    builder: DynamicFragmentNavigatorDestinationBuilder.() -> Unit
+): Unit = destination(
+    DynamicFragmentNavigatorDestinationBuilder(
+        provider[DynamicFragmentNavigator::class],
+        route,
+        fragmentClassName
+    ).apply(builder)
+)
+
+/**
  * DSL for constructing a new [DynamicFragmentNavigator.Destination]
  */
 @NavDestinationDsl
-public class DynamicFragmentNavigatorDestinationBuilder(
-    navigator: DynamicFragmentNavigator,
-    @IdRes id: Int,
-    private val fragmentClassName: String
-) : NavDestinationBuilder<FragmentNavigator.Destination>(navigator, id) {
+public class DynamicFragmentNavigatorDestinationBuilder :
+    NavDestinationBuilder<FragmentNavigator.Destination> {
+
+    private var fragmentClassName: String
+
+    @Suppress("Deprecation")
+    @Deprecated(
+        "Use routes to create your DynamicFragmentDestinationBuilder instead",
+        ReplaceWith(
+            "DynamicFragmentNavigatorDestinationBuilder(navigator, route = id.toString(), " +
+                "fragmentClassName)"
+        )
+    )
+    public constructor(
+        navigator: DynamicFragmentNavigator,
+        @IdRes id: Int,
+        fragmentClassName: String
+    ) : super(navigator, id) {
+        this.fragmentClassName = fragmentClassName
+    }
+
+    public constructor(
+        navigator: DynamicFragmentNavigator,
+        route: String,
+        fragmentClassName: String
+    ) : super(navigator, route) {
+        this.fragmentClassName = fragmentClassName
+    }
 
     public var moduleName: String? = null
 
diff --git a/navigation/navigation-dynamic-features-runtime/api/current.txt b/navigation/navigation-dynamic-features-runtime/api/current.txt
index 3dd9850..ea49279 100644
--- a/navigation/navigation-dynamic-features-runtime/api/current.txt
+++ b/navigation/navigation-dynamic-features-runtime/api/current.txt
@@ -15,7 +15,8 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DynamicActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
-    ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+    ctor @Deprecated public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+    ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, String route);
     method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination build();
     method public String? getAction();
     method public String? getActivityClassName();
@@ -38,7 +39,8 @@
   }
 
   public final class DynamicActivityNavigatorDestinationBuilderKt {
-    method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
   }
 
   public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
@@ -85,7 +87,8 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DynamicIncludeNavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
-    ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, @IdRes int id, String moduleName, String graphResourceName);
+    ctor @Deprecated public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, @IdRes int id, String moduleName, String graphResourceName);
+    ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, String route, String moduleName, String graphResourceName);
     method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph build();
     method public String? getGraphPackage();
     method public void setGraphPackage(String? p);
@@ -93,8 +96,10 @@
   }
 
   public final class DynamicIncludeNavGraphBuilderKt {
-    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName);
-    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName);
+    method @Deprecated public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName);
+    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
   }
 
   public class DynamicInstallManager {
@@ -115,26 +120,34 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DynamicNavGraphBuilder extends androidx.navigation.NavGraphBuilder {
-    ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor @Deprecated public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, optional String? route);
     method public String? getModuleName();
     method public int getProgressDestination();
+    method public String? getProgressDestinationRoute();
     method public void setModuleName(String? p);
     method public void setProgressDestination(int p);
+    method public void setProgressDestinationRoute(String? progDestRoute);
     property public final String? moduleName;
     property public final int progressDestination;
+    property public final String? progressDestinationRoute;
   }
 
   public final class DynamicNavGraphBuilderKt {
-    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
-    method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavControllerKt {
-    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavHostKt {
-    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
   }
 
 }
diff --git a/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_current.txt b/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_current.txt
index 3dd9850..ea49279 100644
--- a/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_current.txt
@@ -15,7 +15,8 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DynamicActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
-    ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+    ctor @Deprecated public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+    ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, String route);
     method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination build();
     method public String? getAction();
     method public String? getActivityClassName();
@@ -38,7 +39,8 @@
   }
 
   public final class DynamicActivityNavigatorDestinationBuilderKt {
-    method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
   }
 
   public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
@@ -85,7 +87,8 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DynamicIncludeNavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
-    ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, @IdRes int id, String moduleName, String graphResourceName);
+    ctor @Deprecated public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, @IdRes int id, String moduleName, String graphResourceName);
+    ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, String route, String moduleName, String graphResourceName);
     method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph build();
     method public String? getGraphPackage();
     method public void setGraphPackage(String? p);
@@ -93,8 +96,10 @@
   }
 
   public final class DynamicIncludeNavGraphBuilderKt {
-    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName);
-    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName);
+    method @Deprecated public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName);
+    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
   }
 
   public class DynamicInstallManager {
@@ -115,26 +120,34 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DynamicNavGraphBuilder extends androidx.navigation.NavGraphBuilder {
-    ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor @Deprecated public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, optional String? route);
     method public String? getModuleName();
     method public int getProgressDestination();
+    method public String? getProgressDestinationRoute();
     method public void setModuleName(String? p);
     method public void setProgressDestination(int p);
+    method public void setProgressDestinationRoute(String? progDestRoute);
     property public final String? moduleName;
     property public final int progressDestination;
+    property public final String? progressDestinationRoute;
   }
 
   public final class DynamicNavGraphBuilderKt {
-    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
-    method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavControllerKt {
-    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavHostKt {
-    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
   }
 
 }
diff --git a/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt b/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt
index 3dd9850..ea49279 100644
--- a/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt
+++ b/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt
@@ -15,7 +15,8 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DynamicActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
-    ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+    ctor @Deprecated public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+    ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, String route);
     method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination build();
     method public String? getAction();
     method public String? getActivityClassName();
@@ -38,7 +39,8 @@
   }
 
   public final class DynamicActivityNavigatorDestinationBuilderKt {
-    method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
   }
 
   public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
@@ -85,7 +87,8 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DynamicIncludeNavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
-    ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, @IdRes int id, String moduleName, String graphResourceName);
+    ctor @Deprecated public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, @IdRes int id, String moduleName, String graphResourceName);
+    ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, String route, String moduleName, String graphResourceName);
     method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph build();
     method public String? getGraphPackage();
     method public void setGraphPackage(String? p);
@@ -93,8 +96,10 @@
   }
 
   public final class DynamicIncludeNavGraphBuilderKt {
-    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName);
-    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName);
+    method @Deprecated public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName);
+    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
   }
 
   public class DynamicInstallManager {
@@ -115,26 +120,34 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DynamicNavGraphBuilder extends androidx.navigation.NavGraphBuilder {
-    ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor @Deprecated public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, optional String? route);
     method public String? getModuleName();
     method public int getProgressDestination();
+    method public String? getProgressDestinationRoute();
     method public void setModuleName(String? p);
     method public void setProgressDestination(int p);
+    method public void setProgressDestinationRoute(String? progDestRoute);
     property public final String? moduleName;
     property public final int progressDestination;
+    property public final String? progressDestinationRoute;
   }
 
   public final class DynamicNavGraphBuilderKt {
-    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
-    method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavControllerKt {
-    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavHostKt {
-    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
   }
 
 }
diff --git a/navigation/navigation-dynamic-features-runtime/build.gradle b/navigation/navigation-dynamic-features-runtime/build.gradle
index 09812400..bc5ae9a 100644
--- a/navigation/navigation-dynamic-features-runtime/build.gradle
+++ b/navigation/navigation-dynamic-features-runtime/build.gradle
@@ -14,10 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
@@ -34,28 +31,28 @@
 
 dependencies {
     api(project(":navigation:navigation-runtime"))
-    api(PLAY_CORE)
-    api(KOTLIN_STDLIB)
+    api(libs.playCore)
+    api(libs.kotlinStdlib)
 
     testImplementation(project(":navigation:navigation-testing"))
     testImplementation("androidx.arch.core:core-testing:2.1.0")
-    testImplementation(ANDROIDX_TEST_CORE)
-    testImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    testImplementation(ANDROIDX_TEST_RUNNER)
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
-    testImplementation(ROBOLECTRIC)
-    testImplementation(TRUTH)
+    testImplementation(libs.testCore)
+    testImplementation(libs.testExtJunit)
+    testImplementation(libs.testRunner)
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
+    testImplementation(libs.robolectric)
+    testImplementation(libs.truth)
 
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(MULTIDEX)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy)
+    androidTestImplementation(libs.espressoCore)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.multidex)
 }
 
 androidx {
diff --git a/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilderTest.kt b/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilderTest.kt
index b2abbe1..613d5b3 100644
--- a/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilderTest.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilderTest.kt
@@ -46,6 +46,7 @@
             )
         }
 
+    @Suppress("DEPRECATION")
     @Test
     fun module() {
         val graph = navController.createGraph(startDestination = DESTINATION_ID) {
@@ -60,6 +61,7 @@
             .isEqualTo(MODULE_NAME)
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun noModule() {
         val graph = navController.createGraph(startDestination = DESTINATION_ID) {
@@ -71,6 +73,7 @@
         ).isNull()
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun activity() {
         val graph = navController.createGraph(startDestination = DESTINATION_ID) {
@@ -90,6 +93,7 @@
         )
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun noActivity() {
         val graph = navController.createGraph(startDestination = DESTINATION_ID) {
@@ -102,6 +106,7 @@
         ).isNull()
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun modulePackage() {
         val graph = navController.createGraph(startDestination = DESTINATION_ID) {
@@ -114,9 +119,79 @@
         val destination = graph.findNode(DESTINATION_ID) as DynamicActivityNavigator.Destination
         assertThat(destination.component).isEqualTo(ComponentName(PACKAGE_NAME, CLASS_NAME))
     }
+
+    @Test
+    fun moduleRoute() {
+        val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+            activity(DESTINATION_ROUTE) {
+                moduleName = MODULE_NAME
+            }
+        }
+
+        assertThat(
+            (graph.findNode(DESTINATION_ROUTE) as DynamicActivityNavigator.Destination).moduleName
+        )
+            .isEqualTo(MODULE_NAME)
+    }
+
+    @Test
+    fun noModuleRoute() {
+        val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+            activity(DESTINATION_ROUTE) {
+            }
+        }
+        assertThat(
+            (graph.findNode(DESTINATION_ROUTE) as DynamicActivityNavigator.Destination).moduleName
+        ).isNull()
+    }
+
+    @Test
+    fun activityRoute() {
+        val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+            activity(DESTINATION_ROUTE) {
+                moduleName = MODULE_NAME
+                activityClassName = CLASS_NAME
+            }
+        }
+        val destination = graph.findNode(DESTINATION_ROUTE) as DynamicActivityNavigator.Destination
+        assertThat(
+            destination.component
+        ).isEqualTo(
+            ComponentName(
+                context,
+                CLASS_NAME
+            )
+        )
+    }
+
+    @Test
+    fun noActivityRoute() {
+        val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+            activity(DESTINATION_ROUTE) {
+            }
+        }
+        val destination = graph.findNode(DESTINATION_ROUTE) as DynamicActivityNavigator.Destination
+        assertThat(
+            destination.component
+        ).isNull()
+    }
+
+    @Test
+    fun modulePackageRoute() {
+        val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+            activity(DESTINATION_ROUTE) {
+                moduleName = MODULE_NAME
+                activityClassName = CLASS_NAME
+                targetPackage = PACKAGE_NAME
+            }
+        }
+        val destination = graph.findNode(DESTINATION_ROUTE) as DynamicActivityNavigator.Destination
+        assertThat(destination.component).isEqualTo(ComponentName(PACKAGE_NAME, CLASS_NAME))
+    }
 }
 
 private const val CLASS_NAME = "com.example.DynamicDestination"
 private const val PACKAGE_NAME = "com.example.myPackage"
 private const val DESTINATION_ID = 1
+private const val DESTINATION_ROUTE = "route"
 private const val MODULE_NAME = "myModule"
diff --git a/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilderTest.kt b/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilderTest.kt
index dfa5c5b..fe10518 100644
--- a/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilderTest.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilderTest.kt
@@ -44,6 +44,7 @@
         navigatorProvider += NoOpNavigator()
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun includeDynamic() {
         val graph = navController.navigatorProvider.navigation(startDestination = GRAPH_ID) {
@@ -65,6 +66,7 @@
             .isEqualTo(GRAPH_RESOURCE_NAME)
     }
 
+    @Suppress("DEPRECATION")
     fun includeDynamic_emptyModuleName() {
         navController.navigatorProvider.navigation(startDestination = GRAPH_ID) {
             try {
@@ -76,6 +78,7 @@
         }
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun includeDynamic_graphPackage_null() {
         val graph = navController.navigatorProvider.navigation(startDestination = GRAPH_ID) {
@@ -87,6 +90,7 @@
             .that(includeDynamic.graphPackage).isEqualTo("${context.packageName}.$MODULE_NAME")
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun includeDynamic_graphPackage_empty() {
         navController.navigatorProvider.navigation(startDestination = GRAPH_ID) {
@@ -101,6 +105,7 @@
         }
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun includeDynamic_graphResourceName_empty() {
         navController.navigatorProvider.navigation(startDestination = GRAPH_ID) {
@@ -112,9 +117,81 @@
             }
         }
     }
+
+    @Test
+    fun includeDynamicRoute() {
+        val graph = navController.navigatorProvider.navigation(startDestination = GRAPH_ROUTE) {
+            includeDynamic(GRAPH_ROUTE, MODULE_NAME, GRAPH_RESOURCE_NAME) {
+                graphPackage = GRAPH_PACKAGE
+            }
+        }
+        val includeDynamic = graph[GRAPH_ROUTE]
+            as DynamicIncludeGraphNavigator.DynamicIncludeNavGraph
+        assertWithMessage("Module should be set in the graph")
+            .that(includeDynamic.moduleName)
+            .isEqualTo(MODULE_NAME)
+
+        assertWithMessage("graphPackage has to be set")
+            .that(includeDynamic.graphPackage)
+            .isEqualTo(GRAPH_PACKAGE)
+
+        assertWithMessage("graphResourceName has to be set")
+            .that(includeDynamic.graphResourceName)
+            .isEqualTo(GRAPH_RESOURCE_NAME)
+    }
+
+    fun includeDynamic_emptyModuleNameRoute() {
+        navController.navigatorProvider.navigation(startDestination = GRAPH_ROUTE) {
+            try {
+                includeDynamic(GRAPH_ROUTE, "", GRAPH_RESOURCE_NAME)
+                fail("includeDynamic should fail with an empty module name")
+            } catch (e: IllegalStateException) {
+                assertThat(e).hasMessageThat().isEqualTo("Module name cannot be empty")
+            }
+        }
+    }
+
+    @Test
+    fun includeDynamic_graphPackage_nullRoute() {
+        val graph = navController.navigatorProvider.navigation(startDestination = GRAPH_ROUTE) {
+            includeDynamic(GRAPH_ROUTE, MODULE_NAME, GRAPH_RESOURCE_NAME)
+        }
+        val includeDynamic = graph[GRAPH_ROUTE]
+            as DynamicIncludeGraphNavigator.DynamicIncludeNavGraph
+
+        assertWithMessage("graphPackage should be filled in from package name and module name")
+            .that(includeDynamic.graphPackage).isEqualTo("${context.packageName}.$MODULE_NAME")
+    }
+
+    @Test
+    fun includeDynamic_graphPackage_emptyRoute() {
+        navController.navigatorProvider.navigation(startDestination = GRAPH_ROUTE) {
+            try {
+                includeDynamic(GRAPH_ROUTE, MODULE_NAME, GRAPH_RESOURCE_NAME) {
+                    graphPackage = ""
+                }
+                fail("includeDynamic should fail with an empty graph package")
+            } catch (e: IllegalStateException) {
+                assertThat(e).hasMessageThat().isEqualTo("Graph package name cannot be empty")
+            }
+        }
+    }
+
+    @Test
+    fun includeDynamic_graphResourceName_emptyRoute() {
+        navController.navigatorProvider.navigation(startDestination = GRAPH_ROUTE) {
+            try {
+                includeDynamic(GRAPH_ROUTE, MODULE_NAME, "")
+                fail("includeDynamic should fail with an empty graph resource name")
+            } catch (e: IllegalStateException) {
+                assertThat(e).hasMessageThat().isEqualTo("Graph resource name cannot be empty")
+            }
+        }
+    }
 }
 
 private const val GRAPH_ID = 1
+private const val GRAPH_ROUTE = "graph"
 private const val MODULE_NAME = "myModule"
 private const val GRAPH_PACKAGE = "com.example.mypackage"
 private const val GRAPH_RESOURCE_NAME = "graphName"
\ No newline at end of file
diff --git a/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilderTest.kt b/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilderTest.kt
index 3dbbd65..b190825 100644
--- a/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilderTest.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/androidTest/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilderTest.kt
@@ -44,6 +44,7 @@
         addNavigator(NoOpNavigator())
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun navigation() {
         val graph = provider.navigation(startDestination = DESTINATION_ID) {
@@ -59,6 +60,7 @@
             .isEqualTo(MODULE_NAME)
     }
 
+    @Suppress("DEPRECATION")
     fun navigation_emptyModuleName() {
         val graph = provider.navigation(startDestination = DESTINATION_ID) {
         }
@@ -66,6 +68,7 @@
             .that(graph !is DynamicGraphNavigator.DynamicNavGraph)
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun progressDestination() {
         val graph = provider.navigation(startDestination = DESTINATION_ID) {
@@ -83,6 +86,7 @@
             .isTrue()
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun progressDestination_notSet() {
         val graph = provider.navigation(startDestination = DESTINATION_ID) {
@@ -93,17 +97,79 @@
             .that(graph.progressDestination)
             .isEqualTo(0)
     }
+
+    @Test
+    fun navigationRoute() {
+        val graph = provider.navigation(startDestination = DESTINATION_ROUTE) {
+            moduleName = MODULE_NAME
+            navDestination(DESTINATION_ROUTE) {}
+        } as DynamicGraphNavigator.DynamicNavGraph
+
+        assertWithMessage("Destination should be added to the graph")
+            .that(DESTINATION_ROUTE in graph)
+            .isTrue()
+        assertWithMessage("Module should be set in the graph")
+            .that(graph.moduleName)
+            .isEqualTo(MODULE_NAME)
+    }
+
+    fun navigation_emptyModuleNameRoute() {
+        val graph = provider.navigation(startDestination = DESTINATION_ROUTE) {
+        }
+        assertWithMessage("Without a moduleName the graph should be a NavGraph")
+            .that(graph !is DynamicGraphNavigator.DynamicNavGraph)
+    }
+
+    @Test
+    fun progressDestinationRoute() {
+        val graph = provider.navigation(startDestination = DESTINATION_ROUTE) {
+            moduleName = MODULE_NAME
+            progressDestinationRoute = PROGRESS_DESTINATION_ROUTE
+            navDestination(DESTINATION_ROUTE) {}
+            navDestination(PROGRESS_DESTINATION_ROUTE) {}
+        }
+
+        assertWithMessage("Destination should be added to the graph")
+            .that(DESTINATION_ROUTE in graph)
+            .isTrue()
+        assertWithMessage("ProgressDestination should be added to the graph")
+            .that(PROGRESS_DESTINATION_ROUTE in graph)
+            .isTrue()
+    }
+
+    @Test
+    fun progressDestination_notSetRoute() {
+        val graph = provider.navigation(startDestination = DESTINATION_ROUTE) {
+            moduleName = MODULE_NAME
+        } as DynamicGraphNavigator.DynamicNavGraph
+
+        assertWithMessage("ProgressDestination should default to 0")
+            .that(graph.progressDestination)
+            .isEqualTo(0)
+    }
 }
 
 private const val DESTINATION_ID = 1
+private const val DESTINATION_ROUTE = "destination"
 private const val PROGRESS_DESTINATION_ID = 2
+private const val PROGRESS_DESTINATION_ROUTE = "progress_destination"
 private const val MODULE_NAME = "myModule"
 
 /**
  * Create a base NavDestination. Generally, only subtypes of NavDestination should be
  * added to a NavGraph (hence why this is not in the common-ktx library)
  */
+@Suppress("DEPRECATION")
 fun DynamicNavGraphBuilder.navDestination(
     @IdRes id: Int,
     builder: NavDestinationBuilder<NavDestination>.() -> Unit
 ) = destination(NavDestinationBuilder(provider[NoOpNavigator::class], id).apply(builder))
+
+/**
+ * Create a base NavDestination. Generally, only subtypes of NavDestination should be
+ * added to a NavGraph (hence why this is not in the common-ktx library)
+ */
+fun DynamicNavGraphBuilder.navDestination(
+    route: String,
+    builder: NavDestinationBuilder<NavDestination>.() -> Unit
+) = destination(NavDestinationBuilder(provider[NoOpNavigator::class], route).apply(builder))
diff --git a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilder.kt b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilder.kt
index 96fb64a..7fefcef 100644
--- a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilder.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicActivityNavigatorDestinationBuilder.kt
@@ -30,6 +30,11 @@
  * Construct a new [DynamicActivityNavigator.Destination]
  * @param id Destination id.
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to build your DynamicActivityDestination instead",
+    ReplaceWith("activity(route = id.toString()) { builder.invoke() }")
+)
 public inline fun DynamicNavGraphBuilder.activity(
     @IdRes id: Int,
     builder: DynamicActivityNavigatorDestinationBuilder.() -> Unit
@@ -41,13 +46,47 @@
 )
 
 /**
+ * Construct a new [DynamicActivityNavigator.Destination]
+ * @param route Destination route.
+ */
+public inline fun DynamicNavGraphBuilder.activity(
+    route: String,
+    builder: DynamicActivityNavigatorDestinationBuilder.() -> Unit
+): Unit = destination(
+    DynamicActivityNavigatorDestinationBuilder(
+        provider[DynamicActivityNavigator::class],
+        route
+    ).apply(builder)
+)
+
+/**
  * DSL for constructing a new [DynamicActivityNavigator.Destination]
  */
 @NavDestinationDsl
-public class DynamicActivityNavigatorDestinationBuilder(
-    private val activityNavigator: DynamicActivityNavigator,
-    @IdRes id: Int
-) : NavDestinationBuilder<ActivityNavigator.Destination>(activityNavigator, id) {
+public class DynamicActivityNavigatorDestinationBuilder :
+    NavDestinationBuilder<ActivityNavigator.Destination> {
+    private var activityNavigator: DynamicActivityNavigator
+
+    @Suppress("Deprecation")
+    @Deprecated(
+        "Use routes to build your DynamicActivityDestination instead",
+        ReplaceWith(
+            "DynamicActivityNavigatorDestinationBuilder(activityNavigator, route = id.toString())"
+        )
+    )
+    public constructor(
+        activityNavigator: DynamicActivityNavigator,
+        @IdRes id: Int
+    ) : super(activityNavigator, id) {
+        this.activityNavigator = activityNavigator
+    }
+
+    public constructor(
+        activityNavigator: DynamicActivityNavigator,
+        route: String
+    ) : super(activityNavigator, route) {
+        this.activityNavigator = activityNavigator
+    }
 
     public var moduleName: String? = null
 
diff --git a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilder.kt b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilder.kt
index b926b54..a59d702 100644
--- a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilder.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicIncludeNavGraphBuilder.kt
@@ -33,6 +33,11 @@
  * @param graphResourceName Graph's resource name without the `navigation` qualifier. This
  * must not be an empty string.
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to include your DynamicNavGraph instead",
+    ReplaceWith("includeDynamic(route = id.toString(), moduleName, graphResourceName)")
+)
 public inline fun DynamicNavGraphBuilder.includeDynamic(
     @IdRes id: Int,
     moduleName: String,
@@ -49,6 +54,13 @@
  * must not be an empty string.
  * @param builder Another builder for chaining.
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to include your DynamicNavGraph instead",
+    ReplaceWith(
+        "includeDynamic(route = id.toString(), moduleName, graphResourceName) { builder.invoke() }"
+    )
+)
 public inline fun DynamicNavGraphBuilder.includeDynamic(
     @IdRes id: Int,
     moduleName: String,
@@ -64,22 +76,83 @@
 )
 
 /**
- * DSL for constructing a new [DynamicIncludeGraphNavigator.DynamicIncludeNavGraph]
+ * Construct a new [DynamicIncludeGraphNavigator.DynamicIncludeNavGraph].
  *
- * @param dynamicIncludeGraphNavigator [DynamicIncludeGraphNavigator] to use.
- * @param id NavGraph id.
+ * @param route NavGraph route.
  * @param moduleName Dynamic feature module name as defined in the module's `AndroidManifest`.
  * This must not be an empty string.
  * @param graphResourceName Graph's resource name without the `navigation` qualifier. This
  * must not be an empty string.
  */
+public inline fun DynamicNavGraphBuilder.includeDynamic(
+    route: String,
+    moduleName: String,
+    graphResourceName: String
+): Unit = includeDynamic(route, moduleName, graphResourceName) {}
+
+/**
+ * Construct a new [DynamicIncludeGraphNavigator.DynamicIncludeNavGraph].
+ *
+ * @param route NavGraph route.
+ * @param moduleName Dynamic feature module name as defined in the module's `AndroidManifest`.
+ * This must not be an empty string.
+ * @param graphResourceName Graph's resource name without the `navigation` qualifier. This
+ * must not be an empty string.
+ * @param builder Another builder for chaining.
+ */
+public inline fun DynamicNavGraphBuilder.includeDynamic(
+    route: String,
+    moduleName: String,
+    graphResourceName: String,
+    builder: DynamicIncludeNavGraphBuilder.() -> Unit
+): Unit = destination(
+    DynamicIncludeNavGraphBuilder(
+        provider[DynamicIncludeGraphNavigator::class],
+        route,
+        moduleName,
+        graphResourceName
+    ).apply(builder)
+)
+
+/**
+ * DSL for constructing a new [DynamicIncludeGraphNavigator.DynamicIncludeNavGraph]
+ */
 @NavDestinationDsl
-public class DynamicIncludeNavGraphBuilder(
-    private val dynamicIncludeGraphNavigator: DynamicIncludeGraphNavigator,
-    @IdRes id: Int,
-    private val moduleName: String,
-    private val graphResourceName: String
-) : NavDestinationBuilder<DynamicIncludeNavGraph>(dynamicIncludeGraphNavigator, id) {
+public class DynamicIncludeNavGraphBuilder : NavDestinationBuilder<DynamicIncludeNavGraph> {
+
+    private var dynamicIncludeGraphNavigator: DynamicIncludeGraphNavigator
+    private var moduleName: String
+    private var graphResourceName: String
+
+    @Suppress("Deprecation")
+    @Deprecated(
+        "Use routes to create your DynamicIncludeNavGraphBuilder instead",
+        ReplaceWith(
+            "DynamicIncludeNavGraphBuilder(dynamicIncludeGraphNavigator, route = id.toString(), " +
+                "moduleName, graphResourceName)"
+        )
+    )
+    public constructor(
+        dynamicIncludeGraphNavigator: DynamicIncludeGraphNavigator,
+        @IdRes id: Int,
+        moduleName: String,
+        graphResourceName: String
+    ) : super(dynamicIncludeGraphNavigator, id) {
+        this.dynamicIncludeGraphNavigator = dynamicIncludeGraphNavigator
+        this.moduleName = moduleName
+        this.graphResourceName = graphResourceName
+    }
+
+    public constructor(
+        dynamicIncludeGraphNavigator: DynamicIncludeGraphNavigator,
+        route: String,
+        moduleName: String,
+        graphResourceName: String
+    ) : super(dynamicIncludeGraphNavigator, route) {
+        this.dynamicIncludeGraphNavigator = dynamicIncludeGraphNavigator
+        this.moduleName = moduleName
+        this.graphResourceName = graphResourceName
+    }
 
     /**
      * Destination NavGraph's resource package as defined in the module's
diff --git a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilder.kt b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilder.kt
index 60d5040..367d36f 100644
--- a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilder.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicNavGraphBuilder.kt
@@ -17,6 +17,7 @@
 package androidx.navigation.dynamicfeatures
 
 import androidx.annotation.IdRes
+import androidx.navigation.NavDestination
 import androidx.navigation.NavDestinationDsl
 import androidx.navigation.NavGraph
 import androidx.navigation.NavGraphBuilder
@@ -31,6 +32,14 @@
  * @param startDestination Id start destination in the graph
  * @param builder Another builder for chaining.
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to create your DynamicNavGraph instead",
+    ReplaceWith(
+        "navigation(startDestination = startDestination.toString(), route = id.toString()) " +
+            "{ builder.invoke() }"
+    )
+)
 public inline fun NavigatorProvider.navigation(
     @IdRes id: Int = 0,
     @IdRes startDestination: Int,
@@ -48,6 +57,14 @@
  * @param startDestination Id start destination in the graph
  * @param builder Another builder for chaining.
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to create your DynamicNavGraph instead",
+    ReplaceWith(
+        "navigation(startDestination = startDestination.toString(), route = id.toString()) " +
+            "{ builder.invoke() }"
+    )
+)
 public inline fun DynamicNavGraphBuilder.navigation(
     @IdRes id: Int,
     @IdRes startDestination: Int,
@@ -61,18 +78,72 @@
 )
 
 /**
- * DSL for constructing a new [DynamicGraphNavigator.DynamicNavGraph]
+ * Construct a new [DynamicGraphNavigator.DynamicNavGraph]
  *
- * @param provider [NavigatorProvider] to use.
- * @param id NavGraph id.
- * @param startDestination Id start destination in the graph
+ * @param route NavGraph route.
+ * @param startDestination route start destination in the graph
+ * @param builder Another builder for chaining.
+ */
+public inline fun NavigatorProvider.navigation(
+    startDestination: String,
+    route: String? = null,
+    builder: DynamicNavGraphBuilder.() -> Unit
+): NavGraph = DynamicNavGraphBuilder(
+    this,
+    startDestination,
+    route
+).apply(builder).build()
+
+/**
+ * Construct a nested [DynamicGraphNavigator.DynamicNavGraph]
+ *
+ * @param route NavGraph route.
+ * @param startDestination route start destination in the graph
+ * @param builder Another builder for chaining.
+ */
+public inline fun DynamicNavGraphBuilder.navigation(
+    startDestination: String,
+    route: String,
+    builder: DynamicNavGraphBuilder.() -> Unit
+): Unit = destination(
+    DynamicNavGraphBuilder(
+        provider,
+        startDestination,
+        route
+    ).apply(builder)
+)
+
+/**
+ * DSL for constructing a new [DynamicGraphNavigator.DynamicNavGraph]
  */
 @NavDestinationDsl
-public class DynamicNavGraphBuilder(
-    provider: NavigatorProvider,
-    @IdRes id: Int,
-    @IdRes private var startDestination: Int
-) : NavGraphBuilder(provider, id, startDestination) {
+public class DynamicNavGraphBuilder : NavGraphBuilder {
+    @IdRes private var startDestinationId: Int = 0
+    private var startDestinationRoute: String? = null
+
+    @Suppress("Deprecation")
+    @Deprecated(
+        "Use routes to create your DynamicNavGraphBuilder instead",
+        ReplaceWith(
+            "DynamicNavGraphBuilder(provider, startDestination = startDestination.toString(), " +
+                "route = id.toString())"
+        )
+    )
+    public constructor(
+        provider: NavigatorProvider,
+        @IdRes id: Int,
+        @IdRes startDestination: Int
+    ) : super(provider, id, startDestination) {
+        this.startDestinationId = startDestination
+    }
+
+    public constructor(
+        provider: NavigatorProvider,
+        startDestination: String,
+        route: String? = null
+    ) : super(provider, startDestination, route) {
+        this.startDestinationRoute = startDestination
+    }
 
     /**
      * The module name of this [Destination]'s dynamic feature module. This has to be the
@@ -80,12 +151,42 @@
      */
     public var moduleName: String? = null
 
+    private var _progressDestination: Int = 0
     /**
      * ID of the destination displayed during module installation. This generally does
      * not need to be set, but is instead filled in by the NavHost via
      * [DynamicGraphNavigator.installDefaultProgressDestination].
+     *
+     * Setting this clears any previously set [progressDestinationRoute].
      */
-    public var progressDestination: Int = 0
+    public var progressDestination: Int
+        get() = _progressDestination
+        set(p) {
+            if (progressDestinationRoute != null) {
+                progressDestinationRoute = null
+            }
+            _progressDestination = p
+        }
+
+    /**
+     * Route of the destination displayed during module installation. This generally does
+     * not need to be set, but is instead filled in by the NavHost via
+     * [DynamicGraphNavigator.installDefaultProgressDestination].
+     *
+     * Setting this overrides any previously set [progressDestination].
+     */
+    public var progressDestinationRoute: String? = null
+        set(progDestRoute) {
+            _progressDestination = if (progDestRoute == null) {
+                0
+            } else {
+                require(progDestRoute.isNotBlank()) {
+                    "Cannot have an empty progress destination route"
+                }
+                NavDestination.createRoute(progressDestinationRoute).hashCode()
+            }
+            field = progDestRoute
+        }
 
     /**
      * @return The [DynamicGraphNavigator.DynamicNavGraph].
@@ -94,7 +195,12 @@
         super.build().also { navGraph ->
             if (navGraph is DynamicGraphNavigator.DynamicNavGraph) {
                 navGraph.moduleName = moduleName
-                navGraph.progressDestination = progressDestination
+                if (navGraph.route != null) {
+                    navGraph.progressDestination =
+                        NavDestination.createRoute(progressDestinationRoute).hashCode()
+                } else {
+                    navGraph.progressDestination = progressDestination
+                }
                 if (progressDestination == 0) {
                     val navGraphNavigator: DynamicGraphNavigator =
                         provider[DynamicGraphNavigator::class]
diff --git a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/NavController.kt b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/NavController.kt
index f84b675..f35e4e4 100644
--- a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/NavController.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/NavController.kt
@@ -23,8 +23,25 @@
 /**
  * Construct a new [androidx.navigation.NavGraph] that supports dynamic navigation destinations
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to create your dynamic NavGraph instead",
+    ReplaceWith(
+        "createGraph(startDestination = startDestination.toString(), route = id.toString()) " +
+            "{ builder.invoke() }"
+    )
+)
 public inline fun NavController.createGraph(
     @IdRes id: Int = 0,
     @IdRes startDestination: Int,
     builder: DynamicNavGraphBuilder.() -> Unit
 ): NavGraph = navigatorProvider.navigation(id, startDestination, builder)
+
+/**
+ * Construct a new [androidx.navigation.NavGraph] that supports dynamic navigation destinations
+ */
+public inline fun NavController.createGraph(
+    startDestination: String,
+    route: String? = null,
+    builder: DynamicNavGraphBuilder.() -> Unit
+): NavGraph = navigatorProvider.navigation(startDestination, route, builder)
diff --git a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/NavHost.kt b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/NavHost.kt
index 800645a..9bd3e8ee 100644
--- a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/NavHost.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/NavHost.kt
@@ -23,8 +23,25 @@
 /**
  * Construct a new [androidx.navigation.NavGraph] that supports dynamic navigation destinations
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to create your dynamic NavGraph instead",
+    ReplaceWith(
+        "createGraph(startDestination = startDestination.toString(), route = id.toString()) " +
+            "{ builder.invoke() }"
+    )
+)
 public inline fun NavHost.createGraph(
     @IdRes id: Int = 0,
     @IdRes startDestination: Int,
     builder: DynamicNavGraphBuilder.() -> Unit
 ): NavGraph = navController.createGraph(id, startDestination, builder)
+
+/**
+ * Construct a new [androidx.navigation.NavGraph] that supports dynamic navigation destinations
+ */
+public inline fun NavHost.createGraph(
+    startDestination: String,
+    route: String? = null,
+    builder: DynamicNavGraphBuilder.() -> Unit
+): NavGraph = navController.createGraph(startDestination, route, builder)
diff --git a/navigation/navigation-fragment-ktx/build.gradle b/navigation/navigation-fragment-ktx/build.gradle
index b73a493..ea68cc8 100644
--- a/navigation/navigation-fragment-ktx/build.gradle
+++ b/navigation/navigation-fragment-ktx/build.gradle
@@ -14,10 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
diff --git a/navigation/navigation-fragment/api/current.ignore b/navigation/navigation-fragment/api/current.ignore
index bed10fd..b755bd3 100644
--- a/navigation/navigation-fragment/api/current.ignore
+++ b/navigation/navigation-fragment/api/current.ignore
@@ -3,6 +3,8 @@
     Method androidx.navigation.fragment.FragmentNavigator.Extras.getSharedElements has changed return type from java.util.Map<android.view.View!,java.lang.String!> to java.util.Map<android.view.View,java.lang.String>
 
 
+RemovedMethod: androidx.navigation.fragment.DialogFragmentNavigator#navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination, android.os.Bundle, androidx.navigation.NavOptions, androidx.navigation.Navigator.Extras):
+    Removed method androidx.navigation.fragment.DialogFragmentNavigator.navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination,android.os.Bundle,androidx.navigation.NavOptions,androidx.navigation.Navigator.Extras)
 RemovedMethod: androidx.navigation.fragment.DialogFragmentNavigator#popBackStack():
     Removed method androidx.navigation.fragment.DialogFragmentNavigator.popBackStack()
 RemovedMethod: androidx.navigation.fragment.FragmentNavigator#navigate(androidx.navigation.fragment.FragmentNavigator.Destination, android.os.Bundle, androidx.navigation.NavOptions, androidx.navigation.Navigator.Extras):
diff --git a/navigation/navigation-fragment/api/current.txt b/navigation/navigation-fragment/api/current.txt
index 5f8b262..dd116f0 100644
--- a/navigation/navigation-fragment/api/current.txt
+++ b/navigation/navigation-fragment/api/current.txt
@@ -12,7 +12,6 @@
   @androidx.navigation.Navigator.Name("dialog") public final class DialogFragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
     ctor public DialogFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager);
     method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
-    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
   }
 
   @androidx.navigation.NavDestination.ClassType(DialogFragment::class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
@@ -24,13 +23,16 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DialogFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
-    ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    ctor @Deprecated public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, String route, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
     method public androidx.navigation.fragment.DialogFragmentNavigator.Destination build();
   }
 
   public final class DialogFragmentNavigatorDestinationBuilderKt {
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
 
   public final class FragmentKt {
@@ -68,13 +70,16 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class FragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
-    ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    ctor @Deprecated public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, String route, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
     method public androidx.navigation.fragment.FragmentNavigator.Destination build();
   }
 
   public final class FragmentNavigatorDestinationBuilderKt {
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
 
   public final class FragmentNavigatorExtrasKt {
diff --git a/navigation/navigation-fragment/api/public_plus_experimental_current.txt b/navigation/navigation-fragment/api/public_plus_experimental_current.txt
index 5f8b262..dd116f0 100644
--- a/navigation/navigation-fragment/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-fragment/api/public_plus_experimental_current.txt
@@ -12,7 +12,6 @@
   @androidx.navigation.Navigator.Name("dialog") public final class DialogFragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
     ctor public DialogFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager);
     method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
-    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
   }
 
   @androidx.navigation.NavDestination.ClassType(DialogFragment::class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
@@ -24,13 +23,16 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DialogFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
-    ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    ctor @Deprecated public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, String route, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
     method public androidx.navigation.fragment.DialogFragmentNavigator.Destination build();
   }
 
   public final class DialogFragmentNavigatorDestinationBuilderKt {
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
 
   public final class FragmentKt {
@@ -68,13 +70,16 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class FragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
-    ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    ctor @Deprecated public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, String route, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
     method public androidx.navigation.fragment.FragmentNavigator.Destination build();
   }
 
   public final class FragmentNavigatorDestinationBuilderKt {
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
 
   public final class FragmentNavigatorExtrasKt {
diff --git a/navigation/navigation-fragment/api/restricted_current.ignore b/navigation/navigation-fragment/api/restricted_current.ignore
index bed10fd..b755bd3 100644
--- a/navigation/navigation-fragment/api/restricted_current.ignore
+++ b/navigation/navigation-fragment/api/restricted_current.ignore
@@ -3,6 +3,8 @@
     Method androidx.navigation.fragment.FragmentNavigator.Extras.getSharedElements has changed return type from java.util.Map<android.view.View!,java.lang.String!> to java.util.Map<android.view.View,java.lang.String>
 
 
+RemovedMethod: androidx.navigation.fragment.DialogFragmentNavigator#navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination, android.os.Bundle, androidx.navigation.NavOptions, androidx.navigation.Navigator.Extras):
+    Removed method androidx.navigation.fragment.DialogFragmentNavigator.navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination,android.os.Bundle,androidx.navigation.NavOptions,androidx.navigation.Navigator.Extras)
 RemovedMethod: androidx.navigation.fragment.DialogFragmentNavigator#popBackStack():
     Removed method androidx.navigation.fragment.DialogFragmentNavigator.popBackStack()
 RemovedMethod: androidx.navigation.fragment.FragmentNavigator#navigate(androidx.navigation.fragment.FragmentNavigator.Destination, android.os.Bundle, androidx.navigation.NavOptions, androidx.navigation.Navigator.Extras):
diff --git a/navigation/navigation-fragment/api/restricted_current.txt b/navigation/navigation-fragment/api/restricted_current.txt
index 5f8b262..dd116f0 100644
--- a/navigation/navigation-fragment/api/restricted_current.txt
+++ b/navigation/navigation-fragment/api/restricted_current.txt
@@ -12,7 +12,6 @@
   @androidx.navigation.Navigator.Name("dialog") public final class DialogFragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
     ctor public DialogFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager);
     method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
-    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
   }
 
   @androidx.navigation.NavDestination.ClassType(DialogFragment::class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
@@ -24,13 +23,16 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class DialogFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
-    ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    ctor @Deprecated public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, String route, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
     method public androidx.navigation.fragment.DialogFragmentNavigator.Destination build();
   }
 
   public final class DialogFragmentNavigatorDestinationBuilderKt {
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
 
   public final class FragmentKt {
@@ -68,13 +70,16 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class FragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
-    ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    ctor @Deprecated public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, String route, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
     method public androidx.navigation.fragment.FragmentNavigator.Destination build();
   }
 
   public final class FragmentNavigatorDestinationBuilderKt {
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
 
   public final class FragmentNavigatorExtrasKt {
diff --git a/navigation/navigation-fragment/build.gradle b/navigation/navigation-fragment/build.gradle
index 5837d97..72e3ba0 100644
--- a/navigation/navigation-fragment/build.gradle
+++ b/navigation/navigation-fragment/build.gradle
@@ -14,10 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
@@ -30,14 +27,14 @@
     api(projectOrArtifact(":fragment:fragment-ktx"))
     api(project(":navigation:navigation-runtime"))
 
-    api(KOTLIN_STDLIB)
+    api(libs.kotlinStdlib)
     androidTestImplementation(project(":navigation:navigation-testing"))
     androidTestImplementation(projectOrArtifact(":fragment:fragment-testing"))
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(TRUTH)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.truth)
     androidTestImplementation(project(":internal-testutils-runtime"), {
         exclude group: "androidx.fragment", module: "fragment"
     })
diff --git a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorDestinationBuilderTest.kt b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorDestinationBuilderTest.kt
index fed4875..7532fdb 100644
--- a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorDestinationBuilderTest.kt
+++ b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorDestinationBuilderTest.kt
@@ -36,6 +36,7 @@
     val activityRule = androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
     private val fragmentManager get() = activityRule.activity.supportFragmentManager
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test fun fragment() {
         val navHostFragment = NavHostFragment()
@@ -53,6 +54,7 @@
             .isEqualTo(BuilderTestDialogFragment::class.java.name)
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test fun fragmentWithBody() {
         val navHostFragment = NavHostFragment()
@@ -74,8 +76,48 @@
             .that(graph[DESTINATION_ID].label)
             .isEqualTo(LABEL)
     }
+
+    @UiThreadTest
+    @Test fun fragmentRoute() {
+        val navHostFragment = NavHostFragment()
+        fragmentManager.beginTransaction()
+            .add(android.R.id.content, navHostFragment)
+            .commitNow()
+        val graph = navHostFragment.createGraph(startDestination = DESTINATION_ROUTE) {
+            dialog<BuilderTestDialogFragment>(DESTINATION_ROUTE)
+        }
+        assertWithMessage("Destination should be added to the graph")
+            .that(DESTINATION_ROUTE in graph)
+            .isTrue()
+        assertWithMessage("DialogFragment class should be set to BuilderTestDialogFragment")
+            .that((graph[DESTINATION_ROUTE] as DialogFragmentNavigator.Destination).className)
+            .isEqualTo(BuilderTestDialogFragment::class.java.name)
+    }
+
+    @UiThreadTest
+    @Test fun fragmentWithBodyRoute() {
+        val navHostFragment = NavHostFragment()
+        fragmentManager.beginTransaction()
+            .add(android.R.id.content, navHostFragment)
+            .commitNow()
+        val graph = navHostFragment.createGraph(startDestination = DESTINATION_ROUTE) {
+            dialog<BuilderTestDialogFragment>(DESTINATION_ROUTE) {
+                label = LABEL
+            }
+        }
+        assertWithMessage("Destination should be added to the graph")
+            .that(DESTINATION_ROUTE in graph)
+            .isTrue()
+        assertWithMessage("DialogFragment class should be set to BuilderTestDialogFragment")
+            .that((graph[DESTINATION_ROUTE] as DialogFragmentNavigator.Destination).className)
+            .isEqualTo(BuilderTestDialogFragment::class.java.name)
+        assertWithMessage("DialogFragment should have label set")
+            .that(graph[DESTINATION_ROUTE].label)
+            .isEqualTo(LABEL)
+    }
 }
 
 private const val DESTINATION_ID = 1
+private const val DESTINATION_ROUTE = "destination"
 private const val LABEL = "Test"
 class BuilderTestDialogFragment : DialogFragment()
diff --git a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
index c66710b..39bc126 100644
--- a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
+++ b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
@@ -23,8 +23,10 @@
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentFactory
 import androidx.fragment.app.FragmentManager
+import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavController
 import androidx.navigation.Navigation
+import androidx.navigation.testing.TestNavigatorState
 import androidx.test.annotation.UiThreadTest
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
@@ -34,6 +36,7 @@
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import kotlin.reflect.KClass
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
@@ -49,11 +52,16 @@
 
     private lateinit var emptyActivity: EmptyActivity
     private lateinit var fragmentManager: FragmentManager
+    private lateinit var navigatorState: TestNavigatorState
+    private lateinit var dialogNavigator: DialogFragmentNavigator
 
     @Before
     fun setup() {
         emptyActivity = activityRule.activity
         fragmentManager = emptyActivity.supportFragmentManager
+        navigatorState = TestNavigatorState()
+        dialogNavigator = DialogFragmentNavigator(emptyActivity, fragmentManager)
+        dialogNavigator.onAttach(navigatorState)
     }
 
     @UiThreadTest
@@ -69,14 +77,11 @@
                 }
             }
         }
-        val dialogNavigator = DialogFragmentNavigator(emptyActivity, fragmentManager)
-        val destination = dialogNavigator.createDestination().apply {
-            id = INITIAL_FRAGMENT
-            setClassName(EmptyDialogFragment::class.java.name)
-        }
+        val entry = createBackStackEntry()
 
-        assertThat(dialogNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        dialogNavigator.navigate(listOf(entry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
         fragmentManager.executePendingTransactions()
         assertWithMessage("Dialog should be shown")
             .that(dialogFragment.requireDialog().isShowing)
@@ -118,25 +123,34 @@
                 }
             }
         }
-        val dialogNavigator = DialogFragmentNavigator(emptyActivity, fragmentManager)
-        val destination = dialogNavigator.createDestination().apply {
-            id = INITIAL_FRAGMENT
-            setClassName(EmptyDialogFragment::class.java.name)
-        }
+        val entry = createBackStackEntry()
 
-        assertThat(dialogNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        dialogNavigator.navigate(listOf(entry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
         fragmentManager.executePendingTransactions()
         assertWithMessage("Dialog should be shown")
             .that(dialogFragment.requireDialog().isShowing)
             .isTrue()
+        dialogNavigator.popBackStack(entry, false)
         assertWithMessage("DialogNavigator should pop dialog off the back stack")
-            .that(dialogNavigator.popBackStack())
-            .isTrue()
+            .that(navigatorState.backStack.value)
+            .isEmpty()
         assertWithMessage("Pop should dismiss the DialogFragment")
             .that(dialogFragment.requireDialog().isShowing)
             .isFalse()
     }
+
+    private fun createBackStackEntry(
+        destId: Int = INITIAL_FRAGMENT,
+        clazz: KClass<out Fragment> = EmptyDialogFragment::class
+    ): NavBackStackEntry {
+        val destination = dialogNavigator.createDestination().apply {
+            id = destId
+            setClassName(clazz.java.name)
+        }
+        return navigatorState.createBackStackEntry(destination, null)
+    }
 }
 
 class EmptyDialogFragment : DialogFragment() {
diff --git a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorDestinationBuilderTest.kt b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorDestinationBuilderTest.kt
index 028a90c..616174b 100644
--- a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorDestinationBuilderTest.kt
+++ b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorDestinationBuilderTest.kt
@@ -37,6 +37,7 @@
     val activityRule = androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
     private val fragmentManager get() = activityRule.activity.supportFragmentManager
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test fun fragment() {
         val navHostFragment = NavHostFragment()
@@ -57,6 +58,7 @@
         )
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test fun fragmentWithBody() {
         val navHostFragment = NavHostFragment()
@@ -82,8 +84,55 @@
             LABEL, graph[DESTINATION_ID].label
         )
     }
+
+    @UiThreadTest
+    @Test fun fragmentRoute() {
+        val navHostFragment = NavHostFragment()
+        fragmentManager.beginTransaction()
+            .add(android.R.id.content, navHostFragment)
+            .commitNow()
+        val graph = navHostFragment.createGraph(startDestination = DESTINATION_ROUTE) {
+            fragment<BuilderTestFragment>(DESTINATION_ROUTE)
+        }
+        assertTrue(
+            "Destination should be added to the graph",
+            DESTINATION_ROUTE in graph
+        )
+        assertEquals(
+            "Fragment class should be set to BuilderTestFragment",
+            BuilderTestFragment::class.java.name,
+            (graph[DESTINATION_ROUTE] as FragmentNavigator.Destination).className
+        )
+    }
+
+    @UiThreadTest
+    @Test fun fragmentWithBodyRoute() {
+        val navHostFragment = NavHostFragment()
+        fragmentManager.beginTransaction()
+            .add(android.R.id.content, navHostFragment)
+            .commitNow()
+        val graph = navHostFragment.createGraph(startDestination = DESTINATION_ROUTE) {
+            fragment<BuilderTestFragment>(DESTINATION_ROUTE) {
+                label = LABEL
+            }
+        }
+        assertTrue(
+            "Destination should be added to the graph",
+            DESTINATION_ROUTE in graph
+        )
+        assertEquals(
+            "Fragment class should be set to BuilderTestFragment",
+            BuilderTestFragment::class.java.name,
+            (graph[DESTINATION_ROUTE] as FragmentNavigator.Destination).className
+        )
+        assertEquals(
+            "Fragment should have label set",
+            LABEL, graph[DESTINATION_ROUTE].label
+        )
+    }
 }
 
 private const val DESTINATION_ID = 1
+private const val DESTINATION_ROUTE = "destination"
 private const val LABEL = "Test"
 class BuilderTestFragment : Fragment()
diff --git a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/NavGraphViewModelLazyTest.kt b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/NavGraphViewModelLazyTest.kt
index f3c50e7..73b3b9bf 100644
--- a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/NavGraphViewModelLazyTest.kt
+++ b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/NavGraphViewModelLazyTest.kt
@@ -56,6 +56,7 @@
             navigatorProvider += TestNavigator()
         }
 
+    @Suppress("DEPRECATION")
     @Test
     fun vmInitialization() {
         val scenario = launchFragmentInContainer<TestVMFragment>()
diff --git a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.kt b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.kt
index e584d40..9bd11441 100644
--- a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.kt
+++ b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.kt
@@ -16,7 +16,6 @@
 package androidx.navigation.fragment
 
 import android.content.Context
-import android.os.Bundle
 import android.util.AttributeSet
 import android.util.Log
 import androidx.annotation.CallSuper
@@ -26,11 +25,12 @@
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleEventObserver
 import androidx.navigation.FloatingWindow
+import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavDestination
 import androidx.navigation.NavOptions
 import androidx.navigation.Navigator
-import androidx.navigation.NavigatorState
 import androidx.navigation.NavigatorProvider
+import androidx.navigation.NavigatorState
 import androidx.navigation.fragment.DialogFragmentNavigator.Destination
 
 /**
@@ -43,49 +43,65 @@
     private val context: Context,
     private val fragmentManager: FragmentManager
 ) : Navigator<Destination>() {
-    private var dialogCount = 0
-    private val restoredTagsAwaitingAttach = mutableSetOf<String?>()
+    private val restoredTagsAwaitingAttach = mutableSetOf<String>()
     private val observer = LifecycleEventObserver { source, event ->
         if (event == Lifecycle.Event.ON_STOP) {
             val dialogFragment = source as DialogFragment
             if (!dialogFragment.requireDialog().isShowing) {
-                NavHostFragment.findNavController(dialogFragment).popBackStack()
+                // Update the NavigatorState to indicate that the Dialog was popped
+                val entry = state.backStack.value.first { it.id == dialogFragment.tag }
+                state.pop(entry, false)
             }
         }
     }
 
-    public override fun popBackStack(): Boolean {
-        if (dialogCount == 0) {
-            return false
-        }
+    override fun popBackStack(popUpTo: NavBackStackEntry, savedState: Boolean) {
         if (fragmentManager.isStateSaved) {
             Log.i(
                 TAG, "Ignoring popBackStack() call: FragmentManager has already saved its state"
             )
-            return false
+            return
         }
-        val existingFragment = fragmentManager.findFragmentByTag(DIALOG_TAG + --dialogCount)
-        if (existingFragment != null) {
-            existingFragment.lifecycle.removeObserver(observer)
-            (existingFragment as DialogFragment).dismiss()
+        val beforePopList = state.backStack.value
+        // Get the set of entries that are going to be popped
+        val poppedList = beforePopList.subList(
+            beforePopList.indexOf(popUpTo),
+            beforePopList.size
+        )
+        // Now go through the list in reversed order (i.e., starting from the most recently added)
+        // and dismiss each dialog
+        for (entry in poppedList.reversed()) {
+            val existingFragment = fragmentManager.findFragmentByTag(entry.id)
+            if (existingFragment != null) {
+                existingFragment.lifecycle.removeObserver(observer)
+                (existingFragment as DialogFragment).dismiss()
+            }
         }
-        return true
+        state.pop(popUpTo, savedState)
     }
 
     public override fun createDestination(): Destination {
         return Destination(this)
     }
 
-    public override fun navigate(
-        destination: Destination,
-        args: Bundle?,
+    override fun navigate(
+        entries: List<NavBackStackEntry>,
         navOptions: NavOptions?,
         navigatorExtras: Extras?
-    ): NavDestination? {
+    ) {
         if (fragmentManager.isStateSaved) {
             Log.i(TAG, "Ignoring navigate() call: FragmentManager has already saved its state")
-            return null
+            return
         }
+        for (entry in entries) {
+            navigate(entry)
+        }
+    }
+
+    private fun navigate(
+        entry: NavBackStackEntry
+    ) {
+        val destination = entry.destination as Destination
         var className = destination.className
         if (className[0] == '.') {
             className = context.packageName + className
@@ -97,33 +113,20 @@
             "Dialog destination ${destination.className} is not an instance of DialogFragment"
         }
         val dialogFragment = frag as DialogFragment
-        dialogFragment.arguments = args
+        dialogFragment.arguments = entry.arguments
         dialogFragment.lifecycle.addObserver(observer)
-        dialogFragment.show(fragmentManager, DIALOG_TAG + dialogCount++)
-        return destination
-    }
-
-    public override fun onSaveState(): Bundle? {
-        if (dialogCount == 0) {
-            return null
-        }
-        val b = Bundle()
-        b.putInt(KEY_DIALOG_COUNT, dialogCount)
-        return b
-    }
-
-    public override fun onRestoreState(savedState: Bundle) {
-        dialogCount = savedState.getInt(KEY_DIALOG_COUNT, 0)
-        for (index in 0 until dialogCount) {
-            val fragment = fragmentManager
-                .findFragmentByTag(DIALOG_TAG + index) as DialogFragment?
-            fragment?.lifecycle?.addObserver(observer)
-                ?: restoredTagsAwaitingAttach.add(DIALOG_TAG + index)
-        }
+        dialogFragment.show(fragmentManager, entry.id)
+        state.add(entry)
     }
 
     override fun onAttach(state: NavigatorState) {
         super.onAttach(state)
+        for (entry in state.backStack.value) {
+            val fragment = fragmentManager
+                .findFragmentByTag(entry.id) as DialogFragment?
+            fragment?.lifecycle?.addObserver(observer)
+                ?: restoredTagsAwaitingAttach.add(entry.id)
+        }
         fragmentManager.addFragmentOnAttachListener { _, childFragment ->
             val needToAddObserver = restoredTagsAwaitingAttach.remove(childFragment.tag)
             if (needToAddObserver) {
@@ -195,7 +198,5 @@
 
     private companion object {
         private const val TAG = "DialogFragmentNavigator"
-        private const val KEY_DIALOG_COUNT = "androidx-nav-dialogfragment:navigator:count"
-        private const val DIALOG_TAG = "androidx-nav-fragment:navigator:dialog:"
     }
 }
diff --git a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigatorDestinationBuilder.kt b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigatorDestinationBuilder.kt
index 465cf75..cf58061 100644
--- a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigatorDestinationBuilder.kt
+++ b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigatorDestinationBuilder.kt
@@ -27,6 +27,11 @@
 /**
  * Construct a new [DialogFragmentNavigator.Destination]
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to create your DialogFragmentDestination instead",
+    ReplaceWith("dialog<F>(route = id.toString())")
+)
 public inline fun <reified F : DialogFragment> NavGraphBuilder.dialog(
     @IdRes id: Int
 ): Unit = dialog<F>(id) {}
@@ -34,6 +39,11 @@
 /**
  * Construct a new [DialogFragmentNavigator.Destination]
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to create your DialogFragmentDestination instead",
+    ReplaceWith("dialog<F>(route = id.toString()) { builder.invoke() }")
+)
 public inline fun <reified F : DialogFragment> NavGraphBuilder.dialog(
     @IdRes id: Int,
     builder: DialogFragmentNavigatorDestinationBuilder.() -> Unit
@@ -44,16 +54,59 @@
         F::class
     ).apply(builder)
 )
+/**
+ * Construct a new [DialogFragmentNavigator.Destination]
+ */
+public inline fun <reified F : DialogFragment> NavGraphBuilder.dialog(
+    route: String
+): Unit = dialog<F>(route) {}
+
+/**
+ * Construct a new [DialogFragmentNavigator.Destination]
+ */
+public inline fun <reified F : DialogFragment> NavGraphBuilder.dialog(
+    route: String,
+    builder: DialogFragmentNavigatorDestinationBuilder.() -> Unit
+): Unit = destination(
+    DialogFragmentNavigatorDestinationBuilder(
+        provider[DialogFragmentNavigator::class],
+        route,
+        F::class
+    ).apply(builder)
+)
 
 /**
  * DSL for constructing a new [DialogFragmentNavigator.Destination]
  */
 @NavDestinationDsl
-public class DialogFragmentNavigatorDestinationBuilder(
-    navigator: DialogFragmentNavigator,
-    @IdRes id: Int,
-    private val fragmentClass: KClass<out DialogFragment>
-) : NavDestinationBuilder<DialogFragmentNavigator.Destination>(navigator, id) {
+public class DialogFragmentNavigatorDestinationBuilder :
+    NavDestinationBuilder<DialogFragmentNavigator.Destination> {
+
+    private var fragmentClass: KClass<out DialogFragment>
+
+    @Suppress("Deprecation")
+    @Deprecated(
+        "Use routes to build your DialogFragmentNavigatorDestination instead",
+        ReplaceWith(
+            "DialogFragmentNavigatorDestinationBuilder(navigator, route = id.toString(), " +
+                "fragmentClass) "
+        )
+    )
+    public constructor(
+        navigator: DialogFragmentNavigator,
+        @IdRes id: Int,
+        fragmentClass: KClass<out DialogFragment>
+    ) : super(navigator, id) {
+        this.fragmentClass = fragmentClass
+    }
+
+    public constructor(
+        navigator: DialogFragmentNavigator,
+        route: String,
+        fragmentClass: KClass<out DialogFragment>
+    ) : super(navigator, route) {
+        this.fragmentClass = fragmentClass
+    }
 
     override fun build(): DialogFragmentNavigator.Destination =
         super.build().also { destination ->
diff --git a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/FragmentNavigatorDestinationBuilder.kt b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/FragmentNavigatorDestinationBuilder.kt
index 2a85478c..e0060d9 100644
--- a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/FragmentNavigatorDestinationBuilder.kt
+++ b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/FragmentNavigatorDestinationBuilder.kt
@@ -27,6 +27,11 @@
 /**
  * Construct a new [FragmentNavigator.Destination]
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to create your FragmentDestination instead",
+    ReplaceWith("fragment<F>(route = id.toString())")
+)
 public inline fun <reified F : Fragment> NavGraphBuilder.fragment(
     @IdRes id: Int
 ): Unit = fragment<F>(id) {}
@@ -34,6 +39,11 @@
 /**
  * Construct a new [FragmentNavigator.Destination]
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to create your FragmentDestination instead",
+    ReplaceWith("fragment<F>(route = id.toString()) { builder.invoke() }")
+)
 public inline fun <reified F : Fragment> NavGraphBuilder.fragment(
     @IdRes id: Int,
     builder: FragmentNavigatorDestinationBuilder.() -> Unit
@@ -46,14 +56,57 @@
 )
 
 /**
+ * Construct a new [FragmentNavigator.Destination]
+ */
+public inline fun <reified F : Fragment> NavGraphBuilder.fragment(
+    route: String
+): Unit = fragment<F>(route) {}
+
+/**
+ * Construct a new [FragmentNavigator.Destination]
+ */
+public inline fun <reified F : Fragment> NavGraphBuilder.fragment(
+    route: String,
+    builder: FragmentNavigatorDestinationBuilder.() -> Unit
+): Unit = destination(
+    FragmentNavigatorDestinationBuilder(
+        provider[FragmentNavigator::class],
+        route,
+        F::class
+    ).apply(builder)
+)
+
+/**
  * DSL for constructing a new [FragmentNavigator.Destination]
  */
 @NavDestinationDsl
-public class FragmentNavigatorDestinationBuilder(
-    navigator: FragmentNavigator,
-    @IdRes id: Int,
-    private val fragmentClass: KClass<out Fragment>
-) : NavDestinationBuilder<FragmentNavigator.Destination>(navigator, id) {
+public class FragmentNavigatorDestinationBuilder :
+    NavDestinationBuilder<FragmentNavigator.Destination> {
+
+    private var fragmentClass: KClass<out Fragment>
+
+    @Suppress("Deprecation")
+    @Deprecated(
+        "Use routes to build your FragmentNavigatorDestination instead",
+        ReplaceWith(
+            "FragmentNavigatorDestinationBuilder(navigator, route = id.toString(), fragmentClass) "
+        )
+    )
+    public constructor(
+        navigator: FragmentNavigator,
+        @IdRes id: Int,
+        fragmentClass: KClass<out Fragment>
+    ) : super(navigator, id) {
+        this.fragmentClass = fragmentClass
+    }
+
+    public constructor(
+        navigator: FragmentNavigator,
+        route: String,
+        fragmentClass: KClass<out Fragment>
+    ) : super(navigator, route) {
+        this.fragmentClass = fragmentClass
+    }
 
     override fun build(): FragmentNavigator.Destination =
         super.build().also { destination ->
diff --git a/navigation/navigation-runtime-ktx/build.gradle b/navigation/navigation-runtime-ktx/build.gradle
index ddb869e..5beadd4 100644
--- a/navigation/navigation-runtime-ktx/build.gradle
+++ b/navigation/navigation-runtime-ktx/build.gradle
@@ -14,10 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
diff --git a/navigation/navigation-runtime-truth/build.gradle b/navigation/navigation-runtime-truth/build.gradle
index dca17f9..683040f 100644
--- a/navigation/navigation-runtime-truth/build.gradle
+++ b/navigation/navigation-runtime-truth/build.gradle
@@ -14,14 +14,9 @@
  * limitations under the License.
  */
 
-
-import androidx.build.AndroidXExtension
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.Publish
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -30,17 +25,17 @@
 
 dependencies {
     api(project(":navigation:navigation-runtime"))
-    api(TRUTH)
-    api(KOTLIN_STDLIB)
+    api(libs.truth)
+    api(libs.kotlinStdlib)
     androidTestImplementation(project(":internal-testutils-truth"))
     androidTestImplementation(project(":internal-testutils-navigation"), {
         exclude group: "androidx.navigation", module: "navigation-common"
     })
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
 }
 
 androidx {
diff --git a/navigation/navigation-runtime/api/current.txt b/navigation/navigation-runtime/api/current.txt
index 219326d..33808c0 100644
--- a/navigation/navigation-runtime/api/current.txt
+++ b/navigation/navigation-runtime/api/current.txt
@@ -59,7 +59,8 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class ActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
-    ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+    ctor @Deprecated public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+    ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, String route);
     method public androidx.navigation.ActivityNavigator.Destination build();
     method public String? getAction();
     method public kotlin.reflect.KClass<? extends android.app.Activity>? getActivityClass();
@@ -79,7 +80,8 @@
   }
 
   public final class ActivityNavigatorDestinationBuilderKt {
-    method public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void activity(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
   }
 
   public final class ActivityNavigatorExtrasKt {
@@ -150,8 +152,8 @@
   }
 
   public final class NavControllerKt {
-    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
-    method public static androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavDeepLinkBuilder {
@@ -187,7 +189,8 @@
   }
 
   public final class NavHostKt {
-    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavInflater {
diff --git a/navigation/navigation-runtime/api/public_plus_experimental_current.txt b/navigation/navigation-runtime/api/public_plus_experimental_current.txt
index 308daa9..1a5eb2b 100644
--- a/navigation/navigation-runtime/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-runtime/api/public_plus_experimental_current.txt
@@ -61,7 +61,8 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class ActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
-    ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+    ctor @Deprecated public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+    ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, String route);
     method public androidx.navigation.ActivityNavigator.Destination build();
     method public String? getAction();
     method public kotlin.reflect.KClass<? extends android.app.Activity>? getActivityClass();
@@ -81,7 +82,8 @@
   }
 
   public final class ActivityNavigatorDestinationBuilderKt {
-    method public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void activity(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
   }
 
   public final class ActivityNavigatorExtrasKt {
@@ -164,8 +166,8 @@
   }
 
   public final class NavControllerKt {
-    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
-    method public static androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavDeepLinkBuilder {
@@ -201,7 +203,8 @@
   }
 
   public final class NavHostKt {
-    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavInflater {
diff --git a/navigation/navigation-runtime/api/restricted_current.txt b/navigation/navigation-runtime/api/restricted_current.txt
index 219326d..33808c0 100644
--- a/navigation/navigation-runtime/api/restricted_current.txt
+++ b/navigation/navigation-runtime/api/restricted_current.txt
@@ -59,7 +59,8 @@
   }
 
   @androidx.navigation.NavDestinationDsl public final class ActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
-    ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+    ctor @Deprecated public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+    ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, String route);
     method public androidx.navigation.ActivityNavigator.Destination build();
     method public String? getAction();
     method public kotlin.reflect.KClass<? extends android.app.Activity>? getActivityClass();
@@ -79,7 +80,8 @@
   }
 
   public final class ActivityNavigatorDestinationBuilderKt {
-    method public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void activity(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
   }
 
   public final class ActivityNavigatorExtrasKt {
@@ -150,8 +152,8 @@
   }
 
   public final class NavControllerKt {
-    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
-    method public static androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavDeepLinkBuilder {
@@ -187,7 +189,8 @@
   }
 
   public final class NavHostKt {
-    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavInflater {
diff --git a/navigation/navigation-runtime/build.gradle b/navigation/navigation-runtime/build.gradle
index 9ac58b4..1ba297e 100644
--- a/navigation/navigation-runtime/build.gradle
+++ b/navigation/navigation-runtime/build.gradle
@@ -14,13 +14,9 @@
  * limitations under the License.
  */
 
-
-import androidx.build.AndroidXExtension
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -29,24 +25,24 @@
 
 dependencies {
     api(project(":navigation:navigation-common"))
-    api("androidx.activity:activity-ktx:1.2.2")
+    api("androidx.activity:activity-ktx:1.2.3")
     api("androidx.lifecycle:lifecycle-runtime-ktx:2.3.1")
     api("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1")
 
-    api(KOTLIN_STDLIB)
+    api(libs.kotlinStdlib)
     androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.3.1")
     androidTestImplementation(project(":internal-testutils-navigation"))
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_EXT_TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(ESPRESSO_INTENTS)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
-    androidTestImplementation(KOTLIN_STDLIB)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testExtTruth)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.espressoCore)
+    androidTestImplementation(libs.espressoIntents)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy)
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy)
+    androidTestImplementation(libs.kotlinStdlib)
 }
 
 androidx {
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/ActivityNavigatorDestinationBuilderTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/ActivityNavigatorDestinationBuilderTest.kt
index 41b28c1..6e1ae7a 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/ActivityNavigatorDestinationBuilderTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/ActivityNavigatorDestinationBuilderTest.kt
@@ -32,6 +32,7 @@
     private val navController =
         NavController(ApplicationProvider.getApplicationContext() as android.content.Context)
 
+    @Suppress("DEPRECATION")
     @Test
     fun activity() {
         val graph = navController.createGraph(startDestination = DESTINATION_ID) {
@@ -50,6 +51,7 @@
         )
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun activityPackage() {
         val graph = navController.createGraph(startDestination = DESTINATION_ID) {
@@ -65,6 +67,7 @@
             .isEqualTo(PACKAGE_NAME)
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun activityClass() {
         val graph = navController.createGraph(startDestination = DESTINATION_ID) {
@@ -83,6 +86,7 @@
         )
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun action() {
         val graph = navController.createGraph(startDestination = DESTINATION_ID) {
@@ -101,6 +105,7 @@
         )
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun data() {
         val graph = navController.createGraph(startDestination = DESTINATION_ID) {
@@ -119,6 +124,7 @@
         )
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun dataPattern() {
         val graph = navController.createGraph(startDestination = DESTINATION_ID) {
@@ -136,9 +142,115 @@
             (graph[DESTINATION_ID] as ActivityNavigator.Destination).dataPattern
         )
     }
+
+    @Test
+    fun activityRoute() {
+        val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+            activity(DESTINATION_ROUTE) {
+                label = LABEL
+            }
+        }
+        assertTrue(
+            "Destination should be added to the graph",
+            DESTINATION_ROUTE in graph
+        )
+        assertEquals(
+            "Destination should have label set",
+            LABEL,
+            graph[DESTINATION_ROUTE].label
+        )
+    }
+
+    @Test
+    fun activityPackageRoute() {
+        val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+            activity(DESTINATION_ROUTE) {
+                targetPackage = PACKAGE_NAME
+            }
+        }
+        assertWithMessage("Destination should be added to the graph")
+            .that(DESTINATION_ROUTE in graph)
+            .isTrue()
+        assertWithMessage("Destination should have package name set")
+            .that((graph[DESTINATION_ROUTE] as ActivityNavigator.Destination).targetPackage)
+            .isEqualTo(PACKAGE_NAME)
+    }
+
+    @Test
+    fun activityClassRoute() {
+        val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+            activity(DESTINATION_ROUTE) {
+                activityClass = TestActivity::class
+            }
+        }
+        assertTrue(
+            "Destination should be added to the graph",
+            DESTINATION_ROUTE in graph
+        )
+        assertEquals(
+            "Destination should have ComponentName set",
+            TestActivity::class.java.name,
+            (graph[DESTINATION_ROUTE] as ActivityNavigator.Destination).component?.className
+        )
+    }
+
+    @Test
+    fun actionRoute() {
+        val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+            activity(DESTINATION_ROUTE) {
+                action = ACTION
+            }
+        }
+        assertTrue(
+            "Destination should be added to the graph",
+            DESTINATION_ROUTE in graph
+        )
+        assertEquals(
+            "Destination should have action set",
+            ACTION,
+            (graph[DESTINATION_ROUTE] as ActivityNavigator.Destination).action
+        )
+    }
+
+    @Test
+    fun dataRoute() {
+        val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+            activity(DESTINATION_ROUTE) {
+                data = DATA
+            }
+        }
+        assertTrue(
+            "Destination should be added to the graph",
+            DESTINATION_ROUTE in graph
+        )
+        assertEquals(
+            "Destination should have data set",
+            DATA,
+            (graph[DESTINATION_ROUTE] as ActivityNavigator.Destination).data
+        )
+    }
+
+    @Test
+    fun dataPatternRoute() {
+        val graph = navController.createGraph(startDestination = DESTINATION_ROUTE) {
+            activity(DESTINATION_ROUTE) {
+                dataPattern = DATA_PATTERN
+            }
+        }
+        assertTrue(
+            "Destination should be added to the graph",
+            DESTINATION_ROUTE in graph
+        )
+        assertEquals(
+            "Destination should have data pattern set",
+            DATA_PATTERN,
+            (graph[DESTINATION_ROUTE] as ActivityNavigator.Destination).dataPattern
+        )
+    }
 }
 
 private const val DESTINATION_ID = 1
+private const val DESTINATION_ROUTE = "destination"
 private const val PACKAGE_NAME = "com.example"
 private const val LABEL = "Test"
 private const val ACTION = "ACTION_TEST"
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryLifecycleTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryLifecycleTest.kt
index 1c9b115..f276f45 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryLifecycleTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryLifecycleTest.kt
@@ -43,6 +43,7 @@
     /**
      * Test that navigating between siblings correctly stops the previous sibling.
      */
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testLifecycle() {
@@ -105,6 +106,7 @@
      * Test that navigating from a sibling to a FloatingWindow sibling leaves the previous
      * destination started.
      */
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testLifecycleWithDialog() {
@@ -167,6 +169,7 @@
      * Test that navigating from within a nested navigation graph to one of the graph's
      * siblings correctly stops both the previous destination and its graph.
      */
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testLifecycleNested() {
@@ -232,6 +235,7 @@
      * FloatingWindow siblings correctly moves both the previous destination and its graph to
      * started.
      */
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testLifecycleNestedWithDialog() {
@@ -299,6 +303,7 @@
      * Test that navigating from within a nested navigation graph to one of the graph's
      * siblings correctly stops both the previous destination and its graph.
      */
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testLifecycleNestedOrdering() {
@@ -394,6 +399,7 @@
      * FloatingWindow siblings correctly moves both the previous destination and its graph to
      * started.
      */
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testLifecycleNestedOrderingWithDialog() {
@@ -476,6 +482,7 @@
      * Test that popping the last destination in a graph while navigating to a new
      * destination in that graph keeps the graph around
      */
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testLifecycleReplaceLastDestination() {
@@ -533,6 +540,7 @@
      * Test that popping the last destination in a graph while navigating correctly
      * cleans up the previous navigation graph
      */
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testLifecycleOrphanedGraph() {
@@ -590,6 +598,7 @@
      * Test that navigating to a new instance of a graph leaves the previous instance in its
      * current state.
      */
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testLifecycleNestedRepeated() {
@@ -663,6 +672,7 @@
      * Test that navigating to a new instance of a graph back to back with its previous
      * instance creates a brand new graph instance
      */
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testLifecycleNestedRepeatedBackToBack() {
@@ -722,6 +732,7 @@
      * last destination from the previous instance of the graph correctly cleans up
      * the orphaned graph and creates a new graph instance.
      */
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testLifecycleNestedRepeatedBackToBackWithOrphanedGraph() {
@@ -789,6 +800,7 @@
      * Test that navigating to a new instance of a graph via a deep link to a FloatingWindow
      * destination leaves the previous instance in its current state.
      */
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testLifecycleNestedRepeatedWithDialog() {
@@ -861,6 +873,7 @@
             .isEqualTo(Lifecycle.State.RESUMED)
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testLifecycleToDestroyedWhenInitialized() {
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryTest.kt
index bcd0b19..b061ee6 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryTest.kt
@@ -42,6 +42,7 @@
 @RunWith(AndroidJUnit4::class)
 class NavBackStackEntryTest {
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testGetViewModelStoreOwner() {
@@ -61,6 +62,7 @@
         assertThat(store).isNotNull()
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testGetViewModelStoreOwnerAndroidViewModel() {
@@ -81,6 +83,7 @@
         assertThat(viewModel).isNotNull()
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testGetViewModelStoreOwnerSavedStateViewModel() {
@@ -116,6 +119,7 @@
         assertThat(restoredState).isEqualTo("test")
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testSaveRestoreGetViewModelStoreOwner() {
@@ -165,6 +169,7 @@
         }
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testGetViewModelStoreOwnerSameGraph() {
@@ -188,6 +193,7 @@
         assertThat(sameGraphOwner.viewModelStore).isSameInstanceAs(viewStore)
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testGetSavedStateHandleRestored() {
@@ -278,6 +284,7 @@
         }
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testOnClearedWhenHostCleared() {
@@ -304,6 +311,7 @@
             .isTrue()
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testOnClearedWhenPopped() {
@@ -338,6 +346,7 @@
             .isTrue()
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testOnClearedWhenHostClearedAfterSaveState() {
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
index 5dd486d..c2e4857 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
@@ -173,6 +173,7 @@
         navController.setGraph(R.navigation.nav_start_destination, args)
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testStartDestinationWithArgsProgrammatic() {
@@ -238,6 +239,7 @@
         }
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testSetViewModelStoreOwnerAfterGraphSet() {
@@ -260,6 +262,7 @@
         }
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testSetSameViewModelStoreOwnerAfterGraphSet() {
@@ -988,6 +991,24 @@
 
     @UiThreadTest
     @Test
+    fun testNavigateThenPopFromNavigator() {
+        val navController = createNavController()
+        navController.setGraph(R.navigation.nav_simple)
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.start_test)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        navController.navigate(R.id.second_test)
+        assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.second_test)
+        assertThat(navigator.backStack.size).isEqualTo(2)
+
+        navigator.popCurrent()
+        assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.start_test)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+    }
+
+    @UiThreadTest
+    @Test
     fun testNavigateThenPopToUnknownDestination() {
         val navController = createNavController()
         navController.setGraph(R.navigation.nav_simple)
@@ -1938,6 +1959,28 @@
         assertThat(backPressedIntercepted).isTrue()
     }
 
+    @UiThreadTest
+    @Test
+    fun testOnDestinationChangedListenerConcurrentModification() {
+        val navController = createNavController()
+        navController.setGraph(R.navigation.nav_simple)
+
+        val listener = object : NavController.OnDestinationChangedListener {
+            override fun onDestinationChanged(
+                controller: NavController,
+                destination: NavDestination,
+                arguments: Bundle?
+            ) {
+                navController.removeOnDestinationChangedListener(this)
+            }
+        }
+
+        navController.addOnDestinationChangedListener(listener)
+        navController.addOnDestinationChangedListener { _, _, _ -> }
+        navController.navigate(R.id.second_test)
+    }
+
+    @Suppress("DEPRECATION")
     @Test
     fun createGraph() {
         val graph = navController.createGraph(startDestination = DESTINATION_ID) {
@@ -1949,7 +1992,7 @@
 
     @UiThreadTest
     @Test
-    @Suppress("EXPERIMENTAL_API_USAGE")
+    @Suppress("DEPRECATION", "EXPERIMENTAL_API_USAGE")
     fun currentBackStackEntryFlow() = runBlocking {
         navController.graph = navController.createGraph(startDestination = 1) {
             test(1)
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavDeepLinkBuilderTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavDeepLinkBuilderTest.kt
index 951a236..0b21a08 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavDeepLinkBuilderTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavDeepLinkBuilderTest.kt
@@ -105,6 +105,7 @@
         assertEquals("Expected one Intent", 1, taskStackBuilder.intentCount)
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun fromContextSetGraphProgrammatic() {
         val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavHostTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavHostTest.kt
index 37ecb1e..5ef8394 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavHostTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavHostTest.kt
@@ -35,6 +35,7 @@
             get() = [email protected]
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun createGraph() {
         val graph = navHost.createGraph(startDestination = DESTINATION_ID) {
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/test/FloatingTestNavigator.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/test/FloatingTestNavigator.kt
index 689f7c6..94ea1b6 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/test/FloatingTestNavigator.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/test/FloatingTestNavigator.kt
@@ -59,6 +59,7 @@
 /**
  * DSL for constructing a new [TestNavigator.Destination] from a [FloatingTestNavigator].
  */
+@Suppress("DEPRECATION")
 @NavDestinationDsl
 class FloatingTestNavigatorDestinationBuilder(
     navigator: FloatingTestNavigator,
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/ActivityNavigatorDestinationBuilder.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/ActivityNavigatorDestinationBuilder.kt
index 993f80b..c0cc861 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/ActivityNavigatorDestinationBuilder.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/ActivityNavigatorDestinationBuilder.kt
@@ -20,6 +20,7 @@
 
 import android.app.Activity
 import android.content.ComponentName
+import android.content.Context
 import android.net.Uri
 import androidx.annotation.IdRes
 import kotlin.reflect.KClass
@@ -27,6 +28,11 @@
 /**
  * Construct a new [ActivityNavigator.Destination]
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to build your ActivityDestination instead",
+    ReplaceWith("activity(route = id.toString()) { builder.invoke() }")
+)
 public inline fun NavGraphBuilder.activity(
     @IdRes id: Int,
     builder: ActivityNavigatorDestinationBuilder.() -> Unit
@@ -38,14 +44,38 @@
 )
 
 /**
+ * Construct a new [ActivityNavigator.Destination]
+ */
+public inline fun NavGraphBuilder.activity(
+    route: String,
+    builder: ActivityNavigatorDestinationBuilder.() -> Unit
+): Unit = destination(
+    ActivityNavigatorDestinationBuilder(
+        provider[ActivityNavigator::class],
+        route
+    ).apply(builder)
+)
+
+/**
  * DSL for constructing a new [ActivityNavigator.Destination]
  */
 @NavDestinationDsl
-public class ActivityNavigatorDestinationBuilder(
-    navigator: ActivityNavigator,
-    @IdRes id: Int
-) : NavDestinationBuilder<ActivityNavigator.Destination>(navigator, id) {
-    private val context = navigator.context
+public class ActivityNavigatorDestinationBuilder :
+    NavDestinationBuilder<ActivityNavigator.Destination> {
+    private var context: Context
+
+    @Suppress("Deprecation")
+    @Deprecated(
+        "Use routes to create your ActivityNavigatorDestinationBuilder instead",
+        ReplaceWith("ActivityNavigatorDestinationBuilder(navigator, route = id.toString())")
+    )
+    public constructor(navigator: ActivityNavigator, @IdRes id: Int) : super(navigator, id) {
+        context = navigator.context
+    }
+
+    public constructor(navigator: ActivityNavigator, route: String) : super(navigator, route) {
+        context = navigator.context
+    }
 
     public var targetPackage: String? = null
 
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
index 9fdd0a7..fc4bde0 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
@@ -43,6 +43,7 @@
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.flow.asSharedFlow
+import java.util.concurrent.CopyOnWriteArrayList
 
 /**
  * NavController manages app navigation within a [NavHost].
@@ -104,8 +105,7 @@
     private val backStackStates = mutableMapOf<String, ArrayDeque<NavBackStackEntryState>>()
     private var lifecycleOwner: LifecycleOwner? = null
     private var viewModel: NavControllerViewModel? = null
-    private val onDestinationChangedListeners =
-        mutableListOf<OnDestinationChangedListener>()
+    private val onDestinationChangedListeners = CopyOnWriteArrayList<OnDestinationChangedListener>()
 
     private val lifecycleObserver: LifecycleObserver = LifecycleEventObserver { _, event ->
         if (_graph != null) {
@@ -252,12 +252,9 @@
                     handler(popUpTo)
                     super.pop(popUpTo, saveState)
                 } else {
-                    // TODO handle the Navigator calling pop() outside of a call to popBackStack()
-                    Log.i(
-                        TAG,
-                        "Ignoring pop of destination ${popUpTo.destination} " +
-                            "outside of the call to popBackStack(). "
-                    )
+                    popBackStackFromNavigator(popUpTo) {
+                        super.pop(popUpTo, saveState)
+                    }
                 }
             } else {
                 navigatorState[destinationNavigator]!!.pop(popUpTo, saveState)
@@ -509,10 +506,46 @@
         return popped
     }
 
+    /**
+     * Trigger a popBackStack() that originated from a Navigator specifically calling
+     * [NavigatorState.pop] outside of a call to [popBackStack] (e.g., in response to some
+     * user interaction that caused that destination to no longer be needed such as
+     * dismissing a dialog destination).
+     *
+     * This method is responsible for popping all destinations above the given [popUpTo] entry and
+     * popping the entry itself and removing it from the back stack before calling the
+     * [onComplete] callback. Only after the processing here is done and the [onComplete]
+     * callback completes does this method dispatch the destination change event.
+     */
+    internal fun popBackStackFromNavigator(popUpTo: NavBackStackEntry, onComplete: () -> Unit) {
+        val popIndex = backQueue.indexOf(popUpTo)
+        if (popIndex < 0) {
+            Log.i(
+                TAG,
+                "Ignoring pop of $popUpTo as it was not found on the current back stack"
+            )
+            return
+        }
+        if (popIndex + 1 != backQueue.size) {
+            // There's other destinations stacked on top of this destination that
+            // we need to pop first
+            popBackStackInternal(
+                backQueue[popIndex + 1].destination.id,
+                inclusive = true,
+                saveState = false
+            )
+        }
+        // Now record the pop of the actual entry - we don't use popBackStackInternal
+        // here since we're being called from the Navigator already
+        popEntryFromBackStack(popUpTo)
+        onComplete()
+        dispatchOnDestinationChanged()
+    }
+
     private fun popEntryFromBackStack(
         popUpTo: NavBackStackEntry,
-        saveState: Boolean,
-        savedState: ArrayDeque<NavBackStackEntryState>
+        saveState: Boolean = false,
+        savedState: ArrayDeque<NavBackStackEntryState> = ArrayDeque()
     ) {
         val entry = backQueue.last()
         check(entry == popUpTo) {
@@ -1916,6 +1949,14 @@
  * @param startDestination the route for the start destination
  * @param builder the builder used to construct the graph
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to create your NavGraph instead",
+    ReplaceWith(
+        "createGraph(startDestination = startDestination.toString(), route = id.toString()) " +
+            "{ builder.invoke() }"
+    )
+)
 public inline fun NavController.createGraph(
     @IdRes id: Int = 0,
     @IdRes startDestination: Int,
@@ -1929,7 +1970,7 @@
  * @param route the route for the graph
  * @param builder the builder used to construct the graph
  */
-public fun NavController.createGraph(
+public inline fun NavController.createGraph(
     startDestination: String,
     route: String? = null,
     builder: NavGraphBuilder.() -> Unit
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHost.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHost.kt
index 979dec7..f3e159b 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHost.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHost.kt
@@ -53,8 +53,25 @@
 /**
  * Construct a new [NavGraph]
  */
+@Suppress("Deprecation")
+@Deprecated(
+    "Use routes to create your NavGraph instead",
+    ReplaceWith(
+        "createGraph(startDestination = startDestination.toString(), route = id.toString()) " +
+            "{ builder.invoke() }"
+    )
+)
 public inline fun NavHost.createGraph(
     @IdRes id: Int = 0,
     @IdRes startDestination: Int,
     builder: NavGraphBuilder.() -> Unit
 ): NavGraph = navController.createGraph(id, startDestination, builder)
+
+/**
+ * Construct a new [NavGraph]
+ */
+public inline fun NavHost.createGraph(
+    startDestination: String,
+    route: String? = null,
+    builder: NavGraphBuilder.() -> Unit
+): NavGraph = navController.createGraph(startDestination, route, builder)
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.kt
index a8a55ed..a7a59e3 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.kt
@@ -27,6 +27,7 @@
 import androidx.annotation.NavigationRes
 import androidx.annotation.RestrictTo
 import androidx.core.content.res.use
+import androidx.core.content.withStyledAttributes
 import androidx.navigation.common.R
 import org.xmlpull.v1.XmlPullParser
 import org.xmlpull.v1.XmlPullParserException
@@ -280,26 +281,22 @@
         parser: XmlResourceParser,
         graphResId: Int
     ) {
-        res.obtainAttributes(attrs, R.styleable.NavAction).use { array ->
-            val id = array.getResourceId(R.styleable.NavAction_android_id, 0)
-            val destId = array.getResourceId(R.styleable.NavAction_destination, 0)
+        context.withStyledAttributes(attrs, R.styleable.NavAction) {
+            val id = getResourceId(R.styleable.NavAction_android_id, 0)
+            val destId = getResourceId(R.styleable.NavAction_destination, 0)
             val action = NavAction(destId)
             val builder = NavOptions.Builder()
-            builder.setLaunchSingleTop(
-                array.getBoolean(R.styleable.NavAction_launchSingleTop, false)
-            )
-            builder.setRestoreState(
-                array.getBoolean(R.styleable.NavAction_restoreState, false)
-            )
+            builder.setLaunchSingleTop(getBoolean(R.styleable.NavAction_launchSingleTop, false))
+            builder.setRestoreState(getBoolean(R.styleable.NavAction_restoreState, false))
             builder.setPopUpTo(
-                array.getResourceId(R.styleable.NavAction_popUpTo, -1),
-                array.getBoolean(R.styleable.NavAction_popUpToInclusive, false),
-                array.getBoolean(R.styleable.NavAction_popUpToSaveState, false)
+                getResourceId(R.styleable.NavAction_popUpTo, -1),
+                getBoolean(R.styleable.NavAction_popUpToInclusive, false),
+                getBoolean(R.styleable.NavAction_popUpToSaveState, false)
             )
-            builder.setEnterAnim(array.getResourceId(R.styleable.NavAction_enterAnim, -1))
-            builder.setExitAnim(array.getResourceId(R.styleable.NavAction_exitAnim, -1))
-            builder.setPopEnterAnim(array.getResourceId(R.styleable.NavAction_popEnterAnim, -1))
-            builder.setPopExitAnim(array.getResourceId(R.styleable.NavAction_popExitAnim, -1))
+            builder.setEnterAnim(getResourceId(R.styleable.NavAction_enterAnim, -1))
+            builder.setExitAnim(getResourceId(R.styleable.NavAction_exitAnim, -1))
+            builder.setPopEnterAnim(getResourceId(R.styleable.NavAction_popEnterAnim, -1))
+            builder.setPopExitAnim(getResourceId(R.styleable.NavAction_popExitAnim, -1))
             action.navOptions = builder.build()
             val args = Bundle()
             val innerDepth = parser.depth + 1
diff --git a/navigation/navigation-safe-args-generator/build.gradle b/navigation/navigation-safe-args-generator/build.gradle
index 22d143a..68d7bf3 100644
--- a/navigation/navigation-safe-args-generator/build.gradle
+++ b/navigation/navigation-safe-args-generator/build.gradle
@@ -19,23 +19,21 @@
 import androidx.build.SdkHelperKt
 import androidx.build.SupportConfig
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("kotlin")
 }
 
 dependencies {
-    implementation(XPP3)
-    implementation(XMLPULL)
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.xpp3)
+    implementation(libs.xmlpull)
+    implementation(libs.kotlinStdlib)
 
-    implementation(JAVAPOET)
-    implementation(KOTLINPOET)
+    implementation(libs.javapoet)
+    implementation(libs.kotlinPoet)
 
-    testImplementation(JUNIT)
-    testImplementation(GOOGLE_COMPILE_TESTING)
+    testImplementation(libs.junit)
+    testImplementation(libs.googleCompileTesting)
     testImplementation(fileTree(
             dir: "${SdkHelperKt.getSdkPath(project)}/platforms/$SupportConfig.COMPILE_SDK_VERSION/",
             include : "android.jar"
diff --git a/navigation/navigation-safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/kotlin/KotlinNavWriter.kt b/navigation/navigation-safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/kotlin/KotlinNavWriter.kt
index 96140c9..bf91bd6 100644
--- a/navigation/navigation-safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/kotlin/KotlinNavWriter.kt
+++ b/navigation/navigation-safe-args-generator/src/main/kotlin/androidx/navigation/safe/args/generator/kotlin/KotlinNavWriter.kt
@@ -127,25 +127,30 @@
     internal fun generateDirectionTypeSpec(action: Action): TypeSpec {
         val className = ClassName("", action.id.javaIdentifier.toCamelCase())
 
-        val getActionIdFunSpec = FunSpec.builder("getActionId")
-            .addModifiers(KModifier.OVERRIDE)
-            .returns(Int::class)
-            .addStatement("return %L", action.id.accessor())
-            .build()
+        val actionIdPropSpec =
+            PropertySpec.builder("actionId", Int::class, KModifier.OVERRIDE)
+                .initializer("%L", action.id.accessor()).build()
 
-        val getArgumentsFunSpec = FunSpec.builder("getArguments").apply {
-            addModifiers(KModifier.OVERRIDE)
-            if (action.args.any { it.type is ObjectType }) {
-                addAnnotation(CAST_NEVER_SUCCEEDS)
-            }
-            returns(BUNDLE_CLASSNAME)
-            val resultVal = "result"
-            addStatement("val %L = %T()", resultVal, BUNDLE_CLASSNAME)
-            action.args.forEach { arg ->
-                arg.type.addBundlePutStatement(this, arg, resultVal, "this.${arg.sanitizedName}")
-            }
-            addStatement("return %L", resultVal)
-        }.build()
+        val argumentsPropSpec =
+            PropertySpec.builder("arguments", BUNDLE_CLASSNAME, KModifier.OVERRIDE)
+                .getter(
+                    FunSpec.getterBuilder().apply {
+                        if (action.args.any { it.type is ObjectType }) {
+                            addAnnotation(CAST_NEVER_SUCCEEDS)
+                        }
+                        val resultVal = "result"
+                        addStatement("val %L = %T()", resultVal, BUNDLE_CLASSNAME)
+                        action.args.forEach { arg ->
+                            arg.type.addBundlePutStatement(
+                                this,
+                                arg,
+                                resultVal,
+                                "this.${arg.sanitizedName}"
+                            )
+                        }
+                        addStatement("return %L", resultVal)
+                    }.build()
+                ).build()
 
         val constructorFunSpec = FunSpec.constructorBuilder()
             .addParameters(
@@ -178,8 +183,8 @@
                 )
         }.addSuperinterface(NAV_DIRECTION_CLASSNAME)
             .addModifiers(KModifier.PRIVATE)
-            .addFunction(getActionIdFunSpec)
-            .addFunction(getArgumentsFunSpec)
+            .addProperty(actionIdPropSpec)
+            .addProperty(argumentsPropSpec)
             .build()
     }
 
diff --git a/navigation/navigation-safe-args-generator/src/test/test-data/expected/kotlin_nav_writer_test/MainFragmentDirections.kt b/navigation/navigation-safe-args-generator/src/test/test-data/expected/kotlin_nav_writer_test/MainFragmentDirections.kt
index 70eb55c..474e7bf 100644
--- a/navigation/navigation-safe-args-generator/src/test/test-data/expected/kotlin_nav_writer_test/MainFragmentDirections.kt
+++ b/navigation/navigation-safe-args-generator/src/test/test-data/expected/kotlin_nav_writer_test/MainFragmentDirections.kt
@@ -11,14 +11,15 @@
     public val main: String,
     public val optional: String = "bla"
   ) : NavDirections {
-    public override fun getActionId(): Int = R.id.next
+    public override val actionId: Int = R.id.next
 
-    public override fun getArguments(): Bundle {
-      val result = Bundle()
-      result.putString("main", this.main)
-      result.putString("optional", this.optional)
-      return result
-    }
+    public override val arguments: Bundle
+      get() {
+        val result = Bundle()
+        result.putString("main", this.main)
+        result.putString("optional", this.optional)
+        return result
+      }
   }
 
   public companion object {
diff --git a/navigation/navigation-safe-args-generator/src/test/test-data/expected/kotlin_nav_writer_test/Next.kt b/navigation/navigation-safe-args-generator/src/test/test-data/expected/kotlin_nav_writer_test/Next.kt
index 0358452..10a9e3c 100644
--- a/navigation/navigation-safe-args-generator/src/test/test-data/expected/kotlin_nav_writer_test/Next.kt
+++ b/navigation/navigation-safe-args-generator/src/test/test-data/expected/kotlin_nav_writer_test/Next.kt
@@ -19,36 +19,37 @@
   public val parcelable: ActivityInfo,
   public val innerData: ActivityInfo.WindowLayout
 ) : NavDirections {
-  public override fun getActionId(): Int = R.id.next
+  public override val actionId: Int = R.id.next
 
-  @Suppress("CAST_NEVER_SUCCEEDS")
-  public override fun getArguments(): Bundle {
-    val result = Bundle()
-    result.putString("main", this.main)
-    result.putInt("mainInt", this.mainInt)
-    result.putString("optional", this.optional)
-    result.putInt("optionalInt", this.optionalInt)
-    if (Parcelable::class.java.isAssignableFrom(ActivityInfo::class.java)) {
-      result.putParcelable("optionalParcelable", this.optionalParcelable as Parcelable?)
-    } else if (Serializable::class.java.isAssignableFrom(ActivityInfo::class.java)) {
-      result.putSerializable("optionalParcelable", this.optionalParcelable as Serializable?)
+  public override val arguments: Bundle
+    @Suppress("CAST_NEVER_SUCCEEDS")
+    get() {
+      val result = Bundle()
+      result.putString("main", this.main)
+      result.putInt("mainInt", this.mainInt)
+      result.putString("optional", this.optional)
+      result.putInt("optionalInt", this.optionalInt)
+      if (Parcelable::class.java.isAssignableFrom(ActivityInfo::class.java)) {
+        result.putParcelable("optionalParcelable", this.optionalParcelable as Parcelable?)
+      } else if (Serializable::class.java.isAssignableFrom(ActivityInfo::class.java)) {
+        result.putSerializable("optionalParcelable", this.optionalParcelable as Serializable?)
+      }
+      if (Parcelable::class.java.isAssignableFrom(ActivityInfo::class.java)) {
+        result.putParcelable("parcelable", this.parcelable as Parcelable)
+      } else if (Serializable::class.java.isAssignableFrom(ActivityInfo::class.java)) {
+        result.putSerializable("parcelable", this.parcelable as Serializable)
+      } else {
+        throw UnsupportedOperationException(ActivityInfo::class.java.name +
+            " must implement Parcelable or Serializable or must be an Enum.")
+      }
+      if (Parcelable::class.java.isAssignableFrom(ActivityInfo.WindowLayout::class.java)) {
+        result.putParcelable("innerData", this.innerData as Parcelable)
+      } else if (Serializable::class.java.isAssignableFrom(ActivityInfo.WindowLayout::class.java)) {
+        result.putSerializable("innerData", this.innerData as Serializable)
+      } else {
+        throw UnsupportedOperationException(ActivityInfo.WindowLayout::class.java.name +
+            " must implement Parcelable or Serializable or must be an Enum.")
+      }
+      return result
     }
-    if (Parcelable::class.java.isAssignableFrom(ActivityInfo::class.java)) {
-      result.putParcelable("parcelable", this.parcelable as Parcelable)
-    } else if (Serializable::class.java.isAssignableFrom(ActivityInfo::class.java)) {
-      result.putSerializable("parcelable", this.parcelable as Serializable)
-    } else {
-      throw UnsupportedOperationException(ActivityInfo::class.java.name +
-          " must implement Parcelable or Serializable or must be an Enum.")
-    }
-    if (Parcelable::class.java.isAssignableFrom(ActivityInfo.WindowLayout::class.java)) {
-      result.putParcelable("innerData", this.innerData as Parcelable)
-    } else if (Serializable::class.java.isAssignableFrom(ActivityInfo.WindowLayout::class.java)) {
-      result.putSerializable("innerData", this.innerData as Serializable)
-    } else {
-      throw UnsupportedOperationException(ActivityInfo.WindowLayout::class.java.name +
-          " must implement Parcelable or Serializable or must be an Enum.")
-    }
-    return result
-  }
 }
diff --git a/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_overridden_action/InnerSettingsDirections.kt b/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_overridden_action/InnerSettingsDirections.kt
index 1790afe..67a10c3 100644
--- a/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_overridden_action/InnerSettingsDirections.kt
+++ b/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_overridden_action/InnerSettingsDirections.kt
@@ -9,13 +9,14 @@
   private data class Exit(
     public val exitReason: Int
   ) : NavDirections {
-    public override fun getActionId(): Int = R.id.exit
+    public override val actionId: Int = R.id.exit
 
-    public override fun getArguments(): Bundle {
-      val result = Bundle()
-      result.putInt("exitReason", this.exitReason)
-      return result
-    }
+    public override val arguments: Bundle
+      get() {
+        val result = Bundle()
+        result.putInt("exitReason", this.exitReason)
+        return result
+      }
   }
 
   public companion object {
diff --git a/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_overridden_action/SettingsDirections.kt b/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_overridden_action/SettingsDirections.kt
index 25f9192..ad3d07a 100644
--- a/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_overridden_action/SettingsDirections.kt
+++ b/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_overridden_action/SettingsDirections.kt
@@ -9,25 +9,27 @@
   private data class Main(
     public val enterReason: String = "DEFAULT"
   ) : NavDirections {
-    public override fun getActionId(): Int = R.id.main
+    public override val actionId: Int = R.id.main
 
-    public override fun getArguments(): Bundle {
-      val result = Bundle()
-      result.putString("enterReason", this.enterReason)
-      return result
-    }
+    public override val arguments: Bundle
+      get() {
+        val result = Bundle()
+        result.putString("enterReason", this.enterReason)
+        return result
+      }
   }
 
   private data class Exit(
     public val exitReason: String = "DEFAULT"
   ) : NavDirections {
-    public override fun getActionId(): Int = R.id.exit
+    public override val actionId: Int = R.id.exit
 
-    public override fun getArguments(): Bundle {
-      val result = Bundle()
-      result.putString("exitReason", this.exitReason)
-      return result
-    }
+    public override val arguments: Bundle
+      get() {
+        val result = Bundle()
+        result.putString("exitReason", this.exitReason)
+        return result
+      }
   }
 
   public companion object {
diff --git a/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_same_action/SettingsDirections.kt b/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_same_action/SettingsDirections.kt
index e8c8d17..181a8df 100644
--- a/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_same_action/SettingsDirections.kt
+++ b/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_same_action/SettingsDirections.kt
@@ -9,13 +9,14 @@
   private data class Exit(
     public val exitReason: String = "DEFAULT"
   ) : NavDirections {
-    public override fun getActionId(): Int = R.id.exit
+    public override val actionId: Int = R.id.exit
 
-    public override fun getArguments(): Bundle {
-      val result = Bundle()
-      result.putString("exitReason", this.exitReason)
-      return result
-    }
+    public override val arguments: Bundle
+      get() {
+        val result = Bundle()
+        result.putString("exitReason", this.exitReason)
+        return result
+      }
   }
 
   public companion object {
diff --git a/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_same_action/SettingsFragmentDirections.kt b/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_same_action/SettingsFragmentDirections.kt
index dee9a87..f566d27 100644
--- a/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_same_action/SettingsFragmentDirections.kt
+++ b/navigation/navigation-safe-args-generator/src/test/test-data/expected/nav_generator_test/kotlin/nested_same_action/SettingsFragmentDirections.kt
@@ -10,13 +10,14 @@
   private data class Exit(
     public val exitReason: String = "DIFFERENT"
   ) : NavDirections {
-    public override fun getActionId(): Int = R.id.exit
+    public override val actionId: Int = R.id.exit
 
-    public override fun getArguments(): Bundle {
-      val result = Bundle()
-      result.putString("exitReason", this.exitReason)
-      return result
-    }
+    public override val arguments: Bundle
+      get() {
+        val result = Bundle()
+        result.putString("exitReason", this.exitReason)
+        return result
+      }
   }
 
   public companion object {
diff --git a/navigation/navigation-safe-args-gradle-plugin/build.gradle b/navigation/navigation-safe-args-gradle-plugin/build.gradle
index c327f2c..49cfde0 100644
--- a/navigation/navigation-safe-args-gradle-plugin/build.gradle
+++ b/navigation/navigation-safe-args-gradle-plugin/build.gradle
@@ -18,8 +18,6 @@
 import androidx.build.LibraryType
 import androidx.build.SdkResourceGenerator
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("kotlin")
@@ -28,13 +26,13 @@
 
 dependencies {
     implementation("com.android.tools.build:gradle:4.0.1")
-    implementation(KOTLIN_GRADLE_PLUGIN)
+    implementation(libs.kotlinGradlePlugin)
     api(project(":navigation:navigation-safe-args-generator"))
     api(gradleApi())
-    implementation(GSON)
+    implementation(libs.gson)
     testImplementation(gradleTestKit())
     testImplementation(project(":internal-testutils-gradle-plugin"))
-    testImplementation(JUNIT)
+    testImplementation(libs.junit)
 }
 
 SdkResourceGenerator.generateForHostTest(project)
diff --git a/navigation/navigation-testing/build.gradle b/navigation/navigation-testing/build.gradle
index 139c664..6404f62 100644
--- a/navigation/navigation-testing/build.gradle
+++ b/navigation/navigation-testing/build.gradle
@@ -14,13 +14,9 @@
  * limitations under the License.
  */
 
-
-import androidx.build.AndroidXExtension
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -34,12 +30,12 @@
     androidTestImplementation(project(":internal-testutils-navigation"), {
         exclude group: "androidx.navigation", module: "navigation-common"
     })
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_EXT_TRUTH)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(TRUTH)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testExtTruth)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.truth)
 }
 
 androidx {
diff --git a/navigation/navigation-testing/src/androidTest/java/androidx/navigation/testing/TestNavHostControllerTest.kt b/navigation/navigation-testing/src/androidTest/java/androidx/navigation/testing/TestNavHostControllerTest.kt
index 2612a35..76aa369 100644
--- a/navigation/navigation-testing/src/androidTest/java/androidx/navigation/testing/TestNavHostControllerTest.kt
+++ b/navigation/navigation-testing/src/androidTest/java/androidx/navigation/testing/TestNavHostControllerTest.kt
@@ -76,6 +76,7 @@
         assertThat(backStack[1].destination).isInstanceOf(TestNavigator.Destination::class.java)
     }
 
+    @Suppress("DEPRECATION")
     @UiThreadTest
     @Test
     fun testDsl() {
diff --git a/navigation/navigation-ui-ktx/build.gradle b/navigation/navigation-ui-ktx/build.gradle
index f2b8964..a45c3cf 100644
--- a/navigation/navigation-ui-ktx/build.gradle
+++ b/navigation/navigation-ui-ktx/build.gradle
@@ -14,10 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
diff --git a/navigation/navigation-ui/api/public_plus_experimental_current.txt b/navigation/navigation-ui/api/public_plus_experimental_current.txt
index 8be4b08..188dc9f 100644
--- a/navigation/navigation-ui/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-ui/api/public_plus_experimental_current.txt
@@ -58,12 +58,10 @@
 
   public final class NavigationUI {
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static com.google.android.material.bottomsheet.BottomSheetBehavior<?>? findBottomSheetBehavior(android.view.View view);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.navigation.NavDestination findStartDestination(androidx.navigation.NavGraph graph);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static boolean matchDestination(androidx.navigation.NavDestination destination, @IdRes int destId);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static boolean matchDestinations(androidx.navigation.NavDestination destination, java.util.Set<java.lang.Integer> destinationIds);
     method public static boolean navigateUp(androidx.navigation.NavController navController, androidx.customview.widget.Openable? openableLayout);
     method public static boolean navigateUp(androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration);
     method public static boolean onNavDestinationSelected(android.view.MenuItem item, androidx.navigation.NavController navController);
+    method @androidx.navigation.ui.NavigationUiSaveStateControl public static boolean onNavDestinationSelected(android.view.MenuItem item, androidx.navigation.NavController navController, boolean saveState);
     method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity activity, androidx.navigation.NavController navController, androidx.customview.widget.Openable? openableLayout);
     method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity activity, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
     method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity activity, androidx.navigation.NavController navController);
@@ -74,10 +72,15 @@
     method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout collapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
     method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout collapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController);
     method public static void setupWithNavController(com.google.android.material.navigation.NavigationView navigationView, androidx.navigation.NavController navController);
+    method @androidx.navigation.ui.NavigationUiSaveStateControl public static void setupWithNavController(com.google.android.material.navigation.NavigationView navigationView, androidx.navigation.NavController navController, boolean saveState);
     method public static void setupWithNavController(com.google.android.material.navigation.NavigationBarView navigationBarView, androidx.navigation.NavController navController);
+    method @androidx.navigation.ui.NavigationUiSaveStateControl public static void setupWithNavController(com.google.android.material.navigation.NavigationBarView navigationBarView, androidx.navigation.NavController navController, boolean saveState);
     field public static final androidx.navigation.ui.NavigationUI INSTANCE;
   }
 
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface NavigationUiSaveStateControl {
+  }
+
   public final class NavigationViewKt {
     method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController navController);
   }
diff --git a/navigation/navigation-ui/build.gradle b/navigation/navigation-ui/build.gradle
index 0333fb6..60c9b7a 100644
--- a/navigation/navigation-ui/build.gradle
+++ b/navigation/navigation-ui/build.gradle
@@ -14,10 +14,9 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
@@ -41,16 +40,17 @@
     api("androidx.drawerlayout:drawerlayout:1.1.1")
     api("com.google.android.material:material:1.4.0-beta01")
     implementation("androidx.transition:transition:1.3.0")
+    api("androidx.annotation:annotation-experimental:1.1.0")
 
     androidTestImplementation(project(":internal-testutils-navigation"), {
         exclude group: "androidx.navigation", module: "navigation-common"
     })
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(MULTIDEX)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.multidex)
 }
 
 androidx {
@@ -60,3 +60,10 @@
     inceptionYear = "2018"
     description = "Android Navigation-UI"
 }
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
+    }
+}
diff --git a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt
index 1f393b1..c2576ae 100644
--- a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt
+++ b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt
@@ -42,6 +42,7 @@
         context = InstrumentationRegistry.getInstrumentation().targetContext
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun testTopLevelFromGraph() {
         val navGraph = NavController(context).apply {
diff --git a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt
index 4fe3d282..0e0166c 100644
--- a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt
+++ b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt
@@ -18,6 +18,7 @@
 
 import androidx.navigation.NavGraph
 import androidx.navigation.NavGraphNavigator
+import androidx.navigation.ui.NavigationUI.matchDestinations
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import androidx.testutils.TestNavigator
@@ -36,6 +37,6 @@
             parent = NavGraph(NavGraphNavigator(TestNavigatorProvider()))
         }
 
-        assertThat(NavigationUI.matchDestinations(destination, setOf(1, 2))).isTrue()
+        assertThat(destination.matchDestinations(setOf(1, 2))).isTrue()
     }
 }
diff --git a/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AbstractAppBarOnDestinationChangedListener.kt b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AbstractAppBarOnDestinationChangedListener.kt
index 4886464..66ebd17 100644
--- a/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AbstractAppBarOnDestinationChangedListener.kt
+++ b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AbstractAppBarOnDestinationChangedListener.kt
@@ -27,6 +27,7 @@
 import androidx.navigation.FloatingWindow
 import androidx.navigation.NavController
 import androidx.navigation.NavDestination
+import androidx.navigation.ui.NavigationUI.matchDestinations
 import java.lang.ref.WeakReference
 import java.util.regex.Pattern
 
@@ -85,10 +86,7 @@
             matcher.appendTail(title)
             setTitle(title)
         }
-        val isTopLevelDestination = NavigationUI.matchDestinations(
-            destination,
-            topLevelDestinations
-        )
+        val isTopLevelDestination = destination.matchDestinations(topLevelDestinations)
         if (openableLayout == null && isTopLevelDestination) {
             setNavigationIcon(null, 0)
         } else {
diff --git a/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AppBarConfiguration.kt b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AppBarConfiguration.kt
index cd91cc8..252f385 100644
--- a/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AppBarConfiguration.kt
+++ b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AppBarConfiguration.kt
@@ -20,6 +20,7 @@
 import androidx.customview.widget.Openable
 import androidx.drawerlayout.widget.DrawerLayout
 import androidx.navigation.NavGraph
+import androidx.navigation.NavGraph.Companion.findStartDestination
 import androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener
 import java.util.HashSet
 
@@ -96,7 +97,7 @@
          * start destination of the graph.
          */
         public constructor(navGraph: NavGraph) {
-            topLevelDestinations.add(NavigationUI.findStartDestination(navGraph).id)
+            topLevelDestinations.add(navGraph.findStartDestination().id)
         }
 
         /**
diff --git a/navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUI.kt b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUI.kt
index 2192929..99ccacd 100644
--- a/navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUI.kt
+++ b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUI.kt
@@ -29,15 +29,15 @@
 import androidx.navigation.ActivityNavigator
 import androidx.navigation.NavController
 import androidx.navigation.NavDestination
-import androidx.navigation.NavGraph
+import androidx.navigation.NavDestination.Companion.hierarchy
+import androidx.navigation.NavGraph.Companion.findStartDestination
 import androidx.navigation.NavOptions
 import com.google.android.material.appbar.CollapsingToolbarLayout
-import com.google.android.material.bottomsheet.BottomSheetBehavior
 import com.google.android.material.bottomnavigation.BottomNavigationView
+import com.google.android.material.bottomsheet.BottomSheetBehavior
 import com.google.android.material.navigation.NavigationBarView
-import com.google.android.material.navigationrail.NavigationRailView
 import com.google.android.material.navigation.NavigationView
-import java.lang.IllegalArgumentException
+import com.google.android.material.navigationrail.NavigationRailView
 import java.lang.ref.WeakReference
 
 /**
@@ -81,7 +81,7 @@
         }
         if (item.order and Menu.CATEGORY_SECONDARY == 0) {
             builder.setPopUpTo(
-                findStartDestination(navController.graph).id,
+                navController.graph.findStartDestination().id,
                 inclusive = false,
                 saveState = true
             )
@@ -97,6 +97,69 @@
     }
 
     /**
+     * Attempt to navigate to the [NavDestination] associated with the given MenuItem. This
+     * MenuItem should have been added via one of the helper methods in this class.
+     *
+     * Importantly, it assumes the [menu item id][MenuItem.getItemId] matches a valid
+     * [action id][NavDestination.getAction] or [destination id][NavDestination.id] to be
+     * navigated to.
+     *
+     * By default, the back stack will be popped back to the navigation graph's start destination.
+     * Menu items that have `android:menuCategory="secondary"` will not pop the back
+     * stack.
+     *
+     * @param item The selected MenuItem.
+     * @param navController The NavController that hosts the destination.
+     * @param saveState Whether the NavController should save the back stack state. This must
+     * always be `false`: leave this parameter off entirely to use the non-experimental version
+     * of this API, which saves the state by default.
+     *
+     * @return True if the [NavController] was able to navigate to the destination
+     * associated with the given MenuItem.
+     */
+    @NavigationUiSaveStateControl
+    @JvmStatic
+    public fun onNavDestinationSelected(
+        item: MenuItem,
+        navController: NavController,
+        saveState: Boolean
+    ): Boolean {
+        check(!saveState) {
+            "Leave the saveState parameter out entirely to use the non-experimental version of " +
+                "this API, which saves the state by default"
+        }
+        val builder = NavOptions.Builder().setLaunchSingleTop(true)
+        if (
+            navController.currentDestination!!.parent!!.findNode(item.itemId)
+            is ActivityNavigator.Destination
+        ) {
+            builder.setEnterAnim(R.anim.nav_default_enter_anim)
+                .setExitAnim(R.anim.nav_default_exit_anim)
+                .setPopEnterAnim(R.anim.nav_default_pop_enter_anim)
+                .setPopExitAnim(R.anim.nav_default_pop_exit_anim)
+        } else {
+            builder.setEnterAnim(R.animator.nav_default_enter_anim)
+                .setExitAnim(R.animator.nav_default_exit_anim)
+                .setPopEnterAnim(R.animator.nav_default_pop_enter_anim)
+                .setPopExitAnim(R.animator.nav_default_pop_exit_anim)
+        }
+        if (item.order and Menu.CATEGORY_SECONDARY == 0) {
+            builder.setPopUpTo(
+                navController.graph.findStartDestination().id,
+                inclusive = false
+            )
+        }
+        val options = builder.build()
+        return try {
+            // TODO provide proper API instead of using Exceptions as Control-Flow.
+            navController.navigate(item.itemId, null, options)
+            true
+        } catch (e: IllegalArgumentException) {
+            false
+        }
+    }
+
+    /**
      * Handles the Up button by delegating its behavior to the given NavController. This should
      * generally be called from [AppCompatActivity.onSupportNavigateUp].
      *
@@ -140,10 +203,8 @@
         val openableLayout = configuration.openableLayout
         val currentDestination = navController.currentDestination
         val topLevelDestinations = configuration.topLevelDestinations
-        return if (openableLayout != null && currentDestination != null && matchDestinations(
-                currentDestination,
-                topLevelDestinations
-            )
+        return if (openableLayout != null && currentDestination != null &&
+            currentDestination.matchDestinations(topLevelDestinations)
         ) {
             openableLayout.open()
             true
@@ -419,7 +480,76 @@
                         return
                     }
                     view.menu.forEach { item ->
-                        item.isChecked = matchDestination(destination, item.itemId)
+                        item.isChecked = destination.matchDestination(item.itemId)
+                    }
+                }
+            })
+    }
+
+    /**
+     * Sets up a [NavigationView] for use with a [NavController]. This will call
+     * [onNavDestinationSelected] when a menu item is selected.
+     * The selected item in the NavigationView will automatically be updated when the destination
+     * changes.
+     *
+     * If the [NavigationView] is directly contained with an [Openable] layout,
+     * it will be closed when a menu item is selected.
+     *
+     * Similarly, if the [NavigationView] has a [BottomSheetBehavior] associated with
+     * it (as is the case when using a [com.google.android.material.bottomsheet.BottomSheetDialog]),
+     * the bottom sheet will be hidden when a menu item is selected.
+     *
+     * @param navigationView The NavigationView that should be kept in sync with changes to the
+     * NavController.
+     * @param navController The NavController that supplies the primary and secondary menu.
+     * @param saveState Whether the NavController should save the back stack state. This must
+     * always be `false`: leave this parameter off entirely to use the non-experimental version
+     * of this API, which saves the state by default.
+     *
+     * Navigation actions on this NavController will be reflected in the
+     * selected item in the NavigationView.
+     */
+    @NavigationUiSaveStateControl
+    @JvmStatic
+    public fun setupWithNavController(
+        navigationView: NavigationView,
+        navController: NavController,
+        saveState: Boolean
+    ) {
+        check(!saveState) {
+            "Leave the saveState parameter out entirely to use the non-experimental version of " +
+                "this API, which saves the state by default"
+        }
+        navigationView.setNavigationItemSelectedListener { item ->
+            val handled = onNavDestinationSelected(item, navController, saveState)
+            if (handled) {
+                val parent = navigationView.parent
+                if (parent is Openable) {
+                    parent.close()
+                } else {
+                    val bottomSheetBehavior = findBottomSheetBehavior(navigationView)
+                    if (bottomSheetBehavior != null) {
+                        bottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
+                    }
+                }
+            }
+            handled
+        }
+        val weakReference = WeakReference(navigationView)
+        navController.addOnDestinationChangedListener(
+            object : NavController.OnDestinationChangedListener {
+                override fun onDestinationChanged(
+                    controller: NavController,
+                    destination: NavDestination,
+                    arguments: Bundle?
+                ) {
+                    val view = weakReference.get()
+                    if (view == null) {
+                        navController.removeOnDestinationChangedListener(this)
+                        return
+                    }
+                    view.menu.forEach { item ->
+                        item.isChecked = destination.matchDestination(item.itemId)
                     }
                 }
             })
@@ -485,7 +615,60 @@
                         return
                     }
                     view.menu.forEach { item ->
-                        if (matchDestination(destination, item.itemId)) {
+                        if (destination.matchDestination(item.itemId)) {
+                            item.isChecked = true
+                        }
+                    }
+                }
+            })
+    }
+
+    /**
+     * Sets up a [NavigationBarView] for use with a [NavController]. This will call
+     * [onNavDestinationSelected] when a menu item is selected. The
+     * selected item in the NavigationBarView will automatically be updated when the destination
+     * changes.
+     *
+     * @param navigationBarView The NavigationBarView ([BottomNavigationView] or
+     * [NavigationRailView])
+     * that should be kept in sync with changes to the NavController.
+     * @param navController The NavController that supplies the primary menu.
+     * @param saveState Whether the NavController should save the back stack state. This must
+     * always be `false`: leave this parameter off entirely to use the non-experimental version
+     * of this API, which saves the state by default.
+     *
+     * Navigation actions on this NavController will be reflected in the
+     * selected item in the NavigationBarView.
+     */
+    @NavigationUiSaveStateControl
+    @JvmStatic
+    public fun setupWithNavController(
+        navigationBarView: NavigationBarView,
+        navController: NavController,
+        saveState: Boolean
+    ) {
+        check(!saveState) {
+            "Leave the saveState parameter out entirely to use the non-experimental version of " +
+                "this API, which saves the state by default"
+        }
+        navigationBarView.setOnItemSelectedListener { item ->
+            onNavDestinationSelected(item, navController, saveState)
+        }
+        val weakReference = WeakReference(navigationBarView)
+        navController.addOnDestinationChangedListener(
+            object : NavController.OnDestinationChangedListener {
+                override fun onDestinationChanged(
+                    controller: NavController,
+                    destination: NavDestination,
+                    arguments: Bundle?
+                ) {
+                    val view = weakReference.get()
+                    if (view == null) {
+                        navController.removeOnDestinationChangedListener(this)
+                        return
+                    }
+                    view.menu.forEach { item ->
+                        if (destination.matchDestination(item.itemId)) {
                             item.isChecked = true
                         }
                     }
@@ -499,14 +682,8 @@
      * the given id is a parent/grandparent/etc of the destination.
      */
     @JvmStatic
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun matchDestination(destination: NavDestination, @IdRes destId: Int): Boolean {
-        var currentDestination: NavDestination? = destination
-        while (currentDestination!!.id != destId && currentDestination.parent != null) {
-            currentDestination = currentDestination.parent
-        }
-        return currentDestination.id == destId
-    }
+    internal fun NavDestination.matchDestination(@IdRes destId: Int): Boolean =
+        hierarchy.any { it.id == destId }
 
     /**
      * Determines whether the given `destinationIds` match the NavDestination. This
@@ -514,22 +691,6 @@
      * case where the given ids is a parent/grandparent/etc of the destination.
      */
     @JvmStatic
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun matchDestinations(destination: NavDestination, destinationIds: Set<Int?>): Boolean =
-        generateSequence(destination) { it.parent }.any { destinationIds.contains(it.id) }
-
-    /**
-     * Finds the actual start destination of the graph, handling cases where the graph's starting
-     * destination is itself a NavGraph.
-     */
-    @JvmStatic
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun findStartDestination(graph: NavGraph): NavDestination =
-        generateSequence(graph.findNode(graph.startDestinationId)) {
-            if (it is NavGraph) {
-                it.findNode(it.startDestinationId)
-            } else {
-                null
-            }
-        }.last()
+    internal fun NavDestination.matchDestinations(destinationIds: Set<Int?>): Boolean =
+        hierarchy.any { destinationIds.contains(it.id) }
 }
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUiSaveStateControl.kt
similarity index 62%
copy from camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
copy to navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUiSaveStateControl.kt
index bfc1884..724eeb1 100644
--- a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
+++ b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUiSaveStateControl.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+package androidx.navigation.ui
 
-import static org.junit.Assert.assertNotNull;
-
-import org.junit.Test;
-
-public class VersionNameTest {
-    @Test
-    public void testCurrentVersion_shouldNotEmpty() {
-        assertNotNull(VersionName.getCurrentVersion().getVersion());
-    }
-}
+/**
+ * @see NavigationUI
+ */
+@Retention(AnnotationRetention.RUNTIME)
+@Target(AnnotationTarget.FUNCTION)
+@RequiresOptIn(level = RequiresOptIn.Level.WARNING)
+public annotation class NavigationUiSaveStateControl
\ No newline at end of file
diff --git a/paging/integration-tests/testapp/lint-baseline.xml b/paging/integration-tests/testapp/lint-baseline.xml
index 6d2337a..647083f 100644
--- a/paging/integration-tests/testapp/lint-baseline.xml
+++ b/paging/integration-tests/testapp/lint-baseline.xml
@@ -1,16 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.error_occurred` appears to be unused"
-        errorLine1="    &lt;string name=&quot;error_occurred&quot;>An error occurred while loading.&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="22"
-            column="13"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="SyntheticAccessor"
diff --git a/paging/runtime/lint-baseline.xml b/paging/runtime/lint-baseline.xml
index 9f5fe7a..42a176b 100644
--- a/paging/runtime/lint-baseline.xml
+++ b/paging/runtime/lint-baseline.xml
@@ -1,103 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.paging`)"
-        errorLine1="    internal var mainThreadExecutor = ArchTaskExecutor.getMainThreadExecutor()"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/paging/AsyncPagedListDiffer.kt"
-            line="131"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.paging`)"
-        errorLine1="    fetchExecutor: Executor = ArchTaskExecutor.getIOThreadExecutor()"
-        errorLine2="                              ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/paging/LivePagedList.kt"
-            line="161"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.paging`)"
-        errorLine1="    fetchExecutor: Executor = ArchTaskExecutor.getIOThreadExecutor()"
-        errorLine2="                              ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/paging/LivePagedList.kt"
-            line="203"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.paging`)"
-        errorLine1="    fetchDispatcher: CoroutineDispatcher = ArchTaskExecutor.getIOThreadExecutor()"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/paging/LivePagedList.kt"
-            line="256"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.paging`)"
-        errorLine1="        ArchTaskExecutor.getMainThreadExecutor().asCoroutineDispatcher(),"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/paging/LivePagedList.kt"
-            line="265"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.paging`)"
-        errorLine1="    fetchDispatcher: CoroutineDispatcher = ArchTaskExecutor.getIOThreadExecutor()"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/paging/LivePagedList.kt"
-            line="308"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.paging`)"
-        errorLine1="        ArchTaskExecutor.getMainThreadExecutor().asCoroutineDispatcher(),"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/paging/LivePagedList.kt"
-            line="317"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.paging`)"
-        errorLine1="    private var fetchDispatcher = ArchTaskExecutor.getIOThreadExecutor().asCoroutineDispatcher()"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/paging/LivePagedListBuilder.kt"
-            line="51"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="ArchTaskExecutor can only be called from within the same library group prefix (referenced groupId=`androidx.arch.core` with prefix androidx.arch from groupId=`androidx.paging`)"
-        errorLine1="            ArchTaskExecutor.getMainThreadExecutor().asCoroutineDispatcher(),"
-        errorLine2="            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/paging/LivePagedListBuilder.kt"
-            line="297"
-            column="13"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
 </issues>
diff --git a/percentlayout/percentlayout/lint-baseline.xml b/percentlayout/percentlayout/lint-baseline.xml
index 358f41a..e39961e 100644
--- a/percentlayout/percentlayout/lint-baseline.xml
+++ b/percentlayout/percentlayout/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/playground-common/playground-build.gradle b/playground-common/playground-build.gradle
index 0509722..b14459d7 100644
--- a/playground-common/playground-build.gradle
+++ b/playground-common/playground-build.gradle
@@ -55,7 +55,6 @@
     dependencies {
         classpath(libs.androidGradlePlugin)
         classpath(libs.kotlinGradlePlugin)
-        classpath(libs.kgpLeakPatcher)
         classpath(libs.kspGradlePlugin)
         classpath(libs.gson)
         classpath "androidx.build:gradle-plugin:0.1.0"
diff --git a/playground-common/playground.properties b/playground-common/playground.properties
index 3e7dfa5..945474e 100644
--- a/playground-common/playground.properties
+++ b/playground-common/playground.properties
@@ -26,7 +26,7 @@
 kotlin.code.style=official
 # Disable docs
 androidx.enableDocumentation=false
-androidx.playground.snapshotBuildId=7378367
+androidx.playground.snapshotBuildId=7396899
 androidx.playground.metalavaBuildId=7255182
 androidx.playground.dokkaBuildId=7299536
 androidx.studio.type=playground
diff --git a/preference/preference/lint-baseline.xml b/preference/preference/lint-baseline.xml
index 244ddad2..df5ab01 100644
--- a/preference/preference/lint-baseline.xml
+++ b/preference/preference/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
@@ -2017,17 +2017,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        CharSequence provideSummary(T preference);"
-        errorLine2="                                    ~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="2189"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public BaseSavedState(Parcel source) {"
         errorLine2="                              ~~~~~~">
         <location
@@ -2634,17 +2623,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public &lt;T extends Preference> T findPreference(CharSequence key) {"
-        errorLine2="                                  ~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="480"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public &lt;T extends Preference> T findPreference(CharSequence key) {"
         errorLine2="                                                   ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceFragment.java"
diff --git a/print/print/lint-baseline.xml b/print/print/lint-baseline.xml
index 9f73e72..e0ec659 100644
--- a/print/print/lint-baseline.xml
+++ b/print/print/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/profileinstaller/integration-tests/init-macrobenchmark-target/README.md b/profileinstaller/integration-tests/init-macrobenchmark-target/README.md
new file mode 100644
index 0000000..1bed279
--- /dev/null
+++ b/profileinstaller/integration-tests/init-macrobenchmark-target/README.md
@@ -0,0 +1 @@
+Benchmark startup overhead introduced by profileinstaller's use of startup library
\ No newline at end of file
diff --git a/profileinstaller/integration-tests/init-macrobenchmark-target/build.gradle b/profileinstaller/integration-tests/init-macrobenchmark-target/build.gradle
new file mode 100644
index 0000000..411e5df
--- /dev/null
+++ b/profileinstaller/integration-tests/init-macrobenchmark-target/build.gradle
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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("AndroidXPlugin")
+    id("com.android.application")
+    id("kotlin-android")
+}
+
+android {
+    buildTypes {
+        release {
+            minifyEnabled true
+            shrinkResources true
+            proguardFiles getDefaultProguardFile("proguard-android-optimize.txt")
+        }
+    }
+}
+
+dependencies {
+    implementation(KOTLIN_STDLIB)
+    implementation(project(":profileinstaller:profileinstaller"))
+}
diff --git a/profileinstaller/integration-tests/init-macrobenchmark-target/src/main/AndroidManifest.xml b/profileinstaller/integration-tests/init-macrobenchmark-target/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2fbc15
--- /dev/null
+++ b/profileinstaller/integration-tests/init-macrobenchmark-target/src/main/AndroidManifest.xml
@@ -0,0 +1,48 @@
+<!--
+  ~ Copyright 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="androidx.profileinstaller.integration.macrobenchmark.target">
+
+    <application
+        android:label="Profileinstaller Macrobenchmark Target"
+        android:allowBackup="false"
+        android:supportsRtl="true"
+        tools:ignore="MissingApplicationIcon">
+
+        <!-- Profileable to enable macrobenchmark profiling -->
+        <!--suppress AndroidElementNotAllowed -->
+        <profileable android:shell="true"/>
+
+        <!--
+        Activities need to be exported so the macrobenchmark can discover them
+        under the new package visibility changes for Android 11.
+         -->
+        <activity
+            android:name=".SimpleTextActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="profileinstaller.init.macrobenchmark.TARGET" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/profileinstaller/integration-tests/init-macrobenchmark-target/src/main/java/androidx/profileinstaller/integration/macrobenchmark/target/SimpleTextActivity.kt b/profileinstaller/integration-tests/init-macrobenchmark-target/src/main/java/androidx/profileinstaller/integration/macrobenchmark/target/SimpleTextActivity.kt
new file mode 100644
index 0000000..c19d537
--- /dev/null
+++ b/profileinstaller/integration-tests/init-macrobenchmark-target/src/main/java/androidx/profileinstaller/integration/macrobenchmark/target/SimpleTextActivity.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.profileinstaller.integration.macrobenchmark.target
+
+import android.app.Activity
+import android.os.Bundle
+import android.widget.TextView
+
+class SimpleTextActivity : Activity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_main)
+
+        val notice = findViewById<TextView>(R.id.txtNotice)
+        notice.setText(R.string.app_notice)
+    }
+}
diff --git a/profileinstaller/integration-tests/init-macrobenchmark-target/src/main/res/layout/activity_main.xml b/profileinstaller/integration-tests/init-macrobenchmark-target/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..42146bc
--- /dev/null
+++ b/profileinstaller/integration-tests/init-macrobenchmark-target/src/main/res/layout/activity_main.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  Copyright 2020 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/txtNotice"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textSize="50sp"
+        tools:text="profileinstaller benchmark️" />
+
+</FrameLayout>
diff --git a/profileinstaller/integration-tests/init-macrobenchmark-target/src/main/res/values/donottranslate-strings.xml b/profileinstaller/integration-tests/init-macrobenchmark-target/src/main/res/values/donottranslate-strings.xml
new file mode 100644
index 0000000..c2c1ed3
--- /dev/null
+++ b/profileinstaller/integration-tests/init-macrobenchmark-target/src/main/res/values/donottranslate-strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright 2020 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<resources>
+    <string name="app_notice">profileinstaller macrobenchmark app.</string>
+</resources>
diff --git a/profileinstaller/integration-tests/init-macrobenchmark/build.gradle b/profileinstaller/integration-tests/init-macrobenchmark/build.gradle
new file mode 100644
index 0000000..33e00c2
--- /dev/null
+++ b/profileinstaller/integration-tests/init-macrobenchmark/build.gradle
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.Publish
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("kotlin-android")
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 28
+    }
+}
+
+dependencies {
+    androidTestImplementation(project(":profileinstaller:profileinstaller"))
+    androidTestImplementation(project(":benchmark:benchmark-macro-junit4"))
+    androidTestImplementation(project(":internal-testutils-macrobenchmark"))
+    androidTestImplementation(ANDROIDX_TEST_RULES)
+    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
+    androidTestImplementation(ANDROIDX_TEST_CORE)
+    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+}
+
+def installReleaseTarget = tasks.getByPath(
+        ":profileinstaller:integration-tests:init-macrobenchmark-target:installRelease"
+)
+
+// Define a task dependency so the app is installed before we run macro benchmarks.
+tasks.getByPath(":profileinstaller:integration-tests:init-macrobenchmark:connectedCheck")
+    .dependsOn(installReleaseTarget)
diff --git a/profileinstaller/integration-tests/init-macrobenchmark/src/androidTest/AndroidManifest.xml b/profileinstaller/integration-tests/init-macrobenchmark/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..c1bd315
--- /dev/null
+++ b/profileinstaller/integration-tests/init-macrobenchmark/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<manifest package="androidx.profileinstaller.integration.macrobenchmark.test"/>
diff --git a/profileinstaller/integration-tests/init-macrobenchmark/src/androidTest/java/androidx/profileinstaller/integration/macrobenchmark/ProfileinstallerStartupBenchmark.kt b/profileinstaller/integration-tests/init-macrobenchmark/src/androidTest/java/androidx/profileinstaller/integration/macrobenchmark/ProfileinstallerStartupBenchmark.kt
new file mode 100644
index 0000000..83d0a926
--- /dev/null
+++ b/profileinstaller/integration-tests/init-macrobenchmark/src/androidTest/java/androidx/profileinstaller/integration/macrobenchmark/ProfileinstallerStartupBenchmark.kt
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.profileinstaller.integration.macrobenchmark
+
+import androidx.benchmark.macro.CompilationMode
+import androidx.benchmark.macro.StartupMode
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
+import androidx.test.filters.LargeTest
+import androidx.testutils.createStartupCompilationParams
+import androidx.testutils.measureStartup
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+class ProfileinstallerStartupBenchmark(
+    private val startupMode: StartupMode,
+    private val compilationMode: CompilationMode
+) {
+    @get:Rule
+    val benchmarkRule = MacrobenchmarkRule()
+
+    @Test
+    fun startup() = benchmarkRule.measureStartup(
+        compilationMode = compilationMode,
+        startupMode = startupMode,
+        packageName = "androidx.profileinstaller.integration.macrobenchmark.target"
+    ) {
+        action = "profileinstaller.init.macrobenchmark.TARGET"
+    }
+
+    companion object {
+        @Parameterized.Parameters(name = "startup={0},compilation={1}")
+        @JvmStatic
+        fun parameters() = createStartupCompilationParams()
+    }
+}
\ No newline at end of file
diff --git a/profileinstaller/integration-tests/init-macrobenchmark/src/main/AndroidManifest.xml b/profileinstaller/integration-tests/init-macrobenchmark/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..ccd5d59
--- /dev/null
+++ b/profileinstaller/integration-tests/init-macrobenchmark/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<manifest package="androidx.profileinstaller.integration.macrobenchmark" />
diff --git a/profileinstaller/profileinstaller/integration-tests/testapp/build.gradle b/profileinstaller/integration-tests/testapp/build.gradle
similarity index 100%
rename from profileinstaller/profileinstaller/integration-tests/testapp/build.gradle
rename to profileinstaller/integration-tests/testapp/build.gradle
diff --git a/profileinstaller/profileinstaller/integration-tests/testapp/cli/all_compose_profile.txt b/profileinstaller/integration-tests/testapp/cli/all_compose_profile.txt
similarity index 100%
rename from profileinstaller/profileinstaller/integration-tests/testapp/cli/all_compose_profile.txt
rename to profileinstaller/integration-tests/testapp/cli/all_compose_profile.txt
diff --git a/profileinstaller/profileinstaller/integration-tests/testapp/cli/build_bundle_launch.sh b/profileinstaller/integration-tests/testapp/cli/build_bundle_launch.sh
similarity index 91%
rename from profileinstaller/profileinstaller/integration-tests/testapp/cli/build_bundle_launch.sh
rename to profileinstaller/integration-tests/testapp/cli/build_bundle_launch.sh
index cfcb5dc..ad3ab2b 100755
--- a/profileinstaller/profileinstaller/integration-tests/testapp/cli/build_bundle_launch.sh
+++ b/profileinstaller/integration-tests/testapp/cli/build_bundle_launch.sh
@@ -19,20 +19,20 @@
 
 SCRIPT=`realpath $0`
 SCRIPT_DIR=`dirname $SCRIPT`
-SUPPORT_DIR=$SCRIPT_DIR/../../../../../
+SUPPORT_DIR=$SCRIPT_DIR/../../../../
 TMP_DIR=`mktemp -d`
 
 pushd $SUPPORT_DIR
 
 echo "===START=== Rebuilding apk..."
 ANDROIDX_PROJECTS=COMPOSE ./gradlew \
-  :profileinstaller:profileinstaller:integration-tests:testapp:clean
+  :profileinstaller:integration-tests:testapp:clean
 if [ $DEBUG = true ]; then
   ANDROIDX_PROJECTS=COMPOSE ./gradlew \
-    :profileinstaller:profileinstaller:integration-tests:testapp:assembleDebug
+    :profileinstaller:integration-tests:testapp:assembleDebug
 else
   ANDROIDX_PROJECTS=COMPOSE ./gradlew \
-    :profileinstaller:profileinstaller:integration-tests:testapp:assembleRelease
+    :profileinstaller:integration-tests:testapp:assembleRelease
 fi
 echo "===/DONE=== Rebuilding apk..."
 
diff --git a/profileinstaller/profileinstaller/integration-tests/testapp/cli/instructions.md b/profileinstaller/integration-tests/testapp/cli/instructions.md
similarity index 100%
rename from profileinstaller/profileinstaller/integration-tests/testapp/cli/instructions.md
rename to profileinstaller/integration-tests/testapp/cli/instructions.md
diff --git a/profileinstaller/profileinstaller/integration-tests/testapp/cli/profgen-cli.jar b/profileinstaller/integration-tests/testapp/cli/profgen-cli.jar
similarity index 100%
rename from profileinstaller/profileinstaller/integration-tests/testapp/cli/profgen-cli.jar
rename to profileinstaller/integration-tests/testapp/cli/profgen-cli.jar
Binary files differ
diff --git a/profileinstaller/profileinstaller/integration-tests/testapp/cli/repackage.py b/profileinstaller/integration-tests/testapp/cli/repackage.py
similarity index 94%
rename from profileinstaller/profileinstaller/integration-tests/testapp/cli/repackage.py
rename to profileinstaller/integration-tests/testapp/cli/repackage.py
index 9a5db31..3b30a3f 100755
--- a/profileinstaller/profileinstaller/integration-tests/testapp/cli/repackage.py
+++ b/profileinstaller/integration-tests/testapp/cli/repackage.py
@@ -14,13 +14,13 @@
 PATH_TO_APKSIGNER = 'apksigner'
 
 SCRIPT_PATH = Path(__file__).parent.absolute()
-SUPPORT_PATH = (SCRIPT_PATH / Path("../../../../..")).resolve()
+SUPPORT_PATH = (SCRIPT_PATH / Path("../../../..")).resolve()
 ROOT_DIR = (SUPPORT_PATH / Path("../..")).resolve()
 BUILD_OUT_DIR = (Path(SUPPORT_PATH) / Path(
-    "../../out/androidx/profileinstaller/profileinstaller/integration-tests/"
+    "../../out/androidx/profileinstaller/integration-tests/"
     "testapp/build/outputs/apk/")).resolve()
 MAPPING_OUT_PATH = (Path(SUPPORT_PATH) / Path(
-    "../../out/androidx/profileinstaller/profileinstaller/integration-tests/"
+    "../../out/androidx/profileinstaller/integration-tests/"
     "testapp/build/outputs/mapping/release/mapping.txt")).resolve()
 
 APK_PREFIX = "testapp"
@@ -119,6 +119,8 @@
     working_dir.mkdir()
     working_apk = working_dir / Path("working.apk")
     shutil.copyfile(apk_src, working_apk)
+    print(f"copying to {SUPPORT_PATH / Path('baseline.prof')}")
+    shutil.copyfile(profile, SUPPORT_PATH / Path("baseline.prof"))
     with ZipFile(working_apk, 'a') as zip:
         profile_destination = Path('assets/dexopt/') / Path(APK_PROFILE_FILE)
         if str(profile_destination) in [it.filename for it in zip.infolist()]:
@@ -155,4 +157,4 @@
     profile = profile_from(args.profile)
     jar = jar_from(args.jar)
     output_apk = output_apk_from(args.output)
-    generate_apk(apk_src, profile, jar, output_apk, args.debug, args.apk_signer)
\ No newline at end of file
+    generate_apk(apk_src, profile, jar, output_apk, args.debug, args.apk_signer)
diff --git a/profileinstaller/profileinstaller/integration-tests/testapp/src/main/AndroidManifest.xml b/profileinstaller/integration-tests/testapp/src/main/AndroidManifest.xml
similarity index 100%
rename from profileinstaller/profileinstaller/integration-tests/testapp/src/main/AndroidManifest.xml
rename to profileinstaller/integration-tests/testapp/src/main/AndroidManifest.xml
diff --git a/profileinstaller/profileinstaller/integration-tests/testapp/src/main/java/androidx/profileinstaller/integration/testapp/MainActivity.kt b/profileinstaller/integration-tests/testapp/src/main/java/androidx/profileinstaller/integration/testapp/MainActivity.kt
similarity index 100%
rename from profileinstaller/profileinstaller/integration-tests/testapp/src/main/java/androidx/profileinstaller/integration/testapp/MainActivity.kt
rename to profileinstaller/integration-tests/testapp/src/main/java/androidx/profileinstaller/integration/testapp/MainActivity.kt
diff --git a/profileinstaller/profileinstaller/integration-tests/testapp/OWNERS b/profileinstaller/profileinstaller/integration-tests/testapp/OWNERS
deleted file mode 100644
index 42abc4e..0000000
--- a/profileinstaller/profileinstaller/integration-tests/testapp/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
[email protected]
[email protected]
diff --git a/recommendation/recommendation/lint-baseline.xml b/recommendation/recommendation/lint-baseline.xml
index 9106d21..3d898bf 100644
--- a/recommendation/recommendation/lint-baseline.xml
+++ b/recommendation/recommendation/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/recyclerview/recyclerview-selection/lint-baseline.xml b/recyclerview/recyclerview-selection/lint-baseline.xml
index b0dc212..b706440 100644
--- a/recyclerview/recyclerview-selection/lint-baseline.xml
+++ b/recyclerview/recyclerview-selection/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/recyclerview/recyclerview/lint-baseline.xml b/recyclerview/recyclerview/lint-baseline.xml
index fe668a0..3f8be2c 100644
--- a/recyclerview/recyclerview/lint-baseline.xml
+++ b/recyclerview/recyclerview/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
@@ -1610,17 +1610,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected T getItem(int position) {"
-        errorLine2="              ~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/ListAdapter.java"
-            line="149"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public RecyclerView.LayoutManager getLayoutManager() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2754,17 +2743,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public &lt;T> T get(int resourceId) {"
-        errorLine2="                   ~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="12945"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public void put(int resourceId, Object data) {"
         errorLine2="                                        ~~~~~~">
         <location
@@ -3150,94 +3128,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public int add(T item) {"
-        errorLine2="                   ~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="142"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public boolean remove(T item) {"
-        errorLine2="                          ~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="573"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public T removeItemAt(int index) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="585"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void updateItemAt(int index, T item) {"
-        errorLine2="                                        ~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="630"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public T get(int index) throws IndexOutOfBoundsException {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="704"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public int indexOf(T item) {"
-        errorLine2="                       ~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="727"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        abstract public int compare(T2 o1, T2 o2);"
-        errorLine2="                                    ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="854"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        abstract public int compare(T2 o1, T2 o2);"
-        errorLine2="                                           ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="854"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public void onChanged(int position, int count, Object payload) {"
         errorLine2="                                                       ~~~~~~">
         <location
@@ -3249,72 +3139,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        abstract public boolean areContentsTheSame(T2 oldItem, T2 newItem);"
-        errorLine2="                                                   ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="887"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        abstract public boolean areContentsTheSame(T2 oldItem, T2 newItem);"
-        errorLine2="                                                               ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="887"
-            column="64"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        abstract public boolean areItemsTheSame(T2 item1, T2 item2);"
-        errorLine2="                                                ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="899"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        abstract public boolean areItemsTheSame(T2 item1, T2 item2);"
-        errorLine2="                                                          ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="899"
-            column="59"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Object getChangePayload(T2 item1, T2 item2) {"
-        errorLine2="                                       ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="919"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Object getChangePayload(T2 item1, T2 item2) {"
-        errorLine2="                                                 ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="919"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public BatchedCallback(Callback&lt;T2> wrappedCallback) {"
         errorLine2="                               ~~~~~~~~~~~~">
         <location
@@ -3326,28 +3150,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public int compare(T2 o1, T2 o2) {"
-        errorLine2="                           ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="957"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public int compare(T2 o1, T2 o2) {"
-        errorLine2="                                  ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="957"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public void onChanged(int position, int count, Object payload) {"
         errorLine2="                                                       ~~~~~~">
         <location
@@ -3359,72 +3161,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public boolean areContentsTheSame(T2 oldItem, T2 newItem) {"
-        errorLine2="                                          ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="987"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public boolean areContentsTheSame(T2 oldItem, T2 newItem) {"
-        errorLine2="                                                      ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="987"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public boolean areItemsTheSame(T2 item1, T2 item2) {"
-        errorLine2="                                       ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="992"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public boolean areItemsTheSame(T2 item1, T2 item2) {"
-        errorLine2="                                                 ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="992"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Object getChangePayload(T2 item1, T2 item2) {"
-        errorLine2="                                       ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="998"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Object getChangePayload(T2 item1, T2 item2) {"
-        errorLine2="                                                 ~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SortedList.java"
-            line="998"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public SortedListAdapterCallback(RecyclerView.Adapter adapter) {"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/remotecallback/processor/lint-baseline.xml b/remotecallback/processor/lint-baseline.xml
index 2b20e46..3b674ab 100644
--- a/remotecallback/processor/lint-baseline.xml
+++ b/remotecallback/processor/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/remotecallback/remotecallback/lint-baseline.xml b/remotecallback/remotecallback/lint-baseline.xml
index 0f06786..7c9f849 100644
--- a/remotecallback/remotecallback/lint-baseline.xml
+++ b/remotecallback/remotecallback/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="LambdaLast"
@@ -38,17 +38,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public T createRemoteCallback(Context context) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/remotecallback/AppWidgetProviderWithCallbacks.java"
-            line="49"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public T createRemoteCallback(Context context) {"
         errorLine2="                                  ~~~~~~~">
         <location
             file="src/main/java/androidx/remotecallback/AppWidgetProviderWithCallbacks.java"
@@ -148,17 +137,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public T createRemoteCallback(Context context) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/remotecallback/BroadcastReceiverWithCallbacks.java"
-            line="55"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public T createRemoteCallback(Context context) {"
         errorLine2="                                  ~~~~~~~">
         <location
             file="src/main/java/androidx/remotecallback/BroadcastReceiverWithCallbacks.java"
@@ -302,17 +280,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public &lt;T extends CallbackReceiver> T getAndResetStub(Class&lt;? extends CallbackReceiver> cls,"
-        errorLine2="                                        ~">
-        <location
-            file="src/main/java/androidx/remotecallback/CallbackHandlerRegistry.java"
-            line="56"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public &lt;T extends CallbackReceiver> T getAndResetStub(Class&lt;? extends CallbackReceiver> cls,"
         errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/remotecallback/CallbackHandlerRegistry.java"
@@ -356,17 +323,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public &lt;T extends CallbackReceiver> void invokeCallback(Context context, T receiver,"
-        errorLine2="                                                                             ~">
-        <location
-            file="src/main/java/androidx/remotecallback/CallbackHandlerRegistry.java"
-            line="102"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="            Intent intent) {"
         errorLine2="            ~~~~~~">
         <location
@@ -389,17 +345,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public &lt;T extends CallbackReceiver> void invokeCallback(Context context, T receiver,"
-        errorLine2="                                                                             ~">
-        <location
-            file="src/main/java/androidx/remotecallback/CallbackHandlerRegistry.java"
-            line="111"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="            Bundle bundle) {"
         errorLine2="            ~~~~~~">
         <location
@@ -511,17 +456,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        void executeCallback(Context context, T receiver, Bundle arguments);"
-        errorLine2="                                              ~">
-        <location
-            file="src/main/java/androidx/remotecallback/CallbackHandlerRegistry.java"
-            line="235"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        void executeCallback(Context context, T receiver, Bundle arguments);"
         errorLine2="                                                          ~~~~~~">
         <location
             file="src/main/java/androidx/remotecallback/CallbackHandlerRegistry.java"
@@ -533,17 +467,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    T createRemoteCallback(Context context);"
-        errorLine2="    ~">
-        <location
-            file="src/main/java/androidx/remotecallback/CallbackReceiver.java"
-            line="107"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    T createRemoteCallback(Context context);"
         errorLine2="                           ~~~~~~~">
         <location
             file="src/main/java/androidx/remotecallback/CallbackReceiver.java"
@@ -621,17 +544,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public T createRemoteCallback(Context context) {"
-        errorLine2="           ~">
-        <location
-            file="src/main/java/androidx/remotecallback/ContentProviderWithCallbacks.java"
-            line="62"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public T createRemoteCallback(Context context) {"
         errorLine2="                                  ~~~~~~~">
         <location
             file="src/main/java/androidx/remotecallback/ContentProviderWithCallbacks.java"
@@ -764,17 +676,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public static &lt;T extends CallbackReceiver> T create(Class&lt;T> cls, Context context) {"
-        errorLine2="                                               ~">
-        <location
-            file="src/main/java/androidx/remotecallback/RemoteCallback.java"
-            line="144"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static &lt;T extends CallbackReceiver> T create(Class&lt;T> cls, Context context) {"
         errorLine2="                                                        ~~~~~~~~">
         <location
             file="src/main/java/androidx/remotecallback/RemoteCallback.java"
diff --git a/resourceinspection/resourceinspection-processor/src/main/kotlin/androidx/resourceinspection/processor/InspectionCompanionGeneration.kt b/resourceinspection/resourceinspection-processor/src/main/kotlin/androidx/resourceinspection/processor/InspectionCompanionGeneration.kt
index 3789325..da5133e 100644
--- a/resourceinspection/resourceinspection-processor/src/main/kotlin/androidx/resourceinspection/processor/InspectionCompanionGeneration.kt
+++ b/resourceinspection/resourceinspection-processor/src/main/kotlin/androidx/resourceinspection/processor/InspectionCompanionGeneration.kt
@@ -43,11 +43,14 @@
         addModifiers(Modifier.PUBLIC, Modifier.FINAL)
         addSuperinterface(INSPECTION_COMPANION.parameterized(view.className))
         addAnnotation(REQUIRES_API)
+        addAnnotation(RESTRICT_TO)
 
         generatedAnnotation?.let { addAnnotation(it) }
 
         addOriginatingElement(view.type)
 
+        addJavadoc("Inspection companion for {@link \$T}.\n\n@hide", view.className)
+
         addField(
             FieldSpec.builder(TypeName.BOOLEAN, "mPropertiesMapped", Modifier.PRIVATE).run {
                 initializer("false")
@@ -57,8 +60,8 @@
 
         val attributeIdNames = NameAllocator().apply {
             for (attribute in view.attributes) {
-                @Suppress("DEPRECATION") // b/187985877
-                newName("m${attribute.name.capitalize(Locale.US)}Id", attribute)
+                val attributeName = attribute.name.replaceFirstChar { it.uppercase() }
+                newName("m${attributeName}Id", attribute)
             }
         }
 
@@ -231,3 +234,12 @@
     AnnotationSpec.builder(ClassName.get("androidx.annotation", "RequiresApi"))
         .addMember("value", "\$L", MIN_SDK)
         .build()
+
+private val RESTRICT_TO: AnnotationSpec =
+    AnnotationSpec.builder(ClassName.get("androidx.annotation", "RestrictTo"))
+        .addMember(
+            "value",
+            "\$T.LIBRARY",
+            ClassName.get("androidx.annotation", "RestrictTo", "Scope")
+        )
+        .build()
\ No newline at end of file
diff --git a/resourceinspection/resourceinspection-processor/src/main/kotlin/androidx/resourceinspection/processor/LayoutInspectionStep.kt b/resourceinspection/resourceinspection-processor/src/main/kotlin/androidx/resourceinspection/processor/LayoutInspectionStep.kt
index 33bc66c..e84c680 100644
--- a/resourceinspection/resourceinspection-processor/src/main/kotlin/androidx/resourceinspection/processor/LayoutInspectionStep.kt
+++ b/resourceinspection/resourceinspection-processor/src/main/kotlin/androidx/resourceinspection/processor/LayoutInspectionStep.kt
@@ -206,7 +206,6 @@
                 if (getter.returnType.isAssignableTo(COLOR)) {
                     AttributeType.COLOR
                 } else {
-                    // TODO(b/180041034): Validate object types and unbox primitives
                     AttributeType.OBJECT
                 }
             else -> throw IllegalArgumentException("Unexpected attribute type")
diff --git a/resourceinspection/resourceinspection-processor/src/test/kotlin/androidx/resourceinspection/processor/ResourceInspectionProcessorTest.kt b/resourceinspection/resourceinspection-processor/src/test/kotlin/androidx/resourceinspection/processor/ResourceInspectionProcessorTest.kt
index 83ef333..5f77c43 100644
--- a/resourceinspection/resourceinspection-processor/src/test/kotlin/androidx/resourceinspection/processor/ResourceInspectionProcessorTest.kt
+++ b/resourceinspection/resourceinspection-processor/src/test/kotlin/androidx/resourceinspection/processor/ResourceInspectionProcessorTest.kt
@@ -66,10 +66,17 @@
                 import android.view.inspector.PropertyReader;
                 import androidx.annotation.NonNull;
                 import androidx.annotation.RequiresApi;
+                import androidx.annotation.RestrictTo;
                 import java.lang.Override;
                 import javax.annotation.processing.Generated;
 
+                /**
+                 * Inspection companion for {@link TrivialTestView}.
+                 *
+                 * @hide
+                 */
                 @RequiresApi(29)
+                @RestrictTo(RestrictTo.Scope.LIBRARY)
                 @Generated("androidx.resourceinspection.processor.ResourceInspectionProcessor")
                 public final class TrivialTestView${'$'}InspectionCompanion
                         implements InspectionCompanion<TrivialTestView>
@@ -155,10 +162,17 @@
                         import android.view.inspector.PropertyReader;
                         import androidx.annotation.NonNull;
                         import androidx.annotation.RequiresApi;
+                        import androidx.annotation.RestrictTo;
                         import java.lang.Override;
                         import javax.annotation.processing.Generated;
 
+                        /**
+                         * Inspection companion for {@link TrivialTestView}.
+                         *
+                         * @hide
+                         */
                         @RequiresApi(29)
+                        @RestrictTo(RestrictTo.Scope.LIBRARY)
                         @Generated("androidx.resourceinspection.processor.ResourceInspectionProcessor")
                         public final class MixedNamespaceTestView${'$'}InspectionCompanion
                                 implements InspectionCompanion<MixedNamespaceTestView> {
@@ -329,10 +343,17 @@
                         import android.view.inspector.PropertyReader;
                         import androidx.annotation.NonNull;
                         import androidx.annotation.RequiresApi;
+                        import androidx.annotation.RestrictTo;
                         import java.lang.Override;
                         import javax.annotation.processing.Generated;
 
+                        /**
+                         * Inspection companion for {@link SimpleTypesTestView}.
+                         *
+                         * @hide
+                         */
                         @RequiresApi(29)
+                        @RestrictTo(RestrictTo.Scope.LIBRARY)
                         @Generated("androidx.resourceinspection.processor.ResourceInspectionProcessor")
                         public final class SimpleTypesTestView${'$'}InspectionCompanion
                                 implements InspectionCompanion<SimpleTypesTestView> {
@@ -499,12 +520,19 @@
                         import android.view.inspector.PropertyReader;
                         import androidx.annotation.NonNull;
                         import androidx.annotation.RequiresApi;
+                        import androidx.annotation.RestrictTo;
                         import java.lang.Override;
                         import java.lang.String;
                         import java.util.function.IntFunction;
                         import javax.annotation.processing.Generated;
 
+                        /**
+                         * Inspection companion for {@link IntEnumTestView}.
+                         *
+                         * @hide
+                         */
                         @RequiresApi(29)
+                        @RestrictTo(RestrictTo.Scope.LIBRARY)
                         @Generated("androidx.resourceinspection.processor.ResourceInspectionProcessor")
                         public final class IntEnumTestView${'$'}InspectionCompanion
                                 implements InspectionCompanion<IntEnumTestView> {
@@ -598,6 +626,7 @@
                         import android.view.inspector.PropertyReader;
                         import androidx.annotation.NonNull;
                         import androidx.annotation.RequiresApi;
+                        import androidx.annotation.RestrictTo;
                         import java.lang.Override;
                         import java.lang.String;
                         import java.util.HashSet;
@@ -605,7 +634,13 @@
                         import java.util.function.IntFunction;
                         import javax.annotation.processing.Generated;
 
+                        /**
+                         * Inspection companion for {@link IntFlagTestView}.
+                         *
+                         * @hide
+                         */
                         @RequiresApi(29)
+                        @RestrictTo(RestrictTo.Scope.LIBRARY)
                         @Generated("androidx.resourceinspection.processor.ResourceInspectionProcessor")
                         public final class IntFlagTestView${'$'}InspectionCompanion
                                 implements InspectionCompanion<IntFlagTestView> {
@@ -895,11 +930,18 @@
                     import android.view.inspector.PropertyReader;
                     import androidx.annotation.NonNull;
                     import androidx.annotation.RequiresApi;
+                    import androidx.annotation.RestrictTo;
                     import androidx.appcompat.R;
                     import java.lang.Override;
                     import javax.annotation.processing.Generated;
 
+                    /**
+                     * Inspection companion for {@link BackgroundTintTestView}.
+                     *
+                     * @hide
+                     */
                     @RequiresApi(29)
+                    @RestrictTo(RestrictTo.Scope.LIBRARY)
                     @Generated("androidx.resourceinspection.processor.ResourceInspectionProcessor")
                     public final class BackgroundTintTestView${'$'}InspectionCompanion
                             implements InspectionCompanion<BackgroundTintTestView> {
@@ -979,13 +1021,20 @@
                     import android.view.inspector.PropertyReader;
                     import androidx.annotation.NonNull;
                     import androidx.annotation.RequiresApi;
+                    import androidx.annotation.RestrictTo;
                     import androidx.appcompat.R;
                     import java.lang.Override;
                     import java.lang.String;
                     import java.util.function.IntFunction;
                     import javax.annotation.processing.Generated;
 
+                    /**
+                     * Inspection companion for {@link AutoSizeTestView}.
+                     *
+                     * @hide
+                     */
                     @RequiresApi(29)
+                    @RestrictTo(RestrictTo.Scope.LIBRARY)
                     @Generated("androidx.resourceinspection.processor.ResourceInspectionProcessor")
                     public final class AutoSizeTestView${'$'}InspectionCompanion
                             implements InspectionCompanion<AutoSizeTestView> {
@@ -1089,11 +1138,18 @@
                     import android.view.inspector.PropertyReader;
                     import androidx.annotation.NonNull;
                     import androidx.annotation.RequiresApi;
+                    import androidx.annotation.RestrictTo;
                     import androidx.appcompat.R;
                     import java.lang.Override;
                     import javax.annotation.processing.Generated;
 
+                    /**
+                     * Inspection companion for {@link CheckMarkTintTestView}.
+                     *
+                     * @hide
+                     */
                     @RequiresApi(29)
+                    @RestrictTo(RestrictTo.Scope.LIBRARY)
                     @Generated("androidx.resourceinspection.processor.ResourceInspectionProcessor")
                     public final class CheckMarkTintTestView${'$'}InspectionCompanion
                         implements InspectionCompanion<CheckMarkTintTestView> {
@@ -1170,11 +1226,18 @@
                     import android.view.inspector.PropertyReader;
                     import androidx.annotation.NonNull;
                     import androidx.annotation.RequiresApi;
+                    import androidx.annotation.RestrictTo;
                     import androidx.appcompat.R;
                     import java.lang.Override;
                     import javax.annotation.processing.Generated;
 
+                    /**
+                     * Inspection companion for {@link CompoundButtonTintTestView}.
+                     *
+                     * @hide
+                     */
                     @RequiresApi(29)
+                    @RestrictTo(RestrictTo.Scope.LIBRARY)
                     @Generated("androidx.resourceinspection.processor.ResourceInspectionProcessor")
                     public final class CompoundButtonTintTestView${'$'}InspectionCompanion
                             implements InspectionCompanion<CompoundButtonTintTestView> {
@@ -1251,11 +1314,18 @@
                     import android.view.inspector.PropertyReader;
                     import androidx.annotation.NonNull;
                     import androidx.annotation.RequiresApi;
+                    import androidx.annotation.RestrictTo;
                     import androidx.appcompat.R;
                     import java.lang.Override;
                     import javax.annotation.processing.Generated;
 
+                    /**
+                     * Inspection companion for {@link CompoundDrawablesTestView}.
+                     *
+                     * @hide
+                     */
                     @RequiresApi(29)
+                    @RestrictTo(RestrictTo.Scope.LIBRARY)
                     @Generated("androidx.resourceinspection.processor.ResourceInspectionProcessor")
                     public final class CompoundDrawablesTestView${'$'}InspectionCompanion
                             implements InspectionCompanion<CompoundDrawablesTestView> {
@@ -1332,11 +1402,18 @@
                     import android.view.inspector.PropertyReader;
                     import androidx.annotation.NonNull;
                     import androidx.annotation.RequiresApi;
+                    import androidx.annotation.RestrictTo;
                     import androidx.appcompat.R;
                     import java.lang.Override;
                     import javax.annotation.processing.Generated;
 
+                    /**
+                     * Inspection companion for {@link ImageTintTestView}.
+                     *
+                     * @hide
+                     */
                     @RequiresApi(29)
+                    @RestrictTo(RestrictTo.Scope.LIBRARY)
                     @Generated("androidx.resourceinspection.processor.ResourceInspectionProcessor")
                     public final class ImageTintTestView${'$'}InspectionCompanion
                             implements InspectionCompanion<ImageTintTestView> {
diff --git a/room/common/lint-baseline.xml b/room/common/lint-baseline.xml
index dbe3c4a..5e43b57 100644
--- a/room/common/lint-baseline.xml
+++ b/room/common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/room/compiler-processing-testing/build.gradle b/room/compiler-processing-testing/build.gradle
index 9ef5aef..f36bac4 100644
--- a/room/compiler-processing-testing/build.gradle
+++ b/room/compiler-processing-testing/build.gradle
@@ -34,7 +34,7 @@
     implementation(KOTLIN_STDLIB_JDK8) // KSP defines older version as dependency, force update.
     implementation(libs.ksp)
     implementation(GOOGLE_COMPILE_TESTING)
-    implementation(KOTLIN_COMPILE_TESTING)
+    implementation(KOTLIN_COMPILE_TESTING_KSP)
     // specify these to match the kotlin compiler version in AndroidX rather than what KSP or KCT
     // uses
     implementation(KOTLIN_COMPILER_EMBEDDABLE)
diff --git a/room/compiler-processing-testing/src/main/java/com/tschuchort/compiletesting/KspKotlinCompileTesting.kt b/room/compiler-processing-testing/src/main/java/com/tschuchort/compiletesting/KspKotlinCompileTesting.kt
deleted file mode 100644
index a4ff231..0000000
--- a/room/compiler-processing-testing/src/main/java/com/tschuchort/compiletesting/KspKotlinCompileTesting.kt
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * This file replicates the KSP support in KotlinCompileTesting as a workaround not to wait for
- * the library to take KSP updates.
- *
- * Ideally, this file should either disappear and replaced with the KCT library OR moved to a
- * real AndroidX library as a replacement for KCT.
- *
- * see: https://github.com/tschuchortdev/kotlin-compile-testing/pull/140
- */
-package com.tschuchort.compiletesting
-
-import com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension
-import com.google.devtools.ksp.KspOptions
-import com.google.devtools.ksp.processing.KSPLogger
-import com.google.devtools.ksp.processing.SymbolProcessorProvider
-import com.google.devtools.ksp.processing.impl.MessageCollectorBasedKSPLogger
-import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
-import org.jetbrains.kotlin.cli.common.messages.MessageRenderer
-import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector
-import org.jetbrains.kotlin.cli.jvm.config.JavaSourceRoot
-import org.jetbrains.kotlin.com.intellij.mock.MockProject
-import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
-import org.jetbrains.kotlin.config.CompilerConfiguration
-import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
-import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
-import java.io.File
-
-/**
- * The list of symbol processors for the kotlin compilation.
- * https://goo.gle/ksp
- */
-var KotlinCompilation.symbolProcessorProviders: List<SymbolProcessorProvider>
-    get() = getKspRegistrar().providers
-    set(value) {
-        val registrar = getKspRegistrar()
-        registrar.providers = value
-    }
-
-/**
- * The directory where generated KSP sources are written
- */
-val KotlinCompilation.kspSourcesDir: File
-    get() = kspWorkingDir.resolve("sources")
-
-/**
- * Arbitrary arguments to be passed to ksp
- */
-var KotlinCompilation.kspArgs: MutableMap<String, String>
-    get() = getKspRegistrar().options
-    set(value) {
-        val registrar = getKspRegistrar()
-        registrar.options = value
-    }
-
-/**
- * Controls for enabling incremental processing logs in KSP.
- */
-var KotlinCompilation.kspIncrementalLog: Boolean
-    get() = getKspRegistrar().incrementalLog
-    set(value) {
-        val registrar = getKspRegistrar()
-        registrar.incrementalLog = value
-    }
-
-private val KotlinCompilation.kspJavaSourceDir: File
-    get() = kspSourcesDir.resolve("java")
-
-private val KotlinCompilation.kspKotlinSourceDir: File
-    get() = kspSourcesDir.resolve("kotlin")
-
-private val KotlinCompilation.kspResources: File
-    get() = kspSourcesDir.resolve("resources")
-
-/**
- * The working directory for KSP
- */
-private val KotlinCompilation.kspWorkingDir: File
-    get() = workingDir.resolve("ksp")
-
-/**
- * The directory where compiled KSP classes are written
- */
-// TODO this seems to be ignored by KSP and it is putting classes into regular classes directory
-//  but we still need to provide it in the KSP options builder as it is required
-//  once it works, we should make the property public.
-private val KotlinCompilation.kspClassesDir: File
-    get() = kspWorkingDir.resolve("classes")
-
-/**
- * The directory where compiled KSP caches are written
- */
-private val KotlinCompilation.kspCachesDir: File
-    get() = kspWorkingDir.resolve("caches")
-
-/**
- * Custom subclass of [AbstractKotlinSymbolProcessingExtension] where processors are pre-defined
- * instead of being
- * loaded via ServiceLocator.
- */
-private class KspTestExtension(
-    options: KspOptions,
-    processorProviders: List<SymbolProcessorProvider>,
-    logger: KSPLogger
-) : AbstractKotlinSymbolProcessingExtension(
-    options = options,
-    logger = logger,
-    testMode = false
-) {
-    private val loadedProviders = processorProviders
-
-    override fun loadProviders() = loadedProviders
-}
-
-/**
- * Registers the [KspTestExtension] to load the given list of processors.
- */
-private class KspCompileTestingComponentRegistrar(
-    private val compilation: KotlinCompilation
-) : ComponentRegistrar {
-    var providers = emptyList<SymbolProcessorProvider>()
-
-    var options: MutableMap<String, String> = mutableMapOf()
-
-    var incremental: Boolean = false
-    var incrementalLog: Boolean = false
-
-    override fun registerProjectComponents(
-        project: MockProject,
-        configuration: CompilerConfiguration
-    ) {
-        if (providers.isEmpty()) {
-            return
-        }
-        val options = KspOptions.Builder().apply {
-            this.projectBaseDir = compilation.kspWorkingDir
-
-            this.processingOptions.putAll(compilation.kspArgs)
-
-            this.incremental = [email protected]
-            this.incrementalLog = [email protected]
-
-            this.cachesDir = compilation.kspCachesDir.also {
-                it.deleteRecursively()
-                it.mkdirs()
-            }
-            this.kspOutputDir = compilation.kspSourcesDir.also {
-                it.deleteRecursively()
-                it.mkdirs()
-            }
-            this.classOutputDir = compilation.kspClassesDir.also {
-                it.deleteRecursively()
-                it.mkdirs()
-            }
-            this.javaOutputDir = compilation.kspJavaSourceDir.also {
-                it.deleteRecursively()
-                it.mkdirs()
-            }
-            this.kotlinOutputDir = compilation.kspKotlinSourceDir.also {
-                it.deleteRecursively()
-                it.mkdirs()
-            }
-            this.resourceOutputDir = compilation.kspResources.also {
-                it.deleteRecursively()
-                it.mkdirs()
-            }
-            configuration[CLIConfigurationKeys.CONTENT_ROOTS]
-                ?.filterIsInstance<JavaSourceRoot>()
-                ?.forEach {
-                    this.javaSourceRoots.add(it.file)
-                }
-        }.build()
-
-        // Temporary until friend-paths is fully supported
-        // https://youtrack.jetbrains.com/issue/KT-34102
-        @Suppress("invisible_member")
-        val messageCollectorBasedKSPLogger = MessageCollectorBasedKSPLogger(
-            PrintingMessageCollector(
-                compilation.internalMessageStreamAccess,
-                MessageRenderer.GRADLE_STYLE,
-                compilation.verbose
-            )
-        )
-        val registrar = KspTestExtension(options, providers, messageCollectorBasedKSPLogger)
-        AnalysisHandlerExtension.registerExtension(project, registrar)
-    }
-}
-
-/**
- * Gets the test registrar from the plugin list or adds if it does not exist.
- */
-private fun KotlinCompilation.getKspRegistrar(): KspCompileTestingComponentRegistrar {
-    compilerPlugins.firstIsInstanceOrNull<KspCompileTestingComponentRegistrar>()?.let {
-        return it
-    }
-    val kspRegistrar = KspCompileTestingComponentRegistrar(this)
-    compilerPlugins = compilerPlugins + kspRegistrar
-    return kspRegistrar
-}
\ No newline at end of file
diff --git a/room/compiler-processing/build.gradle b/room/compiler-processing/build.gradle
index dbe44c1..6d02085 100644
--- a/room/compiler-processing/build.gradle
+++ b/room/compiler-processing/build.gradle
@@ -42,7 +42,7 @@
     testImplementation(GOOGLE_COMPILE_TESTING)
     testImplementation(JUNIT)
     testImplementation(JSR250)
-    testImplementation(KOTLIN_COMPILE_TESTING)
+    testImplementation(KOTLIN_COMPILE_TESTING_KSP)
     testImplementation(libs.ksp)
     testImplementation(project(":room:room-compiler-processing-testing"))
 }
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinClassMetadataUtils.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinClassMetadataUtils.kt
index 2b3fc32..d5cccc5 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinClassMetadataUtils.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinClassMetadataUtils.kt
@@ -215,7 +215,7 @@
 
     fun isDataClass(): Boolean = Flag.Class.IS_DATA(flags)
 
-    fun isValueClass(): Boolean = Flag.Class.IS_INLINE(flags)
+    fun isValueClass(): Boolean = Flag.Class.IS_VALUE(flags)
 
     fun isFunctionalInterface(): Boolean = Flag.Class.IS_FUN(flags)
 
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinMetadataElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinMetadataElement.kt
index cf281c4..10b7be7 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinMetadataElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/KotlinMetadataElement.kt
@@ -99,7 +99,6 @@
                 KotlinClassHeader(
                     kind = kind,
                     metadataVersion = metadataVersion,
-                    bytecodeVersion = bytecodeVersion,
                     data1 = data1,
                     data2 = data2,
                     extraString = extraString,
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSAsMemberOf.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSAsMemberOf.kt
index 37a3569..53cd24a 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSAsMemberOf.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSAsMemberOf.kt
@@ -16,7 +16,6 @@
 
 package androidx.room.compiler.processing.ksp
 
-import com.google.devtools.ksp.processing.Resolver
 import com.google.devtools.ksp.symbol.KSFunctionDeclaration
 import com.google.devtools.ksp.symbol.KSPropertyDeclaration
 import com.google.devtools.ksp.symbol.KSType
@@ -25,7 +24,7 @@
 /**
  * Returns the type of a property as if it is member of the given [ksType].
  */
-internal fun KSPropertyDeclaration.typeAsMemberOf(resolver: Resolver, ksType: KSType?): KSType {
+internal fun KSPropertyDeclaration.typeAsMemberOf(ksType: KSType?): KSType {
     val resolved = type.resolve()
     if (isStatic()) {
         // calling as member with a static would throw as it might be a member of the companion
@@ -41,14 +40,12 @@
     if (resolved.isError) {
         return resolved
     }
-    return resolver.asMemberOf(
-        property = this,
+    return this.asMemberOf(
         containing = ksType
     )
 }
 
 internal fun KSValueParameter.typeAsMemberOf(
-    resolver: Resolver,
     functionDeclaration: KSFunctionDeclaration,
     ksType: KSType?
 ): KSType {
@@ -67,8 +64,7 @@
     if (ksType == null) {
         return resolved
     }
-    val asMember = resolver.asMemberOf(
-        function = functionDeclaration,
+    val asMember = functionDeclaration.asMemberOf(
         containing = ksType
     )
     // TODO b/173224718
@@ -78,7 +74,6 @@
 }
 
 internal fun KSFunctionDeclaration.returnTypeAsMemberOf(
-    resolver: Resolver,
     ksType: KSType?
 ): KSType {
     val resolved = returnType?.resolve()
@@ -91,8 +86,7 @@
             // object
             resolved
         }
-        else -> resolver.asMemberOf(
-            function = this,
+        else -> this.asMemberOf(
             containing = ksType
         ).returnType
     } ?: error("cannot find return type for $this")
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeReferenceExt.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeReferenceExt.kt
index 367ad09..1f2fb25 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeReferenceExt.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeReferenceExt.kt
@@ -54,8 +54,8 @@
 private class NoLocationTypeReference(
     val resolved: KSType
 ) : KSTypeReference {
-    override val annotations: List<KSAnnotation>
-        get() = emptyList()
+    override val annotations: Sequence<KSAnnotation>
+        get() = emptySequence()
     override val element: KSReferenceElement?
         get() = null
     override val location: Location
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspClassFileUtility.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspClassFileUtility.kt
index edc5904..0eb125b 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspClassFileUtility.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspClassFileUtility.kt
@@ -34,35 +34,9 @@
  *
  * KSP Bugs:
  *  * https://github.com/google/ksp/issues/250
- *  * https://github.com/google/ksp/issues/375
  */
 internal object KspClassFileUtility {
     /**
-     * Tries to resolve an Origin.CLASS into koltin or java.
-     * see: https://github.com/google/ksp/issues/375
-     */
-    fun findTrueOrigin(
-        ksClassDeclaration: KSClassDeclaration
-    ): Origin? {
-        if (ksClassDeclaration.origin != Origin.CLASS) {
-            return ksClassDeclaration.origin
-        }
-        return try {
-            val typeReferences = ReflectionReferences.getInstance(ksClassDeclaration) ?: return null
-            val descriptor =
-                typeReferences.getDescriptorMethod.invoke(ksClassDeclaration) ?: return null
-            val descriptorCanonicalName = descriptor::class.java.canonicalName
-            when {
-                descriptorCanonicalName.contains("Java") -> Origin.JAVA
-                descriptorCanonicalName.contains("DeserializedClassDescriptor") -> Origin.KOTLIN
-                else -> null
-            }
-        } catch (throwable: Throwable) {
-            null
-        }
-    }
-
-    /**
      * Sorts the given fields in the order they are declared in the backing class declaration.
      */
     fun orderFields(
@@ -110,7 +84,7 @@
 
     /**
      * Builds a field names comparator from the given class declaration if and only if its origin
-     * is CLASS.
+     * is Kotlin .class.
      * If it fails to find the order, returns null.
      */
     @Suppress("BanUncheckedReflection")
@@ -120,7 +94,9 @@
         getName: T.() -> String,
     ): MemberNameComparator<T>? {
         return try {
-            if (ksClassDeclaration.origin != Origin.CLASS) return null
+            // this is needed only for compiled kotlin classes
+            // https://github.com/google/ksp/issues/250#issuecomment-761108924
+            if (ksClassDeclaration.origin != Origin.KOTLIN_LIB) return null
             val typeReferences = ReflectionReferences.getInstance(ksClassDeclaration) ?: return null
             val descriptor = typeReferences.getDescriptorMethod.invoke(ksClassDeclaration)
                 ?: return null
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspElement.kt
index 887ef7e..be79499 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspElement.kt
@@ -63,8 +63,6 @@
     }
 
     override val docComment: String? by lazy {
-        // TODO: Not yet implemented in KSP.
-        // https://github.com/google/ksp/issues/392
-        null
+        (declaration as? KSDeclaration)?.docString
     }
 }
\ No newline at end of file
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableParameterElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableParameterElement.kt
index 883efc3..496364a 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableParameterElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableParameterElement.kt
@@ -38,7 +38,6 @@
 
     override val type: KspType by lazy {
         parameter.typeAsMemberOf(
-            resolver = env.resolver,
             functionDeclaration = method.declaration,
             ksType = method.containing.type?.ksType
         ).let {
@@ -58,7 +57,6 @@
         }
         check(other is KspType)
         return parameter.typeAsMemberOf(
-            resolver = env.resolver,
             functionDeclaration = method.declaration,
             ksType = other.ksType
         ).let {
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFieldElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFieldElement.kt
index 5418300..11a870b 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFieldElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFieldElement.kt
@@ -47,7 +47,7 @@
     override val type: KspType by lazy {
         env.wrap(
             originatingReference = declaration.type,
-            ksType = declaration.typeAsMemberOf(env.resolver, containing.type?.ksType)
+            ksType = declaration.typeAsMemberOf(containing.type?.ksType)
         )
     }
 
@@ -56,7 +56,7 @@
             return type
         }
         check(other is KspType)
-        val asMember = declaration.typeAsMemberOf(env.resolver, other.ksType)
+        val asMember = declaration.typeAsMemberOf(other.ksType)
         return env.wrap(
             originatingReference = declaration.type,
             ksType = asMember
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFileMemberContainer.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFileMemberContainer.kt
index 60df4da..d02b407 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFileMemberContainer.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFileMemberContainer.kt
@@ -58,11 +58,8 @@
 
     override val fallbackLocationText: String = ksFile.filePath
 
-    override val docComment: String? by lazy {
-        // TODO: Not yet implemented in KSP.
-        // https://github.com/google/ksp/issues/392
-        null
-    }
+    override val docComment: String?
+        get() = null
 
     companion object {
         private fun KSFile.findClassName(): String {
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspHasModifiers.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspHasModifiers.kt
index 298222a..5bfa700 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspHasModifiers.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspHasModifiers.kt
@@ -106,10 +106,8 @@
             // Unfortunately, we don't have a way of checking it as KotlinMetadata annotation is not
             // visible via KSP. We approximate it by checking if it is delegated or not.
             when (declaration.origin) {
-                Origin.JAVA -> true
-                Origin.KOTLIN -> declaration.hasJvmFieldAnnotation()
-                // TODO find a better way to check if class is derived from kotlin source or not.
-                Origin.CLASS -> declaration.hasJvmFieldAnnotation() || !declaration.isDelegated()
+                Origin.JAVA, Origin.JAVA_LIB -> true
+                Origin.KOTLIN, Origin.KOTLIN_LIB -> declaration.hasJvmFieldAnnotation()
                 else -> false
             }
         }
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodElement.kt
index c4df7a0..ab5e1ae 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodElement.kt
@@ -102,7 +102,6 @@
             val overridee = declaration.findOverridee()
             env.wrap(
                 ksType = declaration.returnTypeAsMemberOf(
-                    resolver = env.resolver,
                     ksType = containing.type?.ksType
                 ),
                 originatingReference = checkNotNull(overridee?.returnType ?: declaration.returnType)
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodType.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodType.kt
index ec69fdd..73f1dfc 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodType.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodType.kt
@@ -42,7 +42,7 @@
         origin.declaration.typeParameters.map {
             val typeParameterBounds = it.bounds.map {
                 it.typeName(env.resolver)
-            }.toTypedArray()
+            }.toList().toTypedArray()
             TypeVariableName.get(
                 it.name.asString(),
                 *typeParameterBounds
@@ -72,7 +72,6 @@
             env.wrap(
                 originatingReference = (overridee?.returnType ?: origin.declaration.returnType)!!,
                 ksType = origin.declaration.returnTypeAsMemberOf(
-                    resolver = env.resolver,
                     ksType = containing?.ksType
                 )
             )
@@ -92,7 +91,6 @@
             // suspend functions work w/ continuation so it is always boxed
             return env.wrap(
                 ksType = origin.declaration.returnTypeAsMemberOf(
-                    resolver = env.resolver,
                     ksType = containing?.ksType
                 ),
                 allowPrimitives = false
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeElement.kt
index 404c5f5..bd010f7 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeElement.kt
@@ -40,7 +40,6 @@
 import com.google.devtools.ksp.symbol.Modifier
 import com.google.devtools.ksp.symbol.Origin
 import com.squareup.javapoet.ClassName
-import javax.tools.Diagnostic
 
 internal sealed class KspTypeElement(
     env: KspProcessingEnv,
@@ -51,16 +50,6 @@
     XAnnotated by KspAnnotated.create(env, declaration, NO_USE_SITE),
     KspMemberContainer {
 
-    /**
-     * The true origin of this class file. This may not match `declaration.origin` when declaration
-     * is coming from a .class file.
-     *
-     * TODO: Remove this field when https://github.com/google/ksp/issues/375 is fixed.
-     */
-    val trueOrigin: Origin by lazy {
-        KspClassFileUtility.findTrueOrigin(declaration) ?: declaration.origin
-    }
-
     override val name: String by lazy {
         declaration.simpleName.asString()
     }
@@ -124,7 +113,7 @@
                 )
             }.let {
                 // only order instance fields, we don't care about the order of companion fields.
-                KspClassFileUtility.orderFields(declaration, it)
+                KspClassFileUtility.orderFields(declaration, it.toList())
             }
 
         val companionProperties = declaration
@@ -275,13 +264,7 @@
     }
 
     override fun isFunctionalInterface(): Boolean {
-        // TODO: Update this once KSP supports it
-        // https://github.com/google/ksp/issues/393
-        env.messager.printMessage(
-            Diagnostic.Kind.WARNING,
-            "XProcessing does not yet support checking for functional interfaces in KSP."
-        )
-        return false
+        return Modifier.FUN in declaration.modifiers
     }
 
     override fun isExpect(): Boolean {
@@ -348,7 +331,7 @@
                 containing = this,
                 declaration = it
             )
-        }
+        }.toList()
     }
 
     override fun getSuperInterfaceElements(): List<XTypeElement> {
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/OverrideVarianceResolver.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/OverrideVarianceResolver.kt
index 505ec1f..159d90d 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/OverrideVarianceResolver.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/OverrideVarianceResolver.kt
@@ -46,9 +46,9 @@
 ) {
     fun resolve(): XMethodType {
         // Look at the true origin to decide whether we need variance resolution or not.
-        val parentTrueOrigin = (methodType.origin.enclosingElement as? KspTypeElement)
-            ?.trueOrigin
-        if (parentTrueOrigin == Origin.JAVA) {
+        val parentOrigin = (methodType.origin.enclosingElement as? KspTypeElement)
+            ?.declaration?.origin
+        if (parentOrigin == Origin.JAVA || parentOrigin == Origin.JAVA_LIB) {
             return methodType
         }
         val overideeElm = methodType.origin.findOverridee()
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticContinuationParameterElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticContinuationParameterElement.kt
index cab0ab2..a32e70f 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticContinuationParameterElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticContinuationParameterElement.kt
@@ -89,7 +89,6 @@
         check(other is KspType)
         val continuation = env.resolver.requireContinuationClass()
         val asMember = containing.declaration.returnTypeAsMemberOf(
-            resolver = env.resolver,
             ksType = other.ksType
         )
         val returnTypeRef = checkNotNull(containing.declaration.returnType) {
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt
index 9921270..421f4f7 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt
@@ -80,11 +80,8 @@
         )
     }
 
-    override val docComment: String? by lazy {
-        // Not yet implemented in KSP.
-        // https://github.com/google/ksp/issues/392
-        null
-    }
+    override val docComment: String?
+        get() = null
 
     final override fun asMemberOf(other: XType): XMethodType {
         return KspSyntheticPropertyMethodType.create(
@@ -233,11 +230,8 @@
                 return origin.field.asMemberOf(other)
             }
 
-            override val docComment: String? by lazy {
-                // Not yet implemented in KSP.
-                // https://github.com/google/ksp/issues/392
-                null
-            }
+            override val docComment: String?
+                get() = null
 
             override fun kindName(): String {
                 return "method parameter"
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/KspClassFileUtilityTest.kt b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/KspClassFileUtilityTest.kt
index f097be5f..857cf36 100644
--- a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/KspClassFileUtilityTest.kt
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/KspClassFileUtilityTest.kt
@@ -29,7 +29,6 @@
 
 /**
  * see: https://github.com/google/ksp/issues/250
- * see: https://github.com/google/ksp/issues/375
  */
 class KspClassFileUtilityTest {
     @Test
@@ -142,6 +141,8 @@
 
     @Test
     fun trueOrigin() {
+        // this test is kind of testing ksp itself but it is still good to keep it in case it
+        // breaks.
         fun createSources(pkg: String) = listOf(
             Source.java(
                 "$pkg.JavaClass",
@@ -160,7 +161,7 @@
         )
         fun XTestInvocation.findOrigin(
             qName: String
-        ) = (processingEnv.requireTypeElement(qName) as KspTypeElement).trueOrigin
+        ) = (processingEnv.requireTypeElement(qName) as KspTypeElement).declaration.origin
 
         val preCompiled = compileFiles(
             createSources("lib")
@@ -171,10 +172,10 @@
         ) { invocation ->
             assertThat(
                 invocation.findOrigin("lib.JavaClass")
-            ).isEqualTo(Origin.JAVA)
+            ).isEqualTo(Origin.JAVA_LIB)
             assertThat(
                 invocation.findOrigin("lib.KotlinClass")
-            ).isEqualTo(Origin.KOTLIN)
+            ).isEqualTo(Origin.KOTLIN_LIB)
             assertThat(
                 invocation.findOrigin("main.JavaClass")
             ).isEqualTo(Origin.JAVA)
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/TopLevelMembersTest.kt b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/TopLevelMembersTest.kt
index 5a38d57..3081982 100644
--- a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/TopLevelMembersTest.kt
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/TopLevelMembersTest.kt
@@ -61,6 +61,7 @@
             sources = listOf(appSrc),
             classpath = listOf(classpath)
         ) { invocation ->
+            // b/188822146
             // TODO add lib package here once Room updates to a version that includes the
             //  https://github.com/google/ksp/issues/396 fix (1.5.0-1.0.0-alpha09)
             val declarations = invocation.kspResolver.getDeclarationsFromPackage("app")
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XElementTest.kt b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XElementTest.kt
index 1f0a254..aeaed8f 100644
--- a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XElementTest.kt
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XElementTest.kt
@@ -403,4 +403,36 @@
             }
         }
     }
+
+    @Test
+    fun docComment() {
+        val javaSrc = Source.java(
+            "JavaSubject",
+            """
+            /**
+             * javadocs
+             */
+            public class JavaSubject {}
+            """.trimIndent()
+        )
+        val kotlinSrc = Source.kotlin(
+            "KotlinSubject.kt",
+            """
+            /**
+             * kdocs
+             */
+            class KotlinSubject
+            """.trimIndent()
+        )
+        runProcessorTest(
+            sources = listOf(javaSrc, kotlinSrc)
+        ) { invocation ->
+            assertThat(
+                invocation.processingEnv.requireTypeElement("JavaSubject").docComment?.trim()
+            ).isEqualTo("javadocs")
+            assertThat(
+                invocation.processingEnv.requireTypeElement("KotlinSubject").docComment?.trim()
+            ).isEqualTo("kdocs")
+        }
+    }
 }
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
index b8727eb..736418b 100644
--- a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
@@ -296,13 +296,8 @@
                 .containsExactly("public", "final", "class", "data")
             assertThat(getModifiers("InlineClass"))
                 .containsExactly("public", "final", "class", "value")
-
-            if (!invocation.isKsp) {
-                // TODO: Enable for ksp too once it supports fun interfaces
-                //  https://github.com/google/ksp/issues/393
-                assertThat(getModifiers("FunInterface"))
-                    .containsExactly("public", "abstract", "interface", "fun")
-            }
+            assertThat(getModifiers("FunInterface"))
+                .containsExactly("public", "abstract", "interface", "fun")
         }
     }
 
diff --git a/room/guava/lint-baseline.xml b/room/guava/lint-baseline.xml
index 0da24db..e3459e6 100644
--- a/room/guava/lint-baseline.xml
+++ b/room/guava/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/room/integration-tests/incremental-annotation-processing/src/test/kotlin/androidx/room/gradle/RoomIncrementalAnnotationProcessingTest.kt b/room/integration-tests/incremental-annotation-processing/src/test/kotlin/androidx/room/gradle/RoomIncrementalAnnotationProcessingTest.kt
index 3d5cd1dd..5499a57 100644
--- a/room/integration-tests/incremental-annotation-processing/src/test/kotlin/androidx/room/gradle/RoomIncrementalAnnotationProcessingTest.kt
+++ b/room/integration-tests/incremental-annotation-processing/src/test/kotlin/androidx/room/gradle/RoomIncrementalAnnotationProcessingTest.kt
@@ -28,6 +28,9 @@
 import org.junit.runners.Parameterized
 import java.io.File
 import java.nio.file.Files
+import javax.xml.parsers.DocumentBuilderFactory
+import javax.xml.xpath.XPathConstants
+import javax.xml.xpath.XPathFactory
 
 @RunWith(Parameterized::class)
 class RoomIncrementalAnnotationProcessingTest(
@@ -101,6 +104,35 @@
     private lateinit var unchangedFiles: Set<File>
     private lateinit var deletedFiles: Set<File>
 
+    /**
+     * Find the Room version from local repo.
+     * Using + instead of an explicit version might cause gradle to find a newer version from
+     * prebuilts (SNAPSHOT).
+     */
+    private val roomVersion by lazy {
+        val metadataFile = File(projectSetup.props.localSupportRepo).resolve(
+            "androidx/room/room-compiler/maven-metadata.xml"
+        )
+        check(metadataFile.exists()) {
+            "Cannot find room metadata file in ${metadataFile.absolutePath}"
+        }
+        check(metadataFile.isFile) {
+            "Metadata file should be a file but it is not."
+        }
+        val xmlDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
+            .parse(metadataFile)
+        val latestVersionNode = XPathFactory.newInstance().newXPath()
+            .compile("/metadata/versioning/latest").evaluate(
+                xmlDoc, XPathConstants.STRING
+            )
+        check(latestVersionNode is String) {
+            """Unexpected node for latest version:
+                $latestVersionNode / ${latestVersionNode::class.java}
+            """.trimIndent()
+        }
+        latestVersionNode
+    }
+
     @Before
     fun setup() {
         val projectRoot = projectSetup.rootDir
@@ -176,8 +208,8 @@
 
             dependencies {
                 // Uses latest Room built from tip of tree
-                implementation "androidx.room:room-runtime:+"
-                $processorConfiguration "androidx.room:room-compiler:+"
+                implementation "androidx.room:room-runtime:$roomVersion"
+                $processorConfiguration "androidx.room:room-compiler:$roomVersion"
             }
 
             class SchemaLocationArgumentProvider implements CommandLineArgumentProvider {
diff --git a/room/integration-tests/testapp/lint-baseline.xml b/room/integration-tests/testapp/lint-baseline.xml
index 9d71701..297ad6c 100644
--- a/room/integration-tests/testapp/lint-baseline.xml
+++ b/room/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="SyntheticAccessor"
diff --git a/room/ktx/lint-baseline.xml b/room/ktx/lint-baseline.xml
index 3a6ad8b..17243415 100644
--- a/room/ktx/lint-baseline.xml
+++ b/room/ktx/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/room/migration/lint-baseline.xml b/room/migration/lint-baseline.xml
index 5ee09e3..32a2637 100644
--- a/room/migration/lint-baseline.xml
+++ b/room/migration/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
@@ -987,7 +987,7 @@
         errorLine2="                                           ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/migration/bundle/SchemaBundle.java"
-            line="66"
+            line="67"
             column="44"/>
     </issue>
 
@@ -998,7 +998,7 @@
         errorLine2="           ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/migration/bundle/SchemaBundle.java"
-            line="76"
+            line="77"
             column="12"/>
     </issue>
 
@@ -1006,21 +1006,10 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public static SchemaBundle deserialize(InputStream fis)"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/room/migration/bundle/SchemaBundle.java"
-            line="84"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static SchemaBundle deserialize(InputStream fis)"
         errorLine2="                                           ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/migration/bundle/SchemaBundle.java"
-            line="84"
+            line="86"
             column="44"/>
     </issue>
 
@@ -1031,7 +1020,7 @@
         errorLine2="                                 ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/migration/bundle/SchemaBundle.java"
-            line="99"
+            line="105"
             column="34"/>
     </issue>
 
@@ -1042,7 +1031,7 @@
         errorLine2="                                                      ~~~~">
         <location
             file="src/main/java/androidx/room/migration/bundle/SchemaBundle.java"
-            line="99"
+            line="105"
             column="55"/>
     </issue>
 
@@ -1053,7 +1042,7 @@
         errorLine2="                                 ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/migration/bundle/SchemaBundle.java"
-            line="120"
+            line="126"
             column="34"/>
     </issue>
 
diff --git a/room/runtime/lint-baseline.xml b/room/runtime/lint-baseline.xml
index 00b8762..32d1bdf 100644
--- a/room/runtime/lint-baseline.xml
+++ b/room/runtime/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
@@ -268,28 +268,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected abstract void bind(SupportSQLiteStatement statement, T entity);"
-        errorLine2="                                                                   ~">
-        <location
-            file="src/main/java/androidx/room/EntityDeletionOrUpdateAdapter.java"
-            line="58"
-            column="68"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public final int handle(T entity) {"
-        errorLine2="                            ~">
-        <location
-            file="src/main/java/androidx/room/EntityDeletionOrUpdateAdapter.java"
-            line="66"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public final int handleMultiple(Iterable&lt;? extends T> entities) {"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -334,28 +312,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected abstract void bind(SupportSQLiteStatement statement, T entity);"
-        errorLine2="                                                                   ~">
-        <location
-            file="src/main/java/androidx/room/EntityInsertionAdapter.java"
-            line="53"
-            column="68"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public final void insert(T entity) {"
-        errorLine2="                             ~">
-        <location
-            file="src/main/java/androidx/room/EntityInsertionAdapter.java"
-            line="60"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public final void insert(T[] entities) {"
         errorLine2="                             ~~~">
         <location
@@ -378,17 +334,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public final long insertAndReturnId(T entity) {"
-        errorLine2="                                        ~">
-        <location
-            file="src/main/java/androidx/room/EntityInsertionAdapter.java"
-            line="110"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public final long[] insertAndReturnIdsArray(Collection&lt;? extends T> entities) {"
         errorLine2="                 ~~~~~~">
         <location
@@ -829,17 +774,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public &lt;V> V runInTransaction(@NonNull Callable&lt;V> body) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/room/RoomDatabase.java"
-            line="683"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public Builder&lt;T> fallbackToDestructiveMigrationFrom(int... startVersions) {"
         errorLine2="                                                             ~~~~~~">
         <location
diff --git a/room/rxjava2/lint-baseline.xml b/room/rxjava2/lint-baseline.xml
index 1eb99ab..6eb516e 100644
--- a/room/rxjava2/lint-baseline.xml
+++ b/room/rxjava2/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="PrivateConstructorForUtilityClass"
diff --git a/room/testing/lint-baseline.xml b/room/testing/lint-baseline.xml
index c419600..62d06ec 100644
--- a/room/testing/lint-baseline.xml
+++ b/room/testing/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/samples/Support4Demos/lint-baseline.xml b/samples/Support4Demos/lint-baseline.xml
index fb0dc9c..f606642 100644
--- a/samples/Support4Demos/lint-baseline.xml
+++ b/samples/Support4Demos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="WifiManagerLeak"
@@ -163,175 +163,6 @@
     </issue>
 
     <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.red` appears to be unused"
-        errorLine1="    &lt;drawable name=&quot;red&quot;>#7f00&lt;/drawable>"
-        errorLine2="              ~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="18"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.blue` appears to be unused"
-        errorLine1="    &lt;drawable name=&quot;blue&quot;>#770000ff&lt;/drawable>"
-        errorLine2="              ~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="19"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.yellow` appears to be unused"
-        errorLine1="    &lt;drawable name=&quot;yellow&quot;>#77ffff00&lt;/drawable>"
-        errorLine2="              ~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="21"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.gradient` appears to be unused"
-        errorLine1="&lt;shape xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;>"
-        errorLine2="^">
-        <location
-            file="src/main/res/drawable/gradient.xml"
-            line="16"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_drawer` appears to be unused"
-        errorLine1="&lt;bitmap xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/drawable/ic_drawer.xml"
-            line="20"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_drawer_am` appears to be unused">
-        <location
-            file="src/main/res/drawable-hdpi/ic_drawer_am.png"/>
-        <location
-            file="src/main/res/drawable-mdpi/ic_drawer_am.png"/>
-        <location
-            file="src/main/res/drawable-xhdpi/ic_drawer_am.png"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.menu.shortcuts` appears to be unused"
-        errorLine1="&lt;menu xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;>"
-        errorLine2="^">
-        <location
-            file="src/main/res/menu/shortcuts.xml"
-            line="17"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.fragment_nesting_tabs_support` appears to be unused"
-        errorLine1="    &lt;string name=&quot;fragment_nesting_tabs_support&quot;>Fragment/Nesting Tabs&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="76"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.fragment_tabs` appears to be unused"
-        errorLine1="    &lt;string name=&quot;fragment_tabs&quot;>Fragment/Tabs&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="85"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.fragment_tabs_pager` appears to be unused"
-        errorLine1="    &lt;string name=&quot;fragment_tabs_pager&quot;>Fragment/Tabs and Pager&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="87"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.accessibility_delegate_button` appears to be unused"
-        errorLine1="    &lt;string name=&quot;accessibility_delegate_button&quot;>Button&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="144"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.sample_transport_controller_activity` appears to be unused"
-        errorLine1="    &lt;string name=&quot;sample_transport_controller_activity&quot;>Media/TransportController&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="187"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.error_cannot_skip` appears to be unused"
-        errorLine1="    &lt;string name=&quot;error_cannot_skip&quot;>Cannot skip&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="204"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.error_empty_metadata` appears to be unused"
-        errorLine1="    &lt;string name=&quot;error_empty_metadata&quot;>Empty metadata!&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="215"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.style.ThemeHolo` appears to be unused"
-        errorLine1="    &lt;style name=&quot;ThemeHolo&quot; parent=&quot;android:Theme&quot;>"
-        errorLine2="           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/styles.xml"
-            line="22"
-            column="12"/>
-        <location
-            file="src/main/res/values-v11/styles.xml"
-            line="19"
-            column="12"/>
-    </issue>
-
-    <issue
         id="SyntheticAccessor"
         message="Access to `private` field `mCache` of class `AlbumArtCache` requires synthetic accessor"
         errorLine1="                    mCache.put(artUrl, bitmaps);"
@@ -2941,17 +2772,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void setContent(T content) {"
-        errorLine2="                               ~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/BaseSwipeRefreshLayoutActivity.java"
-            line="97"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
diff --git a/samples/Support7Demos/lint-baseline.xml b/samples/Support7Demos/lint-baseline.xml
index 1d7205d..06ee5cd 100644
--- a/samples/Support7Demos/lint-baseline.xml
+++ b/samples/Support7Demos/lint-baseline.xml
@@ -2,402 +2,6 @@
 <issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"
-            line="41"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"
-            line="45"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"
-            line="49"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_TIME);"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"
-            line="53"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatLocalNightModeActivity.java"
-            line="57"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"
-            line="41"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"
-            line="47"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"
-            line="53"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_TIME);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"
-            line="59"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java"
-            line="65"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"
-            line="41"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"
-            line="49"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"
-            line="57"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_TIME);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"
-            line="65"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 17 (current min is 14): `setLocalNightMode`"
-        errorLine1="        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatNightModeDialog.java"
-            line="73"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Exception requires API level 17 (current min is 17): `android.view.WindowManager.InvalidDisplayException`, and having a surrounding/preceding version check **does not** help since prior to API level 19, just **loading** the class will cause a crash. Consider marking the surrounding class with `RequiresApi(19)` to ensure that the class is never loaded except when on API 19 or higher."
-        errorLine1="                } catch (WindowManager.InvalidDisplayException ex) {"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="444"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="`&lt;class>` requires API level 24 (current min is 14)"
-        errorLine1="    class=&quot;com.example.android.supportv7.drawable.MyDrawable&quot;"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/drawable/my_drawable.xml"
-            line="19"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="VectorDrawableCompat"
-        message="To use VectorDrawableCompat, you need to set `android.defaultConfig.vectorDrawables.useSupportLibrary = true` in `:support-v7-demos/build.gradle`"
-        errorLine1="               app:srcCompat=&quot;@drawable/animation_vector_drawable_grouping_1&quot;/>"
-        errorLine2="               ~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/layout-v11/appcompat_animated_vector.xml"
-            line="27"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.layout.action_bar_tab_content` appears to be unused"
-        errorLine1="&lt;TextView xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/layout/action_bar_tab_content.xml"
-            line="16"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.layout.action_bar_tabs` appears to be unused"
-        errorLine1="&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/layout/action_bar_tabs.xml"
-            line="16"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.xml.preferences` appears to be unused"
-        errorLine1="&lt;PreferenceScreen xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;>"
-        errorLine2="^">
-        <location
-            file="src/main/res/xml/preferences.xml"
-            line="17"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.layout.sample_media_controller` appears to be unused"
-        errorLine1="&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/layout/sample_media_controller.xml"
-            line="19"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.selection_demo_item` appears to be unused"
-        errorLine1="&lt;selector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;>"
-        errorLine2="^">
-        <location
-            file="src/main/res/color/selection_demo_item.xml"
-            line="18"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.sample_media_router_text` appears to be unused"
-        errorLine1="    &lt;string name=&quot;sample_media_router_text&quot;>This activity demonstrates how to"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="29"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.variable_volume_route_group_name` appears to be unused"
-        errorLine1="    &lt;string name=&quot;variable_volume_route_group_name&quot;>Variable Volume Route Group&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="46"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.mixed_volume_route_group_name` appears to be unused"
-        errorLine1="    &lt;string name=&quot;mixed_volume_route_group_name&quot;>Mixed Volume Route Group&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="47"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.sample_dynamic_group_mrp_service` appears to be unused"
-        errorLine1="    &lt;string name=&quot;sample_dynamic_group_mrp_service&quot;>Media Route Provider Service Support Library Sample (supporting dynamic group)&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="50"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.action_bar_tabs` appears to be unused"
-        errorLine1="    &lt;string name=&quot;action_bar_tabs&quot;>AppCompat/Action Bar/Action Bar Tabs&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="73"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.action_bar_with_navigation_drawer` appears to be unused"
-        errorLine1="    &lt;string name=&quot;action_bar_with_navigation_drawer&quot;>AppCompat/Action Bar/Navigation Drawer Toggle&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="77"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.toggle_navigation` appears to be unused"
-        errorLine1="    &lt;string name=&quot;toggle_navigation&quot;>Navigation&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="109"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.btn_add_tab` appears to be unused"
-        errorLine1="    &lt;string name=&quot;btn_add_tab&quot;>Add new tab&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="116"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.btn_remove_tab` appears to be unused"
-        errorLine1="    &lt;string name=&quot;btn_remove_tab&quot;>Remove last tab&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="117"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.btn_toggle_tabs` appears to be unused"
-        errorLine1="    &lt;string name=&quot;btn_toggle_tabs&quot;>Toggle tab mode&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="118"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.btn_remove_all_tabs` appears to be unused"
-        errorLine1="    &lt;string name=&quot;btn_remove_all_tabs&quot;>Remove all tabs&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="119"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.sliding_pane_layout_support` appears to be unused"
-        errorLine1="    &lt;string name=&quot;sliding_pane_layout_support&quot;>Widget/Sliding pane layout&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="130"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.sliding_pane_layout_summary` appears to be unused"
-        errorLine1="    &lt;string name=&quot;sliding_pane_layout_summary&quot;>This activity illustrates the use of sliding panes."
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="132"
-            column="13"/>
-    </issue>
-
- <issue
         id="OnClick"
         message="Corresponding method handler &apos;`public void onAddTab(android.view.View)`&apos; not found"
         errorLine1="                android:onClick=&quot;onAddTab&quot; />"
@@ -453,7 +57,8 @@
         <location
             file="src/main/res/layout/appcompat_night_mode.xml"
             line="23"
-            column="9"/>
+            column="9"
+            message="`wrap_content` here may not work well with WebView below"/>
     </issue>
 
     <issue
@@ -639,7 +244,7 @@
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="450"
+            line="444"
             column="26"/>
     </issue>
 
@@ -892,7 +497,7 @@
         errorLine2="                                                       ~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="436"
+            line="430"
             column="56"/>
     </issue>
 
@@ -1128,193 +733,6 @@
     </issue>
 
     <issue
-        id="RestrictedApi"
-        message="Preconditions.checkArgument can only be called from within the same library group prefix (referenced groupId=`androidx.core` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        checkArgument(selectionTracker != null);"
-        errorLine2="        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/widget/selection/simple/DemoAdapter.java"
-            line="54"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="Preconditions.checkArgument can only be called from within the same library group prefix (referenced groupId=`androidx.core` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        checkArgument(selectionTracker != null);"
-        errorLine2="        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/widget/selection/single/DemoAdapter.java"
-            line="54"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="Preconditions.checkArgument can only be called from within the same library group prefix (referenced groupId=`androidx.core` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        checkArgument(tracker != null);"
-        errorLine2="        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoAdapter.java"
-            line="78"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaRouteDescriptor.getGroupMemberIds can only be called from within the same library (androidx.mediarouter:mediarouter)"
-        errorLine1="        if (initialRoute.getGroupMemberIds().isEmpty()) {"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java"
-            line="121"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaRouteDescriptor.getGroupMemberIds can only be called from within the same library (androidx.mediarouter:mediarouter)"
-        errorLine1="            memberIds.addAll(initialRoute.getGroupMemberIds());"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java"
-            line="124"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="Builder.addGroupMemberId can only be called from within the same library (androidx.mediarouter:mediarouter)"
-        errorLine1="                .addGroupMemberId(routeDescriptor1.getId())"
-        errorLine2="                 ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java"
-            line="228"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="Builder.addGroupMemberId can only be called from within the same library (androidx.mediarouter:mediarouter)"
-        errorLine1="                .addGroupMemberId(routeDescriptor3.getId())"
-        errorLine2="                 ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java"
-            line="229"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="Builder.addGroupMemberIds can only be called from within the same library (androidx.mediarouter:mediarouter)"
-        errorLine1="                            .addGroupMemberIds(memberIds);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java"
-            line="276"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaRouteDescriptor.getGroupMemberIds can only be called from within the same library (androidx.mediarouter:mediarouter)"
-        errorLine1="            for (String memberRouteId : routeDescriptor.getGroupMemberIds()) {"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java"
-            line="341"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="Builder.clearGroupMemberIds can only be called from within the same library (androidx.mediarouter:mediarouter)"
-        errorLine1="                            .clearGroupMemberIds();"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java"
-            line="351"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="Builder.addGroupMemberId can only be called from within the same library (androidx.mediarouter:mediarouter)"
-        errorLine1="                groupDescriptorBuilder.addGroupMemberId(memberRouteId);"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java"
-            line="353"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaRouteDescriptor.getGroupMemberIds can only be called from within the same library (androidx.mediarouter:mediarouter)"
-        errorLine1="                if (!routeDescriptor.getGroupMemberIds().isEmpty()"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java"
-            line="553"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaRouteDescriptor.getGroupMemberIds can only be called from within the same library (androidx.mediarouter:mediarouter)"
-        errorLine1="                        &amp;&amp; mMemberRouteIds.containsAll(routeDescriptor.getGroupMemberIds())) {"
-        errorLine2="                                                                       ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java"
-            line="554"
-            column="72"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaRouteDescriptor.getGroupMemberIds can only be called from within the same library (androidx.mediarouter:mediarouter)"
-        errorLine1="            if (routeDescriptor.getGroupMemberIds().isEmpty()) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java"
-            line="582"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaRouteDescriptor.getGroupMemberIds can only be called from within the same library (androidx.mediarouter:mediarouter)"
-        errorLine1="            for (String routeId : routeDescriptor.getGroupMemberIds()) {"
-        errorLine2="                                                  ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/SampleDynamicGroupMrp.java"
-            line="587"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="Preconditions can only be called from within the same library group prefix (referenced groupId=`androidx.core` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        Preconditions.checkArgument(group != null);"
-        errorLine2="        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/widget/selection/fancy/Uris.java"
-            line="61"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="Preconditions can only be called from within the same library group prefix (referenced groupId=`androidx.core` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        Preconditions.checkArgument(isCheese(uri));"
-        errorLine2="        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/widget/selection/fancy/Uris.java"
-            line="66"
-            column="9"/>
-    </issue>
-
-    <issue
         id="ObsoleteSdkInt"
         message="This folder configuration (`v11`) is unnecessary; `minSdkVersion` is 14. Merge all the resources in this folder into `layout`.">
         <location
@@ -1322,204 +740,6 @@
     </issue>
 
     <issue
-        id="UnusedResources"
-        message="The resource `R.layout.action_bar_tab_content` appears to be unused"
-        errorLine1="&lt;TextView xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/layout/action_bar_tab_content.xml"
-            line="16"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.layout.action_bar_tabs` appears to be unused"
-        errorLine1="&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/layout/action_bar_tabs.xml"
-            line="16"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.xml.preferences` appears to be unused"
-        errorLine1="&lt;PreferenceScreen xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;>"
-        errorLine2="^">
-        <location
-            file="src/main/res/xml/preferences.xml"
-            line="17"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.layout.sample_media_controller` appears to be unused"
-        errorLine1="&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/layout/sample_media_controller.xml"
-            line="19"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.selection_demo_item` appears to be unused"
-        errorLine1="&lt;selector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;>"
-        errorLine2="^">
-        <location
-            file="src/main/res/color/selection_demo_item.xml"
-            line="18"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.sample_media_router_text` appears to be unused"
-        errorLine1="    &lt;string name=&quot;sample_media_router_text&quot;>This activity demonstrates how to"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="29"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.variable_volume_route_group_name` appears to be unused"
-        errorLine1="    &lt;string name=&quot;variable_volume_route_group_name&quot;>Variable Volume Route Group&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="46"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.mixed_volume_route_group_name` appears to be unused"
-        errorLine1="    &lt;string name=&quot;mixed_volume_route_group_name&quot;>Mixed Volume Route Group&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="47"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.sample_dynamic_group_mrp_service` appears to be unused"
-        errorLine1="    &lt;string name=&quot;sample_dynamic_group_mrp_service&quot;>Media Route Provider Service Support Library Sample (supporting dynamic group)&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="50"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.action_bar_tabs` appears to be unused"
-        errorLine1="    &lt;string name=&quot;action_bar_tabs&quot;>AppCompat/Action Bar/Action Bar Tabs&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="73"
-            column="13"/>
-    </issue>
-
- <issue
-        id="UnusedResources"
-        message="The resource `R.string.action_bar_with_navigation_drawer` appears to be unused"
-        errorLine1="    &lt;string name=&quot;action_bar_with_navigation_drawer&quot;>AppCompat/Action Bar/Navigation Drawer Toggle&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="77"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.toggle_navigation` appears to be unused"
-        errorLine1="    &lt;string name=&quot;toggle_navigation&quot;>Navigation&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="109"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.btn_add_tab` appears to be unused"
-        errorLine1="    &lt;string name=&quot;btn_add_tab&quot;>Add new tab&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="116"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.btn_remove_tab` appears to be unused"
-        errorLine1="    &lt;string name=&quot;btn_remove_tab&quot;>Remove last tab&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="117"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.btn_toggle_tabs` appears to be unused"
-        errorLine1="    &lt;string name=&quot;btn_toggle_tabs&quot;>Toggle tab mode&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="118"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.btn_remove_all_tabs` appears to be unused"
-        errorLine1="    &lt;string name=&quot;btn_remove_all_tabs&quot;>Remove all tabs&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="119"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.sliding_pane_layout_support` appears to be unused"
-        errorLine1="    &lt;string name=&quot;sliding_pane_layout_support&quot;>Widget/Sliding pane layout&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="130"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.sliding_pane_layout_summary` appears to be unused"
-        errorLine1="    &lt;string name=&quot;sliding_pane_layout_summary&quot;>This activity illustrates the use of sliding panes."
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="132"
-            column="13"/>
-    </issue>
-
-    <issue
         id="SyntheticAccessor"
         message="Access to `private` method `startActionMode` of class `ActionBarActionMode` requires synthetic accessor"
         errorLine1="                startActionMode();"
@@ -2666,23 +1886,23 @@
     <issue
         id="SyntheticAccessor"
         message="Access to `private` field `mMediaPlayer` of class `LocalPlayer` requires synthetic accessor"
-        errorLine1="                        ICSMediaPlayer.setSurface(mMediaPlayer, mSurface);"
-        errorLine2="                                                  ~~~~~~~~~~~~">
+        errorLine1="                    ICSMediaPlayer.setSurface(mMediaPlayer, mSurface);"
+        errorLine2="                                              ~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="330"
-            column="51"/>
+            line="328"
+            column="47"/>
     </issue>
 
     <issue
         id="SyntheticAccessor"
         message="Access to `private` field `mSurface` of class `LocalPlayer` requires synthetic accessor"
-        errorLine1="                        ICSMediaPlayer.setSurface(mMediaPlayer, mSurface);"
-        errorLine2="                                                                ~~~~~~~~">
+        errorLine1="                    ICSMediaPlayer.setSurface(mMediaPlayer, mSurface);"
+        errorLine2="                                                            ~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="330"
-            column="65"/>
+            line="328"
+            column="61"/>
     </issue>
 
     <issue
@@ -2692,7 +1912,7 @@
         errorLine2="                           ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="335"
+            line="329"
             column="28"/>
     </issue>
 
@@ -2703,7 +1923,7 @@
         errorLine2="                    ~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="336"
+            line="330"
             column="21"/>
     </issue>
 
@@ -2714,7 +1934,7 @@
         errorLine2="                                            ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="336"
+            line="330"
             column="45"/>
     </issue>
 
@@ -2725,7 +1945,7 @@
         errorLine2="                    ~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="338"
+            line="332"
             column="21"/>
     </issue>
 
@@ -2736,7 +1956,7 @@
         errorLine2="                ~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="464"
+            line="458"
             column="17"/>
     </issue>
 
@@ -2747,7 +1967,7 @@
         errorLine2="                ~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="472"
+            line="466"
             column="17"/>
     </issue>
 
@@ -2758,7 +1978,7 @@
         errorLine2="                ~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="481"
+            line="475"
             column="17"/>
     </issue>
 
@@ -2769,7 +1989,7 @@
         errorLine2="                              ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="535"
+            line="529"
             column="31"/>
     </issue>
 
@@ -2780,7 +2000,7 @@
         errorLine2="                    ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="537"
+            line="531"
             column="21"/>
     </issue>
 
@@ -2791,7 +2011,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="538"
+            line="532"
             column="21"/>
     </issue>
 
@@ -4921,17 +4141,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected T mLayoutManager;"
-        errorLine2="              ~">
-        <location
-            file="src/main/java/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java"
-            line="49"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    protected RecyclerView mRecyclerView;"
         errorLine2="              ~~~~~~~~~~~~">
         <location
@@ -4954,17 +4163,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    abstract protected T createLayoutManager();"
-        errorLine2="                       ~">
-        <location
-            file="src/main/java/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java"
-            line="64"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    protected void onRecyclerViewInit(RecyclerView recyclerView) {"
         errorLine2="                                      ~~~~~~~~~~~~">
         <location
@@ -5094,7 +4292,7 @@
             column="29"/>
     </issue>
 
-     <issue
+    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,"
@@ -5959,7 +5157,7 @@
         errorLine2="                                 ~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="395"
+            line="389"
             column="34"/>
     </issue>
 
@@ -5970,7 +5168,7 @@
         errorLine2="                            ~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="407"
+            line="401"
             column="29"/>
     </issue>
 
@@ -5981,7 +5179,7 @@
         errorLine2="                                   ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="462"
+            line="456"
             column="36"/>
     </issue>
 
@@ -5992,7 +5190,7 @@
         errorLine2="                                   ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="471"
+            line="465"
             column="36"/>
     </issue>
 
@@ -6003,7 +5201,7 @@
         errorLine2="                                     ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="480"
+            line="474"
             column="38"/>
     </issue>
 
@@ -6014,7 +5212,7 @@
         errorLine2="                             ~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="603"
+            line="597"
             column="30"/>
     </issue>
 
@@ -6025,7 +5223,7 @@
         errorLine2="                            ~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="615"
+            line="609"
             column="29"/>
     </issue>
 
@@ -6036,7 +5234,7 @@
         errorLine2="                                    ~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="637"
+            line="631"
             column="37"/>
     </issue>
 
@@ -6047,7 +5245,7 @@
         errorLine2="                                    ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="642"
+            line="636"
             column="37"/>
     </issue>
 
@@ -6058,7 +5256,7 @@
         errorLine2="               ~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="652"
+            line="646"
             column="16"/>
     </issue>
 
diff --git a/samples/SupportAnimationDemos/lint-baseline.xml b/samples/SupportAnimationDemos/lint-baseline.xml
index 4de8cfb..e6cca97 100644
--- a/samples/SupportAnimationDemos/lint-baseline.xml
+++ b/samples/SupportAnimationDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="SyntheticAccessor"
diff --git a/samples/SupportContentDemos/lint-baseline.xml b/samples/SupportContentDemos/lint-baseline.xml
index d485d6b..e027914 100644
--- a/samples/SupportContentDemos/lint-baseline.xml
+++ b/samples/SupportContentDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="AppCompatResource"
diff --git a/samples/SupportEmojiDemos/lint-baseline.xml b/samples/SupportEmojiDemos/lint-baseline.xml
index 2c7e012..8e58669 100644
--- a/samples/SupportEmojiDemos/lint-baseline.xml
+++ b/samples/SupportEmojiDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
@@ -63,19 +63,19 @@
         errorLine2="            ~~~~">
         <location
             file="src/main/java/com/example/android/support/text/emoji/MainFragment.java"
-            line="53"
+            line="59"
             column="13"/>
     </issue>
 
     <issue
         id="SyntheticAccessor"
         message="Access to `private` field `mRegularTextView` of class `MainFragment` requires synthetic accessor"
-        errorLine1="                mRegularTextView.setText("
-        errorLine2="                ~~~~~~~~~~~~~~~~">
+        errorLine1="                    mRegularTextView.setText("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/support/text/emoji/MainFragment.java"
-            line="121"
-            column="17"/>
+            line="140"
+            column="21"/>
     </issue>
 
     <issue
@@ -261,7 +261,7 @@
         errorLine2="           ~~~~">
         <location
             file="src/main/java/com/example/android/support/text/emoji/MainFragment.java"
-            line="63"
+            line="69"
             column="12"/>
     </issue>
 
@@ -272,7 +272,7 @@
         errorLine2="                             ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/support/text/emoji/MainFragment.java"
-            line="63"
+            line="69"
             column="30"/>
     </issue>
 
@@ -283,7 +283,7 @@
         errorLine2="                                                      ~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/support/text/emoji/MainFragment.java"
-            line="63"
+            line="69"
             column="55"/>
     </issue>
 
@@ -294,7 +294,7 @@
         errorLine2="            ~~~~~~">
         <location
             file="src/main/java/com/example/android/support/text/emoji/MainFragment.java"
-            line="64"
+            line="70"
             column="13"/>
     </issue>
 
diff --git a/samples/SupportLeanbackDemos/lint-baseline.xml b/samples/SupportLeanbackDemos/lint-baseline.xml
index 6190ec0..e82a85f 100644
--- a/samples/SupportLeanbackDemos/lint-baseline.xml
+++ b/samples/SupportLeanbackDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="MissingSuperCall"
@@ -706,160 +706,6 @@
     </issue>
 
     <issue
-        id="RestrictedApi"
-        message="GuidedStepFragment.SLIDE_FROM_BOTTOM can only be accessed from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
-        errorLine1="            setEntranceTransitionType(GuidedStepFragment.SLIDE_FROM_BOTTOM);"
-        errorLine2="                                                         ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="76"
-            column="58"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="GuidedStepFragment.setEntranceTransitionType can only be called from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
-        errorLine1="            setEntranceTransitionType(GuidedStepFragment.SLIDE_FROM_BOTTOM);"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="76"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="GuidedStepSupportFragment.SLIDE_FROM_BOTTOM can only be accessed from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
-        errorLine1="            setEntranceTransitionType(GuidedStepSupportFragment.SLIDE_FROM_BOTTOM);"
-        errorLine2="                                                                ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="79"
-            column="65"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="GuidedStepSupportFragment.setEntranceTransitionType can only be called from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
-        errorLine1="            setEntranceTransitionType(GuidedStepSupportFragment.SLIDE_FROM_BOTTOM);"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="79"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaPlayerGlue can only be called from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        MediaPlayerGlue mediaPlayerGlue = new MediaPlayerGlue(getActivity());"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="82"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaPlayerGlue.setMode can only be called from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        mediaPlayerGlue.setMode(MediaPlayerGlue.REPEAT_ONE);"
-        errorLine2="                        ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="84"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaPlayerGlue.setArtist can only be called from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        mediaPlayerGlue.setArtist(&quot;A Googler&quot;);"
-        errorLine2="                        ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="85"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaPlayerGlue.setTitle can only be called from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        mediaPlayerGlue.setTitle(&quot;Diving with Sharks Trailer&quot;);"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="86"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaPlayerGlue.setMediaSource can only be called from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        mediaPlayerGlue.setMediaSource(Uri.parse(&quot;android.resource://com.example.android.leanback/&quot;"
-        errorLine2="                        ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="87"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaPlayerGlue can only be called from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        MediaPlayerGlue mediaPlayerGlue = new MediaPlayerGlue(getActivity());"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="85"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaPlayerGlue.setMode can only be called from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        mediaPlayerGlue.setMode(MediaPlayerGlue.REPEAT_ONE);"
-        errorLine2="                        ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="87"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaPlayerGlue.setArtist can only be called from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        mediaPlayerGlue.setArtist(&quot;A Googler&quot;);"
-        errorLine2="                        ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="88"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaPlayerGlue.setTitle can only be called from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        mediaPlayerGlue.setTitle(&quot;Diving with Sharks Trailer&quot;);"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="89"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="RestrictedApi"
-        message="MediaPlayerGlue.setMediaSource can only be called from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
-        errorLine1="        mediaPlayerGlue.setMediaSource(Uri.parse(&quot;android.resource://com.example.android.leanback/&quot;"
-        errorLine2="                        ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="90"
-            column="25"/>
-    </issue>
-
-    <issue
         id="UnsupportedChromeOsHardware"
         message="Expecting `android:required=&quot;false&quot;` for this hardware feature that may not be supported by all Chrome OS devices"
         errorLine1="        android:required=&quot;true&quot;/>"
@@ -871,281 +717,6 @@
     </issue>
 
     <issue
-        id="UnusedResources"
-        message="The resource `R.array.pref_parent_control_entries_summaries` appears to be unused"
-        errorLine1="    &lt;array name=&quot;pref_parent_control_entries_summaries&quot;>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/arrays.xml"
-            line="46"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.raw.browse` appears to be unused">
-        <location
-            file="src/main/res/raw/browse.mp4"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.details_img` appears to be unused">
-        <location
-            file="src/main/res/drawable/details_img.png"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.google_android` appears to be unused">
-        <location
-            file="src/main/res/drawable/google_android.png"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.google_logo` appears to be unused">
-        <location
-            file="src/main/res/drawable/google_logo.png"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.google_photo` appears to be unused">
-        <location
-            file="src/main/res/drawable/google_photo.jpeg"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_guidedstep_option_a` appears to be unused">
-        <location
-            file="src/main/res/drawable/ic_guidedstep_option_a.png"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_guidedstep_option_b` appears to be unused">
-        <location
-            file="src/main/res/drawable/ic_guidedstep_option_b.png"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_guidedstep_option_c` appears to be unused">
-        <location
-            file="src/main/res/drawable/ic_guidedstep_option_c.png"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_settings_wifi_3_bar` appears to be unused">
-        <location
-            file="src/main/res/drawable-xhdpi/ic_settings_wifi_3_bar.png"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.raw.media0` appears to be unused">
-        <location
-            file="src/main/res/raw/media0.mp3"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.raw.media1` appears to be unused">
-        <location
-            file="src/main/res/raw/media1.mp3"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.layout.playback_controls` appears to be unused"
-        errorLine1="&lt;FrameLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/layout/playback_controls.xml"
-            line="17"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.layout.playback_controls_support` appears to be unused"
-        errorLine1="&lt;FrameLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/layout/playback_controls_support.xml"
-            line="19"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.playbackoverlay` appears to be unused"
-        errorLine1="    &lt;string name=&quot;playbackoverlay&quot;>PlaybackOverlay&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="55"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.playbackoverlay_description` appears to be unused"
-        errorLine1="    &lt;string name=&quot;playbackoverlay_description&quot;>PlaybackOverlayFragment test&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="56"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.playbackoverlay_support` appears to be unused"
-        errorLine1="    &lt;string name=&quot;playbackoverlay_support&quot;>PlaybackOverlay(support version)&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="57"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.playbackoverlay_support_description` appears to be unused"
-        errorLine1="    &lt;string name=&quot;playbackoverlay_support_description&quot;>PlaybackOverlaySupportFragment test&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="58"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.legacydetails_off` appears to be unused"
-        errorLine1="    &lt;string name=&quot;legacydetails_off&quot;>Use New DetailsPresenter&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="78"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.legacydetails_on` appears to be unused"
-        errorLine1="    &lt;string name=&quot;legacydetails_on&quot;>Use Legacy DetailsPresenter&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="79"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.guidedstep_fourth_description` appears to be unused"
-        errorLine1="    &lt;string name=&quot;guidedstep_fourth_description&quot;>Fourth step of guided sequence&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="103"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.style.Theme_Example_AppCompat_Leanback_SearchDetails` appears to be unused"
-        errorLine1="    &lt;style name=&quot;Theme.Example.AppCompat.Leanback.SearchDetails&quot; parent=&quot;Theme.AppCompat.Leanback.Details.NoSharedElementTransition&quot;>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/themes_appcompat.xml"
-            line="23"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.style.Theme_Example_AppCompat_Leanback_Details` appears to be unused"
-        errorLine1="    &lt;style name=&quot;Theme.Example.AppCompat.Leanback.Details&quot; parent=&quot;Theme.AppCompat.Leanback.Details&quot;>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/themes_appcompat.xml"
-            line="25"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.style.Theme_Example_AppCompat_Leanback_Details_CustomTitle` appears to be unused"
-        errorLine1="    &lt;style name=&quot;Theme.Example.AppCompat.Leanback.Details.CustomTitle&quot;>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/themes_appcompat.xml"
-            line="27"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.style.Theme_Example_AppCompat_Leanback_Rows` appears to be unused"
-        errorLine1="    &lt;style name=&quot;Theme.Example.AppCompat.Leanback.Rows&quot; parent=&quot;Theme.AppCompat.Leanback&quot;>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/themes_appcompat.xml"
-            line="32"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.style.Theme_Example_AppCompat_Leanback_GuidedStep` appears to be unused"
-        errorLine1="    &lt;style name=&quot;Theme.Example.AppCompat.Leanback.GuidedStep&quot; parent=&quot;Theme.AppCompat.Leanback.GuidedStep&quot;>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/themes_appcompat.xml"
-            line="36"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.style.Theme_Example_AppCompat_Leanback_GuidedStep_First` appears to be unused"
-        errorLine1="    &lt;style name=&quot;Theme.Example.AppCompat.Leanback.GuidedStep.First&quot;>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/themes_appcompat.xml"
-            line="39"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.style.Theme_Example_AppCompat_Leanback_GuidedStep_Half` appears to be unused"
-        errorLine1="    &lt;style name=&quot;Theme.Example.AppCompat.Leanback.GuidedStep.Half&quot; parent=&quot;Theme.AppCompat.Leanback.GuidedStep.Half&quot;>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/themes_appcompat.xml"
-            line="42"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.style.Theme_Example_AppCompat_Leanback_Preferences` appears to be unused"
-        errorLine1="    &lt;style name=&quot;Theme.Example.AppCompat.Leanback.Preferences&quot;>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/themes_appcompat.xml"
-            line="44"
-            column="12"/>
-    </issue>
-
-    <issue
         id="SyntheticAccessor"
         message="Access to `private` member of class `ItemViewClickedListener` requires synthetic accessor"
         errorLine1="        setOnItemViewClickedListener(new ItemViewClickedListener());"
diff --git a/samples/SupportPreferenceDemos/lint-baseline.xml b/samples/SupportPreferenceDemos/lint-baseline.xml
index 111db1c..1f9c3bd 100644
--- a/samples/SupportPreferenceDemos/lint-baseline.xml
+++ b/samples/SupportPreferenceDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="MissingTvBanner"
@@ -13,17 +13,6 @@
     </issue>
 
     <issue
-        id="UnusedResources"
-        message="The resource `R.bool.atLeastP` appears to be unused"
-        errorLine1="    &lt;bool name=&quot;atLeastP&quot;>true&lt;/bool>"
-        errorLine2="          ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values-v28/bools.xml"
-            line="20"
-            column="11"/>
-    </issue>
-
-    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
diff --git a/samples/SupportRemoteCallbackDemos/lint-baseline.xml b/samples/SupportRemoteCallbackDemos/lint-baseline.xml
index 02d6453..7fea55a 100644
--- a/samples/SupportRemoteCallbackDemos/lint-baseline.xml
+++ b/samples/SupportRemoteCallbackDemos/lint-baseline.xml
@@ -1,38 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.style.AppTheme_NoActionBar` appears to be unused"
-        errorLine1="    &lt;style name=&quot;AppTheme.NoActionBar&quot;>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/styles.xml"
-            line="28"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.style.AppTheme_AppBarOverlay` appears to be unused"
-        errorLine1="    &lt;style name=&quot;AppTheme.AppBarOverlay&quot; parent=&quot;ThemeOverlay.AppCompat.Dark.ActionBar&quot;/>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/styles.xml"
-            line="32"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.style.AppTheme_PopupOverlay` appears to be unused"
-        errorLine1="    &lt;style name=&quot;AppTheme.PopupOverlay&quot; parent=&quot;ThemeOverlay.AppCompat.Light&quot;/>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/styles.xml"
-            line="33"
-            column="12"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/samples/SupportSliceDemos/lint-baseline.xml b/samples/SupportSliceDemos/lint-baseline.xml
index def57e7..5f5225d 100644
--- a/samples/SupportSliceDemos/lint-baseline.xml
+++ b/samples/SupportSliceDemos/lint-baseline.xml
@@ -1,82 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.layout.activity_demo` appears to be unused"
-        errorLine1="&lt;LinearLayout"
-        errorLine2="^">
-        <location
-            file="src/main/res/layout/activity_demo.xml"
-            line="18"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.textColor` appears to be unused"
-        errorLine1="    &lt;color name=&quot;textColor&quot;>#D9000000&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="24"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.tintColor` appears to be unused"
-        errorLine1="    &lt;color name=&quot;tintColor&quot;>#FF12A4Af&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="25"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.dimen.textSize` appears to be unused"
-        errorLine1="    &lt;dimen name=&quot;textSize&quot;>10sp&lt;/dimen>"
-        errorLine2="           ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/dimens.xml"
-            line="19"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.dimen.smallTextSize` appears to be unused"
-        errorLine1="    &lt;dimen name=&quot;smallTextSize&quot;>9sp&lt;/dimen>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/dimens.xml"
-            line="20"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.style.AppTheme_AppBarOverlay` appears to be unused"
-        errorLine1="    &lt;style name=&quot;AppTheme.AppBarOverlay&quot; parent=&quot;ThemeOverlay.AppCompat.Dark.ActionBar&quot;/>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/styles.xml"
-            line="34"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.style.AppTheme_PopupOverlay` appears to be unused"
-        errorLine1="    &lt;style name=&quot;AppTheme.PopupOverlay&quot; parent=&quot;ThemeOverlay.AppCompat.Light&quot;/>"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/styles.xml"
-            line="35"
-            column="12"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="SyntheticAccessor"
diff --git a/samples/SupportTransitionDemos/lint-baseline.xml b/samples/SupportTransitionDemos/lint-baseline.xml
index 6a772d4..7a2c909 100644
--- a/samples/SupportTransitionDemos/lint-baseline.xml
+++ b/samples/SupportTransitionDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="AppCompatResource"
@@ -13,41 +13,6 @@
     </issue>
 
     <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_action_navigation_menu` appears to be unused">
-        <location
-            file="src/main/res/drawable-hdpi/ic_action_navigation_menu.png"/>
-        <location
-            file="src/main/res/drawable-mdpi/ic_action_navigation_menu.png"/>
-        <location
-            file="src/main/res/drawable-xhdpi/ic_action_navigation_menu.png"/>
-        <location
-            file="src/main/res/drawable-xxhdpi/ic_action_navigation_menu.png"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_add` appears to be unused">
-        <location
-            file="src/main/res/drawable-xxhdpi/ic_add.png"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_android` appears to be unused">
-        <location
-            file="src/main/res/drawable-hdpi/ic_android.png"/>
-        <location
-            file="src/main/res/drawable-mdpi/ic_android.png"/>
-        <location
-            file="src/main/res/drawable-xhdpi/ic_android.png"/>
-        <location
-            file="src/main/res/drawable-xxhdpi/ic_android.png"/>
-        <location
-            file="src/main/res/drawable-xxxhdpi/ic_android.png"/>
-    </issue>
-
-    <issue
         id="SyntheticAccessor"
         message="Access to `private` field `mRoot` of class `ArcMotionUsage` requires synthetic accessor"
         errorLine1="                TransitionManager.beginDelayedTransition(mRoot, mTransition);"
diff --git a/samples/SupportWearDemos/lint-baseline.xml b/samples/SupportWearDemos/lint-baseline.xml
index c67016a..50d9261 100644
--- a/samples/SupportWearDemos/lint-baseline.xml
+++ b/samples/SupportWearDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="SyntheticAccessor"
@@ -74,7 +74,7 @@
         errorLine2="                                  ~~~~~">
         <location
             file="src/main/java/com/example/android/support/wear/app/MainDemoActivity.java"
-            line="112"
+            line="114"
             column="35"/>
     </issue>
 
@@ -85,7 +85,7 @@
         errorLine2="                                            ~~~~~">
         <location
             file="src/main/java/com/example/android/support/wear/app/MainDemoActivity.java"
-            line="112"
+            line="114"
             column="45"/>
     </issue>
 
@@ -217,7 +217,7 @@
         errorLine2="                            ~~~~~~">
         <location
             file="src/main/java/com/example/android/support/wear/app/MainDemoActivity.java"
-            line="42"
+            line="43"
             column="29"/>
     </issue>
 
diff --git a/security/crypto/lint-baseline.xml b/security/crypto/lint-baseline.xml
index c944174..50222a8 100644
--- a/security/crypto/lint-baseline.xml
+++ b/security/crypto/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/security/security-app-authenticator-testing/OWNERS b/security/security-app-authenticator-testing/OWNERS
new file mode 100644
index 0000000..00fc159
--- /dev/null
+++ b/security/security-app-authenticator-testing/OWNERS
@@ -0,0 +1 @@
[email protected]
diff --git a/security/security-app-authenticator-testing/api/current.txt b/security/security-app-authenticator-testing/api/current.txt
new file mode 100644
index 0000000..9e8fd21
--- /dev/null
+++ b/security/security-app-authenticator-testing/api/current.txt
@@ -0,0 +1,19 @@
+// Signature format: 4.0
+package androidx.security.app.authenticator {
+
+  public final class TestAppAuthenticatorBuilder {
+    method public androidx.security.app.authenticator.AppAuthenticator build() throws androidx.security.app.authenticator.AppAuthenticatorXmlException, java.io.IOException;
+    method public static androidx.security.app.authenticator.TestAppAuthenticatorBuilder createFromInputStream(android.content.Context, java.io.InputStream) throws androidx.security.app.authenticator.AppAuthenticatorXmlException;
+    method public static androidx.security.app.authenticator.TestAppAuthenticatorBuilder createFromResource(android.content.Context, @XmlRes int);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setPackageNotInstalled(String);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setSignatureAcceptedForPackage(String);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setSigningIdentityForPackage(String, String);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setTestPolicy(int);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setUidForPackage(String, int);
+    field public static final int POLICY_CUSTOM = 3; // 0x3
+    field public static final int POLICY_DENY_ALL = 2; // 0x2
+    field public static final int POLICY_SIGNATURE_ACCEPTED_FOR_DECLARED_PACKAGES = 1; // 0x1
+  }
+
+}
+
diff --git a/security/security-app-authenticator-testing/api/public_plus_experimental_current.txt b/security/security-app-authenticator-testing/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..9e8fd21
--- /dev/null
+++ b/security/security-app-authenticator-testing/api/public_plus_experimental_current.txt
@@ -0,0 +1,19 @@
+// Signature format: 4.0
+package androidx.security.app.authenticator {
+
+  public final class TestAppAuthenticatorBuilder {
+    method public androidx.security.app.authenticator.AppAuthenticator build() throws androidx.security.app.authenticator.AppAuthenticatorXmlException, java.io.IOException;
+    method public static androidx.security.app.authenticator.TestAppAuthenticatorBuilder createFromInputStream(android.content.Context, java.io.InputStream) throws androidx.security.app.authenticator.AppAuthenticatorXmlException;
+    method public static androidx.security.app.authenticator.TestAppAuthenticatorBuilder createFromResource(android.content.Context, @XmlRes int);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setPackageNotInstalled(String);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setSignatureAcceptedForPackage(String);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setSigningIdentityForPackage(String, String);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setTestPolicy(int);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setUidForPackage(String, int);
+    field public static final int POLICY_CUSTOM = 3; // 0x3
+    field public static final int POLICY_DENY_ALL = 2; // 0x2
+    field public static final int POLICY_SIGNATURE_ACCEPTED_FOR_DECLARED_PACKAGES = 1; // 0x1
+  }
+
+}
+
diff --git a/security/security-app-authenticator-testing/api/res-current.txt b/security/security-app-authenticator-testing/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/security/security-app-authenticator-testing/api/res-current.txt
diff --git a/security/security-app-authenticator-testing/api/restricted_current.txt b/security/security-app-authenticator-testing/api/restricted_current.txt
new file mode 100644
index 0000000..9e8fd21
--- /dev/null
+++ b/security/security-app-authenticator-testing/api/restricted_current.txt
@@ -0,0 +1,19 @@
+// Signature format: 4.0
+package androidx.security.app.authenticator {
+
+  public final class TestAppAuthenticatorBuilder {
+    method public androidx.security.app.authenticator.AppAuthenticator build() throws androidx.security.app.authenticator.AppAuthenticatorXmlException, java.io.IOException;
+    method public static androidx.security.app.authenticator.TestAppAuthenticatorBuilder createFromInputStream(android.content.Context, java.io.InputStream) throws androidx.security.app.authenticator.AppAuthenticatorXmlException;
+    method public static androidx.security.app.authenticator.TestAppAuthenticatorBuilder createFromResource(android.content.Context, @XmlRes int);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setPackageNotInstalled(String);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setSignatureAcceptedForPackage(String);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setSigningIdentityForPackage(String, String);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setTestPolicy(int);
+    method public androidx.security.app.authenticator.TestAppAuthenticatorBuilder setUidForPackage(String, int);
+    field public static final int POLICY_CUSTOM = 3; // 0x3
+    field public static final int POLICY_DENY_ALL = 2; // 0x2
+    field public static final int POLICY_SIGNATURE_ACCEPTED_FOR_DECLARED_PACKAGES = 1; // 0x1
+  }
+
+}
+
diff --git a/security/security-app-authenticator-testing/build.gradle b/security/security-app-authenticator-testing/build.gradle
new file mode 100644
index 0000000..5d92e64
--- /dev/null
+++ b/security/security-app-authenticator-testing/build.gradle
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.build.LibraryGroups
+import androidx.build.LibraryVersions
+import androidx.build.LibraryType
+import androidx.build.Publish
+
+import static androidx.build.dependencies.DependenciesKt.ANDROIDX_TEST_CORE
+import static androidx.build.dependencies.DependenciesKt.ANDROIDX_TEST_EXT_JUNIT
+import static androidx.build.dependencies.DependenciesKt.ANDROIDX_TEST_RULES
+import static androidx.build.dependencies.DependenciesKt.ANDROIDX_TEST_RUNNER
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+}
+
+dependencies {
+    implementation (project(":security:security-app-authenticator"))
+    implementation("androidx.collection:collection:1.1.0")
+
+    androidTestImplementation("junit:junit:4.13")
+    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
+    androidTestImplementation(ANDROIDX_TEST_CORE)
+    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(ANDROIDX_TEST_RULES)
+}
+
+android {
+    testOptions.unitTests.includeAndroidResources = true
+}
+
+androidx {
+    name = "Android Security App Package Authenticator Testing"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenVersion = LibraryVersions.SECURITY_APP_AUTHENTICATOR_TESTING
+    mavenGroup = LibraryGroups.SECURITY
+    inceptionYear = "2021"
+    description = "This library provides a configurable AppAuthenticator that can be used during testing"
+}
diff --git a/security/security-app-authenticator-testing/src/androidTest/AndroidManifest.xml b/security/security-app-authenticator-testing/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..901dec6
--- /dev/null
+++ b/security/security-app-authenticator-testing/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.security.app.authenticator.testing.test">
+
+</manifest>
+
diff --git a/security/security-app-authenticator-testing/src/androidTest/java/androidx/security/app/authenticator/TestAppAuthenticatorBuilderTest.java b/security/security-app-authenticator-testing/src/androidTest/java/androidx/security/app/authenticator/TestAppAuthenticatorBuilderTest.java
new file mode 100644
index 0000000..b45f255
--- /dev/null
+++ b/security/security-app-authenticator-testing/src/androidTest/java/androidx/security/app/authenticator/TestAppAuthenticatorBuilderTest.java
@@ -0,0 +1,327 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.security.app.authenticator;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
+
+import android.content.Context;
+import android.content.res.Resources;
+
+import androidx.security.app.authenticator.testing.test.R;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class TestAppAuthenticatorBuilderTest {
+    private static final String DECLARED_PACKAGE1 = "com.android.app1";
+    private static final String DECLARED_PACKAGE2 = "com.android.app2";
+    private static final String UNDECLARED_PACKAGE = "com.android.undeclared.app";
+    private static final String EXPECTED_IDENTITY_PACKAGE = "com.social.app";
+    private static final String TEST_PERMISSION =
+            "androidx.security.app.authenticator.TEST_PERMISSION";
+
+    private Context mContext;
+    private Resources mResources;
+    private TestAppAuthenticatorBuilder mBuilderFromResource;
+    private TestAppAuthenticatorBuilder mBuilderFromInputStream;
+
+    @Before
+    public void setUp() throws Exception {
+        mContext = ApplicationProvider.getApplicationContext();
+        mResources = mContext.getResources();
+        mBuilderFromResource = TestAppAuthenticatorBuilder.createFromResource(mContext,
+                R.xml.test_config);
+        mBuilderFromInputStream = TestAppAuthenticatorBuilder.createFromInputStream(mContext,
+                mResources.openRawResource(R.raw.test_config));
+    }
+
+    @Test
+    public void verifyAppIdentity_defaultPolicyDeclaredPackage_returnsMatch() throws Exception {
+        // By default the TestAppAuthenticator returns a test instance that will report all declared
+        // packages have the expected signing identity. This test verifies this default behavior
+        // using the declared test packages from the config.
+        AppAuthenticator appAuthenticatorFromResource = mBuilderFromResource.build();
+        AppAuthenticator appAuthenticatorFromInputStream = mBuilderFromInputStream.build();
+
+        assertEquals(AppAuthenticator.PERMISSION_GRANTED,
+                appAuthenticatorFromResource.checkCallingAppIdentity(
+                        DECLARED_PACKAGE1, TEST_PERMISSION));
+        assertEquals(AppAuthenticator.PERMISSION_GRANTED,
+                appAuthenticatorFromInputStream.checkCallingAppIdentity(
+                        DECLARED_PACKAGE1, TEST_PERMISSION));
+        assertEquals(AppAuthenticator.SIGNATURE_MATCH,
+                appAuthenticatorFromResource.checkAppIdentity(EXPECTED_IDENTITY_PACKAGE));
+        assertEquals(AppAuthenticator.SIGNATURE_MATCH,
+                appAuthenticatorFromInputStream.checkAppIdentity(EXPECTED_IDENTITY_PACKAGE));
+        // Since the AppAuthenticator with this policy should return permission granted the
+        // enforce version of this method should not throw any exceptions.
+        appAuthenticatorFromResource.enforceCallingAppIdentity(
+                DECLARED_PACKAGE1, TEST_PERMISSION);
+        appAuthenticatorFromInputStream.enforceCallingAppIdentity(
+                DECLARED_PACKAGE1, TEST_PERMISSION);
+        appAuthenticatorFromResource.enforceAppIdentity(EXPECTED_IDENTITY_PACKAGE);
+        appAuthenticatorFromInputStream.enforceAppIdentity(EXPECTED_IDENTITY_PACKAGE);
+    }
+
+    @Test
+    public void verifyAppIdentity_defaultPolicyUndeclaredPackage_returnsNoMatch() throws Exception {
+        // This test verifies the default policy used by the instance returned from the
+        // TestAppAuthenticator will report a package as not having an expected signing identity
+        // if it is not declared in the XML config.
+        AppAuthenticator appAuthenticatorFromResource = mBuilderFromResource.build();
+        AppAuthenticator appAuthenticatorFromInputStream = mBuilderFromInputStream.build();
+
+        assertEquals(AppAuthenticator.PERMISSION_DENIED_NO_MATCH,
+                appAuthenticatorFromResource.checkCallingAppIdentity(
+                        UNDECLARED_PACKAGE, TEST_PERMISSION));
+        assertEquals(AppAuthenticator.PERMISSION_DENIED_NO_MATCH,
+                appAuthenticatorFromInputStream.checkCallingAppIdentity(
+                        UNDECLARED_PACKAGE, TEST_PERMISSION));
+        assertEquals(AppAuthenticator.SIGNATURE_NO_MATCH,
+                appAuthenticatorFromResource.checkAppIdentity(UNDECLARED_PACKAGE));
+        assertEquals(AppAuthenticator.SIGNATURE_NO_MATCH,
+                appAuthenticatorFromInputStream.checkAppIdentity(UNDECLARED_PACKAGE));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromResource.enforceCallingAppIdentity(
+                        UNDECLARED_PACKAGE, TEST_PERMISSION));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromInputStream.enforceCallingAppIdentity(
+                        UNDECLARED_PACKAGE, TEST_PERMISSION));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromResource.enforceAppIdentity(UNDECLARED_PACKAGE));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromInputStream.enforceAppIdentity(UNDECLARED_PACKAGE));
+
+
+    }
+
+    @Test
+    public void verifyAppIdentity_denyAllPolicyDeclaredPackage_returnsNoMatch() throws Exception {
+        // The TestAppAuthenticator also provides an option to specify a deny all policy that will
+        // report any package does not have the expected signing identity even if it is declared
+        // in the XML config.
+        AppAuthenticator appAuthenticatorFromResource =
+                mBuilderFromResource.setTestPolicy(
+                        TestAppAuthenticatorBuilder.POLICY_DENY_ALL).build();
+        AppAuthenticator appAuthenticatorFromInputStream =
+                mBuilderFromInputStream.setTestPolicy(
+                        TestAppAuthenticatorBuilder.POLICY_DENY_ALL).build();
+
+        assertEquals(AppAuthenticator.PERMISSION_DENIED_NO_MATCH,
+                appAuthenticatorFromResource.checkCallingAppIdentity(
+                        DECLARED_PACKAGE1, TEST_PERMISSION));
+        assertEquals(AppAuthenticator.PERMISSION_DENIED_NO_MATCH,
+                appAuthenticatorFromInputStream.checkCallingAppIdentity(
+                        DECLARED_PACKAGE1, TEST_PERMISSION));
+        assertEquals(AppAuthenticator.SIGNATURE_NO_MATCH,
+                appAuthenticatorFromResource.checkAppIdentity(EXPECTED_IDENTITY_PACKAGE));
+        assertEquals(AppAuthenticator.SIGNATURE_NO_MATCH,
+                appAuthenticatorFromInputStream.checkAppIdentity(EXPECTED_IDENTITY_PACKAGE));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromResource.enforceCallingAppIdentity(
+                        DECLARED_PACKAGE1, TEST_PERMISSION));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromInputStream.enforceCallingAppIdentity(
+                        DECLARED_PACKAGE1, TEST_PERMISSION));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromResource.enforceAppIdentity(EXPECTED_IDENTITY_PACKAGE));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromInputStream.enforceAppIdentity(EXPECTED_IDENTITY_PACKAGE));
+    }
+
+    @Test
+    public void verifyAppIdentity_declaredPackageWithExpectedSigningIdentity_returnsMatch()
+            throws Exception {
+        // The TestAppAuthenticator provides an option to specify the signing identity of a package;
+        // this test verifies when the specified signing identity matches that in the provided XML
+        // config the instance returned from TestAppAuthenticator reports the match.
+        AppAuthenticator appAuthenticatorFromResource =
+                mBuilderFromResource.setSigningIdentityForPackage(DECLARED_PACKAGE1,
+                        "fb5dbd3c669af9fc236c6991e6387b7f11ff0590997f22d0f5c74ff40e04fca8")
+                        .setSigningIdentityForPackage(EXPECTED_IDENTITY_PACKAGE,
+                        "d78405f761ff6236cc9b570347a570aba0c62a129a3ac30c831c64d09ad95469")
+                        .build();
+        AppAuthenticator appAuthenticatorFromInputStream =
+                mBuilderFromInputStream.setSigningIdentityForPackage(DECLARED_PACKAGE1,
+                        "fb5dbd3c669af9fc236c6991e6387b7f11ff0590997f22d0f5c74ff40e04fca8")
+                        .setSigningIdentityForPackage(EXPECTED_IDENTITY_PACKAGE,
+                        "d78405f761ff6236cc9b570347a570aba0c62a129a3ac30c831c64d09ad95469")
+                        .build();
+
+        assertEquals(AppAuthenticator.PERMISSION_GRANTED,
+                appAuthenticatorFromResource.checkCallingAppIdentity(
+                        DECLARED_PACKAGE1, TEST_PERMISSION));
+        assertEquals(AppAuthenticator.PERMISSION_GRANTED,
+                appAuthenticatorFromInputStream.checkCallingAppIdentity(
+                        DECLARED_PACKAGE1, TEST_PERMISSION));
+        assertEquals(AppAuthenticator.SIGNATURE_MATCH,
+                appAuthenticatorFromResource.checkAppIdentity(EXPECTED_IDENTITY_PACKAGE));
+        assertEquals(AppAuthenticator.SIGNATURE_MATCH,
+                appAuthenticatorFromInputStream.checkAppIdentity(EXPECTED_IDENTITY_PACKAGE));
+        appAuthenticatorFromResource.enforceCallingAppIdentity(
+                DECLARED_PACKAGE1, TEST_PERMISSION);
+        appAuthenticatorFromResource.enforceCallingAppIdentity(
+                DECLARED_PACKAGE1, TEST_PERMISSION);
+        appAuthenticatorFromResource.checkAppIdentity(EXPECTED_IDENTITY_PACKAGE);
+        appAuthenticatorFromInputStream.checkAppIdentity(EXPECTED_IDENTITY_PACKAGE);
+    }
+
+    @Test
+    public void callingAppIdentity_undeclaredPackageWithExpectedSigningIdentity_returnsMatch()
+            throws Exception {
+        // By using the setSigningIdentityForPackage method a test can set the signing identity
+        // for a package that is not explicitly declared in the XML config; this can be useful
+        // for configs that make use of the all-packages tag and thus cannot use the default
+        // "accept all declared packages" policy.
+        // Note, the expected-identity tag does not support an all-packages declaration, so only
+        // the calling identity is verified here.
+        AppAuthenticator appAuthenticatorFromResource =
+                mBuilderFromResource.setSigningIdentityForPackage(UNDECLARED_PACKAGE,
+                        "681b0e56a796350c08647352a4db800cc44b2adc8f4c72fa350bd05d4d50264d")
+                        .build();
+        AppAuthenticator appAuthenticatorFromInputStream =
+                mBuilderFromInputStream.setSigningIdentityForPackage(UNDECLARED_PACKAGE,
+                        "681b0e56a796350c08647352a4db800cc44b2adc8f4c72fa350bd05d4d50264d")
+                        .build();
+
+        assertEquals(AppAuthenticator.PERMISSION_GRANTED,
+                appAuthenticatorFromResource.checkCallingAppIdentity(
+                        UNDECLARED_PACKAGE, TEST_PERMISSION));
+        assertEquals(AppAuthenticator.PERMISSION_GRANTED,
+                appAuthenticatorFromInputStream.checkCallingAppIdentity(
+                        UNDECLARED_PACKAGE, TEST_PERMISSION));
+        appAuthenticatorFromResource.enforceCallingAppIdentity(UNDECLARED_PACKAGE, TEST_PERMISSION);
+        appAuthenticatorFromInputStream.enforceCallingAppIdentity(
+                UNDECLARED_PACKAGE, TEST_PERMISSION);
+    }
+
+    @Test
+    public void callingAppIdentity_packageUidMismatch_returnsUidMismatch() throws Exception {
+        // The uid of the calling app can be set through the TestAppAuthenticator to test scenarios
+        // when the ID of the calling app does not match that of the specified package. This test
+        // verifies the AppAuthenticator instance returned from the TestAppAuthenticator returns
+        // the proper result for this mismatch.
+        final int packageUid = 10001;
+        final int callingUid = 10123;
+        final int callingPid = 1234;
+        AppAuthenticator appAuthenticatorFromResource =
+                mBuilderFromResource.setUidForPackage(DECLARED_PACKAGE1, packageUid).build();
+        AppAuthenticator appAuthenticatorFromInputStream =
+                mBuilderFromInputStream.setUidForPackage(DECLARED_PACKAGE1, packageUid).build();
+
+        assertEquals(AppAuthenticator.PERMISSION_DENIED_PACKAGE_UID_MISMATCH,
+                appAuthenticatorFromResource.checkCallingAppIdentity(DECLARED_PACKAGE1,
+                        TEST_PERMISSION, callingPid, callingUid));
+        assertEquals(AppAuthenticator.PERMISSION_DENIED_PACKAGE_UID_MISMATCH,
+                appAuthenticatorFromInputStream.checkCallingAppIdentity(DECLARED_PACKAGE1,
+                        TEST_PERMISSION, callingPid, callingUid));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromResource.enforceCallingAppIdentity(DECLARED_PACKAGE1,
+                        TEST_PERMISSION, callingPid, callingUid));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromInputStream.enforceCallingAppIdentity(DECLARED_PACKAGE1,
+                        TEST_PERMISSION, callingPid, callingUid));
+    }
+
+    @Test
+    public void verifyAppIdentity_signatureAcceptedForPackage_returnsExpectedResult()
+            throws Exception {
+        // The TestAppAuthenticator allows packages to be individually set to accept the signing
+        // identity. This test verifies the signature is accepted for specified packages, but is
+        // rejected for all other packages.
+        AppAuthenticator appAuthenticatorFromResource =
+                mBuilderFromResource.setSignatureAcceptedForPackage(
+                        DECLARED_PACKAGE1).setSignatureAcceptedForPackage(
+                        EXPECTED_IDENTITY_PACKAGE).build();
+        AppAuthenticator appAuthenticatorFromInputStream =
+                mBuilderFromInputStream.setSignatureAcceptedForPackage(
+                        DECLARED_PACKAGE1).setSignatureAcceptedForPackage(
+                        EXPECTED_IDENTITY_PACKAGE).build();
+
+        assertEquals(AppAuthenticator.PERMISSION_GRANTED,
+                appAuthenticatorFromResource.checkCallingAppIdentity(
+                        DECLARED_PACKAGE1, TEST_PERMISSION));
+        assertEquals(AppAuthenticator.PERMISSION_GRANTED,
+                appAuthenticatorFromInputStream.checkCallingAppIdentity(
+                        DECLARED_PACKAGE1, TEST_PERMISSION));
+        assertEquals(AppAuthenticator.PERMISSION_GRANTED,
+                appAuthenticatorFromResource.checkAppIdentity(EXPECTED_IDENTITY_PACKAGE));
+        assertEquals(AppAuthenticator.PERMISSION_GRANTED,
+                appAuthenticatorFromInputStream.checkAppIdentity(EXPECTED_IDENTITY_PACKAGE));
+        // A package declared in the XML config but not set explicitly to be accepted should be
+        // rejected.
+        assertEquals(AppAuthenticator.PERMISSION_DENIED_NO_MATCH,
+                appAuthenticatorFromResource.checkCallingAppIdentity(
+                        DECLARED_PACKAGE2, TEST_PERMISSION));
+        assertEquals(AppAuthenticator.PERMISSION_DENIED_NO_MATCH,
+                appAuthenticatorFromInputStream.checkCallingAppIdentity(
+                        DECLARED_PACKAGE2, TEST_PERMISSION));
+        appAuthenticatorFromResource.enforceCallingAppIdentity(DECLARED_PACKAGE1, TEST_PERMISSION);
+        appAuthenticatorFromInputStream.enforceCallingAppIdentity(
+                DECLARED_PACKAGE1, TEST_PERMISSION);
+        appAuthenticatorFromResource.enforceAppIdentity(EXPECTED_IDENTITY_PACKAGE);
+        appAuthenticatorFromInputStream.enforceAppIdentity(EXPECTED_IDENTITY_PACKAGE);
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromResource.enforceCallingAppIdentity(
+                        DECLARED_PACKAGE2, TEST_PERMISSION));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromInputStream.enforceCallingAppIdentity(
+                        DECLARED_PACKAGE2, TEST_PERMISSION));
+    }
+
+    @Test
+    public void callingAppIdentity_packageNotInstalled_returnsUnknownPackage() throws Exception {
+        // The TestAppAuthenticator can be configured to treat a package as uninstalled to verify
+        // scenarios where the package being queried is not available on the device.
+        AppAuthenticator appAuthenticatorFromResource =
+                mBuilderFromResource.setPackageNotInstalled(
+                        DECLARED_PACKAGE1).setPackageNotInstalled(
+                        EXPECTED_IDENTITY_PACKAGE).build();
+        AppAuthenticator appAuthenticatorFromInputStream =
+                mBuilderFromInputStream.setPackageNotInstalled(
+                        DECLARED_PACKAGE1).setPackageNotInstalled(
+                        EXPECTED_IDENTITY_PACKAGE).build();
+
+        assertEquals(AppAuthenticator.PERMISSION_DENIED_UNKNOWN_PACKAGE,
+                appAuthenticatorFromResource.checkCallingAppIdentity(
+                        DECLARED_PACKAGE1, TEST_PERMISSION));
+        assertEquals(AppAuthenticator.PERMISSION_DENIED_UNKNOWN_PACKAGE,
+                appAuthenticatorFromInputStream.checkCallingAppIdentity(
+                        DECLARED_PACKAGE1, TEST_PERMISSION));
+        assertEquals(AppAuthenticator.SIGNATURE_NO_MATCH,
+                appAuthenticatorFromResource.checkAppIdentity(EXPECTED_IDENTITY_PACKAGE));
+        assertEquals(AppAuthenticator.SIGNATURE_NO_MATCH,
+                appAuthenticatorFromInputStream.checkAppIdentity(EXPECTED_IDENTITY_PACKAGE));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromResource.enforceCallingAppIdentity(
+                        DECLARED_PACKAGE1, TEST_PERMISSION));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromInputStream.enforceCallingAppIdentity(
+                        DECLARED_PACKAGE1, TEST_PERMISSION));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromResource.enforceAppIdentity(EXPECTED_IDENTITY_PACKAGE));
+        assertThrows(SecurityException.class, () ->
+                appAuthenticatorFromInputStream.enforceAppIdentity(EXPECTED_IDENTITY_PACKAGE));
+    }
+}
diff --git a/security/security-app-authenticator-testing/src/androidTest/java/androidx/security/app/authenticator/TestAppAuthenticatorUtilsTest.java b/security/security-app-authenticator-testing/src/androidTest/java/androidx/security/app/authenticator/TestAppAuthenticatorUtilsTest.java
new file mode 100644
index 0000000..ccee60b
--- /dev/null
+++ b/security/security-app-authenticator-testing/src/androidTest/java/androidx/security/app/authenticator/TestAppAuthenticatorUtilsTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.security.app.authenticator;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Binder;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class TestAppAuthenticatorUtilsTest {
+    private static final String TEST_PACKAGE = "com.android.app1";
+
+    private TestAppAuthenticatorUtils.Builder mBuilder;
+
+    @Before
+    public void setUp() throws Exception {
+        Context context = ApplicationProvider.getApplicationContext();
+        mBuilder = new TestAppAuthenticatorUtils.Builder(context);
+    }
+
+    @Test
+    public void getUidForPackage_defaultConfig_returnsBinderCallingUid() throws Exception {
+        // By default the TestAppAuthenticatorUtils should return Binder#getCallingUid as the UID
+        // of any specified package.
+        TestAppAuthenticatorUtils utils = mBuilder.build();
+
+        assertEquals(Binder.getCallingUid(), utils.getUidForPackage(TEST_PACKAGE));
+    }
+
+    @Test
+    public void getUidForPackage_setUidForPackage_returnsSetUid() throws Exception {
+        // The TestAppAuthentictorUtils allows the UID of a package to be explicit set to verify
+        // cases where the UID of the specified package does not match the UID of the calling
+        // package.
+        TestAppAuthenticatorUtils utils = mBuilder.setUidForPackage(TEST_PACKAGE, 1234).build();
+
+        assertEquals(1234, utils.getUidForPackage(TEST_PACKAGE));
+
+    }
+
+    @Test
+    public void getUidForPackage_packageNotInstalled_throwsException() throws Exception {
+        // The TestAppAuthenticatorUtils can be configured to treat a package as not installed;
+        // this will result in a PackageManager.NameNotFoundException being thrown, similar to
+        // what is thrown by the platform when invoking PackageManager#getPackageInfo with a
+        // package that is not installed on the device.
+        TestAppAuthenticatorUtils utils = mBuilder.setPackageNotInstalled(TEST_PACKAGE).build();
+
+        assertThrows(PackageManager.NameNotFoundException.class,
+                () -> utils.getUidForPackage(TEST_PACKAGE));
+    }
+}
diff --git a/security/security-app-authenticator-testing/src/androidTest/java/androidx/security/app/authenticator/TestAppSignatureVerifierTest.java b/security/security-app-authenticator-testing/src/androidTest/java/androidx/security/app/authenticator/TestAppSignatureVerifierTest.java
new file mode 100644
index 0000000..ec5ea8db
--- /dev/null
+++ b/security/security-app-authenticator-testing/src/androidTest/java/androidx/security/app/authenticator/TestAppSignatureVerifierTest.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.security.app.authenticator;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+
+import androidx.security.app.authenticator.testing.test.R;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.xmlpull.v1.XmlPullParser;
+
+import java.util.Map;
+import java.util.Set;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class TestAppSignatureVerifierTest {
+    private static final String DECLARED_PACKAGE = "com.android.app1";
+    private static final String UNDECLARED_PACKAGE = "com.android.undeclared.app";
+    private static final String QUERY_TYPE = "test";
+    private static final String TEST_PERMISSION =
+            "androidx.security.app.authenticator.TEST_PERMISSION";
+
+    private TestAppSignatureVerifier.Builder mBuilder;
+    private Set<String> mPackageCertDigests;
+    private Set<String> mAllPackagesCertDigests;
+
+    @Before
+    public void setUp() throws Exception {
+        Context context = ApplicationProvider.getApplicationContext();
+        mBuilder = new TestAppSignatureVerifier.Builder(context);
+
+        XmlPullParser parser = context.getResources().getXml(R.xml.test_config);
+        AppAuthenticator.AppAuthenticatorConfig config =
+                AppAuthenticator.createConfigFromParser(parser);
+        Map<String, Map<String, Set<String>>> permissionAllowMap = config.getPermissionAllowMap();
+        mBuilder.setPermissionAllowMap(permissionAllowMap);
+        mBuilder.setExpectedIdentities(config.getExpectedIdentities());
+        // Set the test policy to custom since a majority of these test will use a custom config,
+        // and those that test a policy will set it explicitly.
+        mBuilder.setTestPolicy(TestAppAuthenticatorBuilder.POLICY_CUSTOM);
+        mPackageCertDigests = permissionAllowMap.get(TEST_PERMISSION).get(DECLARED_PACKAGE);
+        mAllPackagesCertDigests =
+                permissionAllowMap.get(TEST_PERMISSION).get(AppAuthenticator.ALL_PACKAGES_TAG);
+    }
+
+    @Test
+    public void verifySigningIdentityForQuery_policyAcceptDeclared_returnsExpectedResult()
+            throws Exception {
+        // The TestAppSignatureVerifier supports specifying a test policy; this test verifies the
+        // policy that accepts all declared packages does properly accept a package declared in
+        // the XML config and does not accept one that could potentially pass through an
+        // all-packages declaration.
+        TestAppSignatureVerifier verifier =
+                mBuilder.setTestPolicy(
+                        TestAppAuthenticatorBuilder.POLICY_SIGNATURE_ACCEPTED_FOR_DECLARED_PACKAGES)
+                        .build();
+
+        assertTrue(verifier.verifySigningIdentityForQuery(DECLARED_PACKAGE, QUERY_TYPE,
+                mPackageCertDigests, mAllPackagesCertDigests));
+        assertFalse(verifier.verifySigningIdentityForQuery(UNDECLARED_PACKAGE, QUERY_TYPE, null,
+                mAllPackagesCertDigests));
+    }
+
+    @Test
+    public void verifySigningIdentityForQuery_policyDenyAll_returnsNoMatch() throws Exception {
+        // The POLICY_DENY_ALL should cause all queries to be denied, even for packages
+        // explicitly declared in the app-authenticator's XML configuration.
+        TestAppSignatureVerifier verifier =
+                mBuilder.setTestPolicy(TestAppAuthenticatorBuilder.POLICY_DENY_ALL).build();
+
+        assertFalse(verifier.verifySigningIdentityForQuery(DECLARED_PACKAGE, QUERY_TYPE,
+                mPackageCertDigests, mAllPackagesCertDigests));
+        assertFalse(verifier.verifySigningIdentityForQuery(UNDECLARED_PACKAGE, QUERY_TYPE, null,
+                mAllPackagesCertDigests));
+    }
+
+    @Test
+    public void verifySigningIdentityForQuery_packageNotInstalled_returnsNoMatch()
+            throws Exception {
+        // The TestAppSignatureVerifier can be configured to treat apps as not installed; since
+        // they do not have a signing identity on the device this should cause the verifier to
+        // return no match for the exp signing identity.
+        TestAppSignatureVerifier verifier =
+                mBuilder.setPackageNotInstalled(DECLARED_PACKAGE).build();
+
+        assertFalse(verifier.verifySigningIdentityForQuery(DECLARED_PACKAGE, QUERY_TYPE,
+                mPackageCertDigests, mAllPackagesCertDigests));
+    }
+
+    @Test
+    public void verifySigningIdentityForQuery_packageSignatureAccepted_returnsMatch()
+            throws Exception {
+        // The TestAppSignatureVerifier can be configured to treat an app's signing identity as
+        // accepted.
+        TestAppSignatureVerifier verifier =
+                mBuilder.setSignatureAcceptedForPackage(DECLARED_PACKAGE).build();
+
+        assertTrue(verifier.verifySigningIdentityForQuery(DECLARED_PACKAGE, QUERY_TYPE,
+                mPackageCertDigests, mAllPackagesCertDigests));
+    }
+
+    @Test
+    public void verifySigningIdentityForQuery_packageSignatureSet_returnsExpectedValue()
+            throws Exception {
+        // The TestAppSignatureVerifier supports setting an explicit signing identity for a package;
+        // this can be used to test both that the configured identity matches the expected
+        // identity from the config file, but can also be used as a test case to verify a signing
+        // identity that is no longer trusted is not added back to the config file.
+        TestAppSignatureVerifier verifier =
+                mBuilder.setSigningIdentityForPackage(DECLARED_PACKAGE,
+                        "fb5dbd3c669af9fc236c6991e6387b7f11ff0590997f22d0f5c74ff40e04fca8")
+                        .build();
+        // Use new Sets of package certs that do not match the configured digest above; note that
+        // the all-packages set is required as well since the config does have the same
+        // certificate under that element too.
+        Set<String> newPackageCertDigests = Set.of(
+                "f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2");
+        Set<String> newAllPackagesCertDigests = Set.of(
+                "7d6fd7774f0d87624da6dcf16d0d3d104c3191e771fbe2f39c86aed4b2bf1a0f");
+
+        assertTrue(verifier.verifySigningIdentityForQuery(DECLARED_PACKAGE, QUERY_TYPE,
+                mPackageCertDigests, mAllPackagesCertDigests));
+        assertFalse(verifier.verifySigningIdentityForQuery(DECLARED_PACKAGE, QUERY_TYPE,
+                newPackageCertDigests, newAllPackagesCertDigests));
+    }
+}
diff --git a/security/security-app-authenticator-testing/src/androidTest/res/raw/test_config.xml b/security/security-app-authenticator-testing/src/androidTest/res/raw/test_config.xml
new file mode 100644
index 0000000..345e777
--- /dev/null
+++ b/security/security-app-authenticator-testing/src/androidTest/res/raw/test_config.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2020 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<app-authenticator>
+    <expected-identity>
+        <package name="com.bank.app">
+            <cert-digest> fb5dbd3c669af9fc236c6991e6387b7f11ff0590997f22d0f5c74ff40e04fca8
+            </cert-digest>
+        </package>
+        <package name="com.social.app">
+            <cert-digest>6a8b96e278e58f62cfe3584022cec1d0527fcb85a9e5d2e1694eb0405be5b599
+            </cert-digest>
+            <cert-digest>d78405f761ff6236cc9b570347a570aba0c62a129a3ac30c831c64d09ad95469
+            </cert-digest>
+        </package>
+    </expected-identity>
+    <permission name="androidx.security.app.authenticator.TEST_PERMISSION">
+        <all-packages>
+            <cert-digest>fb5dbd3c669af9fc236c6991e6387b7f11ff0590997f22d0f5c74ff40e04fca8
+            </cert-digest>
+            <cert-digest>681b0e56a796350c08647352a4db800cc44b2adc8f4c72fa350bd05d4d50264d
+            </cert-digest>
+        </all-packages>
+        <package name="com.android.app1">
+            <cert-digest>Fb5dbd3c669af9fc236c6991e6387b7f11ff0590997f22d0f5c74ff40e04fca8
+            </cert-digest>
+        </package>
+        <package name="com.android.app2">
+            <cert-digest>6a8b96e278e58f62cfe3584022cec1d0527fcb85a9e5d2e1694eb0405be5b599
+            </cert-digest>
+            <cert-digest>d78405f761ff6236cc9b570347a570aba0c62a129a3ac30c831c64d09ad95469
+            </cert-digest>
+        </package>
+    </permission>
+</app-authenticator>
diff --git a/security/security-app-authenticator-testing/src/androidTest/res/xml/test_config.xml b/security/security-app-authenticator-testing/src/androidTest/res/xml/test_config.xml
new file mode 100644
index 0000000..f8e6cce
--- /dev/null
+++ b/security/security-app-authenticator-testing/src/androidTest/res/xml/test_config.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2020 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<app-authenticator>
+    <expected-identity>
+        <package name="com.bank.app">
+            <cert-digest> fb5dbd3c669af9fc236c6991e6387b7f11ff0590997f22d0f5c74ff40e04fca8
+            </cert-digest>
+        </package>
+        <package name="com.social.app">
+            <cert-digest>6a8b96e278e58f62cfe3584022cec1d0527fcb85a9e5d2e1694eb0405be5b599
+            </cert-digest>
+            <cert-digest>d78405f761ff6236cc9b570347a570aba0c62a129a3ac30c831c64d09ad95469
+            </cert-digest>
+        </package>
+    </expected-identity>
+    <permission name="androidx.security.app.authenticator.TEST_PERMISSION">
+        <all-packages>
+            <cert-digest>fb5dbd3c669af9fc236c6991e6387b7f11ff0590997f22d0f5c74ff40e04fca8
+            </cert-digest>
+            <cert-digest>681b0e56a796350c08647352a4db800cc44b2adc8f4c72fa350bd05d4d50264d
+            </cert-digest>
+        </all-packages>
+        <package name="com.android.app1">
+            <cert-digest>fb5dbd3c669af9fc236c6991e6387b7f11ff0590997f22d0f5c74ff40e04fca8
+            </cert-digest>
+        </package>
+        <package name="com.android.app2">
+            <cert-digest>6a8b96e278e58f62cfe3584022cec1d0527fcb85a9e5d2e1694eb0405be5b599
+            </cert-digest>
+            <cert-digest>d78405f761ff6236cc9b570347a570aba0c62a129a3ac30c831c64d09ad95469
+            </cert-digest>
+        </package>
+    </permission>
+</app-authenticator>
diff --git a/security/security-app-authenticator-testing/src/main/AndroidManifest.xml b/security/security-app-authenticator-testing/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..24789e6
--- /dev/null
+++ b/security/security-app-authenticator-testing/src/main/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.security.app.authenticator.testing">
+
+</manifest>
diff --git a/security/security-app-authenticator-testing/src/main/java/androidx/security/app/authenticator/TestAppAuthenticatorBuilder.java b/security/security-app-authenticator-testing/src/main/java/androidx/security/app/authenticator/TestAppAuthenticatorBuilder.java
new file mode 100644
index 0000000..a5f21d6
--- /dev/null
+++ b/security/security-app-authenticator-testing/src/main/java/androidx/security/app/authenticator/TestAppAuthenticatorBuilder.java
@@ -0,0 +1,333 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.security.app.authenticator;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.Resources;
+import android.os.Binder;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.XmlRes;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlPullParserFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Builder class that can be used to facilitate the creation of a new {@link AppAuthenticator} which
+ * can be configured to meet the requirements of the test. Similar to the {@code AppAuthenticator},
+ * the static factory methods for this class require either an XML resource or {@link InputStream}
+ * containing the {@code app-authenticator} configuration allowing verification of your declared
+ * config as part of the test.
+ *
+ * <p>There are several options to configure the behavior of the resulting {@code AppAuthenticator}.
+ * <ul>
+ *     <li>{@link #setTestPolicy(int)} - This sets a generic test policy. {@link
+ *     #POLICY_SIGNATURE_ACCEPTED_FOR_DECLARED_PACKAGES} will cause the {@code AppAuthenticator}
+ *     to always return that a queried package has the expected signing identity as long as it is
+ *     explicitly declared in your configuration; that is, the package must be declared in a
+ *     {@code package} element within either an {@code expected-identity} or {@code permission}
+ *     element. {@link #POLICY_DENY_ALL} will cause the {@code AppAuthenticator} to always return
+ *     that a queried package does not have the expected signing identity regardless of its
+ *     declaration. These two policies can be used to verify good path and error path for
+ *     scenarios where the package names can be explicitly declared in the XML configuration.
+ *     <p>{@code POLICY_SIGNATURE_ACCEPTED_FOR_DECLARED_PACKAGES} is the default policy when no
+ *     other options are configured. When any of the other set methods (except for {@link
+ *     #setUidForPackage(String, int)}) are invoked they will set the policy to {@link
+ *     #POLICY_CUSTOM}.
+ *     </li>
+ *     <li>{@link #setSignatureAcceptedForPackage(String)} - This configures the {@code
+ *     AppAuthenticator} to always return that the specified package has the expected signing
+ *     identity. Note this still requires the {@code app-authenticator} have a path to verify
+ *     the provided package; that is, the package must either be explicitly declared in a
+ *     {@code package} element or fall under a {@code all-packages} element for the query being
+ *     performed. This is to ensure that a package being verified during the test could also be
+ *     successfully verified in production for the given query.
+ *     </li>
+ *     <li>{@link #setSigningIdentityForPackage(String, String)} - This sets an explicit
+ *     signing identity for the provided package; the signing identity should be
+ *     specified as the SHA-256 digest of the DER encoding of the signing certificate, similar
+ *     to how digests are specified in the {@code app-authenticator} configuration file. While
+ *     this can be used to set a signing identity to the expected value, this is more often
+ *     used to set the signing identity to a value that should not be accepted. For instance, a
+ *     test suite could have a test that verifies a key that is no longer trusted is never
+ *     added back to the configuration file.
+ *     </li>
+ *     <li>{@link #setPackageNotInstalled(String)} - This configures the {@code AppAuthenticator}
+ *     to treat the specified package as not installed on the device. Since a package that is not
+ *     installed can result in a different return code from the {@code AppAuthenticator} methods
+ *     this configuration can be used to verify an app's behavior when an expected app is not
+ *     installed on the device.
+ *     </li>
+ *     <li>{@link #setUidForPackage(String, int)} - The {@code AppAuthenticator} will
+ *     always verify the UID of the calling package matches the specified UID (or
+ *     {@link Binder#getCallingUid()} if a UID is not specified). By default this test {@code
+ *     AppAuthenticator} will use the result of {@code Binder#getCallingUid()} as the UID of all
+ *     queried packages. This method can be used to verify the expected behavior when a calling
+ *     package's UID does not match the expected UID.
+ *     </li>
+ * </ul>
+ */
+// The purpose of this class is to build a configurable AppAuthenticator for tests so the builder
+// is the top level class.
+@SuppressLint("TopLevelBuilder")
+public final class TestAppAuthenticatorBuilder {
+    private Context mContext;
+    private XmlPullParser mParser;
+    private @TestPolicy int mTestPolicy;
+    private TestAppSignatureVerifier.Builder mAppSignatureVerifierBuilder;
+    private TestAppAuthenticatorUtils.Builder mAppAuthenticatorUtilsBuilder;
+
+    /**
+     * Private constructor that should only be called by the static factory methods.
+     *
+     * @param context the context within which to create the {@link AppAuthenticator}
+     * @param parser  an {@link XmlPullParser} containing the definitions for the
+     *                permissions and expected identities based on package / expected signing
+     *                certificate digests
+     */
+    private TestAppAuthenticatorBuilder(Context context, XmlPullParser parser) {
+        mContext = context;
+        mParser = parser;
+        mTestPolicy = POLICY_SIGNATURE_ACCEPTED_FOR_DECLARED_PACKAGES;
+        mAppSignatureVerifierBuilder = new TestAppSignatureVerifier.Builder(context);
+        mAppAuthenticatorUtilsBuilder = new TestAppAuthenticatorUtils.Builder(mContext);
+    }
+
+    /**
+     * This test policy will cause the AppAuthenticator to return a successful signing identity for
+     * all packages explicitly declared in the XML configuration. This is the default policy used
+     * when a new {@code AppAuthenticator} is built without calling {@link
+     * #setSigningIdentityForPackage(String, String)}, {@link
+     * #setSignatureAcceptedForPackage(String)}, and {@link #setPackageNotInstalled(String)}.
+     */
+    public static final int POLICY_SIGNATURE_ACCEPTED_FOR_DECLARED_PACKAGES = 1;
+    /**
+     * This test policy will cause the AppAuthenticator to return that the signing identity of
+     * the package does that match the expect identity from the XML configuration for all queried
+     * packages.
+     */
+    public static final int POLICY_DENY_ALL = 2;
+    /**
+     * This test policy indicates that the caller will specify the expected results for each
+     * package individually. This is the default policy used when a new {@code TestAppAuthenticator}
+     * is built after calling any of the following:
+     * {@link #setSigningIdentityForPackage(String, String)}, {@link
+     * #setSignatureAcceptedForPackage(String)}, and {@link #setPackageNotInstalled(String)}.
+     * Once the policy has been set to this value it cannot be changed to any of the other policies.
+     */
+    public static final int POLICY_CUSTOM = 3;
+
+    @IntDef(value = {
+            POLICY_SIGNATURE_ACCEPTED_FOR_DECLARED_PACKAGES,
+            POLICY_DENY_ALL,
+            POLICY_CUSTOM,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    @interface TestPolicy {
+    }
+
+    /**
+     * Returns a new {@link TestAppAuthenticatorBuilder} that can be used to create a new {@link
+     * AppAuthenticator} configured to behave as required for the test.
+     *
+     * @param context     the context within which to create the {@link AppAuthenticator}
+     * @param xmlResource the ID of the XML resource containing the definitions for the
+     *                    permissions and expected identities based on package / expected signing
+     *                    certificate digests
+     * @return this instance of the {@code TestAppAuthenticatorBuilder}
+     */
+    // This is not a setter for the builder but instead a static factory method to obtain a new
+    // builder.
+    @SuppressLint("BuilderSetStyle")
+    @NonNull
+    public static TestAppAuthenticatorBuilder createFromResource(@NonNull Context context,
+            @XmlRes int xmlResource) {
+        Resources resources = context.getResources();
+        XmlPullParser parser = resources.getXml(xmlResource);
+        return new TestAppAuthenticatorBuilder(context, parser);
+    }
+
+    /**
+     * Returns a new {@link TestAppAuthenticatorBuilder} that can be used to create a new {@link
+     * AppAuthenticator} configured to behave as required for the test.
+     *
+     * @param context        the context within which to create the {@link AppAuthenticator}
+     * @param xmlInputStream the XML {@link InputStream} containing the definitions for the
+     *                       permissions and expected identities based on packages / expected
+     *                       signing certificate digests
+     * @return this instance of the {@code TestAppAuthenticatorBuilder}
+     */
+    // This is not a setter for the builder but instead a static factory method to obtain a new
+    // builder.
+    @SuppressLint("BuilderSetStyle")
+    @NonNull
+    public static TestAppAuthenticatorBuilder createFromInputStream(
+            @NonNull Context context,
+            @NonNull InputStream xmlInputStream)
+            throws AppAuthenticatorXmlException {
+        XmlPullParser parser;
+        try {
+            parser = XmlPullParserFactory.newInstance().newPullParser();
+            parser.setInput(xmlInputStream, null);
+        } catch (XmlPullParserException e) {
+            throw new AppAuthenticatorXmlException("Unable to create parser from provided "
+                    + "InputStream", e);
+        }
+        return new TestAppAuthenticatorBuilder(context, parser);
+    }
+
+    /**
+     * Sets the policy to be used by the {@link AppAuthenticator} for the test.
+     *
+     * @param testPolicy the test policy to be used by the {@code AppAuthenticator{}
+     * @return this instance of the {@code TestAppAuthenticatorBuilder}
+     * @see #POLICY_SIGNATURE_ACCEPTED_FOR_DECLARED_PACKAGES
+     * @see #POLICY_DENY_ALL
+     * @see #POLICY_CUSTOM
+     */
+    // The builder allows configuring other options that are not directly controlled by the
+    // AppAuthenticator.
+    @SuppressLint("MissingGetterMatchingBuilder")
+    public @NonNull TestAppAuthenticatorBuilder setTestPolicy(@TestPolicy int testPolicy) {
+        mTestPolicy = testPolicy;
+        return this;
+    }
+
+    /**
+     * Configures the resulting {@link AppAuthenticator} to always return that the signing
+     * identity matches the expected value when the specified {@code packageName} is queried.
+     *
+     * <p>Note, the specified {@code packageName} must be defined either explicitly via a
+     * {@code package} element or implicitly via a {@code all-packages} element; this ensures
+     * that the XML configuration is correct and that the specified package could be verified
+     * on device.
+     *
+     * @param packageName the name of the package for which the signing identity should be
+     *                    treated as matching the expected value
+     * @return this instance of the {@code TestAppAuthenticatorBuilder}
+     */
+    // The builder allows configuring other options that are not directly controlled by the
+    // AppAuthenticator.
+    @SuppressLint("MissingGetterMatchingBuilder")
+    @NonNull
+    public TestAppAuthenticatorBuilder setSignatureAcceptedForPackage(
+            @NonNull String packageName) {
+        mTestPolicy = POLICY_CUSTOM;
+        mAppSignatureVerifierBuilder.setSignatureAcceptedForPackage(packageName);
+        return this;
+    }
+
+    /**
+     * Sets the provided {@code certDigest} as the signing identity for the specified {@code
+     * packageName}.
+     *
+     * @param packageName the name of the package that will use the provided signing identity
+     * @param certDigest  the digest to be treated as the signing identity of the specified package
+     * @return this instance of the {@code TestAppAuthenticatorBuilder}
+     */
+    // The builder allows configuring other options that are not directly controlled by the
+    // AppAuthenticator.
+    @SuppressLint("MissingGetterMatchingBuilder")
+    @NonNull
+    public TestAppAuthenticatorBuilder setSigningIdentityForPackage(
+            @NonNull String packageName,
+            @NonNull String certDigest) {
+        mTestPolicy = POLICY_CUSTOM;
+        mAppSignatureVerifierBuilder.setSigningIdentityForPackage(packageName, certDigest);
+        return this;
+    }
+
+    /**
+     * Sets the provided {@code uid} as the UID of the specified {@code packageName}.
+     *
+     * <p>This method can be used to verify the scenario where a calling package does not have the
+     * expected calling UID.
+     *
+     * @param packageName the name of the package that will be treated as having the provided uid
+     * @param uid         the uid to use for the specified package
+     * @return this instance of the {@code TestAppAuthenticatorBuilder}
+     */
+    // The builder allows configuring other options that are not directly controlled by the
+    // AppAuthenticator.
+    @SuppressLint("MissingGetterMatchingBuilder")
+    @NonNull
+    public TestAppAuthenticatorBuilder setUidForPackage(@NonNull String packageName,
+            int uid) {
+        mAppAuthenticatorUtilsBuilder.setUidForPackage(packageName, uid);
+        return this;
+    }
+
+    /**
+     * Treats the provided {@code packageName} as not being installed by the resulting {@link
+     * AppAuthenticator}.
+     *
+     * @param packageName the name of the package to be treated as not installed
+     * @return this instance of the {@code TestAppAuthenticatorBuilder}
+     */
+    // The builder allows configuring other options that are not directly controlled by the
+    // AppAuthenticator.
+    @SuppressLint("MissingGetterMatchingBuilder")
+    @NonNull
+    public TestAppAuthenticatorBuilder setPackageNotInstalled(
+            @NonNull String packageName) {
+        mTestPolicy = POLICY_CUSTOM;
+        mAppAuthenticatorUtilsBuilder.setPackageNotInstalled(packageName);
+        mAppSignatureVerifierBuilder.setPackageNotInstalled(packageName);
+        return this;
+    }
+
+    /**
+     * Builds an {@link AppAuthenticator} with the specified config that can be injected to satisfy
+     * test requirements.
+     *
+     * @return a new {@code AppAuthenticator} that will respond to queries as configured
+     * @throws AppAuthenticatorXmlException if the provided XML config file is not in the proper
+     *                                      format to create a new {@code AppAuthenticator}
+     * @throws IOException                  if an IO error is encountered when attempting to read
+     *                                      the XML config file
+     */
+    // This class is provided so that apps can inject a configurable AppAuthenticator for their
+    // tests, so it needs access to the restricted test APIs.
+    @SuppressLint("RestrictedApi")
+    @NonNull
+    public AppAuthenticator build() throws AppAuthenticatorXmlException, IOException {
+        // Obtain the config from the AppAuthenticator class to ensure that the provided XML is
+        // properly configured.
+        AppAuthenticator.AppAuthenticatorConfig config =
+                AppAuthenticator.createConfigFromParser(mParser);
+
+        // Configure the AppSignatureVerifier that will by the test AppAuthenticator.
+        mAppSignatureVerifierBuilder.setPermissionAllowMap(config.getPermissionAllowMap());
+        mAppSignatureVerifierBuilder.setExpectedIdentities(config.getExpectedIdentities());
+        mAppSignatureVerifierBuilder.setTestPolicy(mTestPolicy);
+
+        // Inject the AppSignatureVerifier and AppAuthenticatorUtils into the AppAuthenticator
+        // to configure it to behave as requested.
+        AppAuthenticator appAuthenticator = AppAuthenticator.createFromConfig(mContext, config);
+        appAuthenticator.setAppSignatureVerifier(mAppSignatureVerifierBuilder.build());
+        appAuthenticator.setAppAuthenticatorUtils(mAppAuthenticatorUtilsBuilder.build());
+        return appAuthenticator;
+    }
+}
diff --git a/security/security-app-authenticator-testing/src/main/java/androidx/security/app/authenticator/TestAppAuthenticatorUtils.java b/security/security-app-authenticator-testing/src/main/java/androidx/security/app/authenticator/TestAppAuthenticatorUtils.java
new file mode 100644
index 0000000..984854e
--- /dev/null
+++ b/security/security-app-authenticator-testing/src/main/java/androidx/security/app/authenticator/TestAppAuthenticatorUtils.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.security.app.authenticator;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import androidx.collection.ArrayMap;
+import androidx.collection.ArraySet;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * An extension of the {@link AppAuthenticatorUtils} used by the {@link AppAuthenticator} that
+ * can be injected into the {@code AppAuthenticator} to configure it to behave as required by the
+ * test.
+ *
+ * <p>This test class supports changing the UID of a specified package and treating the package
+ * as not being installed to allowing testing of error path scenarios.
+ */
+class TestAppAuthenticatorUtils extends AppAuthenticatorUtils {
+    private Map<String, Integer> mPackageUids;
+    private Set<String> mNotInstalledPackages;
+
+    /**
+     * Constructor; instances should be configured through the {@link Builder}.
+     */
+    TestAppAuthenticatorUtils(Context context, Map<String, Integer> packageUids,
+            Set<String> exceptionPackages) {
+        super(context);
+        mPackageUids = packageUids;
+        mNotInstalledPackages = exceptionPackages;
+    }
+
+    /**
+     * Builder for a new {@link TestAppAuthenticatorUtils} that allows this test class to be
+     * configured as required for the test.
+     */
+    static class Builder {
+        private Context mContext;
+        private Map<String, Integer> mPackageUids;
+        private Set<String> mNotInstalledPackages;
+
+        /**
+         * Creates a new {@code Builder} with the specified {@link Context}.
+         *
+         * @param context the {@code Context} within which to create the new Builder
+         */
+        Builder(Context context) {
+            mContext = context;
+            mPackageUids = new ArrayMap<>();
+            mNotInstalledPackages = new ArraySet<>();
+        }
+
+        /**
+         * Sets the {@code uid} to be returned when the specified {@code packageName} is queried.
+         *
+         * @param packageName the name of the package to be configured
+         * @param uid         the uid to return for the specified package
+         * @return this instance of the {@code Builder}
+         */
+        Builder setUidForPackage(String packageName, int uid) {
+            mPackageUids.put(packageName, uid);
+            return this;
+        }
+
+        /**
+         * Treats the provided {@code packageName} as not being installed; this will result in a
+         * {@link PackageManager.NameNotFoundException} being thrown when this package is queried.
+         *
+         * @param packageName the name of the package to be treated as not installed
+         * @return this instance of the {@code Builder}
+         */
+        Builder setPackageNotInstalled(String packageName) {
+            mNotInstalledPackages.add(packageName);
+            return this;
+        }
+
+        /**
+         * Builds an extension of the {@link AppAuthenticatorUtils} that can be injected to satisfy
+         * test requirements.
+         *
+         * @return a new {@link TestAppAuthenticatorUtils} that will respond to queries as
+         * configured.
+         */
+        TestAppAuthenticatorUtils build() {
+            return new TestAppAuthenticatorUtils(mContext, mPackageUids, mNotInstalledPackages);
+        }
+    }
+
+    /**
+     * Returns the UID configured for the specified {@code packageName}, or the calling UID if
+     * the UID of the package has not been configured.
+     *
+     * @param packageName the name of the package to be queried
+     * @return the UID of the specified package
+     * @throws PackageManager.NameNotFoundException if this class has been configured to treat
+     *                                              the specified package as not installed
+     */
+    @Override
+    int getUidForPackage(String packageName) throws PackageManager.NameNotFoundException {
+        if (mNotInstalledPackages.contains(packageName)) {
+            throw new PackageManager.NameNotFoundException("Test configured to throw exception "
+                    + "for package " + packageName);
+        }
+        if (mPackageUids.containsKey(packageName)) {
+            return mPackageUids.get(packageName);
+        }
+        return getCallingUid();
+    }
+}
diff --git a/security/security-app-authenticator-testing/src/main/java/androidx/security/app/authenticator/TestAppSignatureVerifier.java b/security/security-app-authenticator-testing/src/main/java/androidx/security/app/authenticator/TestAppSignatureVerifier.java
new file mode 100644
index 0000000..f5f533f
--- /dev/null
+++ b/security/security-app-authenticator-testing/src/main/java/androidx/security/app/authenticator/TestAppSignatureVerifier.java
@@ -0,0 +1,276 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.security.app.authenticator;
+
+import android.content.Context;
+
+import androidx.collection.ArrayMap;
+import androidx.collection.ArraySet;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * An extension of the {@link AppSignatureVerifier} used by the {@link AppAuthenticator} that can
+ * be injected into the {@code AppAuthenticator} to configure it to behave as required by the test.
+ *
+ * <p>This test class supports setting a {@link TestAppAuthenticatorBuilder.TestPolicy},
+ * configuring generic acceptance per package, specifying the signing identity per package, and
+ * treating packages as not installed.
+ */
+class TestAppSignatureVerifier extends AppSignatureVerifier {
+    /**
+     * A Set of classes to be treated as always accepted as long as they are in the XML config file.
+     */
+    private final Set<String> mSignatureAcceptedPackages;
+    /**
+     * A Set of classes to be treated as not installed.
+     */
+    private final Set<String> mNotInstalledPackages;
+    /**
+     * A mapping from the package name to the digest to be used as the signing identity for the
+     * package during the test.
+     */
+    private final Map<String, String> mSigningIdentities;
+    /**
+     * The test policy to be used.
+     */
+    private final @TestAppAuthenticatorBuilder.TestPolicy int mTestPolicy;
+
+    /**
+     * Constructor that should only be invoked by the {@link Builder}.
+     */
+    TestAppSignatureVerifier(Context context,
+            Map<String, Map<String, Set<String>>> permissionAllowMap,
+            Map<String, Set<String>> expectedIdentities,
+            Set<String> signatureAcceptedPackages,
+            Set<String> notInstalledPackages,
+            Map<String, String> signingIdentities,
+            @TestAppAuthenticatorBuilder.TestPolicy int testPolicy) {
+        super(context, permissionAllowMap, expectedIdentities,
+                AppAuthenticator.DEFAULT_DIGEST_ALGORITHM, new NullCache());
+        mSignatureAcceptedPackages = signatureAcceptedPackages;
+        mNotInstalledPackages = notInstalledPackages;
+        mSigningIdentities = signingIdentities;
+        mTestPolicy = testPolicy;
+    }
+
+    /*
+     * Builder for a new {@link TestAppSignatureVerifier} that allows this test class to be
+     * configured as required for the test.
+     */
+    static class Builder {
+        private final Context mContext;
+        private Map<String, Map<String, Set<String>>> mPermissionAllowMap;
+        private Map<String, Set<String>> mExpectedIdentities;
+        private Set<String> mSignatureAcceptedPackages;
+        private Set<String> mNotInstalledPackages;
+        private String mDigestAlgorithm;
+        private Map<String, String> mSigningIdentities;
+        private @ TestAppAuthenticatorBuilder.TestPolicy int mTestPolicy;
+
+        /**
+         * Constructor accepting the {@code context} used to instantiate a new {@code
+         * TestAppSignatureVerifier}.
+         */
+        Builder(Context context) {
+            mContext = context;
+            mSignatureAcceptedPackages = new ArraySet<>();
+            mNotInstalledPackages = new ArraySet<>();
+            mSigningIdentities = new ArrayMap<>();
+        }
+
+        /**
+         * Configures the resulting {@link TestAppSignatureVerifier} to always return that the
+         * signing identity matches the expected value when the specified {@code packageName} is
+         * queried.
+         *
+         * @param packageName the name of the package for which the signing identity should be
+         *                    treated as matching the expected value
+         * @return this instance of the {@code Builder}
+         */
+        Builder setSignatureAcceptedForPackage(String packageName) {
+            mSignatureAcceptedPackages.add(packageName);
+            return this;
+        }
+
+        /**
+         * Sets the provided {@code certDigest} as the signing identity for the specified {@code
+         * packageName}.
+         *
+         * @param packageName the name of the package that will use the provided signing identity
+         * @param certDigest the digest to be treated as the signing identity of the specified
+         *                  package
+         * @return this instance of the {@code Builder}
+         */
+        Builder setSigningIdentityForPackage(String packageName, String certDigest) {
+            mSigningIdentities.put(packageName, certDigest);
+            return this;
+        }
+
+        /**
+         * Sets the {@code permissionAllowMap} to be used by the {@code TestAppSignatureVerifier}.
+         *
+         * This {@code Map} should contain a mapping from permission names to a mapping of package
+         * names to expected signing identities; each permission can also contain a mapping to
+         * the {@link AppAuthenticator#ALL_PACKAGES_TAG} which allow signing identities to be
+         * specified without knowing the exact packages that will be signed by them.
+         *
+         * @return this instance of the {@code Builder}
+         */
+        Builder setPermissionAllowMap(Map<String, Map<String, Set<String>>> permissionAllowMap) {
+            mPermissionAllowMap = permissionAllowMap;
+            return this;
+        }
+
+        /**
+         * Sets the {@code expectedIdentities} to be used by the {@code TestAppSignatureVerifier}.
+         *
+         * This {@code Map} should contain a mapping from package name to the expected signing
+         * certificate digest(s).
+         *
+         * @return this instance of the {@code Builder}
+         */
+        Builder setExpectedIdentities(Map<String, Set<String>> expectedIdentities) {
+            mExpectedIdentities = expectedIdentities;
+            return this;
+        }
+
+        /**
+         * Sets the test policy to be used by the {@code TestAppSignatureVerifier}.
+         *
+         * @return this instance of the {@code Builder}
+         */
+        Builder setTestPolicy(@ TestAppAuthenticatorBuilder.TestPolicy int testPolicy) {
+            mTestPolicy = testPolicy;
+            return this;
+        }
+
+        /**
+         * Treats the provided {@code packageName} as not being installed by the resulting {@link
+         * TestAppSignatureVerifier}.
+         *
+         * @param packageName the name of the package to be treated as not installed
+         * @return this instance of the {@code Builder}
+         */
+        Builder setPackageNotInstalled(String packageName) {
+            mNotInstalledPackages.add(packageName);
+            return this;
+        }
+
+        /**
+         * Builds a new {@code TestAppSignatureVerifier} instance using the provided configuration.
+         */
+        TestAppSignatureVerifier build() {
+            if (mPermissionAllowMap == null) {
+                mPermissionAllowMap = new ArrayMap<>();
+            }
+            if (mExpectedIdentities == null) {
+                mExpectedIdentities = new ArrayMap<>();
+            }
+            if (mDigestAlgorithm == null) {
+                mDigestAlgorithm = AppAuthenticator.DEFAULT_DIGEST_ALGORITHM;
+            }
+            return new TestAppSignatureVerifier(mContext, mPermissionAllowMap, mExpectedIdentities,
+                    mSignatureAcceptedPackages, mNotInstalledPackages, mSigningIdentities,
+                    mTestPolicy);
+        }
+    }
+
+    /**
+     * Responds to a signing identity query using the specified config for the provided {@code
+     * packageName} where the package is expected to have the signing identity in the {@code
+     * packageCertDigests} and, where applicable, {@code all-packages} are supported with the
+     * {@code allPackagesCertDigests}.
+     *
+     * <p>Package queries are performed in the following order:
+     * <ul>
+     *     <li>If the test policy is {@code POLICY_DENY_ALL} then {@code false} is returned</li>
+     *     {li>If the test policy is {@code POLICY_SIGNATURE_ACCEPTED_FOR_DECLARED_PACKAGES} then
+     *     {@code true} is returned as long as the specified package is explicitly declared with one
+     *     or more signing identities for this query</li>
+     *     <li>If the package is configured to be treated as not installed {@code false} is
+     *     returned</li>
+     *     <li>If the package is configured to have its signing identity accepted then {@code
+     *     true} is returned</li>
+     *     <li>If a signing identity is configured for the package then it is compared against
+     *     the expected signing identity declared in the XML config; if there is a match then
+     *     {@code true} is returned</li>
+     * </ul>
+     * @param packageName the name of the package being queried
+     * @param query the type of query being performed
+     * @param packageCertDigests a {@code Set} of certificate digests that are expected for the
+     *                           package
+     * @param allPackagesCertDigests a {@code Set} of certificate digests that are expected for
+     *                               any package for this query
+     * @return {@code true} if the package can be treated as successfully verified based on the
+     * test configuration
+     */
+    @Override
+    boolean verifySigningIdentityForQuery(String packageName, String query,
+            Set<String> packageCertDigests, Set<String> allPackagesCertDigests) {
+        if (mTestPolicy ==  TestAppAuthenticatorBuilder.POLICY_DENY_ALL) {
+            return false;
+        }
+        if (mTestPolicy
+                == TestAppAuthenticatorBuilder.POLICY_SIGNATURE_ACCEPTED_FOR_DECLARED_PACKAGES) {
+            // packageCertDigests will only be set if the package is explicitly declared for the
+            // query
+            return packageCertDigests != null;
+        }
+        if (mNotInstalledPackages.contains(packageName)) {
+            return false;
+        }
+        if (mSignatureAcceptedPackages.contains(packageName)) {
+            return true;
+        }
+        String certDigest = mSigningIdentities.get(packageName);
+        if (certDigest != null) {
+            if (packageCertDigests != null && packageCertDigests.contains(certDigest)) {
+                return true;
+            }
+            if (allPackagesCertDigests != null && allPackagesCertDigests.contains(certDigest)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * A test version of the {@code Cache} that always returns {@code null} for a cache query;
+     * this is intended to always force the test to go through the configured verification
+     * process as opposed to returning a previous query result.
+     */
+    static class NullCache extends Cache {
+        /**
+         * Instantiates a new NullCache; since it is not intended to return cached values a max
+         * size is not accepted, but a value of 1 is used since a value <= 0 is treated as an
+         * error by the {@link androidx.collection.LruCache}.
+         */
+        NullCache() {
+            super(1);
+        }
+
+        /**
+         * Overrides the {@link Cache#get} method to return a null value for all cache queries.
+         */
+        @Override
+        CacheEntry get(String packageName, String query) {
+            return null;
+        }
+    }
+}
diff --git a/security/security-app-authenticator/src/main/java/androidx/security/app/authenticator/AppAuthenticator.java b/security/security-app-authenticator/src/main/java/androidx/security/app/authenticator/AppAuthenticator.java
index fcb1f2b..c6e26df 100644
--- a/security/security-app-authenticator/src/main/java/androidx/security/app/authenticator/AppAuthenticator.java
+++ b/security/security-app-authenticator/src/main/java/androidx/security/app/authenticator/AppAuthenticator.java
@@ -145,7 +145,7 @@
      * @param appSignatureVerifier the verifier to be used to verify app signing identities
      * @param appAuthenticatorUtils the utils to be used
      */
-    private AppAuthenticator(AppSignatureVerifier appSignatureVerifier,
+    AppAuthenticator(AppSignatureVerifier appSignatureVerifier,
             AppAuthenticatorUtils appAuthenticatorUtils) {
         mAppSignatureVerifier = appSignatureVerifier;
         mAppAuthenticatorUtils = appAuthenticatorUtils;
@@ -413,6 +413,24 @@
     private static AppAuthenticator createFromParser(Context context, XmlPullParser parser)
             throws AppAuthenticatorXmlException, IOException {
         AppAuthenticatorConfig config = createConfigFromParser(parser);
+        return createFromConfig(context, config);
+    }
+
+    /**
+     * Creates a new {@code AppAuthenticator} that can be used to guard resources based on
+     * package name / signing identity as well as allow verification of expected signing identities
+     * before interacting with other apps on a device using the configuration defined in the
+     * provided {@code config}.
+     *
+     * @param context the context within which to create the {@code AppAuthenticator}
+     * @param config  an {@link AppAuthenticatorConfig} containing the definitions for the
+     *                permissions and expected identities based on package / expected signing
+     *                certificate digests
+     * @return a new {@code AppAuthenticator} that can be used to enforce the signing identities
+     * defined in the provided {@code config}
+     */
+    static AppAuthenticator createFromConfig(Context context,
+            @NonNull AppAuthenticatorConfig config) {
         AppSignatureVerifier verifier = AppSignatureVerifier.builder(context)
                 .setPermissionAllowMap(config.getPermissionAllowMap())
                 .setExpectedIdentities(config.getExpectedIdentities())
@@ -422,7 +440,7 @@
     }
 
     /**
-     * Creates a new {@code AppAuthentictorConfig} that can be used to instantiate a new {@code
+     * Creates a new {@code AppAuthenticatorConfig} that can be used to instantiate a new {@code
      * AppAuthenticator} with the specified config.
      *
      * @param parser an {@link XmlPullParser} containing the definition for the permissions and
diff --git a/security/security-app-authenticator/src/main/java/androidx/security/app/authenticator/AppSignatureVerifier.java b/security/security-app-authenticator/src/main/java/androidx/security/app/authenticator/AppSignatureVerifier.java
index ac8a291..3df7674 100644
--- a/security/security-app-authenticator/src/main/java/androidx/security/app/authenticator/AppSignatureVerifier.java
+++ b/security/security-app-authenticator/src/main/java/androidx/security/app/authenticator/AppSignatureVerifier.java
@@ -210,7 +210,7 @@
      * The {@code query} can either be a permission or {@code EXPECTED_IDENTITY_QUERY} when
      * verifying the identity of another app before establishing communication.
      */
-    private boolean verifySigningIdentityForQuery(String packageName, String query,
+    boolean verifySigningIdentityForQuery(String packageName, String query,
             Set<String> packageCertDigests, Set<String> allPackagesCertDigests) {
         AppSigningInfo appSigningInfo;
         try {
diff --git a/settings.gradle b/settings.gradle
index 2eb2969..ba10801 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -504,7 +504,9 @@
 includeProject(":preference:preference-ktx", "preference/preference-ktx", [BuildType.MAIN])
 includeProject(":print:print", "print/print", [BuildType.MAIN])
 includeProject(":profileinstaller:profileinstaller", "profileinstaller/profileinstaller", [BuildType.MAIN, BuildType.COMPOSE])
-includeProject(":profileinstaller:profileinstaller:integration-tests:testapp", "profileinstaller/profileinstaller/integration-tests/testapp", [BuildType.COMPOSE])
+includeProject(":profileinstaller:integration-tests:init-macrobenchmark", "profileinstaller/integration-tests/init-macrobenchmark", [BuildType.MAIN])
+includeProject(":profileinstaller:integration-tests:init-macrobenchmark-target", "profileinstaller/integration-tests/init-macrobenchmark-target", [BuildType.MAIN])
+includeProject(":profileinstaller:integration-tests:testapp", "profileinstaller/integration-tests/testapp", [BuildType.COMPOSE])
 includeProject(":recommendation:recommendation", "recommendation/recommendation", [BuildType.MAIN])
 includeProject(":recyclerview:recyclerview", "recyclerview/recyclerview", [BuildType.MAIN])
 includeProject(":recyclerview:recyclerview-benchmark", "recyclerview/recyclerview-benchmark", [BuildType.MAIN])
@@ -535,6 +537,7 @@
 includeProject(":savedstate:savedstate", "savedstate/savedstate", [BuildType.MAIN, BuildType.FLAN, BuildType.WEAR])
 includeProject(":savedstate:savedstate-ktx", "savedstate/savedstate-ktx", [BuildType.MAIN, BuildType.FLAN])
 includeProject(":security:security-app-authenticator", "security/security-app-authenticator", [BuildType.MAIN])
+includeProject(":security:security-app-authenticator-testing", "security/security-app-authenticator-testing", [BuildType.MAIN])
 includeProject(":security:security-biometric", "security/security-biometric", [BuildType.MAIN])
 includeProject(":security:security-crypto", "security/crypto", [BuildType.MAIN])
 includeProject(":security:security-crypto-ktx", "security/security-crypto-ktx", [BuildType.MAIN])
@@ -614,6 +617,9 @@
 includeProject(":webkit:webkit", "webkit/webkit", [BuildType.MAIN])
 includeProject(":window:window", "window/window", [BuildType.MAIN])
 includeProject(":window:window-extensions", "window/window-extensions", [BuildType.MAIN])
+includeProject(":window:window-java", "window/window-java", [BuildType.MAIN])
+includeProject(":window:window-rxjava2", "window/window-rxjava2", [BuildType.MAIN])
+includeProject(":window:window-rxjava3", "window/window-rxjava3", [BuildType.MAIN])
 includeProject(":window:window-samples", "window/window-samples", [BuildType.MAIN])
 includeProject(":window:window-sidecar", "window/window-sidecar", [BuildType.MAIN])
 includeProject(":work:integration-tests:testapp", "work/integration-tests/testapp", [BuildType.MAIN])
diff --git a/sharetarget/integration-tests/testapp/lint-baseline.xml b/sharetarget/integration-tests/testapp/lint-baseline.xml
index ca9f621..a692025 100644
--- a/sharetarget/integration-tests/testapp/lint-baseline.xml
+++ b/sharetarget/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="SyntheticAccessor"
diff --git a/sharetarget/sharetarget/lint-baseline.xml b/sharetarget/sharetarget/lint-baseline.xml
index f801350..841949b 100644
--- a/sharetarget/sharetarget/lint-baseline.xml
+++ b/sharetarget/sharetarget/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/slices/builders/lint-baseline.xml b/slices/builders/lint-baseline.xml
index 2c54f970..d679f37 100644
--- a/slices/builders/lint-baseline.xml
+++ b/slices/builders/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/slices/core/lint-baseline.xml b/slices/core/lint-baseline.xml
index c6d6156..2861f41 100644
--- a/slices/core/lint-baseline.xml
+++ b/slices/core/lint-baseline.xml
@@ -2,17 +2,6 @@
 <issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
-        id="UnusedResources"
-        message="The resource `R.string.abc_slice_permission_checkbox` appears to be unused"
-        errorLine1="    &lt;string name=&quot;abc_slice_permission_checkbox&quot;>Allow &lt;xliff:g id=&quot;app&quot; example=&quot;Example App&quot;>%1$s&lt;/xliff:g> to show slices from any app&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="32"
-            column="13"/>
-    </issue>
-
-    <issue
         id="BanSynchronizedMethods"
         message="Use of synchronized methods is not recommended"
         errorLine1="    private synchronized void persist(PermissionState state) {"
diff --git a/slices/test/lint-baseline.xml b/slices/test/lint-baseline.xml
index 154ca0c..e6ba8b8 100644
--- a/slices/test/lint-baseline.xml
+++ b/slices/test/lint-baseline.xml
@@ -78,48 +78,4 @@
             column="50"/>
     </issue>
 
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_large` appears to be unused"
-        errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/drawable/ic_large.xml"
-            line="16"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_more` appears to be unused"
-        errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/drawable/ic_more.xml"
-            line="17"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_shortcut` appears to be unused"
-        errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/drawable/ic_shortcut.xml"
-            line="16"
-            column="1"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.drawable.ic_small` appears to be unused"
-        errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/drawable/ic_small.xml"
-            line="16"
-            column="1"/>
-    </issue>
-
 </issues>
diff --git a/slices/view/lint-baseline.xml b/slices/view/lint-baseline.xml
index a6913381..3ee1112 100644
--- a/slices/view/lint-baseline.xml
+++ b/slices/view/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/slidingpanelayout/slidingpanelayout/lint-baseline.xml b/slidingpanelayout/slidingpanelayout/lint-baseline.xml
index 6f8643b..5529aaa 100644
--- a/slidingpanelayout/slidingpanelayout/lint-baseline.xml
+++ b/slidingpanelayout/slidingpanelayout/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/sqlite/integration-tests/inspection-room-testapp/lint-baseline.xml b/sqlite/integration-tests/inspection-room-testapp/lint-baseline.xml
index 850b2d6..fe92ca3 100644
--- a/sqlite/integration-tests/inspection-room-testapp/lint-baseline.xml
+++ b/sqlite/integration-tests/inspection-room-testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="MissingTestSizeAnnotation"
diff --git a/sqlite/integration-tests/inspection-sqldelight-testapp/lint-baseline.xml b/sqlite/integration-tests/inspection-sqldelight-testapp/lint-baseline.xml
index 790c3a4..c5d00a5 100644
--- a/sqlite/integration-tests/inspection-sqldelight-testapp/lint-baseline.xml
+++ b/sqlite/integration-tests/inspection-sqldelight-testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="MissingTestSizeAnnotation"
diff --git a/sqlite/sqlite-framework/lint-baseline.xml b/sqlite/sqlite-framework/lint-baseline.xml
index de5df74..06f5edc 100644
--- a/sqlite/sqlite-framework/lint-baseline.xml
+++ b/sqlite/sqlite-framework/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/sqlite/sqlite-inspection/lint-baseline.xml b/sqlite/sqlite-inspection/lint-baseline.xml
index 55db410..d57b4aa 100644
--- a/sqlite/sqlite-inspection/lint-baseline.xml
+++ b/sqlite/sqlite-inspection/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanUncheckedReflection"
diff --git a/sqlite/sqlite/lint-baseline.xml b/sqlite/sqlite/lint-baseline.xml
index 0abbca7..f4df559 100644
--- a/sqlite/sqlite/lint-baseline.xml
+++ b/sqlite/sqlite/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/swiperefreshlayout/swiperefreshlayout/lint-baseline.xml b/swiperefreshlayout/swiperefreshlayout/lint-baseline.xml
index 86469ac..98a416e 100644
--- a/swiperefreshlayout/swiperefreshlayout/lint-baseline.xml
+++ b/swiperefreshlayout/swiperefreshlayout/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="KotlinPropertyAccess"
@@ -13,7 +13,8 @@
         <location
             file="src/main/java/androidx/swiperefreshlayout/widget/CircularProgressDrawable.java"
             line="391"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
diff --git a/testutils/testutils-espresso/lint-baseline.xml b/testutils/testutils-espresso/lint-baseline.xml
index b6893f0..b4cf80d 100644
--- a/testutils/testutils-espresso/lint-baseline.xml
+++ b/testutils/testutils-espresso/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="UnknownNullness"
diff --git a/testutils/testutils-navigation/src/androidTest/java/androidx/testutils/TestNavigatorDestinationBuilderTest.kt b/testutils/testutils-navigation/src/androidTest/java/androidx/testutils/TestNavigatorDestinationBuilderTest.kt
index fb2d187..20383a3 100644
--- a/testutils/testutils-navigation/src/androidTest/java/androidx/testutils/TestNavigatorDestinationBuilderTest.kt
+++ b/testutils/testutils-navigation/src/androidTest/java/androidx/testutils/TestNavigatorDestinationBuilderTest.kt
@@ -31,6 +31,7 @@
 class TestNavigatorDestinationBuilderTest {
     private val provider = TestNavigatorProvider()
 
+    @Suppress("DEPRECATION")
     @Test
     fun test() {
         val graph = provider.navigation(startDestination = DESTINATION_ID) {
@@ -53,6 +54,7 @@
         )
     }
 
+    @Suppress("DEPRECATION")
     @Test
     fun testWithBody() {
         val graph = provider.navigation(startDestination = DESTINATION_ID) {
diff --git a/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigator.kt b/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigator.kt
index a0a1b6c..f4b4933 100644
--- a/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigator.kt
+++ b/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigator.kt
@@ -33,6 +33,10 @@
         get() = backStack.lastOrNull()
             ?: throw IllegalStateException("Nothing on the back stack")
 
+    fun popCurrent() {
+        state.pop(current, false)
+    }
+
     override fun createDestination(): Destination {
         return Destination(this)
     }
diff --git a/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigatorDestinationBuilder.kt b/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigatorDestinationBuilder.kt
index f8b90e7..a9bcbad 100644
--- a/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigatorDestinationBuilder.kt
+++ b/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigatorDestinationBuilder.kt
@@ -37,6 +37,7 @@
 /**
  * Construct a new [TestNavigator.Destination]
  */
+@Suppress("DEPRECATION")
 inline fun NavGraphBuilder.test(
     @IdRes id: Int,
     builder: TestNavigatorDestinationBuilder.() -> Unit
@@ -62,6 +63,7 @@
  */
 @NavDestinationDsl
 class TestNavigatorDestinationBuilder : NavDestinationBuilder<TestNavigator.Destination> {
+    @Suppress("DEPRECATION")
     constructor(navigator: TestNavigator, @IdRes id: Int = 0) : super(navigator, id)
     constructor(navigator: TestNavigator, route: String) : super(navigator, route)
 }
diff --git a/testutils/testutils-runtime/lint-baseline.xml b/testutils/testutils-runtime/lint-baseline.xml
index a2172e9..7d270a3 100644
--- a/testutils/testutils-runtime/lint-baseline.xml
+++ b/testutils/testutils-runtime/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanUncheckedReflection"
diff --git a/textclassifier/integration-tests/testapp/lint-baseline.xml b/textclassifier/integration-tests/testapp/lint-baseline.xml
index e3669ff..f33cca5 100644
--- a/textclassifier/integration-tests/testapp/lint-baseline.xml
+++ b/textclassifier/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="SyntheticAccessor"
diff --git a/textclassifier/textclassifier/lint-baseline.xml b/textclassifier/textclassifier/lint-baseline.xml
index 6e979f7..65b32c9 100644
--- a/textclassifier/textclassifier/lint-baseline.xml
+++ b/textclassifier/textclassifier/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/tracing/tracing/lint-baseline.xml b/tracing/tracing/lint-baseline.xml
index e17f06f..ca00e4a 100644
--- a/tracing/tracing/lint-baseline.xml
+++ b/tracing/tracing/lint-baseline.xml
@@ -1,3 +1,3 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 </issues>
diff --git a/transition/transition-ktx/build.gradle b/transition/transition-ktx/build.gradle
index 27caf0b..73f8be9 100644
--- a/transition/transition-ktx/build.gradle
+++ b/transition/transition-ktx/build.gradle
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.Publish
 
 plugins {
@@ -26,14 +24,14 @@
 }
 
 dependencies {
-    api(KOTLIN_STDLIB)
+    api(libs.kotlinStdlib)
     api(project(":transition:transition"))
 
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
 }
 
 androidx {
diff --git a/transition/transition/build.gradle b/transition/transition/build.gradle
index eb608cb..1b20ed2 100644
--- a/transition/transition/build.gradle
+++ b/transition/transition/build.gradle
@@ -1,9 +1,6 @@
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
 import androidx.build.Publish
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -17,15 +14,15 @@
     compileOnly("androidx.fragment:fragment:1.2.5")
     compileOnly("androidx.appcompat:appcompat:1.0.1")
 
-    androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.espressoCore, excludes.espresso)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(project(":fragment:fragment"))
     androidTestImplementation("androidx.appcompat:appcompat:1.1.0")
     androidTestImplementation(project(":internal-testutils-runtime"), {
diff --git a/tv-provider/tv-provider/lint-baseline.xml b/tv-provider/tv-provider/lint-baseline.xml
index 3477fc1..f9b1035 100644
--- a/tv-provider/tv-provider/lint-baseline.xml
+++ b/tv-provider/tv-provider/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
@@ -258,17 +258,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setInternalProviderId(String externalId) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="661"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setInternalProviderId(String externalId) {"
         errorLine2="                                       ~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
@@ -280,17 +269,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setPreviewVideoUri(Uri previewVideoUri) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="673"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setPreviewVideoUri(Uri previewVideoUri) {"
         errorLine2="                                    ~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
@@ -301,39 +279,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setLastPlaybackPositionMillis(int position) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="687"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setDurationMillis(int duration) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="699"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setIntentUri(Uri intentUri) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="711"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setIntentUri(Uri intentUri) {"
         errorLine2="                              ~~~">
         <location
@@ -346,17 +291,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setIntent(Intent intent) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="723"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setIntent(Intent intent) {"
         errorLine2="                           ~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
@@ -367,61 +301,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setTransient(boolean transientValue) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="734"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setType(@Type int type) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="761"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setPosterArtAspectRatio(@AspectRatio int ratio) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="785"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setThumbnailAspectRatio(@AspectRatio int ratio) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="808"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setLogoUri(Uri logoUri) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="820"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setLogoUri(Uri logoUri) {"
         errorLine2="                            ~~~">
         <location
@@ -433,28 +312,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setAvailability(@Availability int availability) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="847"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setStartingPrice(String price) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="859"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setStartingPrice(String price) {"
         errorLine2="                                  ~~~~~~">
         <location
@@ -467,17 +324,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setOfferPrice(String price) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="871"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setOfferPrice(String price) {"
         errorLine2="                               ~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
@@ -489,17 +335,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setReleaseDate(String releaseDate) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="886"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setReleaseDate(String releaseDate) {"
         errorLine2="                                ~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
@@ -511,17 +346,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setReleaseDate(Date releaseDate) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="898"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setReleaseDate(Date releaseDate) {"
         errorLine2="                                ~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
@@ -532,61 +356,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setItemCount(int itemCount) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="910"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setLive(boolean live) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="922"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setInteractionType(@InteractionType int interactionType) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="948"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setInteractionCount(long interactionCount) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="960"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setAuthor(String author) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="972"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setAuthor(String author) {"
         errorLine2="                           ~~~~~~">
         <location
@@ -598,28 +367,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setBrowsable(boolean browsable) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="986"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setContentId(String contentId) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="998"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setContentId(String contentId) {"
         errorLine2="                              ~~~~~~">
         <location
@@ -632,17 +379,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setLogoContentDescription(String logoContentDescription) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="1013"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setLogoContentDescription(String logoContentDescription) {"
         errorLine2="                                           ~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
@@ -654,17 +390,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setGenre(String genre) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="1025"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setGenre(String genre) {"
         errorLine2="                          ~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
@@ -675,39 +400,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setStartTimeUtcMillis(long startTime) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="1038"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setEndTimeUtcMillis(long endTime) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="1050"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setPreviewAudioUri(Uri previewAudioUri) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="1062"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setPreviewAudioUri(Uri previewAudioUri) {"
         errorLine2="                                    ~~~">
         <location
@@ -719,17 +411,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setTvSeriesItemType(@TvSeriesItemType int type) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BasePreviewProgram.java"
-            line="1074"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    protected ContentValues mValues;"
         errorLine2="              ~~~~~~~~~~~~~">
         <location
@@ -983,28 +664,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setId(long programId) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="569"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setPackageName(String packageName) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="583"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setPackageName(String packageName) {"
         errorLine2="                                ~~~~~~">
         <location
@@ -1017,17 +676,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setTitle(String title) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="595"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setTitle(String title) {"
         errorLine2="                          ~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
@@ -1039,17 +687,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setEpisodeTitle(String episodeTitle) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="607"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setEpisodeTitle(String episodeTitle) {"
         errorLine2="                                 ~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
@@ -1060,28 +697,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setSeasonNumber(int seasonNumber) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="619"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setSeasonNumber(String seasonNumber, int numericalSeasonNumber) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="636"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setSeasonNumber(String seasonNumber, int numericalSeasonNumber) {"
         errorLine2="                                 ~~~~~~">
         <location
@@ -1093,28 +708,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setEpisodeNumber(int episodeNumber) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="652"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setEpisodeNumber(String episodeNumber, int numericalEpisodeNumber) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="669"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setEpisodeNumber(String episodeNumber, int numericalEpisodeNumber) {"
         errorLine2="                                  ~~~~~~">
         <location
@@ -1127,17 +720,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setDescription(String description) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="686"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setDescription(String description) {"
         errorLine2="                                ~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
@@ -1149,17 +731,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setLongDescription(String longDescription) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="698"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setLongDescription(String longDescription) {"
         errorLine2="                                    ~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
@@ -1170,39 +741,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setVideoWidth(int width) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="710"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setVideoHeight(int height) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="722"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setContentRatings(TvContentRating[] contentRatings) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="736"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setContentRatings(TvContentRating[] contentRatings) {"
         errorLine2="                                   ~~~~~~~~~~~~~~~~~">
         <location
@@ -1215,17 +753,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setPosterArtUri(Uri posterArtUri) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="749"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setPosterArtUri(Uri posterArtUri) {"
         errorLine2="                                 ~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
@@ -1237,17 +764,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setThumbnailUri(Uri thumbnailUri) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="762"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setThumbnailUri(Uri thumbnailUri) {"
         errorLine2="                                 ~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
@@ -1259,17 +775,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setCanonicalGenres(@Genre String[] genres) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="777"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setCanonicalGenres(@Genre String[] genres) {"
         errorLine2="                                           ~~~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
@@ -1281,17 +786,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setInternalProviderData(byte[] data) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="789"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setInternalProviderData(byte[] data) {"
         errorLine2="                                         ~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
@@ -1303,17 +797,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setAudioLanguages(String[] audioLanguages) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="801"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setAudioLanguages(String[] audioLanguages) {"
         errorLine2="                                   ~~~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
@@ -1324,83 +807,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setSearchable(boolean searchable) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="814"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setInternalProviderFlag1(long flag) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="826"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setInternalProviderFlag2(long flag) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="838"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setInternalProviderFlag3(long flag) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="850"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setInternalProviderFlag4(long flag) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="862"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setReviewRatingStyle(@ReviewRatingStyle int reviewRatingStyle) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="879"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setReviewRating(String reviewRating) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="904"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setReviewRating(String reviewRating) {"
         errorLine2="                                 ~~~~~~">
         <location
@@ -1413,17 +819,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public T setSeasonTitle(String seasonTitle) {"
-        errorLine2="               ~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
-            line="916"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public T setSeasonTitle(String seasonTitle) {"
         errorLine2="                                ~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/BaseProgram.java"
diff --git a/vectordrawable/integration-tests/testapp/lint-baseline.xml b/vectordrawable/integration-tests/testapp/lint-baseline.xml
index b41ff71..610f5d7 100644
--- a/vectordrawable/integration-tests/testapp/lint-baseline.xml
+++ b/vectordrawable/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="NewApi"
@@ -310,105 +310,6 @@
     </issue>
 
     <issue
-        id="UnusedResources"
-        message="The resource `R.color.color1` appears to be unused"
-        errorLine1="    &lt;color name=&quot;color1&quot;>#ff3838&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="17"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.color.color3` appears to be unused"
-        errorLine1="    &lt;color name=&quot;color3&quot;>#0ed300&lt;/color>"
-        errorLine2="           ~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/colors.xml"
-            line="19"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.triangle` appears to be unused"
-        errorLine1="    &lt;string name=&quot;triangle&quot;> &quot;M300,70 l 0,-70 70,70 0,0   -70,70z&quot;&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="20"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.rectangle` appears to be unused"
-        errorLine1="    &lt;string name=&quot;rectangle&quot;>&quot;M300,70 l 0,-70 70,0  0,140 -70,0 z&quot;&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="21"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.rectangle2` appears to be unused"
-        errorLine1="    &lt;string name=&quot;rectangle2&quot;>&quot;M300,70 l 0,-70 70,0  0,70z M300,70  l 70,0 0,70 -70,0z&quot;&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="22"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.equal2` appears to be unused"
-        errorLine1="    &lt;string name=&quot;equal2&quot;>    &quot;M300,35 l 0,-35 70,0  0,35z M300,105 l 70,0 0,35 -70,0z&quot;&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="23"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.round_box` appears to be unused"
-        errorLine1="    &lt;string name=&quot;round_box&quot;>&quot;m2.10001,-6c-1.9551,0 -0.5,0.02499 -2.10001,0.02499c-1.575,0 0.0031,-0.02499 -1.95,-0.02499c-2.543,0 -4,2.2816 -4,4.85001c0,3.52929 0.25,6.25 5.95,6.25c5.7,0 6,-2.72071 6,-6.25c0,-2.56841 -1.35699,-4.85001 -3.89999,-4.85001&quot;&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="24"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.heart` appears to be unused"
-        errorLine1="    &lt;string name=&quot;heart&quot;>    &quot;m4.5,-7c-1.95509,0 -3.83009,1.26759 -4.5,3c-0.66991,-1.73241 -2.54691,-3 -4.5,-3c-2.543,0 -4.5,1.93159 -4.5,4.5c0,3.5293 3.793,6.2578 9,11.5c5.207,-5.2422 9,-7.9707 9,-11.5c0,-2.56841 -1.957,-4.5 -4.5,-4.5&quot;&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="25"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.raw.vector_drawable01` appears to be unused"
-        errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
-        errorLine2="^">
-        <location
-            file="src/main/res/raw/vector_drawable01.xml"
-            line="16"
-            column="1"/>
-    </issue>
-
-    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
diff --git a/vectordrawable/vectordrawable-animated/lint-baseline.xml b/vectordrawable/vectordrawable-animated/lint-baseline.xml
index dae6dac..01cd1086 100644
--- a/vectordrawable/vectordrawable-animated/lint-baseline.xml
+++ b/vectordrawable/vectordrawable-animated/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/versionedparcelable/versionedparcelable-compiler/build.gradle b/versionedparcelable/versionedparcelable-compiler/build.gradle
index 72cbdae..83f50b6 100644
--- a/versionedparcelable/versionedparcelable-compiler/build.gradle
+++ b/versionedparcelable/versionedparcelable-compiler/build.gradle
@@ -18,15 +18,13 @@
 import androidx.build.LibraryType
 import androidx.build.LibraryVersions
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("java-library")
 }
 
 dependencies {
-    implementation(JAVAPOET)
+    implementation(libs.javapoet)
 }
 
 androidx {
diff --git a/versionedparcelable/versionedparcelable-compiler/lint-baseline.xml b/versionedparcelable/versionedparcelable-compiler/lint-baseline.xml
index 0a058be..d4598db 100644
--- a/versionedparcelable/versionedparcelable-compiler/lint-baseline.xml
+++ b/versionedparcelable/versionedparcelable-compiler/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/versionedparcelable/versionedparcelable/build.gradle b/versionedparcelable/versionedparcelable/build.gradle
index 5ffba1b..b093782 100644
--- a/versionedparcelable/versionedparcelable/build.gradle
+++ b/versionedparcelable/versionedparcelable/build.gradle
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
@@ -29,12 +27,12 @@
     api("androidx.annotation:annotation:1.2.0")
     implementation("androidx.collection:collection:1.0.0")
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
-    androidTestImplementation(TRUTH)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy)
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy)
+    androidTestImplementation(libs.truth)
     androidTestAnnotationProcessor project(":versionedparcelable:versionedparcelable-compiler")
 }
 
diff --git a/versionedparcelable/versionedparcelable/lint-baseline.xml b/versionedparcelable/versionedparcelable/lint-baseline.xml
index c3c931a..949938fb 100644
--- a/versionedparcelable/versionedparcelable/lint-baseline.xml
+++ b/versionedparcelable/versionedparcelable/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanUncheckedReflection"
diff --git a/viewpager/viewpager/lint-baseline.xml b/viewpager/viewpager/lint-baseline.xml
index 90974b3..d331d83 100644
--- a/viewpager/viewpager/lint-baseline.xml
+++ b/viewpager/viewpager/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="LambdaLast"
diff --git a/viewpager2/integration-tests/testapp/lint-baseline.xml b/viewpager2/integration-tests/testapp/lint-baseline.xml
index 4a9e0bef..a8c267e 100644
--- a/viewpager2/integration-tests/testapp/lint-baseline.xml
+++ b/viewpager2/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/viewpager2/viewpager2/lint-baseline.xml b/viewpager2/viewpager2/lint-baseline.xml
index 1056cc1..8c446ed 100644
--- a/viewpager2/viewpager2/lint-baseline.xml
+++ b/viewpager2/viewpager2/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/wear/compose/foundation/build.gradle b/wear/compose/foundation/build.gradle
index 0024cfb..4ab4e7b 100644
--- a/wear/compose/foundation/build.gradle
+++ b/wear/compose/foundation/build.gradle
@@ -19,14 +19,15 @@
 import androidx.build.RunApiTasks
 import androidx.build.AndroidXUiPlugin
 
+import static androidx.build.dependencies.DependenciesKt.*
+
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
     id("AndroidXUiPlugin")
-    id("org.jetbrains.kotlin.android")
 }
 
-AndroidXUiPlugin.applyAndConfigureKotlinPlugin(project, false)
+AndroidXUiPlugin.applyAndConfigureKotlinPlugin(project)
 
 dependencies {
     kotlinPlugin(project(":compose:compiler:compiler"))
@@ -34,6 +35,44 @@
     implementation(libs.kotlinStdlib)
 }
 
+
+if(AndroidXUiPlugin.isMultiplatformEnabled(project)) {
+    kotlin {
+        android()
+        jvm("desktop")
+
+        /*
+         * When updating dependencies, make sure to make the an an analogous update in the
+         * corresponding block above
+         */
+        sourceSets {
+            commonMain.dependencies {
+                implementation(KOTLIN_STDLIB_COMMON)
+            }
+            jvmMain.dependencies {
+                implementation(KOTLIN_STDLIB)
+            }
+            androidMain {
+                dependsOn(jvmMain)
+            }
+            desktopMain {
+                dependsOn(jvmMain)
+            }
+
+            commonTest.dependencies {
+                implementation(kotlin("test-junit"))
+            }
+            androidAndroidTest.dependencies {
+                implementation(ANDROIDX_TEST_EXT_JUNIT)
+                implementation(ANDROIDX_TEST_RULES)
+                implementation(ANDROIDX_TEST_RUNNER)
+                implementation(TRUTH)
+            }
+        }
+    }
+}
+
+
 android {
     defaultConfig {
         minSdkVersion 25
diff --git a/wear/compose/material/build.gradle b/wear/compose/material/build.gradle
index 2dd6a56..94fd032 100644
--- a/wear/compose/material/build.gradle
+++ b/wear/compose/material/build.gradle
@@ -19,30 +19,80 @@
 import androidx.build.RunApiTasks
 import androidx.build.AndroidXUiPlugin
 
+import static androidx.build.dependencies.DependenciesKt.*
+
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
     id("AndroidXUiPlugin")
-    id("org.jetbrains.kotlin.android")
 }
 
-AndroidXUiPlugin.applyAndConfigureKotlinPlugin(project, false)
+AndroidXUiPlugin.applyAndConfigureKotlinPlugin(project)
 
 dependencies {
     kotlinPlugin(project(":compose:compiler:compiler"))
 
-    api(project(":compose:foundation:foundation"))
-    api(project(":compose:ui:ui"))
-    api(project(":compose:ui:ui-text"))
-    api(project(":compose:runtime:runtime"))
+    if(!AndroidXUiPlugin.isMultiplatformEnabled(project)) {
+        api(project(":compose:foundation:foundation"))
+        api(project(":compose:ui:ui"))
+        api(project(":compose:ui:ui-text"))
+        api(project(":compose:runtime:runtime"))
 
-    implementation(libs.kotlinStdlib)
-    implementation(project(":compose:material:material"))
-    implementation(project(":compose:material:material-ripple"))
+        implementation(libs.kotlinStdlib)
+        implementation(project(":compose:material:material"))
+        implementation(project(":compose:material:material-ripple"))
 
-    androidTestImplementation project(path: ':compose:ui:ui-test')
-    androidTestImplementation project(path: ':compose:ui:ui-test-junit4')
-    androidTestImplementation project(path: ':compose:test-utils')
+        androidTestImplementation project(path: ':compose:ui:ui-test')
+        androidTestImplementation project(path: ':compose:ui:ui-test-junit4')
+        androidTestImplementation project(path: ':compose:test-utils')
+    }
+}
+
+if(AndroidXUiPlugin.isMultiplatformEnabled(project)) {
+    kotlin {
+        android()
+        jvm("desktop")
+
+        /*
+         * When updating dependencies, make sure to make the an an analogous update in the
+         * corresponding block above
+         */
+        sourceSets {
+            commonMain.dependencies {
+                implementation(KOTLIN_STDLIB_COMMON)
+
+                api(project(":compose:foundation:foundation"))
+                api(project(":compose:ui:ui"))
+                api(project(":compose:ui:ui-text"))
+                api(project(":compose:runtime:runtime"))
+
+                implementation(project(":compose:material:material"))
+                implementation(project(":compose:material:material-ripple"))
+            }
+            jvmMain.dependencies {
+                implementation(KOTLIN_STDLIB)
+            }
+            androidMain {
+                dependsOn(jvmMain)
+            }
+            desktopMain {
+                dependsOn(jvmMain)
+            }
+
+            commonTest.dependencies {
+                implementation(kotlin("test-junit"))
+            }
+            androidAndroidTest.dependencies {
+                implementation(ANDROIDX_TEST_EXT_JUNIT)
+                implementation(ANDROIDX_TEST_RULES)
+                implementation(ANDROIDX_TEST_RUNNER)
+                implementation(TRUTH)
+                implementation(project(path: ':compose:ui:ui-test'))
+                implementation(project(path: ':compose:ui:ui-test-junit4'))
+                implementation(project(path: ':compose:test-utils'))
+            }
+        }
+    }
 }
 
 android {
diff --git a/wear/compose/material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipTest.kt b/wear/compose/material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipTest.kt
index fe6d6f3..48a160f 100644
--- a/wear/compose/material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipTest.kt
+++ b/wear/compose/material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipTest.kt
@@ -19,9 +19,9 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.shape.CornerSize
 import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.testutils.assertShape
@@ -38,6 +38,7 @@
 import androidx.compose.ui.test.assertIsEnabled
 import androidx.compose.ui.test.assertIsNotEnabled
 import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertWidthIsEqualTo
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.getUnclippedBoundsInRoot
 import androidx.compose.ui.test.junit4.ComposeContentTestRule
@@ -46,6 +47,7 @@
 import androidx.compose.ui.test.onChildAt
 import androidx.compose.ui.test.onNodeWithContentDescription
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onRoot
 import androidx.compose.ui.test.performClick
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.unit.Dp
@@ -255,6 +257,108 @@
             .assertTopPositionInRootIsEqualTo((itemBounds.height - iconBounds.height) / 2)
     }
 
+    @Test
+    fun icon_only_compact_chip_has_correct_default_width_and_height() {
+        val iconTag = "TestIcon"
+        val chipTag = "chip"
+        rule
+            .setContentWithThemeForSizeAssertions(useUnmergedTree = true) {
+                CompactChip(
+                    onClick = {},
+                    modifier = Modifier.testTag(chipTag),
+                    icon = { CreateImage(iconTag) }
+                )
+            }
+
+        rule.onRoot().assertWidthIsEqualTo(52.dp).assertHeightIsEqualTo(32.dp)
+    }
+
+    @Test
+    fun label_only_compact_chip_has_correct_default_height() {
+        val chipTag = "chip"
+        rule
+            .setContentWithThemeForSizeAssertions(useUnmergedTree = true) {
+                CompactChip(
+                    onClick = {},
+                    modifier = Modifier.testTag(chipTag),
+                    label = { Text("Test") }
+                )
+            }
+
+        rule.onRoot().assertHeightIsEqualTo(32.dp)
+    }
+
+    @Test
+    fun no_content_compact_chip_has_correct_default_width_and_height() {
+        val chipTag = "chip"
+        rule
+            .setContentWithThemeForSizeAssertions(useUnmergedTree = true) {
+                CompactChip(
+                    onClick = {},
+                    modifier = Modifier.testTag(chipTag),
+                )
+            }
+
+        rule.onRoot().assertWidthIsEqualTo(52.dp).assertHeightIsEqualTo(32.dp)
+    }
+
+    @Test
+    fun icon_only_compact_chip_can_have_width_overridden() {
+        val iconTag = "TestIcon"
+        val chipTag = "chip"
+        rule
+            .setContentWithThemeForSizeAssertions(useUnmergedTree = true) {
+                CompactChip(
+                    onClick = {},
+                    modifier = Modifier.testTag(chipTag).width(100.dp),
+                    icon = { CreateImage(iconTag) }
+                )
+            }
+
+        rule.onRoot().assertWidthIsEqualTo(100.dp)
+    }
+
+    @Test
+    fun has_icon_in_correct_location_when_compact_chip() {
+        val iconTag = "TestIcon"
+        val chipTag = "chip"
+        rule
+            .setContentWithThemeForSizeAssertions(useUnmergedTree = true) {
+                CompactChip(
+                    onClick = {},
+                    label = { Text("Blue green orange") },
+                    icon = { CreateImage(iconTag) },
+                    modifier = Modifier.testTag(chipTag)
+                )
+            }
+        val itemBounds = rule.onNodeWithTag(chipTag).getUnclippedBoundsInRoot()
+        val iconBounds = rule.onNodeWithTag(iconTag, useUnmergedTree = true)
+            .getUnclippedBoundsInRoot()
+
+        rule.onNodeWithContentDescription(iconTag, useUnmergedTree = true)
+            .assertTopPositionInRootIsEqualTo((itemBounds.height - iconBounds.height) / 2)
+    }
+
+    @Test
+    fun has_icon_in_correct_location_when_icon_only_chip() {
+        val iconTag = "TestIcon"
+        val chipTag = "chip"
+        rule
+            .setContentWithThemeForSizeAssertions(useUnmergedTree = true) {
+                CompactChip(
+                    onClick = {},
+                    modifier = Modifier.testTag(chipTag),
+                    icon = { CreateImage(iconTag) }
+                )
+            }
+        val itemBounds = rule.onNodeWithTag(chipTag).getUnclippedBoundsInRoot()
+        val iconBounds = rule.onNodeWithTag(iconTag, useUnmergedTree = true)
+            .getUnclippedBoundsInRoot()
+
+        rule.onNodeWithContentDescription(iconTag, useUnmergedTree = true)
+            .assertTopPositionInRootIsEqualTo((itemBounds.height - iconBounds.height) / 2)
+    }
+
     private fun verifyHeight(expectedHeight: Dp) {
         rule.verifyHeight(expectedHeight) {
             Chip(
@@ -282,7 +386,7 @@
 
     @Test
     fun three_slot_layout_gives_primary_enabled_colors() =
-        verifyThreeSlotColors(
+        verifySlotColors(
             TestChipColors.Primary,
             ChipStatus.Enabled,
             { MaterialTheme.colors.primary },
@@ -292,6 +396,18 @@
         )
 
     @Test
+    fun compact_chip_gives_primary_enabled_colors() =
+        verifySlotColors(
+            TestChipColors.Primary,
+            ChipStatus.Enabled,
+            { MaterialTheme.colors.primary },
+            { MaterialTheme.colors.onPrimary },
+            { MaterialTheme.colors.onPrimary },
+            { MaterialTheme.colors.onPrimary },
+            compactChip = true
+        )
+
+    @Test
     fun gives_primary_disabled_colors() =
         verifyColors(
             TestChipColors.Primary,
@@ -302,7 +418,7 @@
 
     @Test
     fun three_slot_layout_gives_primary_disabled_colors() =
-        verifyThreeSlotColors(
+        verifySlotColors(
             TestChipColors.Primary,
             ChipStatus.Disabled,
             { MaterialTheme.colors.primary },
@@ -322,7 +438,7 @@
 
     @Test
     fun three_slot_layout_gives_secondary_enabled_colors() =
-        verifyThreeSlotColors(
+        verifySlotColors(
             TestChipColors.Secondary,
             ChipStatus.Enabled,
             { MaterialTheme.colors.surface },
@@ -342,7 +458,7 @@
 
     @Test
     fun three_slot_layout_gives_secondary_disabled_colors() =
-        verifyThreeSlotColors(
+        verifySlotColors(
             TestChipColors.Secondary,
             ChipStatus.Enabled,
             { MaterialTheme.colors.surface },
@@ -352,6 +468,18 @@
         )
 
     @Test
+    fun compact_chip_gives_secondary_disabled_colors() =
+        verifySlotColors(
+            TestChipColors.Secondary,
+            ChipStatus.Enabled,
+            { MaterialTheme.colors.surface },
+            { MaterialTheme.colors.onSurface },
+            { MaterialTheme.colors.onSurface },
+            { MaterialTheme.colors.onSurface },
+            compactChip = true
+        )
+
+    @Test
     fun allows_custom_enabled_background_color_override() {
         val overrideColor = Color.Yellow
         rule.setContentWithTheme {
@@ -532,13 +660,14 @@
         }
     }
 
-    private fun verifyThreeSlotColors(
+    private fun verifySlotColors(
         testChipColors: TestChipColors,
         status: ChipStatus,
         backgroundColor: @Composable () -> Color,
         contentColor: @Composable () -> Color,
         secondaryContentColor: @Composable () -> Color,
-        iconColor: @Composable () -> Color
+        iconColor: @Composable () -> Color,
+        compactChip: Boolean = false
     ) {
         var expectedBackground = Color.Transparent
         var expectedContent = Color.Transparent
@@ -560,28 +689,43 @@
                     .fillMaxSize()
                     .background(expectedBackground)
             ) {
-                Chip(
-                    onClick = {},
-                    colors = testChipColors.chipColors(),
-                    label = { actualContent = LocalContentColor.current },
-                    secondaryLabel = { actualSecondaryContent = LocalContentColor.current },
-                    icon = { actualIcon = LocalContentColor.current },
-                    enabled = status.enabled(),
-                    modifier = Modifier.testTag("test-item")
-                )
+                if (compactChip) {
+                    CompactChip(
+                        onClick = {},
+                        colors = testChipColors.chipColors(),
+                        label = { actualContent = LocalContentColor.current },
+                        icon = { actualIcon = LocalContentColor.current },
+                        enabled = status.enabled(),
+                        modifier = Modifier.testTag("test-item")
+                    )
+                } else {
+                    Chip(
+                        onClick = {},
+                        colors = testChipColors.chipColors(),
+                        label = { actualContent = LocalContentColor.current },
+                        secondaryLabel = { actualSecondaryContent = LocalContentColor.current },
+                        icon = { actualIcon = LocalContentColor.current },
+                        enabled = status.enabled(),
+                        modifier = Modifier.testTag("test-item")
+                    )
+                }
             }
         }
 
         if (status.enabled()) {
             assertEquals(expectedContent, actualContent)
-            assertEquals(expectedSecondaryContent, actualSecondaryContent)
+            if (! compactChip) {
+                assertEquals(expectedSecondaryContent, actualSecondaryContent)
+            }
             assertEquals(expectedIcon, actualIcon)
         } else {
             assertEquals(expectedContent.copy(alpha = expectedAlpha), actualContent)
-            assertEquals(
-                expectedSecondaryContent.copy(alpha = expectedAlpha),
-                actualSecondaryContent
-            )
+            if (! compactChip) {
+                assertEquals(
+                    expectedSecondaryContent.copy(alpha = expectedAlpha),
+                    actualSecondaryContent
+                )
+            }
             assertEquals(expectedIcon.copy(alpha = expectedAlpha), actualIcon)
         }
 
diff --git a/wear/compose/material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/MaterialThemeTest.kt b/wear/compose/material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/MaterialThemeTest.kt
new file mode 100644
index 0000000..32c54d7
--- /dev/null
+++ b/wear/compose/material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/MaterialThemeTest.kt
@@ -0,0 +1,456 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.wear.compose.material
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.captureToImage
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.test.performClick
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.sp
+import org.junit.Assert.assertEquals
+import org.junit.Rule
+import org.junit.Test
+
+class MaterialThemeTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun sets_default_color() {
+        var expectedBackground = Color.Transparent
+        rule.setContentWithTheme {
+            expectedBackground = MaterialTheme.colors.primary
+            Chip(
+                onClick = {},
+                colors = ChipDefaults.primaryChipColors(), // make sure using the primary color
+                label = { Text("Test") },
+            )
+        }
+
+        rule.onNodeWithText("Test")
+            .captureToImage()
+            .assertContainsColor(expectedBackground, 50.0f)
+    }
+
+    @Test
+    fun overrides_color_when_nested() {
+        // MaterialTheme in 'setWearContent' sets the primary background
+        // to cornflower blue. The nested theme should override that for primary.
+        rule.setContentWithTheme {
+            MaterialTheme(colors = MaterialTheme.colors.copy(primary = Color.Cyan)) {
+                Chip(
+                    onClick = {},
+                    colors = ChipDefaults.primaryChipColors(), // make sure using the primary color
+                    label = { Text("Test") },
+                )
+            }
+        }
+
+        rule.onNodeWithText("Test")
+            .captureToImage()
+            .assertContainsColor(Color.Cyan, 50.0f)
+    }
+
+    @Test
+    fun can_be_overridden_by_component_color_explicitly() {
+        rule.setContentWithTheme {
+            Chip(
+                onClick = {},
+                colors = ChipDefaults.primaryChipColors(backgroundColor = Color.Yellow),
+                label = { Text("Test") },
+            )
+        }
+
+        rule.onNodeWithText("Test")
+            .captureToImage()
+            .assertContainsColor(Color.Yellow, 50.0f)
+    }
+
+    @Test
+    fun sets_default_textstyle() {
+        var expectedStyle: TextStyle? = null
+
+        rule.setContentWithTheme {
+            expectedStyle = MaterialTheme.typography.button
+            Chip(
+                onClick = {},
+                label = { Text("Test") },
+            )
+        }
+
+        assertTextStyleEquals(expectedStyle!!, rule.textStyleOf("Test"))
+    }
+
+    @Test
+    fun overrides_textstyle_when_nested() {
+        val override = TextStyle(
+            fontFamily = FontFamily.Default,
+            fontWeight = FontWeight.Normal,
+            fontSize = 16.sp,
+            letterSpacing = 0.sp
+        )
+        rule.setContentWithTheme {
+            MaterialTheme(
+                typography = MaterialTheme.typography
+                    .copy(button = override)
+            ) {
+                Chip(
+                    onClick = {},
+                    label = { Text("Test") },
+                )
+            }
+        }
+
+        assertTextStyleEquals(override, rule.textStyleOf("Test"))
+    }
+
+    @Test
+    fun sets_primary_color_dynamically() =
+        verifyBackgroundColorIsDynamic(
+            initial = { MaterialTheme.colors.primary },
+            selectChipColors = { ChipDefaults.primaryChipColors() },
+            updateThemeColors = { colors, primary -> colors.copy(primary = primary) }
+        )
+
+    @Test
+    fun sets_primaryvariant_color_dynamically() =
+        verifyBackgroundColorIsDynamic(
+            initial = { MaterialTheme.colors.primaryVariant },
+            selectChipColors = {
+                ChipDefaults
+                    .primaryChipColors(backgroundColor = MaterialTheme.colors.primaryVariant)
+            },
+            updateThemeColors =
+                { colors, primaryVariant -> colors.copy(primaryVariant = primaryVariant) }
+        )
+
+    @Test
+    fun sets_secondary_color_dynamically() =
+        verifyBackgroundColorIsDynamic(
+            initial = { MaterialTheme.colors.secondary },
+            selectChipColors = {
+                ChipDefaults
+                    .secondaryChipColors(backgroundColor = MaterialTheme.colors.secondary)
+            },
+            updateThemeColors = { colors, secondary -> colors.copy(secondary = secondary) }
+        )
+
+    @Test
+    fun sets_secondaryvariant_color_dynamically() =
+        verifyBackgroundColorIsDynamic(
+            initial = { MaterialTheme.colors.secondaryVariant },
+            selectChipColors = {
+                ChipDefaults
+                    .secondaryChipColors(backgroundColor = MaterialTheme.colors.secondaryVariant)
+            },
+            updateThemeColors =
+                { colors, secondaryVariant -> colors.copy(secondaryVariant = secondaryVariant) }
+        )
+
+    @Test
+    fun sets_error_color_dynamically() =
+        verifyBackgroundColorIsDynamic(
+            initial = { MaterialTheme.colors.error },
+            selectChipColors = {
+                ChipDefaults
+                    .secondaryChipColors(backgroundColor = MaterialTheme.colors.error)
+            },
+            updateThemeColors = { colors, error -> colors.copy(error = error) }
+        )
+
+    @Test
+    fun sets_colors_dynamically() {
+        var initialBackground = Color.Transparent
+        val overrideBackground = Color.Cyan
+
+        rule.setContentWithTheme {
+            initialBackground = MaterialTheme.colors.primary
+            val colors = Colors()
+            val rememberedColors = remember { mutableStateOf(colors) }
+            MaterialTheme(colors = rememberedColors.value) {
+                Column {
+                    Chip(
+                        onClick = {},
+                        colors = ChipDefaults.primaryChipColors(),
+                        label = { Text("Test") },
+                    )
+                    Chip(
+                        onClick = {
+                            rememberedColors.value = colors.copy(primary = overrideBackground)
+                        },
+                        label = { },
+                        modifier = Modifier.testTag("button")
+                    )
+                }
+            }
+        }
+
+        rule.onNodeWithText("Test")
+            .captureToImage()
+            .assertContainsColor(initialBackground, 60.0f)
+        rule.onNodeWithTag("button")
+            .performClick()
+        rule.onNodeWithText("Test")
+            .captureToImage()
+            .assertContainsColor(overrideBackground, 60.0f)
+    }
+
+    @Test
+    fun sets_button_textstyle_dynamically() =
+        verifyTextStyleIsDynamic(
+            selectStyle = { it.button },
+            updateTextStyle = { typography, button -> typography.copy(button = button) }
+        )
+
+    @Test
+    fun sets_display1_textstyle_dynamically() =
+        verifyTextStyleIsDynamic(
+            selectStyle = { it.display1 },
+            updateTextStyle = { typography, display1 -> typography.copy(display1 = display1) }
+        )
+
+    @Test
+    fun sets_display2_textstyle_dynamically() =
+        verifyTextStyleIsDynamic(
+            selectStyle = { it.display2 },
+            updateTextStyle = { typography, display2 -> typography.copy(display2 = display2) }
+        )
+
+    @Test
+    fun sets_display3_textstyle_dynamically() =
+        verifyTextStyleIsDynamic(
+            selectStyle = { it.display3 },
+            updateTextStyle = { typography, display3 -> typography.copy(display3 = display3) }
+        )
+
+    @Test
+    fun sets_title1_textstyle_dynamically() =
+        verifyTextStyleIsDynamic(
+            selectStyle = { it.title1 },
+            updateTextStyle = { typography, title1 -> typography.copy(title1 = title1) }
+        )
+
+    @Test
+    fun sets_title2_textstyle_dynamically() =
+        verifyTextStyleIsDynamic(
+            selectStyle = { it.title2 },
+            updateTextStyle = { typography, title2 -> typography.copy(title2 = title2) }
+        )
+
+    @Test
+    fun sets_title3_textstyle_dynamically() =
+        verifyTextStyleIsDynamic(
+            selectStyle = { it.title3 },
+            updateTextStyle = { typography, title3 -> typography.copy(title3 = title3) }
+        )
+
+    @Test
+    fun sets_body1_textstyle_dynamically() =
+        verifyTextStyleIsDynamic(
+            selectStyle = { it.body1 },
+            updateTextStyle = { typography, body1 -> typography.copy(body1 = body1) }
+        )
+
+    @Test
+    fun sets_body2_textstyle_dynamically() =
+        verifyTextStyleIsDynamic(
+            selectStyle = { it.body2 },
+            updateTextStyle = { typography, body2 -> typography.copy(body2 = body2) }
+        )
+
+    @Test
+    fun sets_caption1_textstyle_dynamically() =
+        verifyTextStyleIsDynamic(
+            selectStyle = { it.caption1 },
+            updateTextStyle = { typography, caption1 -> typography.copy(caption1 = caption1) }
+        )
+
+    @Test
+    fun sets_caption2_textstyle_dynamically() =
+        verifyTextStyleIsDynamic(
+            selectStyle = { it.caption2 },
+            updateTextStyle = { typography, caption2 -> typography.copy(caption2 = caption2) }
+        )
+
+    @Test
+    fun sets_typography_dynamically() {
+        val initialStyle = TextStyle(
+            fontFamily = FontFamily.Default,
+            fontWeight = FontWeight.Bold,
+            fontSize = 14.sp,
+            letterSpacing = 0.sp
+        )
+        val overrideTextStyle = TextStyle(
+            fontFamily = FontFamily.Default,
+            fontWeight = FontWeight.Normal,
+            fontSize = 8.sp,
+            letterSpacing = 0.sp
+        )
+
+        rule.setContentWithTheme {
+            val typography = Typography()
+            val rememberedTypography = remember { mutableStateOf(typography) }
+            MaterialTheme(typography = rememberedTypography.value) {
+                Column {
+                    Chip(
+                        onClick = {},
+                        colors = ChipDefaults.primaryChipColors(),
+                        label = { Text("Test") },
+                    )
+                    Chip(
+                        onClick = {
+                            rememberedTypography.value =
+                                typography.copy(button = overrideTextStyle)
+                        },
+                        label = { },
+                        modifier = Modifier.testTag("button")
+                    )
+                }
+            }
+        }
+
+        assertTextStyleEquals(initialStyle, rule.textStyleOf("Test"))
+        rule.onNodeWithTag("button").performClick()
+        assertTextStyleEquals(overrideTextStyle, rule.textStyleOf("Test"))
+    }
+
+    private fun verifyBackgroundColorIsDynamic(
+        initial: @Composable () -> Color,
+        selectChipColors: @Composable () -> ChipColors,
+        updateThemeColors: (Colors, Color) -> Colors
+    ) {
+        var initialColor = Color.Transparent
+        val overrideColor = Color.Cyan
+        val colors = Colors()
+
+        rule.setContentWithTheme {
+            initialColor = initial()
+            val dynamicColor = remember { mutableStateOf(initialColor) }
+            val themeColors = updateThemeColors(colors, dynamicColor.value)
+            MaterialTheme(colors = themeColors) {
+                Column {
+                    Chip(
+                        onClick = {},
+                        colors = selectChipColors(),
+                        label = { Text("Test") },
+                    )
+                    Chip(
+                        onClick = { dynamicColor.value = overrideColor },
+                        label = { },
+                        modifier = Modifier.testTag("button")
+                    )
+                }
+            }
+        }
+
+        rule.onNodeWithText("Test")
+            .captureToImage()
+            .assertContainsColor(initialColor, 60.0f)
+        rule.onNodeWithTag("button")
+            .performClick()
+        rule.onNodeWithText("Test")
+            .captureToImage()
+            .assertContainsColor(overrideColor, 60.0f)
+    }
+
+    private fun verifyContentColorIsDynamic(
+        initial: @Composable () -> Color,
+        selectChipColors: @Composable () -> ChipColors,
+        updateThemeColors: (Colors, Color) -> Colors
+    ) {
+        var initialColor = Color.White
+        val overrideColor = Color.Cyan
+        val colors = Colors()
+
+        rule.setContentWithTheme {
+            initialColor = initial()
+            val dynamicColor = remember { mutableStateOf(initialColor) }
+            val themeColors = updateThemeColors(colors, dynamicColor.value)
+            MaterialTheme(colors = themeColors) {
+                Column {
+                    Chip(
+                        onClick = {},
+                        colors = selectChipColors(),
+                        label = { Text("Test") },
+                    )
+                    Chip(
+                        onClick = { dynamicColor.value = overrideColor },
+                        label = { Text("Test") },
+                        modifier = Modifier.testTag("button")
+                    )
+                }
+            }
+        }
+
+        assertEquals(initialColor, rule.textStyleOf("Test").color)
+        rule.onNodeWithTag("button")
+            .performClick()
+        assertEquals(overrideColor, rule.textStyleOf("Test").color)
+    }
+
+    private fun verifyTextStyleIsDynamic(
+        selectStyle: (Typography) -> TextStyle,
+        updateTextStyle: (Typography, TextStyle) -> Typography
+    ) {
+        var initialStyle = TextStyle()
+        val overrideTextStyle = TextStyle(
+            fontFamily = FontFamily.Default,
+            fontWeight = FontWeight.Normal,
+            fontSize = 8.sp,
+            letterSpacing = 0.sp
+        )
+        val typography = Typography()
+
+        rule.setContentWithTheme {
+            initialStyle = selectStyle(typography)
+            val dynamicStyle = remember { mutableStateOf(initialStyle) }
+            val rememberedTypography =
+                updateTextStyle(typography, dynamicStyle.value)
+            MaterialTheme(
+                // WearChip always uses 'button' style for text, so assign the style under test to button.
+                typography = rememberedTypography.copy(button = selectStyle(rememberedTypography))
+            ) {
+                Column {
+                    Chip(
+                        onClick = {},
+                        label = { Text("Test") },
+                    )
+                    Chip(
+                        onClick = { dynamicStyle.value = overrideTextStyle },
+                        label = { },
+                        modifier = Modifier.testTag("button")
+                    )
+                }
+            }
+        }
+
+        assertTextStyleEquals(initialStyle, rule.textStyleOf("Test"))
+        rule.onNodeWithTag("button").performClick()
+        assertTextStyleEquals(overrideTextStyle, rule.textStyleOf("Test"))
+    }
+}
\ No newline at end of file
diff --git a/wear/compose/material/src/commonMain/kotlin/androidx/wear/compose/material/Chip.kt b/wear/compose/material/src/commonMain/kotlin/androidx/wear/compose/material/Chip.kt
index f2b9c62..fce5d9c 100644
--- a/wear/compose/material/src/commonMain/kotlin/androidx/wear/compose/material/Chip.kt
+++ b/wear/compose/material/src/commonMain/kotlin/androidx/wear/compose/material/Chip.kt
@@ -15,8 +15,6 @@
  */
 package androidx.wear.compose.material
 
-import androidx.compose.foundation.Indication
-import androidx.compose.foundation.LocalIndication
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.interaction.Interaction
 import androidx.compose.foundation.interaction.MutableInteractionSource
@@ -29,9 +27,11 @@
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.material.ContentAlpha
 import androidx.compose.material.Surface
+import androidx.compose.material.ripple.rememberRipple
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.Immutable
@@ -75,7 +75,6 @@
  * @param modifier Modifier to be applied to the chip
  * @param enabled Controls the enabled state of the chip. When `false`, this chip will not
  * be clickable
- * @param onClickLabel Semantic / accessibility label for the [onClick] action
  * @param contentPadding The spacing values to apply internally between the container and the
  * content
  * @param shape Defines the chip's shape. It is strongly recommended to use the default as this
@@ -84,9 +83,6 @@
  * [Interaction]s for this Chip. You can create and pass in your own remembered
  * [MutableInteractionSource] if you want to observe [Interaction]s and customize the
  * appearance / behavior of this Chip in different [Interaction]s.
- * @param indication Indication to be shown when surface is pressed. By default, indication from
- * [LocalIndication] will be used. Pass `null` to show no indication, or current value from
- * [LocalIndication] to show theme default
  * @param role The type of user interface element. Accessibility services might use this
  * to describe the element or do customizations
  */
@@ -96,11 +92,9 @@
     colors: ChipColors,
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
-    onClickLabel: String? = null,
     contentPadding: PaddingValues = ChipDefaults.ContentPadding,
     shape: Shape = MaterialTheme.shapes.small,
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
-    indication: Indication? = LocalIndication.current,
     role: Role? = Role.Button,
     content: @Composable () -> Unit,
 ) {
@@ -122,10 +116,9 @@
         val contentBoxModifier = Modifier
             .clickable(
                 enabled = enabled,
-                onClickLabel = onClickLabel,
                 onClick = onClick,
                 role = role,
-                indication = indication,
+                indication = rememberRipple(),
                 interactionSource = interactionSource,
             )
             .padding(contentPadding)
@@ -148,7 +141,7 @@
 /**
  * Wear Material [Chip] that offers three slots and a specific layout for an icon, label and
  * secondaryLabel. The icon and secondaryLabel are optional. The items are laid out with the icon,
- * if provided, a the start of a row, with a column next containing the two label slots.
+ * if provided, at the start of a row, with a column next containing the two label slots.
  *
  * The [Chip] is Stadium shaped and has a max height designed to take no more than two lines of text
  * of [Typography.button] style. If no secondary label is provided then the label
@@ -167,26 +160,25 @@
  *
  * Chips can be enabled or disabled. A disabled chip will not respond to click events.
  *
- * @param label A slot for providing the chips main label. The contents are expected to be text
+ * @param label A slot for providing the chip's main label. The contents are expected to be text
  * which is "start" aligned if there is an icon preset and "start" or "center" aligned if not.
  * @param onClick Will be called when the user clicks the chip
  * @param modifier Modifier to be applied to the chip
- * @param secondaryLabel A slot for providing the chips secondary label. The contents are expected
+ * @param secondaryLabel A slot for providing the chip's secondary label. The contents are expected
  * to be text which is "start" aligned if there is an icon preset and "start" or "center" aligned if
  * not. label and secondaryLabel contents should be consistently aligned.
+ * @param icon A slot for providing the chip's icon. The contents are expected to be a horizontally
+ * and vertically aligned icon of size [ChipDefaults.IconSize] or [ChipDefaults.LargeIconSize].
  * @param colors [ChipColors] that will be used to resolve the background and content color for
  * this chip in different states. See [ChipDefaults.chipColors]. Defaults to
  * [ChipDefaults.primaryChipColors]
  * @param enabled Controls the enabled state of the chip. When `false`, this chip will not
  * be clickable
- * @param onClickLabel Semantic / accessibility label for the [onClick] action
  * @param interactionSource The [MutableInteractionSource] representing the stream of
  * [Interaction]s for this Chip. You can create and pass in your own remembered
  * [MutableInteractionSource] if you want to observe [Interaction]s and customize the
  * appearance / behavior of this Chip in different [Interaction]s.
- * @param indication Indication to be shown when surface is pressed. By default, indication from
- * [LocalIndication] will be used. Pass `null` to show no indication, or current value from
- * [LocalIndication] to show theme default
+
  * @param contentPadding The spacing values to apply internally between the container and the
  * content
  */
@@ -199,9 +191,7 @@
     icon: (@Composable () -> Unit)? = null,
     colors: ChipColors = ChipDefaults.primaryChipColors(),
     enabled: Boolean = true,
-    onClickLabel: String? = null,
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
-    indication: Indication? = LocalIndication.current,
     contentPadding: PaddingValues = ChipDefaults.contentPadding(icon != null),
 ) {
     Chip(
@@ -209,9 +199,7 @@
         colors = colors,
         modifier = modifier,
         enabled = enabled,
-        onClickLabel = onClickLabel,
         interactionSource = interactionSource,
-        indication = indication,
         contentPadding = contentPadding
     ) {
         Row(
@@ -248,6 +236,94 @@
 }
 
 /**
+ * A compact Wear Material Chip that offers two slots and a specific layout for an icon and label.
+ * Both the icon and label are optional however it is expected that at least one will be provided.
+ *
+ * The [CompactChip] is Stadium shaped and has a max height designed to take no more than one line
+ * of text of [Typography.button] style and/or one 24x24 icon. The default max height is
+ * [ChipDefaults.CompactChipHeight].
+ *
+ * If a icon is provided then the labels should be "start" aligned, e.g. left aligned in ltr so that
+ * the text starts next to the icon.
+ *
+ * The items are laid out as follows.
+ *
+ * 1. If a label is provided then the chip will be laid out with the optional icon at the start of a
+ * row followed by the label with a default max height of [ChipDefaults.CompactChipHeight].
+ *
+ * 2. If only an icon is provided it will be laid out vertically and horizontally centered with a
+ * default height of [ChipDefaults.CompactChipHeight] and the default width of
+ * [ChipDefaults.IconOnlyCompactChipWidth]
+ *
+ * The [CompactChip] can have different styles with configurable content colors, background colors
+ * including gradients, these are provided by [ChipColors] implementations.
+ *
+ * The recommended set of [ChipColors] styles can be obtained from [ChipDefaults], e.g.
+ * [ChipDefaults.primaryChipColors] to get a color scheme for a primary [Chip] which by default
+ * will have a solid background of [Colors.primary] and content color of
+ * [Colors.onPrimary].
+ *
+ * Chips can be enabled or disabled. A disabled chip will not respond to click events.
+ *
+ * @param onClick Will be called when the user clicks the chip
+ * @param modifier Modifier to be applied to the chip
+ * @param label A slot for providing the chip's main label. The contents are expected to be text
+ * which is "start" aligned if there is an icon preset and "start" or "center" aligned if not.
+ * @param icon A slot for providing the chip's icon. The contents are expected to be a horizontally
+ * and vertically aligned icon of size [ChipDefaults.IconSize] or [ChipDefaults.LargeIconSize].
+ * @param colors [ChipColors] that will be used to resolve the background and content color for
+ * this chip in different states. See [ChipDefaults.chipColors]. Defaults to
+ * [ChipDefaults.primaryChipColors]
+ * @param enabled Controls the enabled state of the chip. When `false`, this chip will not
+ * be clickable
+ * @param interactionSource The [MutableInteractionSource] representing the stream of
+ * [Interaction]s for this Chip. You can create and pass in your own remembered
+ * [MutableInteractionSource] if you want to observe [Interaction]s and customize the
+ * appearance / behavior of this Chip in different [Interaction]s.
+ * @param contentPadding The spacing values to apply internally between the container and the
+ * content
+ */
+@Composable
+fun CompactChip(
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    label: (@Composable () -> Unit)? = null,
+    icon: (@Composable () -> Unit)? = null,
+    colors: ChipColors = ChipDefaults.primaryChipColors(),
+    enabled: Boolean = true,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    contentPadding: PaddingValues = ChipDefaults.contentPadding(icon != null),
+) {
+    if (label != null) {
+        Chip(
+            label = label,
+            onClick = onClick,
+            modifier = modifier.height(ChipDefaults.CompactChipHeight),
+            icon = icon,
+            colors = colors,
+            enabled = enabled,
+            interactionSource = interactionSource,
+            contentPadding = contentPadding
+        )
+    } else {
+        Chip(
+            onClick = onClick,
+            modifier = modifier
+                .height(ChipDefaults.CompactChipHeight)
+                .width(ChipDefaults.IconOnlyCompactChipWidth),
+            colors = colors,
+            enabled = enabled,
+            interactionSource = interactionSource,
+            contentPadding = contentPadding
+        ) {
+            if (icon != null) {
+                icon()
+            }
+        }
+    }
+}
+
+/**
  * Represents the background and content colors used in a chip in different states.
  *
  * See [ChipDefaults.primaryChipColors] for the default colors used in a primary styled [Chip].
@@ -377,6 +453,18 @@
     internal val Height = 52.dp
 
     /**
+     * The height applied for the [CompactChip].
+     * Note that you can override it by applying Modifier.height directly on [CompactChip].
+     */
+    internal val CompactChipHeight = 32.dp
+
+    /**
+     * The default width applied for the [CompactChip] when it has no label provided.
+     * Note that you can override it by applying Modifier.width directly on [CompactChip].
+     */
+    internal val IconOnlyCompactChipWidth = 52.dp
+
+    /**
      * The default size of the icon when used inside a [Chip].
      */
     public val IconSize = 24.dp
@@ -475,7 +563,8 @@
 
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
-        if (javaClass != other?.javaClass) return false
+        if (other == null) return false
+        if (this::class != other::class) return false
 
         other as DefaultChipColors
 
diff --git a/wear/compose/material/src/commonMain/kotlin/androidx/wear/compose/material/MaterialTheme.kt b/wear/compose/material/src/commonMain/kotlin/androidx/wear/compose/material/MaterialTheme.kt
index f92126e..fa56577 100644
--- a/wear/compose/material/src/commonMain/kotlin/androidx/wear/compose/material/MaterialTheme.kt
+++ b/wear/compose/material/src/commonMain/kotlin/androidx/wear/compose/material/MaterialTheme.kt
@@ -24,10 +24,7 @@
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.ReadOnlyComposable
-import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.runtime.remember
-import androidx.compose.runtime.structuralEqualityPolicy
-import androidx.compose.ui.text.TextStyle
 
 // TODO: Provide references to the Wear material design specs.
 /**
@@ -113,26 +110,3 @@
         lightTheme = false
     )
 }
-
-/**
- * CompositionLocal containing the preferred [TextStyle] that will be used by [Text] components by
- * default. To set the value for this CompositionLocal, see [ProvideTextStyle] which will merge any
- * missing [TextStyle] properties with the existing [TextStyle] set in this CompositionLocal.
- *
- * @see ProvideTextStyle
- */
-val LocalTextStyle = compositionLocalOf(structuralEqualityPolicy()) { TextStyle.Default }
-
-// TODO: b/156598010 remove this and replace with fold definition on the backing CompositionLocal
-/**
- * This function is used to set the current value of [LocalTextStyle], merging the given style
- * with the current style values for any missing attributes. Any [Text] components included in
- * this component's [content] will be styled with this style unless styled explicitly.
- *
- * @see LocalTextStyle
- */
-@Composable
-fun ProvideTextStyle(value: TextStyle, content: @Composable () -> Unit) {
-    val mergedStyle = LocalTextStyle.current.merge(value)
-    CompositionLocalProvider(LocalTextStyle provides mergedStyle, content = content)
-}
diff --git a/wear/compose/material/src/commonMain/kotlin/androidx/wear/compose/material/Text.kt b/wear/compose/material/src/commonMain/kotlin/androidx/wear/compose/material/Text.kt
new file mode 100644
index 0000000..ae7966d
--- /dev/null
+++ b/wear/compose/material/src/commonMain/kotlin/androidx/wear/compose/material/Text.kt
@@ -0,0 +1,247 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.wear.compose.material
+
+import androidx.compose.foundation.text.BasicText
+import androidx.compose.foundation.text.InlineTextContent
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.compositionLocalOf
+import androidx.compose.runtime.structuralEqualityPolicy
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.takeOrElse
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.Paragraph
+import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontStyle
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextDecoration
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.TextUnit
+
+/**
+ * High level element that displays text and provides semantics / accessibility information.
+ *
+ * The default [style] uses the [LocalTextStyle] provided by the [MaterialTheme] / components. If
+ * you are setting your own style, you may want to consider first retrieving [LocalTextStyle],
+ * and using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific
+ * attributes you want to override.
+ *
+ * For ease of use, commonly used parameters from [TextStyle] are also present here. The order of
+ * precedence is as follows:
+ * - If a parameter is explicitly set here (i.e, it is _not_ `null` or [TextUnit.Unspecified]),
+ * then this parameter will always be used.
+ * - If a parameter is _not_ set, (`null` or [TextUnit.Unspecified]), then the corresponding value
+ * from [style] will be used instead.
+ *
+ * Additionally, for [color], if [color] is not set, and [style] does not have a color, then
+ * [LocalContentColor] will be used with an alpha of [LocalContentAlpha]- this allows this
+ * [Text] or element containing this [Text] to adapt to different background colors and still
+ * maintain contrast and accessibility.
+ *
+ * @param text The text to be displayed.
+ * @param modifier [Modifier] to apply to this layout node.
+ * @param color [Color] to apply to the text. If [Color.Unspecified], and [style] has no color set,
+ * this will be [LocalContentColor].
+ * @param fontSize The size of glyphs to use when painting the text. See [TextStyle.fontSize].
+ * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
+ * See [TextStyle.fontStyle].
+ * @param fontWeight The typeface thickness to use when painting the text (e.g., [FontWeight.Bold]).
+ * @param fontFamily The font family to be used when rendering the text. See [TextStyle.fontFamily].
+ * @param letterSpacing The amount of space to add between each letter.
+ * See [TextStyle.letterSpacing].
+ * @param textDecoration The decorations to paint on the text (e.g., an underline).
+ * See [TextStyle.textDecoration].
+ * @param textAlign The alignment of the text within the lines of the paragraph.
+ * See [TextStyle.textAlign].
+ * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM.
+ * See [TextStyle.lineHeight].
+ * @param overflow How visual overflow should be handled.
+ * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
+ * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ * [overflow] and TextAlign may have unexpected effects.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if
+ * necessary. If the text exceeds the given number of lines, it will be truncated according to
+ * [overflow] and [softWrap]. If it is not null, then it must be greater than zero.
+ * @param onTextLayout Callback that is executed when a new text layout is calculated.
+ * @param style Style configuration for the text such as color, font, line height etc.
+ */
+@Composable
+fun Text(
+    text: String,
+    modifier: Modifier = Modifier,
+    color: Color = Color.Unspecified,
+    fontSize: TextUnit = TextUnit.Unspecified,
+    fontStyle: FontStyle? = null,
+    fontWeight: FontWeight? = null,
+    fontFamily: FontFamily? = null,
+    letterSpacing: TextUnit = TextUnit.Unspecified,
+    textDecoration: TextDecoration? = null,
+    textAlign: TextAlign? = null,
+    lineHeight: TextUnit = TextUnit.Unspecified,
+    overflow: TextOverflow = TextOverflow.Clip,
+    softWrap: Boolean = true,
+    maxLines: Int = Int.MAX_VALUE,
+    onTextLayout: (TextLayoutResult) -> Unit = {},
+    style: TextStyle = LocalTextStyle.current
+) {
+    Text(
+        AnnotatedString(text),
+        modifier,
+        color,
+        fontSize,
+        fontStyle,
+        fontWeight,
+        fontFamily,
+        letterSpacing,
+        textDecoration,
+        textAlign,
+        lineHeight,
+        overflow,
+        softWrap,
+        maxLines,
+        emptyMap(),
+        onTextLayout,
+        style
+    )
+}
+
+/**
+ * High level element that displays text and provides semantics / accessibility information.
+ *
+ * The default [style] uses the [LocalTextStyle] provided by the [MaterialTheme] / components. If
+ * you are setting your own style, you may want to consider first retrieving [LocalTextStyle],
+ * and using [TextStyle.copy] to keep any theme defined attributes, only modifying the specific
+ * attributes you want to override.
+ *
+ * For ease of use, commonly used parameters from [TextStyle] are also present here. The order of
+ * precedence is as follows:
+ * - If a parameter is explicitly set here (i.e, it is _not_ `null` or [TextUnit.Unspecified]),
+ * then this parameter will always be used.
+ * - If a parameter is _not_ set, (`null` or [TextUnit.Unspecified]), then the corresponding value
+ * from [style] will be used instead.
+ *
+ * Additionally, for [color], if [color] is not set, and [style] does not have a color, then
+ * [LocalContentColor] will be used with an alpha of [LocalContentAlpha]- this allows this
+ * [Text] or element containing this [Text] to adapt to different background colors and still
+ * maintain contrast and accessibility.
+ *
+ * @param text The text to be displayed, where [AnnotatedString] allows multiple styles to be used.
+ * @param modifier [Modifier] to apply to this layout node.
+ * @param color [Color] to apply to the text. If [Color.Unspecified], and [style] has no color set,
+ * this will be [LocalContentColor].
+ * @param fontSize The size of glyphs to use when painting the text. See [TextStyle.fontSize].
+ * @param fontStyle The typeface variant to use when drawing the letters (e.g., italic).
+ * See [TextStyle.fontStyle].
+ * @param fontWeight The typeface thickness to use when painting the text (e.g., [FontWeight.Bold]).
+ * @param fontFamily The font family to be used when rendering the text. See [TextStyle.fontFamily].
+ * @param letterSpacing The amount of space to add between each letter.
+ * See [TextStyle.letterSpacing].
+ * @param textDecoration The decorations to paint on the text (e.g., an underline).
+ * See [TextStyle.textDecoration].
+ * @param textAlign The alignment of the text within the lines of the paragraph.
+ * See [TextStyle.textAlign].
+ * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM.
+ * See [TextStyle.lineHeight].
+ * @param overflow How visual overflow should be handled.
+ * @param softWrap Whether the text should break at soft line breaks. If false, the glyphs in the
+ * text will be positioned as if there was unlimited horizontal space. If [softWrap] is false,
+ * [overflow] and TextAlign may have unexpected effects.
+ * @param maxLines An optional maximum number of lines for the text to span, wrapping if
+ * necessary. If the text exceeds the given number of lines, it will be truncated according to
+ * [overflow] and [softWrap]. If it is not null, then it must be greater than zero.
+ * @param inlineContent A map store composables that replaces certain ranges of the text. It's
+ * used to insert composables into text layout. Check [InlineTextContent] for more information.
+ * @param onTextLayout Callback that is executed when a new text layout is calculated.
+ * @param style Style configuration for the text such as color, font, line height etc.
+ */
+@Composable
+fun Text(
+    text: AnnotatedString,
+    modifier: Modifier = Modifier,
+    color: Color = Color.Unspecified,
+    fontSize: TextUnit = TextUnit.Unspecified,
+    fontStyle: FontStyle? = null,
+    fontWeight: FontWeight? = null,
+    fontFamily: FontFamily? = null,
+    letterSpacing: TextUnit = TextUnit.Unspecified,
+    textDecoration: TextDecoration? = null,
+    textAlign: TextAlign? = null,
+    lineHeight: TextUnit = TextUnit.Unspecified,
+    overflow: TextOverflow = TextOverflow.Clip,
+    softWrap: Boolean = true,
+    maxLines: Int = Int.MAX_VALUE,
+    inlineContent: Map<String, InlineTextContent> = mapOf(),
+    onTextLayout: (TextLayoutResult) -> Unit = {},
+    style: TextStyle = LocalTextStyle.current
+) {
+    val textColor = color.takeOrElse {
+        style.color.takeOrElse {
+            LocalContentColor.current.copy(alpha = LocalContentAlpha.current)
+        }
+    }
+    val mergedStyle = style.merge(
+        TextStyle(
+            color = textColor,
+            fontSize = fontSize,
+            fontWeight = fontWeight,
+            textAlign = textAlign,
+            lineHeight = lineHeight,
+            fontFamily = fontFamily,
+            textDecoration = textDecoration,
+            fontStyle = fontStyle,
+            letterSpacing = letterSpacing
+        )
+    )
+    BasicText(
+        text,
+        modifier,
+        mergedStyle,
+        onTextLayout,
+        overflow,
+        softWrap,
+        maxLines,
+        inlineContent
+    )
+}
+
+/**
+ * CompositionLocal containing the preferred [TextStyle] that will be used by [Text] components by
+ * default. To set the value for this CompositionLocal, see [ProvideTextStyle] which will merge any
+ * missing [TextStyle] properties with the existing [TextStyle] set in this CompositionLocal.
+ *
+ * @see ProvideTextStyle
+ */
+val LocalTextStyle = compositionLocalOf(structuralEqualityPolicy()) { TextStyle.Default }
+
+// TODO: b/156598010 remove this and replace with fold definition on the backing CompositionLocal
+/**
+ * This function is used to set the current value of [LocalTextStyle], merging the given style
+ * with the current style values for any missing attributes. Any [Text] components included in
+ * this component's [content] will be styled with this style unless styled explicitly.
+ *
+ * @see LocalTextStyle
+ */
+@Composable
+fun ProvideTextStyle(value: TextStyle, content: @Composable () -> Unit) {
+    val mergedStyle = LocalTextStyle.current.merge(value)
+    CompositionLocalProvider(LocalTextStyle provides mergedStyle, content = content)
+}
diff --git a/wear/tiles/tiles-proto/src/main/proto/layout.proto b/wear/tiles/tiles-proto/src/main/proto/layout.proto
index 45707da..ade99be 100644
--- a/wear/tiles/tiles-proto/src/main/proto/layout.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/layout.proto
@@ -15,24 +15,24 @@
 // The horizontal alignment of an element within its container.
 enum HorizontalAlignment {
   // Horizontal alignment is undefined.
-  HALIGN_UNDEFINED = 0;
+  HORIZONTAL_ALIGN_UNDEFINED = 0;
 
   // Horizontally align to the left.
-  HALIGN_LEFT = 1;
+  HORIZONTAL_ALIGN_LEFT = 1;
 
   // Horizontally align to center.
-  HALIGN_CENTER = 2;
+  HORIZONTAL_ALIGN_CENTER = 2;
 
   // Horizontally align to the right.
-  HALIGN_RIGHT = 3;
+  HORIZONTAL_ALIGN_RIGHT = 3;
 
   // Horizontally align to the content start (left in LTR layouts, right in RTL
   // layouts).
-  HALIGN_START = 4;
+  HORIZONTAL_ALIGN_START = 4;
 
   // Horizontally align to the content end (right in LTR layouts, left in RTL
   // layouts).
-  HALIGN_END = 5;
+  HORIZONTAL_ALIGN_END = 5;
 }
 
 // An extensible HorizontalAlignment property.
@@ -44,16 +44,16 @@
 // The vertical alignment of an element within its container.
 enum VerticalAlignment {
   // Vertical alignment is undefined.
-  VALIGN_UNDEFINED = 0;
+  VERTICAL_ALIGN_UNDEFINED = 0;
 
   // Vertically align to the top.
-  VALIGN_TOP = 1;
+  VERTICAL_ALIGN_TOP = 1;
 
   // Vertically align to center.
-  VALIGN_CENTER = 2;
+  VERTICAL_ALIGN_CENTER = 2;
 
   // Vertically align to the bottom.
-  VALIGN_BOTTOM = 3;
+  VERTICAL_ALIGN_BOTTOM = 3;
 }
 
 // An extensible VerticalAlignment property.
@@ -106,18 +106,18 @@
 // Spannable.
 enum SpanVerticalAlignment {
   // Alignment is undefined.
-  SPAN_VALIGN_UNDEFINED = 0;
+  SPAN_VERTICAL_ALIGN_UNDEFINED = 0;
 
   // Align to the bottom of the line (descent of the largest text in this line).
   // If there is no text in the line containing this image, this will align to
   // the bottom of the line, where the line height is defined as the height of
   // the largest image in the line.
-  SPAN_VALIGN_BOTTOM = 1;
+  SPAN_VERTICAL_ALIGN_BOTTOM = 1;
 
   // Align to the baseline of the text. Note that if the line in the Spannable
   // which contains this image does not contain any text, the effects of using
   // this alignment are undefined.
-  SPAN_VALIGN_TEXT_BASELINE = 2;
+  SPAN_VERTICAL_ALIGN_TEXT_BASELINE = 2;
 }
 
 // An extensible SpanVerticalAlignment property.
@@ -389,11 +389,11 @@
   ContainerDimension width = 3;
 
   // The horizontal alignment of the element inside this Box. If not defined,
-  // defaults to HALIGN_CENTER.
+  // defaults to HORIZONTAL_ALIGN_CENTER.
   HorizontalAlignmentProp horizontal_alignment = 4;
 
   // The vertical alignment of the element inside this Box. If not defined,
-  // defaults to VALIGN_CENTER.
+  // defaults to VERTICAL_ALIGN_CENTER.
   VerticalAlignmentProp vertical_alignment = 5;
 
   // Modifiers for this element.
@@ -431,7 +431,7 @@
   SpanModifiers modifiers = 4;
 
   // Alignment of this image within the line height of the surrounding
-  // Spannable. If undefined, defaults to SPAN_VALIGN_BOTTOM.
+  // Spannable. If undefined, defaults to SPAN_VERTICAL_ALIGN_BOTTOM.
   SpanVerticalAlignmentProp alignment = 5;
 }
 
@@ -500,7 +500,7 @@
 
   // The horizontal alignment of elements inside this column, if they are
   // narrower than the resulting width of the column. If not defined, defaults
-  // to HALIGN_CENTER.
+  // to HORIZONTAL_ALIGN_CENTER.
   HorizontalAlignmentProp horizontal_alignment = 2;
 
   // The width of this column. If not defined, this will size itself to fit
@@ -529,7 +529,7 @@
 
   // The vertical alignment of elements inside this row, if they are narrower
   // than the resulting height of the row. If not defined, defaults to
-  // VALIGN_CENTER.
+  // VERTICAL_ALIGN_CENTER.
   VerticalAlignmentProp vertical_alignment = 2;
 
   // The width of this row. If not defined, this will size itself to fit
@@ -569,7 +569,7 @@
   // larger than the thickness of the element being drawn, this controls whether
   // the element should be drawn towards the inner or outer edge of the arc, or
   // drawn in the center.
-  // If not defined, defaults to VALIGN_CENTER
+  // If not defined, defaults to VERTICAL_ALIGN_CENTER
   VerticalAlignmentProp vertical_align = 4;
 
   // Modifiers for this element.
diff --git a/wear/tiles/tiles-proto/src/main/proto/tile.proto b/wear/tiles/tiles-proto/src/main/proto/tile.proto
index fb41af4..542fff8 100644
--- a/wear/tiles/tiles-proto/src/main/proto/tile.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/tile.proto
@@ -12,9 +12,9 @@
 // A holder for a tile. This specifies the resources to use for this delivery
 // of the tile, and the timeline for the tile.
 message Tile {
-  // The resource version required for these tiles. This can be any developer-defined
-  // string; it is only used to cache resources, and is passed in
-  // ResourcesRequest if the system does not have a copy of the specified
+  // The resource version required for these tiles. This can be any
+  // developer-defined string; it is only used to cache resources, and is passed
+  // in ResourcesRequest if the system does not have a copy of the specified
   // resource version.
   string resources_version = 1;
 
diff --git a/wear/tiles/tiles-renderer/build.gradle b/wear/tiles/tiles-renderer/build.gradle
index ae9634b..8b6d6ee 100644
--- a/wear/tiles/tiles-renderer/build.gradle
+++ b/wear/tiles/tiles-renderer/build.gradle
@@ -33,6 +33,8 @@
 
     implementation "androidx.concurrent:concurrent-futures:1.1.0"
     implementation "androidx.core:core:1.3.2"
+    implementation "androidx.wear:wear:1.2.0-alpha09"
+
     implementation(project(":wear:tiles:tiles"))
     implementation(project(path: ":wear:tiles:tiles-proto", configuration: "shadow"))
     implementation(libs.kotlinCoroutinesCore)
diff --git a/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java b/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java
index 4bc4b41..433bec7 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java
+++ b/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java
@@ -120,8 +120,8 @@
     public AndroidXScreenshotTestRule screenshotRule =
             new AndroidXScreenshotTestRule("wear/wear-tiles-renderer");
 
-    // This isn't totally ideal right now.
-    // The screenshot tests run on a phone, so emulate some watch dimensions here.
+    // This isn't totally ideal right now. The screenshot tests run on a phone, so emulate some
+    // watch dimensions here.
     private static final int SCREEN_WIDTH = 390;
     private static final int SCREEN_HEIGHT = 390;
 
@@ -149,9 +149,9 @@
         byte[] inlineImagePayload =
                 new byte[INLINE_IMAGE_WIDTH * INLINE_IMAGE_HEIGHT * INLINE_IMAGE_PIXEL_STRIDE];
 
-        // Generate a square image, with a white square in the center.
-        // This replaces an inline payload as a byte array. We could hardcode it, but the
-        // autoformatter will ruin the formatting.
+        // Generate a square image, with a white square in the center. This replaces an inline
+        // payload as a byte array. We could hardcode it, but the autoformatter will ruin the
+        // formatting.
         for (int y = 0; y < 8; y++) {
             for (int x = 0; x < 8; x++) {
                 int index = ((y * INLINE_IMAGE_WIDTH) + x) * INLINE_IMAGE_PIXEL_STRIDE;
diff --git a/wear/tiles/tiles-renderer/src/androidTest/proto/layout.proto b/wear/tiles/tiles-renderer/src/androidTest/proto/layout.proto
index 30f6573..1d59543 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/proto/layout.proto
+++ b/wear/tiles/tiles-renderer/src/androidTest/proto/layout.proto
@@ -15,24 +15,24 @@
 // The horizontal alignment of an element within its container.
 enum HorizontalAlignment {
   // Horizontal alignment is undefined.
-  HALIGN_UNDEFINED = 0;
+  HORIZONTAL_ALIGN_UNDEFINED = 0;
 
   // Horizontally align to the left.
-  HALIGN_LEFT = 1;
+  HORIZONTAL_ALIGN_LEFT = 1;
 
   // Horizontally align to center.
-  HALIGN_CENTER = 2;
+  HORIZONTAL_ALIGN_CENTER = 2;
 
   // Horizontally align to the right.
-  HALIGN_RIGHT = 3;
+  HORIZONTAL_ALIGN_RIGHT = 3;
 
   // Horizontally align to the content start (left in LTR layouts, right in RTL
   // layouts).
-  HALIGN_START = 4;
+  HORIZONTAL_ALIGN_START = 4;
 
   // Horizontally align to the content end (right in LTR layouts, left in RTL
   // layouts).
-  HALIGN_END = 5;
+  HORIZONTAL_ALIGN_END = 5;
 }
 
 // An extensible HorizontalAlignment property.
@@ -44,16 +44,16 @@
 // The vertical alignment of an element within its container.
 enum VerticalAlignment {
   // Vertical alignment is undefined.
-  VALIGN_UNDEFINED = 0;
+  VERTICAL_ALIGN_UNDEFINED = 0;
 
   // Vertically align to the top.
-  VALIGN_TOP = 1;
+  VERTICAL_ALIGN_TOP = 1;
 
   // Vertically align to center.
-  VALIGN_CENTER = 2;
+  VERTICAL_ALIGN_CENTER = 2;
 
   // Vertically align to the bottom.
-  VALIGN_BOTTOM = 3;
+  VERTICAL_ALIGN_BOTTOM = 3;
 }
 
 // An extensible VerticalAlignment property.
@@ -322,11 +322,11 @@
   ContainerDimension width = 3;
 
   // The horizontal alignment of the element inside this Box. If not defined,
-  // defaults to HALIGN_CENTER.
+  // defaults to HORIZONTAL_ALIGN_CENTER.
   HorizontalAlignmentProp horizontal_alignment = 4;
 
   // The vertical alignment of the element inside this Box. If not defined,
-  // defaults to VALIGN_CENTER.
+  // defaults to VERTICAL_ALIGN_CENTER.
   VerticalAlignmentProp vertical_alignment = 5;
 
   // Modifiers for this element.
@@ -429,7 +429,7 @@
 
   // The horizontal alignment of elements inside this column, if they are
   // narrower than the resulting width of the column. If not defined, defaults
-  // to HALIGN_CENTER.
+  // to HORIZONTAL_ALIGN_CENTER.
   HorizontalAlignmentProp horizontal_alignment = 2;
 
   // The width of this column. If not defined, this will size itself to fit
@@ -458,7 +458,7 @@
 
   // The vertical alignment of elements inside this row, if they are narrower
   // than the resulting height of the row. If not defined, defaults to
-  // VALIGN_CENTER.
+  // VERTICAL_ALIGN_CENTER.
   VerticalAlignmentProp vertical_alignment = 2;
 
   // The width of this row. If not defined, this will size itself to fit
@@ -499,7 +499,7 @@
   // larger than the thickness of the element being drawn, this controls whether
   // the element should be drawn towards the inner or outer edge of the arc, or
   // drawn in the center.
-  // If not defined, defaults to VALIGN_CENTER
+  // If not defined, defaults to VERTICAL_ALIGN_CENTER
   VerticalAlignmentProp vertical_align = 4;
 
   // Modifiers for this element.
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_alignment.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_alignment.textproto
index a9edc23..f30c5df 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_alignment.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_alignment.textproto
@@ -15,7 +15,7 @@
         value: 0
       }
       vertical_align {
-        value: VALIGN_TOP
+        value: VERTICAL_ALIGN_TOP
       }
       contents {
         text {
@@ -67,7 +67,7 @@
         value: 90
       }
       vertical_align {
-        value: VALIGN_CENTER
+        value: VERTICAL_ALIGN_CENTER
       }
       contents {
         text {
@@ -119,7 +119,7 @@
         value: 180
       }
       vertical_align {
-        value: VALIGN_BOTTOM
+        value: VERTICAL_ALIGN_BOTTOM
       }
       contents {
         text {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_alignment_mixed_types.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_alignment_mixed_types.textproto
index fc6e0e8..ce0c71e 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_alignment_mixed_types.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_alignment_mixed_types.textproto
@@ -15,17 +15,17 @@
         value: 0
       }
       vertical_align {
-        value: VALIGN_TOP
+        value: VERTICAL_ALIGN_TOP
       }
       contents {
         adapter {
           content {
             box {
               horizontal_alignment {
-                value: HALIGN_CENTER
+                value: HORIZONTAL_ALIGN_CENTER
               }
               vertical_alignment {
-                value: VALIGN_CENTER
+                value: VERTICAL_ALIGN_CENTER
               }
               modifiers {
                 background {
@@ -107,17 +107,17 @@
         value: 90
       }
       vertical_align {
-        value: VALIGN_CENTER
+        value: VERTICAL_ALIGN_CENTER
       }
       contents {
         adapter {
           content {
             box {
               horizontal_alignment {
-                value: HALIGN_CENTER
+                value: HORIZONTAL_ALIGN_CENTER
               }
               vertical_alignment {
-                value: VALIGN_CENTER
+                value: VERTICAL_ALIGN_CENTER
               }
               modifiers {
                 background {
@@ -199,17 +199,17 @@
         value: 180
       }
       vertical_align {
-        value: VALIGN_BOTTOM
+        value: VERTICAL_ALIGN_BOTTOM
       }
       contents {
         adapter {
           content {
             box {
               horizontal_alignment {
-                value: HALIGN_CENTER
+                value: HORIZONTAL_ALIGN_CENTER
               }
               vertical_alignment {
-                value: VALIGN_CENTER
+                value: VERTICAL_ALIGN_CENTER
               }
               modifiers {
                 background {
@@ -295,10 +295,10 @@
           content {
             box {
               horizontal_alignment {
-                value: HALIGN_CENTER
+                value: HORIZONTAL_ALIGN_CENTER
               }
               vertical_alignment {
-                value: VALIGN_CENTER
+                value: VERTICAL_ALIGN_CENTER
               }
               modifiers {
                 background {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_with_buttons_rotated.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_with_buttons_rotated.textproto
index 69d7804..8aa48ef 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_with_buttons_rotated.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_with_buttons_rotated.textproto
@@ -13,10 +13,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
@@ -74,10 +74,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
@@ -132,10 +132,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
@@ -193,10 +193,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
@@ -255,10 +255,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
@@ -317,10 +317,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_with_buttons_unrotated.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_with_buttons_unrotated.textproto
index d30ba9e..b76566c 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_with_buttons_unrotated.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/arc_with_buttons_unrotated.textproto
@@ -11,10 +11,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
@@ -69,10 +69,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
@@ -127,10 +127,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
@@ -185,10 +185,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
@@ -244,10 +244,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
@@ -303,10 +303,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/box_with_fixed_size.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/box_with_fixed_size.textproto
index bfaef0e..6939b85 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/box_with_fixed_size.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/box_with_fixed_size.textproto
@@ -1,9 +1,9 @@
 box {
   horizontal_alignment {
-    value: HALIGN_CENTER
+    value: HORIZONTAL_ALIGN_CENTER
   }
   vertical_alignment {
-    value: VALIGN_CENTER
+    value: VERTICAL_ALIGN_CENTER
   }
   width {
     expanded_dimension {}
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/column_with_alignment.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/column_with_alignment.textproto
index 1212653..079f55b 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/column_with_alignment.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/column_with_alignment.textproto
@@ -2,7 +2,7 @@
   contents {
     column {
       horizontal_alignment {
-        value: HALIGN_LEFT
+        value: HORIZONTAL_ALIGN_LEFT
       }
       contents {
         text {
@@ -24,7 +24,7 @@
   contents {
     column {
       horizontal_alignment {
-        value: HALIGN_CENTER
+        value: HORIZONTAL_ALIGN_CENTER
       }
       contents {
         text {
@@ -46,7 +46,7 @@
   contents {
     column {
       horizontal_alignment {
-        value: HALIGN_RIGHT
+        value: HORIZONTAL_ALIGN_RIGHT
       }
       contents {
         text {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/column_with_alignment_rtlaware.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/column_with_alignment_rtlaware.textproto
index 1ba79d3..8bbe9ba 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/column_with_alignment_rtlaware.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/column_with_alignment_rtlaware.textproto
@@ -2,7 +2,7 @@
   contents {
     column {
       horizontal_alignment {
-        value: HALIGN_START
+        value: HORIZONTAL_ALIGN_START
       }
       contents {
         text {
@@ -24,7 +24,7 @@
   contents {
     column {
       horizontal_alignment {
-        value: HALIGN_CENTER
+        value: HORIZONTAL_ALIGN_CENTER
       }
       contents {
         text {
@@ -46,7 +46,7 @@
   contents {
     column {
       horizontal_alignment {
-        value: HALIGN_END
+        value: HORIZONTAL_ALIGN_END
       }
       contents {
         text {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/column_with_height.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/column_with_height.textproto
index 8167667..152ef32 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/column_with_height.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/column_with_height.textproto
@@ -12,7 +12,7 @@
     expanded_dimension {}
   }
   vertical_alignment {
-    value: VALIGN_BOTTOM
+    value: VERTICAL_ALIGN_BOTTOM
   }
   modifiers {
     background {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/expanded_box_horizontal.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/expanded_box_horizontal.textproto
index fce3d41..cf5da0c 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/expanded_box_horizontal.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/expanded_box_horizontal.textproto
@@ -7,10 +7,10 @@
 # the inner box not expanding properly.
 box {
   horizontal_alignment {
-    value: HALIGN_CENTER
+    value: HORIZONTAL_ALIGN_CENTER
   }
   vertical_alignment {
-    value: VALIGN_CENTER
+    value: VERTICAL_ALIGN_CENTER
   }
   width {
     expanded_dimension {}
@@ -21,7 +21,7 @@
   contents {
     box {
       horizontal_alignment {
-        value: HALIGN_START
+        value: HORIZONTAL_ALIGN_START
       }
       modifiers {
         background {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/expanded_box_horizontal_right_align.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/expanded_box_horizontal_right_align.textproto
index 5ba5696..7074ac3 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/expanded_box_horizontal_right_align.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/expanded_box_horizontal_right_align.textproto
@@ -7,7 +7,7 @@
   contents {
     box {
       horizontal_alignment {
-        value: HALIGN_END
+        value: HORIZONTAL_ALIGN_END
       }
       modifiers {
         background {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/expanded_box_vertical.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/expanded_box_vertical.textproto
index 44b4e02..6619350 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/expanded_box_vertical.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/expanded_box_vertical.textproto
@@ -7,10 +7,10 @@
 # the inner box not expanding properly.
 box {
   horizontal_alignment {
-    value: HALIGN_CENTER
+    value: HORIZONTAL_ALIGN_CENTER
   }
   vertical_alignment {
-    value: VALIGN_CENTER
+    value: VERTICAL_ALIGN_CENTER
   }
   width {
     expanded_dimension {}
@@ -21,7 +21,7 @@
   contents {
     box {
       vertical_alignment {
-        value: VALIGN_TOP
+        value: VERTICAL_ALIGN_TOP
       }
       modifiers {
         background {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/font_weights_in_spannable.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/font_weights_in_spannable.textproto
index d5aa3bc..cb396b6 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/font_weights_in_spannable.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/font_weights_in_spannable.textproto
@@ -3,7 +3,7 @@
     value: 5
   }
   multiline_alignment {
-    value: HALIGN_START
+    value: HORIZONTAL_ALIGN_START
   }
   line_spacing {
     value: 20
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/image_oversized_in_box.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/image_oversized_in_box.textproto
index 2bbb125..3664445d 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/image_oversized_in_box.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/image_oversized_in_box.textproto
@@ -3,7 +3,7 @@
     expanded_dimension {}
   }
   horizontal_alignment {
-    value: HALIGN_CENTER
+    value: HORIZONTAL_ALIGN_CENTER
   }
   contents {
     box {
@@ -18,7 +18,7 @@
         }
       }
       horizontal_alignment {
-        value: HALIGN_START
+        value: HORIZONTAL_ALIGN_START
       }
       width {
         linear_dimension {
@@ -63,7 +63,7 @@
         }
       }
       horizontal_alignment {
-        value: HALIGN_CENTER
+        value: HORIZONTAL_ALIGN_CENTER
       }
       width {
         linear_dimension {
@@ -108,7 +108,7 @@
         }
       }
       horizontal_alignment {
-        value: HALIGN_END
+        value: HORIZONTAL_ALIGN_END
       }
       width {
         linear_dimension {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/image_oversized_in_box_proportional.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/image_oversized_in_box_proportional.textproto
index e84fb02..53c224a 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/image_oversized_in_box_proportional.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/image_oversized_in_box_proportional.textproto
@@ -3,7 +3,7 @@
     expanded_dimension {}
   }
   horizontal_alignment {
-    value: HALIGN_CENTER
+    value: HORIZONTAL_ALIGN_CENTER
   }
   contents {
     box {
@@ -18,7 +18,7 @@
         }
       }
       horizontal_alignment {
-        value: HALIGN_START
+        value: HORIZONTAL_ALIGN_START
       }
       width {
         linear_dimension {
@@ -64,7 +64,7 @@
         }
       }
       horizontal_alignment {
-        value: HALIGN_CENTER
+        value: HORIZONTAL_ALIGN_CENTER
       }
       width {
         linear_dimension {
@@ -110,7 +110,7 @@
         }
       }
       horizontal_alignment {
-        value: HALIGN_END
+        value: HORIZONTAL_ALIGN_END
       }
       width {
         linear_dimension {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/line_multi_height.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/line_multi_height.textproto
index 2d0df13..8e31aa1 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/line_multi_height.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/line_multi_height.textproto
@@ -183,7 +183,7 @@
       contents {
         column {
           horizontal_alignment {
-            value: HALIGN_START
+            value: HORIZONTAL_ALIGN_START
           }
           contents {
             text {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/multi_line_text_alignment.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/multi_line_text_alignment.textproto
index 1c3bc0d..d429b2d 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/multi_line_text_alignment.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/multi_line_text_alignment.textproto
@@ -2,7 +2,7 @@
   contents {
     spannable {
       multiline_alignment {
-        value: HALIGN_START
+        value: HORIZONTAL_ALIGN_START
       }
       max_lines: {
         value: 5
@@ -30,7 +30,7 @@
   contents {
     spannable {
       multiline_alignment {
-        value: HALIGN_CENTER
+        value: HORIZONTAL_ALIGN_CENTER
       }
       max_lines: {
         value: 5
@@ -58,7 +58,7 @@
   contents {
     spannable {
       multiline_alignment {
-        value: HALIGN_END
+        value: HORIZONTAL_ALIGN_END
       }
       max_lines: {
         value: 5
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/row_with_alignment.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/row_with_alignment.textproto
index 777566b..4268a27 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/row_with_alignment.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/row_with_alignment.textproto
@@ -2,7 +2,7 @@
   contents {
     row {
       vertical_alignment {
-        value: VALIGN_TOP
+        value: VERTICAL_ALIGN_TOP
       }
       contents {
         image {
@@ -34,7 +34,7 @@
   contents {
     row {
       vertical_alignment {
-        value: VALIGN_CENTER
+        value: VERTICAL_ALIGN_CENTER
       }
       contents {
         image {
@@ -66,7 +66,7 @@
   contents {
     row {
       vertical_alignment {
-        value: VALIGN_BOTTOM
+        value: VERTICAL_ALIGN_BOTTOM
       }
       contents {
         image {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/row_with_width.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/row_with_width.textproto
index 626b2a5..585d1f6 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/row_with_width.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/row_with_width.textproto
@@ -12,7 +12,7 @@
     expanded_dimension {}
   }
   horizontal_alignment {
-    value: HALIGN_END
+    value: HORIZONTAL_ALIGN_END
   }
   modifiers {
     background {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/spacer_in_arc.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/spacer_in_arc.textproto
index b4477b7..644578a 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/spacer_in_arc.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/spacer_in_arc.textproto
@@ -22,10 +22,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
@@ -92,10 +92,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
@@ -162,10 +162,10 @@
       content {
         box {
           horizontal_alignment {
-            value: HALIGN_CENTER
+            value: HORIZONTAL_ALIGN_CENTER
           }
           vertical_alignment {
-            value: VALIGN_CENTER
+            value: VERTICAL_ALIGN_CENTER
           }
           modifiers {
             background {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_image.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_image.textproto
index bdafd00..3a28ba0 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_image.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_image.textproto
@@ -3,7 +3,7 @@
     value: 5
   }
   multiline_alignment {
-    value: HALIGN_START
+    value: HORIZONTAL_ALIGN_START
   }
   spans {
     text {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_image_with_clickable.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_image_with_clickable.textproto
index 4c53354..c18150c 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_image_with_clickable.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_image_with_clickable.textproto
@@ -3,7 +3,7 @@
     value: 5
   }
   multiline_alignment {
-    value: HALIGN_START
+    value: HORIZONTAL_ALIGN_START
   }
   spans {
     text {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_image_wrapped.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_image_wrapped.textproto
index e408122..8a0407c 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_image_wrapped.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_image_wrapped.textproto
@@ -5,7 +5,7 @@
         value: 5
       }
       multiline_alignment {
-        value: HALIGN_START
+        value: HORIZONTAL_ALIGN_START
       }
       spans {
         text {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_text.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_text.textproto
index aba61e0..59e2b99 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_text.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/spannable_text.textproto
@@ -26,7 +26,7 @@
         value: 5
       }
       multiline_alignment {
-        value: HALIGN_START
+        value: HORIZONTAL_ALIGN_START
       }
       line_spacing {
         value: 20
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_font_weights.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_font_weights.textproto
index ded6fd2..db7513d 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_font_weights.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_font_weights.textproto
@@ -13,15 +13,15 @@
     expanded_dimension: {}
   }
   vertical_alignment {
-    value: VALIGN_CENTER
+    value: VERTICAL_ALIGN_CENTER
   }
   horizontal_alignment {
-    value: HALIGN_CENTER
+    value: HORIZONTAL_ALIGN_CENTER
   }
   contents {
     column {
       horizontal_alignment {
-        value: HALIGN_LEFT
+        value: HORIZONTAL_ALIGN_LEFT
       }
       contents {
         text {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_font_weights_italic.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_font_weights_italic.textproto
index 34cc5a5..47b6514 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_font_weights_italic.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_font_weights_italic.textproto
@@ -13,15 +13,15 @@
     expanded_dimension: {}
   }
   vertical_alignment {
-    value: VALIGN_CENTER
+    value: VERTICAL_ALIGN_CENTER
   }
   horizontal_alignment {
-    value: HALIGN_CENTER
+    value: HORIZONTAL_ALIGN_CENTER
   }
   contents {
     column {
       horizontal_alignment {
-        value: HALIGN_LEFT
+        value: HORIZONTAL_ALIGN_LEFT
       }
       contents {
         text {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_spacing.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_spacing.textproto
index 9e4a193..78cec6c4 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_spacing.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_spacing.textproto
@@ -13,15 +13,15 @@
     expanded_dimension: {}
   }
   vertical_alignment {
-    value: VALIGN_CENTER
+    value: VERTICAL_ALIGN_CENTER
   }
   horizontal_alignment {
-    value: HALIGN_CENTER
+    value: HORIZONTAL_ALIGN_CENTER
   }
   contents {
     column {
       horizontal_alignment {
-        value: HALIGN_LEFT
+        value: HORIZONTAL_ALIGN_LEFT
       }
       contents {
         text {
diff --git a/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_style_no_color.textproto b/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_style_no_color.textproto
index 8206ef9..63955be 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_style_no_color.textproto
+++ b/wear/tiles/tiles-renderer/src/androidTest/res/raw/text_with_style_no_color.textproto
@@ -1,6 +1,6 @@
 spannable {
   multiline_alignment {
-    value: HALIGN_START
+    value: HORIZONTAL_ALIGN_START
   }
   spans {
     text {
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/UpdateScheduler.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/UpdateScheduler.java
index 861ecfc..efcc923 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/UpdateScheduler.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/UpdateScheduler.java
@@ -41,9 +41,8 @@
     private long mScheduledUpdateTimeMillis = NO_SCHEDULED_UPDATE;
 
     // Last time at which we updated the tile, measured by the device uptime. This needs to be
-    // device
-    // uptime to prevent issues when time changes (e.g. time jumps caused by syncs with NTP or
-    // similar).
+    // device uptime to prevent issues when time changes (e.g. time jumps caused by syncs with NTP
+    // or similar).
     private long mLastUpdateRealtimeMillis = 0;
 
     UpdateScheduler(AlarmManager alarmManager, Clock clock) {
@@ -99,8 +98,7 @@
                 fireUpdate();
             } else {
                 // "Schedule" an update. This is just so enableUpdates will definitely trigger the
-                // update
-                // when called.
+                // update when called.
                 mScheduledUpdateTimeMillis = nowMillis;
             }
         }
@@ -125,8 +123,7 @@
 
         if (mScheduledUpdateTimeMillis != Long.MAX_VALUE) {
             // If the schedule update is in the past, then fire now, otherwise schedule for the
-            // given
-            // time.
+            // given time.
             long now = mClock.getElapsedTimeMillis();
 
             if (now >= mScheduledUpdateTimeMillis) {
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/DefaultInlineImageResourceResolver.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/DefaultInlineImageResourceResolver.java
index b31a850..3f28ec0 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/DefaultInlineImageResourceResolver.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/DefaultInlineImageResourceResolver.java
@@ -62,8 +62,7 @@
         }
 
         // The app Context is correct here, as it's just used for display density, so it doesn't
-        // depend
-        // on anything from the provider app.
+        // depend on anything from the provider app.
         return new BitmapDrawable(mAppContext.getResources(), bitmap);
     }
 
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ImageViewWithoutIntrinsicSizes.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ImageViewWithoutIntrinsicSizes.java
new file mode 100644
index 0000000..f37453c
--- /dev/null
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ImageViewWithoutIntrinsicSizes.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.wear.tiles.renderer.internal;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+
+/**
+ * Fixed version of ImageView which doesn't ever use the intrinsic size of its drawables.
+ *
+ * <p>Tiles has a rule that the size of the layout should be statically resolvable. Because it can
+ * asynchronously load the resources though, this is not possible if we ever use the intrinsic sizes
+ * of images, as the layout may resize itself after an image is loaded. Take the following example:
+ *
+ * <p>Box (size = wrap()) { Text("Hello World") Image(size = expand()) }
+ *
+ * <p>The Box will size itself to wrap the contents, which it does by asking each child how large it
+ * wishes to be. For Text, this is the size of the text run (ish, it gets a little more complex with
+ * multiple lines), and for images, this is the intrinsic size of the drawable (even in the case
+ * where the image is MATCH_PARENT; that gets applied later). This means that the layout can "jump"
+ * after the image is loaded, if the image's intrinsic size is larger than the text.
+ *
+ * <p>This wrapper prevents that; if the image ever gets a MeasureSpec which allows it to pick its
+ * own size, we clamp the max size to 0 to prevent it from ever doing that. This is safe within
+ * Tiles; images only support absolute sizes (in which case, it has an exact measurespec), ratio
+ * sizes (which is handled in RatioViewWrapper), and expand sizes, in which case this image gets
+ * ignored for the first measure pass, and will receive an exact measurespec on the second measure
+ * pass.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@SuppressLint("AppCompatCustomView")
+class ImageViewWithoutIntrinsicSizes extends ImageView {
+    ImageViewWithoutIntrinsicSizes(Context context) {
+        super(context);
+    }
+
+    ImageViewWithoutIntrinsicSizes(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    ImageViewWithoutIntrinsicSizes(
+            Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    ImageViewWithoutIntrinsicSizes(
+            Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        // Helpfully, half of ImageView that is needed in Measure (resolveUri) is private. We can
+        // still hack this though. If we ever get an AT_MOST measurespec, then we _don't_ want to
+        // use our intrinsic dimensions. Just measure that as AT_MOST = 0.
+
+        if (MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY) {
+            widthMeasureSpec = MeasureSpec.makeMeasureSpec(1, MeasureSpec.AT_MOST);
+        }
+
+        if (MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY) {
+            heightMeasureSpec = MeasureSpec.makeMeasureSpec(1, MeasureSpec.AT_MOST);
+        }
+
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    }
+}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/RatioViewWrapper.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/RatioViewWrapper.java
index 44586ce..512318d 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/RatioViewWrapper.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/RatioViewWrapper.java
@@ -104,15 +104,15 @@
         // Measure the child within the given bounds.
         childView.measure(widthMeasureSpec, heightMeasureSpec);
 
+        // No aspect ratio. Trust the child and hope for the best.
         if (mAspectRatio == UNDEFINED_ASPECT_RATIO) {
-            // We don't have an aspect ratio.
             setMeasuredDimension(childView.getMeasuredWidth(), childView.getMeasuredHeight());
+            combineMeasuredStates(getMeasuredState(), childView.getMeasuredState());
             return;
         }
 
         // If both are MeasureSpec.EXACTLY, we can't do anything else. Set our dimensions to be the
-        // same
-        // and exit.
+        // same and exit.
         if (widthMeasureMode == MeasureSpec.EXACTLY && heightMeasureMode == MeasureSpec.EXACTLY) {
             setMeasuredDimension(childView.getMeasuredWidth(), childView.getMeasuredHeight());
             return;
@@ -131,16 +131,13 @@
                 && (heightMeasureMode == MeasureSpec.AT_MOST
                         || heightMeasureMode == MeasureSpec.UNSPECIFIED)) {
             // Generally, this happens if this view has both width/height=WRAP_CONTENT. This can
-            // also
-            // happen though if this view has both dimensions as MATCH_CONTENT, but the parent view
-            // is
-            // WRAP_CONTENT. In that case, the parent will run a first view pass to get the size of
-            // the
-            // children, then calculate its size and re-size this widget with EXACTLY MeasureSpecs.
+            // also happen though if this view has both dimensions as MATCH_CONTENT, but the parent
+            // view is WRAP_CONTENT. In that case, the parent will run a first view pass to get the
+            // size of the children, then calculate its size and re-size this widget with EXACTLY
+            // MeasureSpecs.
             //
             // In this case, let's just assume that the child has reached the maximum size that it
-            // wants,
-            // so rescale the dimension that will make it _smaller_.
+            // wants, so rescale the dimension that will make it _smaller_.
             float targetWidth = childView.getMeasuredHeight() * mAspectRatio;
             float targetHeight = childView.getMeasuredWidth() / mAspectRatio;
 
@@ -180,10 +177,8 @@
 
             childView.measure(childWidth, childHeight);
 
-            // We're pulling some hacks here.
-            // We get an AT_MOST constraint, but if we oversize ourselves, the parent container
-            // should
-            // do appropriate clipping.
+            // We're pulling some hacks here. We get an AT_MOST constraint, but if we oversize
+            // ourselves, the parent container should do appropriate clipping.
             setMeasuredDimension(childView.getMeasuredWidth(), childView.getMeasuredHeight());
         } else if (heightMeasureMode == MeasureSpec.EXACTLY) {
             // Can't change height, change width.
@@ -198,12 +193,9 @@
             setMeasuredDimension(childView.getMeasuredWidth(), childView.getMeasuredHeight());
         } else {
             // This should never happen; the first if checks that both MeasureSpecs are either
-            // AT_MOST
-            // or UNSPECIFIED. If that branch isn't taken, one of the MeasureSpecs must be EXACTLY.
-            // It's
-            // technically possible to smash the flag bits though (mode == 3 is invalid), so if we
-            // get
-            // here, that must have happened.
+            // AT_MOST or UNSPECIFIED. If that branch isn't taken, one of the MeasureSpecs must be
+            // EXACTLY. It's technically possible to smash the flag bits though (mode == 3 is
+            // invalid), so if we get here, that must have happened.
             throw new IllegalArgumentException("Unknown measure mode bits in given MeasureSpecs");
         }
     }
@@ -213,16 +205,13 @@
         View childView = getChildAt(0);
 
         // Place the child view within the bounds. If the child is greater than the bounds (i.e. one
-        // of
-        // the constraints was MATCH_PARENT, and the other was free), then just align the top-left
-        // for
-        // now.
+        // of the constraints was MATCH_PARENT, and the other was free), then just align the
+        // top-left for now.
         childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight());
     }
 
     // setPadding(Relative) should just pass straight through to the child; this View should just be
-    // a
-    // wrapper, so should not itself introduce any extra spacing.
+    // a wrapper, so should not itself introduce any extra spacing.
     //
     // We don't override the getters, since nothing in the layout tree should actually use them.
     @Override
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ResourceResolvers.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ResourceResolvers.java
index 5325714..5c7bd19 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ResourceResolvers.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ResourceResolvers.java
@@ -179,11 +179,9 @@
                         "Can't find resolver for image resource " + protoResourceId));
     }
 
-    /** Returns whether an image can be tinted or not. */
     public boolean canImageBeTinted(@NonNull String protoResourceId) {
         // Only Android image resources can be tinted for now. This is because we don't really know
-        // what
-        // is in an inline image.
+        // what is in an inline image.
         ResourceProto.ImageResource imageResource =
                 mProtoResources.getIdToImageMap().get(protoResourceId);
 
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/TileRendererInternal.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/TileRendererInternal.java
index 201d249..55cd63b 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/TileRendererInternal.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/TileRendererInternal.java
@@ -117,7 +117,8 @@
 import androidx.wear.tiles.proto.StateProto.State;
 import androidx.wear.tiles.renderer.R;
 import androidx.wear.tiles.renderer.internal.ResourceResolvers.ResourceAccessException;
-import androidx.wear.tiles.renderer.internal.WearArcLayout.ArcLayoutWidget;
+import androidx.wear.widget.ArcLayout;
+import androidx.wear.widget.CurvedTextView;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -137,15 +138,16 @@
 
     private static final String TAG = "TileRendererInternal";
 
-    private static final int HALIGN_DEFAULT_GRAVITY = Gravity.CENTER_HORIZONTAL;
-    private static final int VALIGN_DEFAULT_GRAVITY = Gravity.CENTER_VERTICAL;
+    private static final int HORIZONTAL_ALIGN_DEFAULT_GRAVITY = Gravity.CENTER_HORIZONTAL;
+    private static final int VERTICAL_ALIGN_DEFAULT_GRAVITY = Gravity.CENTER_VERTICAL;
     private static final int TEXT_ALIGN_DEFAULT = Gravity.CENTER_HORIZONTAL;
     private static final ScaleType IMAGE_DEFAULT_SCALE_TYPE = ScaleType.FIT_CENTER;
 
-    @WearArcLayout.LayoutParams.VerticalAlignment
-    private static final int ARC_VALIGN_DEFAULT = WearArcLayout.LayoutParams.VALIGN_CENTER;
+    @ArcLayout.LayoutParams.VerticalAlignment
+    private static final int ARC_VERTICAL_ALIGN_DEFAULT =
+            ArcLayout.LayoutParams.VERTICAL_ALIGN_CENTER;
 
-    private static final int SPAN_VALIGN_DEFAULT = ImageSpan.ALIGN_BOTTOM;
+    private static final int SPAN_VERTICAL_ALIGN_DEFAULT = ImageSpan.ALIGN_BOTTOM;
 
     // This is pretty badly named; TruncateAt specifies where to place the ellipsis (or whether to
     // marquee). Disabling truncation with null actually disables the _ellipsis_, but text will
@@ -161,8 +163,7 @@
                     .setWrappedDimension(WrappedDimensionProp.getDefaultInstance())
                     .build();
 
-    @WearArcLayout.AnchorType
-    private static final int ARC_ANCHOR_DEFAULT = WearArcLayout.ANCHOR_CENTER;
+    @ArcLayout.AnchorType private static final int ARC_ANCHOR_DEFAULT = ArcLayout.ANCHOR_CENTER;
 
     // White
     private static final int LINE_COLOR_DEFAULT = 0xFFFFFFFF;
@@ -301,13 +302,13 @@
         //
         // A Row (LinearLayout) supports this with width=0 and weight>0. After doing a layout pass,
         // it will assign all remaining space to elements with width=0 and weight>0, biased by the
-        // weight. This causes problems if there are two (or more) "expand" elements in a row,
-        // which is itself set to WRAP_CONTENTS, and one of those elements has a measured width
-        // (e.g. Text). In that case, the LinearLayout will measure the text, then ensure that
-        // all elements with a weight set have their widths set according to the weight. For us,
-        // that means that _all_ elements with expand=true will size themselves to the same width
-        // as the Text, pushing out the bounds of the parent row. This happens on columns too,
-        // but of course regarding height.
+        // weight. This causes problems if there are two (or more) "expand" elements in a row, which
+        // is itself set to WRAP_CONTENTS, and one of those elements has a measured width (e.g.
+        // Text). In that case, the LinearLayout will measure the text, then ensure that all
+        // elements with a weight set have their widths set according to the weight. For us, that
+        // means that _all_ elements with expand=true will size themselves to the same width as the
+        // Text, pushing out the bounds of the parent row. This happens on columns too, but of
+        // course regarding height.
         //
         // To get around this, if an element with expand=true is added to a row that is WRAP_CONTENT
         // (e.g. a row with no explicit width, that is not expanded), we ignore the expand=true, and
@@ -368,55 +369,55 @@
 
     private static int horizontalAlignmentToGravity(HorizontalAlignmentProp alignment) {
         switch (alignment.getValue()) {
-            case HALIGN_START:
+            case HORIZONTAL_ALIGN_START:
                 return Gravity.START;
-            case HALIGN_CENTER:
+            case HORIZONTAL_ALIGN_CENTER:
                 return Gravity.CENTER_HORIZONTAL;
-            case HALIGN_END:
+            case HORIZONTAL_ALIGN_END:
                 return Gravity.END;
-            case HALIGN_LEFT:
+            case HORIZONTAL_ALIGN_LEFT:
                 return Gravity.LEFT;
-            case HALIGN_RIGHT:
+            case HORIZONTAL_ALIGN_RIGHT:
                 return Gravity.RIGHT;
             case UNRECOGNIZED:
-            case HALIGN_UNDEFINED:
-                return HALIGN_DEFAULT_GRAVITY;
+            case HORIZONTAL_ALIGN_UNDEFINED:
+                return HORIZONTAL_ALIGN_DEFAULT_GRAVITY;
         }
 
-        return HALIGN_DEFAULT_GRAVITY;
+        return HORIZONTAL_ALIGN_DEFAULT_GRAVITY;
     }
 
     private static int verticalAlignmentToGravity(VerticalAlignmentProp alignment) {
         switch (alignment.getValue()) {
-            case VALIGN_TOP:
+            case VERTICAL_ALIGN_TOP:
                 return Gravity.TOP;
-            case VALIGN_CENTER:
+            case VERTICAL_ALIGN_CENTER:
                 return Gravity.CENTER_VERTICAL;
-            case VALIGN_BOTTOM:
+            case VERTICAL_ALIGN_BOTTOM:
                 return Gravity.BOTTOM;
             case UNRECOGNIZED:
-            case VALIGN_UNDEFINED:
-                return VALIGN_DEFAULT_GRAVITY;
+            case VERTICAL_ALIGN_UNDEFINED:
+                return VERTICAL_ALIGN_DEFAULT_GRAVITY;
         }
 
-        return VALIGN_DEFAULT_GRAVITY;
+        return VERTICAL_ALIGN_DEFAULT_GRAVITY;
     }
 
-    @WearArcLayout.LayoutParams.VerticalAlignment
+    @ArcLayout.LayoutParams.VerticalAlignment
     private static int verticalAlignmentToArcVAlign(VerticalAlignmentProp alignment) {
         switch (alignment.getValue()) {
-            case VALIGN_TOP:
-                return WearArcLayout.LayoutParams.VALIGN_OUTER;
-            case VALIGN_CENTER:
-                return WearArcLayout.LayoutParams.VALIGN_CENTER;
-            case VALIGN_BOTTOM:
-                return WearArcLayout.LayoutParams.VALIGN_INNER;
+            case VERTICAL_ALIGN_TOP:
+                return ArcLayout.LayoutParams.VERTICAL_ALIGN_OUTER;
+            case VERTICAL_ALIGN_CENTER:
+                return ArcLayout.LayoutParams.VERTICAL_ALIGN_CENTER;
+            case VERTICAL_ALIGN_BOTTOM:
+                return ArcLayout.LayoutParams.VERTICAL_ALIGN_INNER;
             case UNRECOGNIZED:
-            case VALIGN_UNDEFINED:
-                return ARC_VALIGN_DEFAULT;
+            case VERTICAL_ALIGN_UNDEFINED:
+                return ARC_VERTICAL_ALIGN_DEFAULT;
         }
 
-        return ARC_VALIGN_DEFAULT;
+        return ARC_VERTICAL_ALIGN_DEFAULT;
     }
 
     private static ScaleType contentScaleModeToScaleType(ContentScaleMode contentScaleMode) {
@@ -438,16 +439,16 @@
     private static int spanVerticalAlignmentToImgSpanAlignment(
             SpanVerticalAlignmentProp alignment) {
         switch (alignment.getValue()) {
-            case SPAN_VALIGN_TEXT_BASELINE:
+            case SPAN_VERTICAL_ALIGN_TEXT_BASELINE:
                 return ImageSpan.ALIGN_BASELINE;
-            case SPAN_VALIGN_BOTTOM:
+            case SPAN_VERTICAL_ALIGN_BOTTOM:
                 return ImageSpan.ALIGN_BOTTOM;
-            case SPAN_VALIGN_UNDEFINED:
+            case SPAN_VERTICAL_ALIGN_UNDEFINED:
             case UNRECOGNIZED:
-                return SPAN_VALIGN_DEFAULT;
+                return SPAN_VERTICAL_ALIGN_DEFAULT;
         }
 
-        return SPAN_VALIGN_DEFAULT;
+        return SPAN_VERTICAL_ALIGN_DEFAULT;
     }
 
     /**
@@ -458,10 +459,10 @@
     private static boolean isBold(FontStyle fontStyle) {
         // Although this method could be a simple equality check against FONT_WEIGHT_BOLD, we list
         // all current cases here so that this will become a compile time error as soon as a new
-        // FontWeight value is added to the schema. If this fails to build, then this means that
-        // an int typeface style is no longer enough to represent all FontWeight values and a
-        // customizable, per-weight text style must be introduced to TileRendererInternal to
-        // handle this. See b/176980535
+        // FontWeight value is added to the schema. If this fails to build, then this means that an
+        // int typeface style is no longer enough to represent all FontWeight values and a
+        // customizable, per-weight text style must be introduced to TileRendererInternal to handle
+        // this. See b/176980535
         switch (fontStyle.getWeight().getValue()) {
             case FONT_WEIGHT_BOLD:
                 return true;
@@ -537,8 +538,8 @@
 
     private void applyFontStyle(FontStyle style, TextView textView) {
         // Need to supply typefaceStyle when creating the typeface (will select specialist
-        // bold/italic typefaces), *and* when setting the typeface (will set synthetic
-        // bold/italic flags in Paint if they're not supported by the given typeface).
+        // bold/italic typefaces), *and* when setting the typeface (will set synthetic bold/italic
+        // flags in Paint if they're not supported by the given typeface).
         textView.setTypeface(createTypeface(style), fontStyleToTypefaceStyle(style));
 
         int currentPaintFlags = textView.getPaintFlags();
@@ -563,22 +564,15 @@
         textView.setTextColor(extractTextColorArgb(style));
     }
 
-    private void applyFontStyle(FontStyle style, WearCurvedTextView textView) {
+    private void applyFontStyle(FontStyle style, CurvedTextView textView) {
         // Need to supply typefaceStyle when creating the typeface (will select specialist
-        // bold/italic typefaces), *and* when setting the typeface (will set synthetic
-        // bold/italic flags in Paint if they're not supported by the given typeface).
+        // bold/italic typefaces), *and* when setting the typeface (will set synthetic bold/italic
+        // flags in Paint if they're not supported by the given typeface).
         textView.setTypeface(createTypeface(style), fontStyleToTypefaceStyle(style));
 
-        int currentPaintFlags = textView.getPaintFlags();
-
-        // Remove the bits we're setting
-        currentPaintFlags &= ~Paint.UNDERLINE_TEXT_FLAG;
-
-        if (style.hasUnderline() && style.getUnderline().getValue()) {
-            currentPaintFlags |= Paint.UNDERLINE_TEXT_FLAG;
-        }
-
-        textView.setPaintFlags(currentPaintFlags);
+        // TODO(b/188801917): Implement underline. CurvedTextView (well, drawTextOnArc) doesn't
+        // support underline. We can implement this later by drawing a line under the text ourselves
+        // though.
 
         if (style.hasSize()) {
             textView.setTextSize(toPx(style.getSize()));
@@ -715,14 +709,14 @@
         return view;
     }
 
-    // This is a little nasty; ArcLayoutWidget is just an interface, so we have no guarantee that
-    // the instance also extends View (as it should). Instead, just take a View in and rename
-    // this, and check that it's an ArcLayoutWidget internally.
+    // This is a little nasty; ArcLayout.Widget is just an interface, so we have no guarantee that
+    // the instance also extends View (as it should). Instead, just take a View in and rename this,
+    // and check that it's an ArcLayout.Widget internally.
     private View applyModifiersToArcLayoutView(View view, ArcModifiers modifiers) {
-        if (!(view instanceof ArcLayoutWidget)) {
+        if (!(view instanceof ArcLayout.Widget)) {
             Log.e(
                     TAG,
-                    "applyModifiersToArcLayoutView should only be called with an ArcLayoutWidget");
+                    "applyModifiersToArcLayoutView should only be called with an ArcLayout.Widget");
             return view;
         }
 
@@ -769,15 +763,15 @@
         return TEXT_OVERFLOW_DEFAULT;
     }
 
-    @WearArcLayout.AnchorType
+    @ArcLayout.AnchorType
     private static int anchorTypeToAnchorPos(ArcAnchorTypeProp type) {
         switch (type.getValue()) {
             case ARC_ANCHOR_START:
-                return WearArcLayout.ANCHOR_START;
+                return ArcLayout.ANCHOR_START;
             case ARC_ANCHOR_CENTER:
-                return WearArcLayout.ANCHOR_CENTER;
+                return ArcLayout.ANCHOR_CENTER;
             case ARC_ANCHOR_END:
-                return WearArcLayout.ANCHOR_END;
+                return ArcLayout.ANCHOR_END;
             case ARC_ANCHOR_UNDEFINED:
             case UNRECOGNIZED:
                 return ARC_ANCHOR_DEFAULT;
@@ -936,6 +930,34 @@
         // sets the gravity of the foreground Drawable). Go and apply gravity to the child.
         applyGravityToFrameLayoutChildren(frame, gravity);
 
+        // HACK: FrameLayout has a bug in it. If we add one WRAP_CONTENT child, and one MATCH_PARENT
+        // child, the expected behaviour is that the FrameLayout sizes itself to fit the
+        // WRAP_CONTENT child (e.g. a TextView), then the MATCH_PARENT child is forced to the same
+        // size as the outer FrameLayout (and hence, the size of the TextView, after accounting for
+        // padding etc). Because of a bug though, this doesn't happen; instead, the MATCH_PARENT
+        // child will just keep its intrinsic size. This is because FrameLayout only forces
+        // MATCH_PARENT children to a given size if there are _more than one_ of them (see the
+        // bottom of FrameLayout#onMeasure).
+        //
+        // To work around this (without copying the whole of FrameLayout just to change a "1" to
+        // "0"), we add a Space element in if there is one MATCH_PARENT child. This has a tiny cost
+        // to the measure pass, and negligible cost to layout/draw (since it doesn't take part in
+        // those passes).
+        int numMatchParentChildren = 0;
+        for (int i = 0; i < frame.getChildCount(); i++) {
+            LayoutParams lp = frame.getChildAt(i).getLayoutParams();
+            if (lp.width == LayoutParams.MATCH_PARENT || lp.height == LayoutParams.MATCH_PARENT) {
+                numMatchParentChildren++;
+            }
+        }
+
+        if (numMatchParentChildren == 1) {
+            Space hackSpace = new Space(mAppContext);
+            LayoutParams hackSpaceLp =
+                    new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+            frame.addView(hackSpace, hackSpaceLp);
+        }
+
         return wrappedView;
     }
 
@@ -986,7 +1008,7 @@
         LayoutParams layoutParams = generateDefaultLayoutParams();
 
         space.setSweepAngleDegrees(lengthDegrees);
-        space.setThicknessPx(thicknessPx);
+        space.setThickness(thicknessPx);
 
         View wrappedView = applyModifiersToArcLayoutView(space, spacer.getModifiers());
         parent.addView(wrappedView, layoutParams);
@@ -1038,8 +1060,8 @@
     }
 
     private View inflateArcText(ViewGroup parent, ArcText text) {
-        WearCurvedTextView textView =
-                new WearCurvedTextView(
+        CurvedTextView textView =
+                new CurvedTextView(
                         mAppContext, /* attrs= */ null, R.attr.tilesFallbackTextAppearance);
 
         LayoutParams layoutParams = generateDefaultLayoutParams();
@@ -1152,7 +1174,7 @@
             return null;
         }
 
-        ImageView imageView = new ImageView(mAppContext);
+        ImageViewWithoutIntrinsicSizes imageView = new ImageViewWithoutIntrinsicSizes(mAppContext);
 
         if (image.hasContentScaleMode()) {
             imageView.setScaleType(
@@ -1188,17 +1210,20 @@
         parent.addView(wrappedView, ratioWrapperLayoutParams);
 
         ListenableFuture<Drawable> drawableFuture = mResourceResolvers.getDrawable(protoResId);
-        if (drawableFuture.isDone()) {
+        boolean isImageSet = false;
+        if (drawableFuture.isDone() && !drawableFuture.isCancelled()) {
             // If the future is done, immediately draw.
-            setImageDrawable(imageView, drawableFuture, protoResId);
-        } else {
+            isImageSet = setImageDrawable(imageView, drawableFuture, protoResId);
+        }
+
+        if (!isImageSet) {
             // Is there a placeholder to use in the meantime?
             try {
                 if (mResourceResolvers.hasPlaceholderDrawable(protoResId)) {
                     imageView.setImageDrawable(
                             mResourceResolvers.getPlaceholderDrawableOrThrow(protoResId));
                 }
-            } catch (ResourceAccessException ex) {
+            } catch (ResourceAccessException | IllegalArgumentException ex) {
                 Log.e(TAG, "Exception loading placeholder for resource " + protoResId, ex);
             }
 
@@ -1233,13 +1258,15 @@
         return wrappedView;
     }
 
-    private static void setImageDrawable(
+    private static boolean setImageDrawable(
             ImageView imageView, Future<Drawable> drawableFuture, String protoResId) {
         try {
             imageView.setImageDrawable(drawableFuture.get());
+            return true;
         } catch (ExecutionException | InterruptedException e) {
             Log.w(TAG, "Could not get drawable for image " + protoResId);
         }
+        return false;
     }
 
     @Nullable
@@ -1264,7 +1291,7 @@
             lineColor = line.getColor().getArgb();
         }
 
-        lineView.setThicknessPx(thicknessPx);
+        lineView.setThickness(thicknessPx);
         lineView.setSweepAngleDegrees(lengthDegrees);
         lineView.setColor(lineColor);
 
@@ -1276,7 +1303,7 @@
 
     @Nullable
     private View inflateArc(ViewGroup parent, Arc arc) {
-        WearArcLayout arcLayout = new WearArcLayout(mAppContext);
+        ArcLayout arcLayout = new ArcLayout(mAppContext);
 
         LayoutParams layoutParams = generateDefaultLayoutParams();
         layoutParams.width = LayoutParams.MATCH_PARENT;
@@ -1289,15 +1316,15 @@
         for (ArcLayoutElement child : arc.getContentsList()) {
             @Nullable View childView = inflateArcLayoutElement(arcLayout, child);
             if (childView != null) {
-                WearArcLayout.LayoutParams childLayoutParams =
-                        (WearArcLayout.LayoutParams) childView.getLayoutParams();
+                ArcLayout.LayoutParams childLayoutParams =
+                        (ArcLayout.LayoutParams) childView.getLayoutParams();
                 boolean rotate = false;
                 if (child.hasAdapter()) {
                     rotate = child.getAdapter().getRotateContents().getValue();
                 }
 
                 // Apply rotation and gravity.
-                childLayoutParams.setRotate(rotate);
+                childLayoutParams.setRotated(rotate);
                 childLayoutParams.setVerticalAlignment(
                         verticalAlignmentToArcVAlign(arc.getVerticalAlign()));
             }
@@ -1862,9 +1889,9 @@
         private static Typeface loadTypeface(TypedArray array, int styleableResId) {
             // Resources are a little nasty; we can't just check if resType =
             // TypedValue.TYPE_REFERENCE, because it never is (if you use @font/foo inside of
-            // styles.xml, the value will be a string of the form res/font/foo.ttf). Instead, see
-            // if there's a resource ID at all, and use that, otherwise assume it's a well known
-            // font family.
+            // styles.xml, the value will be a string of the form res/font/foo.ttf). Instead, see if
+            // there's a resource ID at all, and use that, otherwise assume it's a well known font
+            // family.
             int resType = array.getType(styleableResId);
 
             if (array.getResourceId(styleableResId, -1) != -1
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearArcLayout.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearArcLayout.java
deleted file mode 100644
index e3dec57..0000000
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearArcLayout.java
+++ /dev/null
@@ -1,747 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.wear.tiles.renderer.internal;
-
-import static java.lang.Math.asin;
-import static java.lang.Math.max;
-import static java.lang.Math.round;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.annotation.AttrRes;
-import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.StyleRes;
-import androidx.annotation.UiThread;
-import androidx.wear.tiles.renderer.R;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Container which will lay its elements out on an arc. Elements will be relative to a given anchor
- * angle (where 0 degrees = 12 o clock), where the layout relative to the anchor angle is controlled
- * using {@code anchorAngleDegrees} and {@code anchorType}. The thickness of the arc is calculated
- * based on the child element with the greatest height (in the case of Android widgets), or greatest
- * thickness (for curved widgets). By default, the container lays its children one by one in
- * clockwise direction. The attribute 'clockwise' can be set to false to make the layout direction
- * as anti-clockwise. These two types of widgets will be drawn as follows.
- *
- * <p>Standard Android Widgets:
- *
- * <p>These widgets will be drawn as usual, but placed at the correct position on the arc, with the
- * correct amount of rotation applied. As an example, for an Android Text widget, the text baseline
- * would be drawn at a tangent to the arc. The arc length of a widget is obtained by measuring the
- * width of the widget, and transforming that to the length of an arc on a circle.
- *
- * <p>A standard Android widget will be measured as usual, but the maximum height constraint will be
- * capped at the minimum radius of the arc (i.e. width / 2).
- *
- * <p>"Curved" widgets:
- *
- * <p>Widgets which implement {@link ArcLayoutWidget} are expected to draw themselves within an arc
- * automatically. These widgets will be measured with the full dimensions of the arc container. They
- * are also expected to provide their thickness (used when calculating the thickness of the arc) and
- * the current sweep angle (used for laying out when drawing). Note that the WearArcLayout will
- * apply a rotation transform to the canvas before drawing this child; the inner child need not
- * perform any rotations itself.
- *
- * <p>An example of a widget which implements this interface is {@link WearCurvedTextView}, which
- * will lay itself out along the arc.
- */
-// TODO(b/174649543): Replace this with the actual androidx.wear.widget.WearArcLayout when
-// the next stable release of it is ready.
-// TODO(b/177464637): Resolve RestrictToUsage suppression.
-@SuppressWarnings("RestrictToUsage")
-@UiThread
-public class WearArcLayout extends ViewGroup {
-
-    /**
-     * Interface for a widget which knows it is being rendered inside an arc, and will draw itself
-     * accordingly. Any widget implementing this interface will receive the full-sized canvas,
-     * pre-rotated, in its draw call.
-     */
-    public interface ArcLayoutWidget {
-
-        /** Returns the sweep angle that this widget is drawn with. */
-        float getSweepAngleDegrees();
-
-        /** Returns the thickness of this widget inside the arc. */
-        int getThicknessPx();
-
-        /** Check whether the widget contains invalid attributes as a child of WearArcLayout */
-        void checkInvalidAttributeAsChild();
-
-        /**
-         * Return true when the given point is in the clickable area of the child widget. In
-         * particular, the coordinates should be considered as if the child was drawn centered at
-         * the default angle (12 o clock).
-         */
-        boolean insideClickArea(float x, float y);
-    }
-
-    /**
-     * Layout parameters for a widget added to an arc. This allows each element to specify whether
-     * or not it should be rotated(around the center of the child) when drawn inside the arc. For
-     * example, when the child is put at the center-bottom of the arc, whether the parent layout is
-     * responsible to rotate it 180 degree to draw it upside down.
-     *
-     * <p>Note that the {@code rotate} parameter is ignored when drawing "Fullscreen" elements.
-     */
-    public static class LayoutParams extends ViewGroup.MarginLayoutParams {
-
-        /**
-         * Vertical alignment of elements within the arc.
-         *
-         * @hide
-         */
-        @Retention(RetentionPolicy.SOURCE)
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        @IntDef({VALIGN_OUTER, VALIGN_CENTER, VALIGN_INNER})
-        public @interface VerticalAlignment {}
-
-        /** Align to the outer edge of the parent WearArcLayout. */
-        public static final int VALIGN_OUTER = 0;
-
-        /** Align to the center of the parent WearArcLayout. */
-        public static final int VALIGN_CENTER = 1;
-
-        /** Align to the inner edge of the parent WearArcLayout. */
-        public static final int VALIGN_INNER = 2;
-
-        private boolean mRotate = true;
-        @VerticalAlignment private int mVerticalAlignment = VALIGN_CENTER;
-
-        // Internally used during layout/draw
-        // Stores the angle of the child, used to handle touch events.
-        float mMiddleAngle;
-
-        /**
-         * Creates a new set of layout parameters. The values are extracted from the supplied
-         * attributes set and context.
-         *
-         * @param context the application environment
-         * @param attrs the set of attributes from which to extract the layout parameters' values
-         */
-        public LayoutParams(@NonNull Context context, @NonNull AttributeSet attrs) {
-            super(context, attrs);
-
-            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.WearArcLayout_Layout);
-
-            mRotate = a.getBoolean(R.styleable.WearArcLayout_Layout_layout_rotate, true);
-            mVerticalAlignment =
-                    a.getInt(R.styleable.WearArcLayout_Layout_layout_valign, VALIGN_CENTER);
-
-            a.recycle();
-        }
-
-        /**
-         * Creates a new set of layout parameters with specified width and height
-         *
-         * @param width the width, either WRAP_CONTENT, MATCH_PARENT or a fixed size in pixels
-         * @param height the height, either WRAP_CONTENT, MATCH_PARENT or a fixed size in pixels
-         */
-        public LayoutParams(int width, int height) {
-            super(width, height);
-        }
-
-        /** Copy constructor */
-        public LayoutParams(@NonNull ViewGroup.LayoutParams source) {
-            super(source);
-        }
-
-        /**
-         * Gets whether the widget shall be rotated by the WearArcLayout container corresponding to
-         * its layout position angle
-         */
-        public boolean getRotate() {
-            return mRotate;
-        }
-
-        /**
-         * Sets whether the widget shall be rotated by the WearArcLayout container corresponding to
-         * its layout position angle
-         */
-        public void setRotate(boolean rotate) {
-            mRotate = rotate;
-        }
-
-        /** Gets how the widget is positioned vertically in the WearArcLayout. */
-        @VerticalAlignment
-        public int getVerticalAlignment() {
-            return mVerticalAlignment;
-        }
-
-        /**
-         * Sets how the widget is positioned vertically in the WearArcLayout.
-         *
-         * @param verticalAlignment align the widget to outer, inner edges or center.
-         */
-        public void setVerticalAlignment(@VerticalAlignment int verticalAlignment) {
-            mVerticalAlignment = verticalAlignment;
-        }
-    }
-
-    /**
-     * Annotation for anchor types.
-     *
-     * @hide
-     */
-    @Retention(RetentionPolicy.SOURCE)
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    @IntDef({ANCHOR_START, ANCHOR_CENTER, ANCHOR_END})
-    public @interface AnchorType {}
-
-    /**
-     * Anchor at the start of the set of elements drawn within this container. This causes the first
-     * child to be drawn from {@code anchorAngle} degrees, to the right.
-     *
-     * <p>As an example, if this container contains two arcs, one having 10 degrees of sweep and the
-     * other having 20 degrees of sweep, the first will be drawn between 0-10 degrees, and the
-     * second between 10-30 degrees.
-     */
-    public static final int ANCHOR_START = 0;
-
-    /**
-     * Anchor at the center of the set of elements drawn within this container.
-     *
-     * <p>As an example, if this container contains two arcs, one having 10 degrees of sweep and the
-     * other having 20 degrees of sweep, the first will be drawn between -15 and -5 degrees, and the
-     * second between -5 and 15 degrees.
-     */
-    public static final int ANCHOR_CENTER = 1;
-
-    /**
-     * Anchor at the end of the set of elements drawn within this container. This causes the last
-     * element to end at {@code anchorAngle} degrees, with the other elements swept to the left.
-     *
-     * <p>As an example, if this container contains two arcs, one having 10 degrees of sweep and the
-     * other having 20 degrees of sweep, the first will be drawn between -30 and -20 degrees, and
-     * the second between -20 and 0 degrees.
-     */
-    public static final int ANCHOR_END = 2;
-
-    private static final float DEFAULT_START_ANGLE_DEGREES = 0f;
-    private static final boolean DEFAULT_LAYOUT_DIRECTION_IS_CLOCKWISE = true; // clockwise
-    @AnchorType private static final int DEFAULT_ANCHOR_TYPE = ANCHOR_START;
-
-    private int mThicknessPx = 0;
-
-    @AnchorType private int mAnchorType;
-    private float mAnchorAngleDegrees;
-    private boolean mClockwise;
-
-    @SuppressWarnings("SyntheticAccessor")
-    private final ChildArcAngles mChildArcAngles = new ChildArcAngles();
-
-    public WearArcLayout(@NonNull Context context) {
-        this(context, null);
-    }
-
-    public WearArcLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public WearArcLayout(
-            @NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
-        this(context, attrs, defStyleAttr, 0);
-    }
-
-    public WearArcLayout(
-            @NonNull Context context,
-            @Nullable AttributeSet attrs,
-            @AttrRes int defStyleAttr,
-            @StyleRes int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-
-        TypedArray a =
-                context.obtainStyledAttributes(
-                        attrs, R.styleable.WearArcLayout, defStyleAttr, defStyleRes);
-
-        mAnchorType = a.getInt(R.styleable.WearArcLayout_anchorPosition, DEFAULT_ANCHOR_TYPE);
-        mAnchorAngleDegrees =
-                a.getFloat(
-                        R.styleable.WearArcLayout_anchorAngleDegrees, DEFAULT_START_ANGLE_DEGREES);
-        mClockwise =
-                a.getBoolean(
-                        R.styleable.WearArcLayout_clockwise, DEFAULT_LAYOUT_DIRECTION_IS_CLOCKWISE);
-
-        a.recycle();
-    }
-
-    @Override
-    public void requestLayout() {
-        super.requestLayout();
-
-        for (int i = 0; i < getChildCount(); i++) {
-            getChildAt(i).forceLayout();
-        }
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        // Need to derive the thickness of the curve from the children. We're a curve, so the
-        // children can only be sized up to (width or height)/2 units. This currently only
-        // supports fitting to a circle.
-        //
-        // No matter what, fit to the given size, be it a maximum or a fixed size. It doesn't make
-        // sense for this container to wrap its children.
-        int actualWidthPx = MeasureSpec.getSize(widthMeasureSpec);
-        int actualHeightPx = MeasureSpec.getSize(heightMeasureSpec);
-
-        if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED
-                && MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED) {
-            // We can't actually resolve this.
-            // Let's fit to the screen dimensions, for need of anything better...
-            DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
-            actualWidthPx = displayMetrics.widthPixels;
-            actualHeightPx = displayMetrics.heightPixels;
-        }
-
-        // Fit to a square.
-        if (actualWidthPx < actualHeightPx) {
-            actualHeightPx = actualWidthPx;
-        } else if (actualHeightPx < actualWidthPx) {
-            actualWidthPx = actualHeightPx;
-        }
-
-        int maxChildDimension = actualHeightPx / 2;
-
-        // Measure all children in the new measurespec, and cache the largest.
-        int childMeasureSpec = MeasureSpec.makeMeasureSpec(maxChildDimension, MeasureSpec.AT_MOST);
-
-        // We need to do two measure passes. First, we need to measure all "normal" children, and
-        // get the thickness of all "CurvedContainer" children. Once we have that, we know the
-        // maximum thickness, and we can lay out the "CurvedContainer" children, taking into
-        // account their vertical alignment.
-        int maxChildHeightPx = 0;
-        int childState = 0;
-        for (int i = 0; i < getChildCount(); i++) {
-            View child = getChildAt(i);
-
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            // ArcLayoutWidget is a special case. Because of how it draws, fit it to the size
-            // of the whole widget.
-            int childMeasuredHeight;
-            if (child instanceof ArcLayoutWidget) {
-                childMeasuredHeight = ((ArcLayoutWidget) child).getThicknessPx();
-            } else {
-                measureChild(
-                        child,
-                        getChildMeasureSpec(childMeasureSpec, 0, child.getLayoutParams().width),
-                        getChildMeasureSpec(childMeasureSpec, 0, child.getLayoutParams().height));
-                childMeasuredHeight = child.getMeasuredHeight();
-                childState = combineMeasuredStates(childState, child.getMeasuredState());
-            }
-            LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-            maxChildHeightPx =
-                    max(
-                            maxChildHeightPx,
-                            childMeasuredHeight
-                                    + childLayoutParams.topMargin
-                                    + childLayoutParams.bottomMargin);
-        }
-
-        mThicknessPx = maxChildHeightPx;
-
-        // And now do the pass for the ArcLayoutWidgets
-        for (int i = 0; i < getChildCount(); i++) {
-            View child = getChildAt(i);
-
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            if (child instanceof ArcLayoutWidget) {
-                LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-
-                float insetPx = getChildTopInset(child);
-
-                int innerChildMeasureSpec =
-                        MeasureSpec.makeMeasureSpec(
-                                maxChildDimension * 2 - round(insetPx * 2), MeasureSpec.EXACTLY);
-
-                measureChild(
-                        child,
-                        getChildMeasureSpec(innerChildMeasureSpec, 0, childLayoutParams.width),
-                        getChildMeasureSpec(innerChildMeasureSpec, 0, childLayoutParams.height));
-
-                childState = combineMeasuredStates(childState, child.getMeasuredState());
-            }
-        }
-
-        setMeasuredDimension(
-                resolveSizeAndState(actualWidthPx, widthMeasureSpec, childState),
-                resolveSizeAndState(actualHeightPx, heightMeasureSpec, childState));
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        for (int i = 0; i < getChildCount(); i++) {
-            View child = getChildAt(i);
-
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            // Curved container widgets have been measured so that the "arc" inside their widget
-            // will touch the outside of the box they have been measured in, taking into account
-            // the vertical alignment. Just grow them from the center.
-            if (child instanceof ArcLayoutWidget) {
-                int leftPx = round((getMeasuredWidth() / 2f) - (child.getMeasuredWidth() / 2f));
-                int topPx = round((getMeasuredHeight() / 2f) - (child.getMeasuredHeight() / 2f));
-
-                child.layout(
-                        leftPx,
-                        topPx,
-                        leftPx + child.getMeasuredWidth(),
-                        topPx + child.getMeasuredHeight());
-            } else {
-                // Normal widgets need to be placed on their canvas, taking into account their
-                // vertical position.
-                int leftPx = round((getMeasuredWidth() / 2f) - (child.getMeasuredWidth() / 2f));
-                int topPx = round(getChildTopInset(child));
-
-                child.layout(
-                        leftPx,
-                        topPx,
-                        leftPx + child.getMeasuredWidth(),
-                        topPx + child.getMeasuredHeight());
-            }
-        }
-
-        // Once dimensions are set, also layout the children in the arc, computing the
-        // center angle where they should be drawn.
-        float currentCumulativeAngle = calculateInitialRotation();
-        for (int i = 0; i < getChildCount(); i++) {
-            View child = getChildAt(i);
-
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            calculateArcAngle(child, mChildArcAngles);
-            float preRotation =
-                    mChildArcAngles.leftMarginAsAngle + mChildArcAngles.actualChildAngle / 2f;
-            float multiplier = mClockwise ? 1f : -1f;
-
-            float middleAngle = multiplier * (currentCumulativeAngle + preRotation);
-            LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-            childLayoutParams.mMiddleAngle = middleAngle;
-
-            currentCumulativeAngle += mChildArcAngles.getTotalAngle();
-        }
-    }
-
-    // When a view (that can handle it) receives a TOUCH_DOWN event, it will get all subsequent
-    // events until the touch is released, even if the pointer goes outside of it's bounds.
-    @Nullable private View mTouchedView = null;
-
-    @Override
-    public boolean onInterceptTouchEvent(@NonNull MotionEvent event) {
-        if (mTouchedView == null && event.getActionMasked() == MotionEvent.ACTION_DOWN) {
-            for (int i = 0; i < getChildCount(); i++) {
-                View child = getChildAt(i);
-                // Ensure that the view is visible
-                if (child.getVisibility() != VISIBLE) {
-                    continue;
-                }
-
-                // Map the event to the child's coordinate system
-                LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-                float angle = childLayoutParams.mMiddleAngle;
-
-                float[] point = new float[] {event.getX(), event.getY()};
-                mapPoint(child, angle, point);
-
-                // Check if the click is actually in the child area
-                float x = point[0];
-                float y = point[1];
-
-                if (insideChildClickArea(child, x, y)) {
-                    mTouchedView = child;
-                    break;
-                }
-            }
-        }
-        // We can't do normal dispatching because it will capture touch in the original position
-        // of children.
-        return true;
-    }
-
-    private static boolean insideChildClickArea(View child, float x, float y) {
-        if (child instanceof ArcLayoutWidget) {
-            return ((ArcLayoutWidget) child).insideClickArea(x, y);
-        }
-        return x >= 0 && x < child.getMeasuredWidth() && y >= 0 && y < child.getMeasuredHeight();
-    }
-
-    // Map a point to local child coordinates.
-    private void mapPoint(View child, float angle, float[] point) {
-        float cx = getMeasuredWidth() / 2;
-        float cy = getMeasuredHeight() / 2;
-
-        Matrix m = new Matrix();
-        m.postRotate(-angle, cx, cy);
-        m.postTranslate(-child.getX(), -child.getY());
-        if (!(child instanceof ArcLayoutWidget)) {
-            LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-            if (!childLayoutParams.getRotate()) {
-                m.postRotate(angle, child.getWidth() / 2, child.getHeight() / 2);
-            }
-        }
-        m.mapPoints(point);
-    }
-
-    @Override
-    @SuppressLint("ClickableViewAccessibility")
-    public boolean onTouchEvent(@NonNull MotionEvent event) {
-        @Nullable View touchedView = mTouchedView;
-        if (touchedView != null) {
-            // Map the event's coordinates to the child's coordinate space
-            float[] point = new float[] {event.getX(), event.getY()};
-            LayoutParams touchedViewLayoutParams = (LayoutParams) touchedView.getLayoutParams();
-            mapPoint(touchedView, touchedViewLayoutParams.mMiddleAngle, point);
-
-            float dx = point[0] - event.getX();
-            float dy = point[1] - event.getY();
-            event.offsetLocation(dx, dy);
-
-            touchedView.dispatchTouchEvent(event);
-
-            if (event.getActionMasked() == MotionEvent.ACTION_UP
-                    || event.getActionMasked() == MotionEvent.ACTION_CANCEL) {
-                // We have finished handling these series of events.
-                mTouchedView = null;
-            }
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    protected boolean drawChild(@NonNull Canvas canvas, @NonNull View child, long drawingTime) {
-        // Rotate the canvas to make the children render in the right place.
-        canvas.save();
-
-        LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-        float middleAngle = childLayoutParams.mMiddleAngle;
-
-        // Rotate the child widget.
-        canvas.rotate(middleAngle, getMeasuredWidth() / 2f, getMeasuredHeight() / 2f);
-
-        if (child instanceof ArcLayoutWidget) {
-            ((ArcLayoutWidget) child).checkInvalidAttributeAsChild();
-        } else {
-            // Do we need to do some counter rotation?
-            LayoutParams layoutParams = (LayoutParams) child.getLayoutParams();
-
-            float angleToRotate = 0f;
-
-            if (layoutParams.getRotate()) {
-                // For counterclockwise layout, especially when mixing standard Android widget with
-                // ArcLayoutWidget as children, we might need to rotate the standard widget to make
-                // them have the same upwards direction.
-                if (!mClockwise) {
-                    angleToRotate = 180f;
-                }
-            } else {
-                // Un-rotate about the top of the canvas, around the center of the actual child.
-                // This compounds with the initial rotation into a translation.
-                angleToRotate = -middleAngle;
-            }
-
-            // Do the actual rotation. Note that the strange rotation center is because the child
-            // view is x-centered but at the top of this container.
-            float childInset = getChildTopInset(child);
-            canvas.rotate(
-                    angleToRotate,
-                    getMeasuredWidth() / 2f,
-                    child.getMeasuredHeight() / 2f + childInset);
-        }
-
-        boolean wasInvalidateIssued = super.drawChild(canvas, child, drawingTime);
-
-        canvas.restore();
-
-        return wasInvalidateIssued;
-    }
-
-    private float calculateInitialRotation() {
-        float multiplier = mClockwise ? 1f : -1f;
-        if (mAnchorType == ANCHOR_START) {
-            return multiplier * mAnchorAngleDegrees;
-        }
-
-        float totalArcAngle = 0;
-
-        for (int i = 0; i < getChildCount(); i++) {
-            calculateArcAngle(getChildAt(i), mChildArcAngles);
-            totalArcAngle += mChildArcAngles.getTotalAngle();
-        }
-
-        if (mAnchorType == ANCHOR_CENTER) {
-            return multiplier * mAnchorAngleDegrees - (totalArcAngle / 2f);
-        } else if (mAnchorType == ANCHOR_END) {
-            return multiplier * mAnchorAngleDegrees - totalArcAngle;
-        }
-
-        return 0;
-    }
-
-    private static float widthToAngleDegrees(float widthPx, float radiusPx) {
-        return (float) Math.toDegrees(2 * asin(widthPx / radiusPx / 2f));
-    }
-
-    private void calculateArcAngle(@NonNull View view, @NonNull ChildArcAngles childAngles) {
-        if (view.getVisibility() == GONE) {
-            childAngles.leftMarginAsAngle = 0;
-            childAngles.rightMarginAsAngle = 0;
-            childAngles.actualChildAngle = 0;
-            return;
-        }
-
-        float radiusPx = (getMeasuredWidth() / 2f) - mThicknessPx;
-
-        LayoutParams childLayoutParams = (LayoutParams) view.getLayoutParams();
-
-        childAngles.leftMarginAsAngle = widthToAngleDegrees(childLayoutParams.leftMargin, radiusPx);
-        childAngles.rightMarginAsAngle =
-                widthToAngleDegrees(childLayoutParams.rightMargin, radiusPx);
-
-        if (view instanceof ArcLayoutWidget) {
-            childAngles.actualChildAngle = ((ArcLayoutWidget) view).getSweepAngleDegrees();
-        } else {
-            childAngles.actualChildAngle = widthToAngleDegrees(view.getMeasuredWidth(), radiusPx);
-        }
-    }
-
-    private float getChildTopInset(@NonNull View child) {
-        LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-
-        int childHeight =
-                child instanceof ArcLayoutWidget
-                        ? ((ArcLayoutWidget) child).getThicknessPx()
-                        : child.getMeasuredHeight();
-
-        int thicknessDiffPx =
-                mThicknessPx
-                        - childLayoutParams.topMargin
-                        - childLayoutParams.bottomMargin
-                        - childHeight;
-
-        int margin = mClockwise ? childLayoutParams.topMargin : childLayoutParams.bottomMargin;
-
-        switch (childLayoutParams.getVerticalAlignment()) {
-            case LayoutParams.VALIGN_OUTER:
-                return margin;
-            case LayoutParams.VALIGN_CENTER:
-                return margin + thicknessDiffPx / 2f;
-            case LayoutParams.VALIGN_INNER:
-                return margin + thicknessDiffPx;
-            default:
-                // Nortmally unreachable...
-                return 0;
-        }
-    }
-
-    @Override
-    protected boolean checkLayoutParams(@Nullable ViewGroup.LayoutParams p) {
-        return p instanceof LayoutParams;
-    }
-
-    @Override
-    @NonNull
-    protected ViewGroup.LayoutParams generateLayoutParams(@NonNull ViewGroup.LayoutParams p) {
-        return new LayoutParams(p);
-    }
-
-    @Override
-    @NonNull
-    public ViewGroup.LayoutParams generateLayoutParams(@NonNull AttributeSet attrs) {
-        return new LayoutParams(getContext(), attrs);
-    }
-
-    @Override
-    @NonNull
-    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
-        return new LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
-    }
-
-    /** Returns the anchor type used for this container. */
-    @AnchorType
-    public int getAnchorType() {
-        return mAnchorType;
-    }
-
-    /** Sets the anchor type used for this container. */
-    public void setAnchorType(@AnchorType int anchorType) {
-        if (anchorType < ANCHOR_START || anchorType > ANCHOR_END) {
-            throw new IllegalArgumentException("Unknown anchor type");
-        }
-
-        mAnchorType = anchorType;
-        invalidate();
-    }
-
-    /** Returns the anchor angle used for this container, in degrees. */
-    public float getAnchorAngleDegrees() {
-        return mAnchorAngleDegrees;
-    }
-
-    /** Sets the anchor angle used for this container, in degrees. */
-    public void setAnchorAngleDegrees(float anchorAngleDegrees) {
-        mAnchorAngleDegrees = anchorAngleDegrees;
-        invalidate();
-    }
-
-    /** returns the layout direction */
-    public boolean getClockwise() {
-        return mClockwise;
-    }
-
-    /** Sets the layout direction */
-    public void setClockwise(boolean clockwise) {
-        mClockwise = clockwise;
-        invalidate();
-    }
-
-    private static class ChildArcAngles {
-        public float leftMarginAsAngle;
-        public float rightMarginAsAngle;
-        public float actualChildAngle;
-
-        public float getTotalAngle() {
-            return leftMarginAsAngle + rightMarginAsAngle + actualChildAngle;
-        }
-    }
-}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedLineView.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedLineView.java
index 10a2fbb..208edd2 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedLineView.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedLineView.java
@@ -33,6 +33,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.wear.tiles.renderer.R;
+import androidx.wear.widget.ArcLayout;
 
 /**
  * A line, drawn inside an arc.
@@ -41,7 +42,7 @@
  * the color to draw with. This widget will then draw an arc, with the specified thickness, around
  * its parent arc. The sweep angle is specified in degrees, clockwise.
  */
-public class WearCurvedLineView extends View implements WearArcLayout.ArcLayoutWidget {
+public class WearCurvedLineView extends View implements ArcLayout.Widget {
     private static final int DEFAULT_THICKNESS_PX = 0;
     private static final float DEFAULT_SWEEP_ANGLE_DEGREES = 0;
     @ColorInt private static final int DEFAULT_COLOR = 0xFFFFFFFF;
@@ -96,8 +97,7 @@
 
         if (mSweepAngleDegrees >= 360f) {
             // Android internally will take the modulus of the angle with 360, so drawing a full
-            // ring
-            // can't be done using path.arcTo. In that case, just draw a circle.
+            // ring can't be done using path.arcTo. In that case, just draw a circle.
             mPath.addOval(
                     insetPx,
                     insetPx,
@@ -106,10 +106,8 @@
                     Direction.CW);
         } else if (mSweepAngleDegrees != 0) {
             // The arc needs to be offset by -90 degrees. The ArcContainer will rotate this widget
-            // such
-            // that the "12 o clock" position on the canvas is aligned to the center of our
-            // requested
-            // angle, but 0 degrees in Android corresponds to the "3 o clock" position.
+            // such that the "12 o clock" position on the canvas is aligned to the center of our
+            // requested angle, but 0 degrees in Android corresponds to the "3 o clock" position.
             mPath.moveTo(0, 0); // Work-around for b/177676885
             mPath.arcTo(
                     insetPx,
@@ -136,18 +134,13 @@
         updatePathAndPaint();
     }
 
-    @Override
-    public int getThicknessPx() {
-        return mThicknessPx;
-    }
-
     /** Sets the thickness of this arc in pixels. */
-    public void setThicknessPx(int thicknessPx) {
-        if (thicknessPx < 0) {
-            thicknessPx = 0;
+    public void setThickness(int thickness) {
+        if (thickness < 0) {
+            thickness = 0;
         }
 
-        this.mThicknessPx = thicknessPx;
+        this.mThicknessPx = thickness;
         updatePathAndPaint();
         invalidate();
     }
@@ -157,6 +150,11 @@
         return mSweepAngleDegrees;
     }
 
+    @Override
+    public int getThickness() {
+        return mThicknessPx;
+    }
+
     /** Sets the sweep angle of this arc in degrees. */
     public void setSweepAngleDegrees(float sweepAngleDegrees) {
         this.mSweepAngleDegrees = sweepAngleDegrees;
@@ -188,7 +186,7 @@
     }
 
     @Override
-    public boolean insideClickArea(float x, float y) {
+    public boolean isPointInsideClickArea(float x, float y) {
         // Stolen from WearCurvedTextView...
         float radius2 = min(getWidth(), getHeight()) / 2f - getPaddingTop();
         float radius1 = radius2 - mThicknessPx;
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedSpacer.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedSpacer.java
index dd29df2..b6e6a55 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedSpacer.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedSpacer.java
@@ -24,13 +24,13 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.wear.tiles.renderer.R;
+import androidx.wear.widget.ArcLayout;
 
 /**
  * A lightweight curved widget that represents space between elements inside an Arc. This does no
- * rendering; it simply causes the parent {@link WearArcLayout} to advance by {@code
- * sweepAngleDegrees}.
+ * rendering; it simply causes the parent {@link ArcLayout} to advance by {@code sweepAngleDegrees}.
  */
-public class WearCurvedSpacer extends View implements WearArcLayout.ArcLayoutWidget {
+public class WearCurvedSpacer extends View implements ArcLayout.Widget {
 
     private static final float DEFAULT_SWEEP_ANGLE_DEGREES = 0f;
     private static final int DEFAULT_THICKNESS_PX = 0;
@@ -75,26 +75,26 @@
         return mSweepAngleDegrees;
     }
 
+    @Override
+    public int getThickness() {
+        return mThicknessPx;
+    }
+
     /** Sets the sweep angle of this spacer, in degrees. */
     public void setSweepAngleDegrees(float sweepAngleDegrees) {
         this.mSweepAngleDegrees = sweepAngleDegrees;
     }
 
-    @Override
-    public int getThicknessPx() {
-        return mThicknessPx;
-    }
-
     /** Sets the thickness of this spacer, in DP. */
-    public void setThicknessPx(int thicknessPx) {
-        this.mThicknessPx = thicknessPx;
+    public void setThickness(int thickness) {
+        this.mThicknessPx = thickness;
     }
 
     @Override
     public void checkInvalidAttributeAsChild() {}
 
     @Override
-    public boolean insideClickArea(float x, float y) {
+    public boolean isPointInsideClickArea(float x, float y) {
         return false;
     }
 }
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedTextView.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedTextView.java
deleted file mode 100644
index 242d853..0000000
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedTextView.java
+++ /dev/null
@@ -1,946 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.wear.tiles.renderer.internal;
-
-import static java.lang.Math.cos;
-import static java.lang.Math.max;
-import static java.lang.Math.min;
-import static java.lang.Math.round;
-import static java.lang.Math.sin;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.Rect;
-import android.graphics.Typeface;
-import android.os.Build;
-import android.text.StaticLayout;
-import android.text.TextPaint;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-
-import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.wear.tiles.renderer.R;
-
-/**
- * A WearCurvedTextView is a component allowing developers to easily write curved text following the
- * curvature of the largest circle that can be inscribed in the view. WearArcLayout could be used to
- * concatenate multiple curved texts, also layout together with other widgets such as icons.
- */
-// TODO(b/174649543): Replace this with the actual androidx.wear.widget.WearCurvedTextView when
-// the next stable release of it is ready.
-public final class WearCurvedTextView extends View implements WearArcLayout.ArcLayoutWidget {
-    private static final float UNSET_ANCHOR_DEGREE = -1f;
-    private static final int UNSET_ANCHOR_TYPE = -1;
-    private static final float MIN_SWEEP_DEGREE = 0f;
-    private static final float MAX_SWEEP_DEGREE = 359.9f;
-    private static final float DEFAULT_TEXT_SIZE = 24f;
-    @ColorInt private static final int DEFAULT_TEXT_COLOR = Color.WHITE;
-    private static final int DEFAULT_TEXT_STYLE = Typeface.NORMAL;
-    private static final boolean DEFAULT_CLOCKWISE = true;
-    private static final int FONT_WEIGHT_MAX = 1000;
-    private static final float ITALIC_SKEW_X = -0.25f;
-    // make 0 degree at 12 o'clock, since canvas assumes 0 degree is 3 o'clock
-    private static final float ANCHOR_DEGREE_OFFSET = -90f;
-
-    private final Path mPath = new Path();
-    private final Path mBgPath = new Path();
-    private final TextPaint mPaint = new TextPaint();
-    private final Rect mBounds = new Rect();
-    private final Rect mBgBounds = new Rect();
-    private boolean mDirty = true;
-    private String mTextToDraw = "";
-    private float mPathRadius = 0f;
-    private float mTextSweepDegrees = 0f;
-    private float mBackgroundSweepDegrees = MAX_SWEEP_DEGREE;
-    private int mLastUsedTextAlignment = -1;
-    private float mLocalRotateAngle = 0f;
-
-    private int mAnchorType = UNSET_ANCHOR_TYPE;
-    private float mAnchorAngleDegrees = UNSET_ANCHOR_DEGREE;
-    private float mMinSweepDegrees = MIN_SWEEP_DEGREE;
-    private float mMaxSweepDegrees = MAX_SWEEP_DEGREE;
-    private String mText = "";
-    private float mTextSize = DEFAULT_TEXT_SIZE;
-    @Nullable private Typeface mTypeface = null;
-    private boolean mClockwise = DEFAULT_CLOCKWISE;
-    @ColorInt private int mTextColor = DEFAULT_TEXT_COLOR;
-    @Nullable private TextUtils.TruncateAt mEllipsize = null;
-    private float mLetterSpacing = 0f;
-    @Nullable private String mFontFeatureSettings = null;
-    @Nullable private String mFontVariationSettings = null;
-
-    // If true, it means we got the touch_down event and are receiving the touch events that follow.
-    private boolean mHandlingTouch = false;
-
-    public WearCurvedTextView(@NonNull Context context) {
-        this(context, null);
-    }
-
-    public WearCurvedTextView(@NonNull Context context, @Nullable AttributeSet attrs) {
-        this(context, attrs, android.R.attr.textViewStyle);
-    }
-
-    public WearCurvedTextView(
-            @NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
-        this(context, attrs, defStyle, 0);
-    }
-
-    public WearCurvedTextView(
-            @NonNull Context context, @Nullable AttributeSet attrs, int defStyle, int defStyleRes) {
-        super(context, attrs, defStyle, defStyleRes);
-
-        mPaint.setAntiAlias(true);
-
-        TextAppearanceAttributes attributes = new TextAppearanceAttributes();
-        attributes.mTextColor = ColorStateList.valueOf(DEFAULT_TEXT_COLOR);
-
-        final Resources.Theme theme = context.getTheme();
-        TypedArray a =
-                theme.obtainStyledAttributes(
-                        attrs, R.styleable.TextViewAppearance, defStyle, defStyleRes);
-
-        TypedArray appearance = null;
-        int ap = a.getResourceId(R.styleable.TextViewAppearance_android_textAppearance, -1);
-        a.recycle();
-
-        if (ap != -1) {
-            appearance = theme.obtainStyledAttributes(ap, R.styleable.TextAppearance);
-        }
-        if (appearance != null) {
-            readTextAppearance(appearance, attributes, true);
-            appearance.recycle();
-        }
-
-        a =
-                context.obtainStyledAttributes(
-                        attrs, R.styleable.WearCurvedTextView, defStyle, defStyleRes);
-        // overrride the value in the appearance with explicitly specified attribute values
-        readTextAppearance(a, attributes, false);
-
-        // read the other supported TextView attributes
-        if (a.hasValue(R.styleable.WearCurvedTextView_android_text)) {
-            mText = nullToEmpty(a.getString(R.styleable.WearCurvedTextView_android_text));
-        }
-
-        int textEllipsize = a.getInt(R.styleable.WearCurvedTextView_android_ellipsize, 0);
-        switch (textEllipsize) {
-            case 1:
-                mEllipsize = TextUtils.TruncateAt.START;
-                break;
-            case 2:
-                mEllipsize = TextUtils.TruncateAt.MIDDLE;
-                break;
-            case 3:
-                mEllipsize = TextUtils.TruncateAt.END;
-                break;
-            default:
-                mEllipsize = null;
-        }
-
-        // read the custom WearCurvedTextView attributes
-        mMaxSweepDegrees =
-                a.getFloat(R.styleable.WearCurvedTextView_maxSweepDegrees, MAX_SWEEP_DEGREE);
-        mMaxSweepDegrees = min(mMaxSweepDegrees, MAX_SWEEP_DEGREE);
-        mMinSweepDegrees =
-                a.getFloat(R.styleable.WearCurvedTextView_minSweepDegrees, MIN_SWEEP_DEGREE);
-        if (mMinSweepDegrees > mMaxSweepDegrees) {
-            throw new IllegalArgumentException(
-                    "MinSweepDegrees cannot be bigger than MaxSweepDegrees");
-        }
-        mAnchorType = a.getInt(R.styleable.WearCurvedTextView_anchorPosition, UNSET_ANCHOR_TYPE);
-        mAnchorAngleDegrees =
-                a.getFloat(R.styleable.WearCurvedTextView_anchorAngleDegrees, UNSET_ANCHOR_DEGREE);
-        mAnchorAngleDegrees = mAnchorAngleDegrees % 360f;
-        mClockwise = a.getBoolean(R.styleable.WearCurvedTextView_clockwise, DEFAULT_CLOCKWISE);
-
-        a.recycle();
-
-        applyTextAppearance(attributes);
-
-        mPaint.setTextSize(mTextSize);
-    }
-
-    @Override
-    public float getSweepAngleDegrees() {
-        return mBackgroundSweepDegrees;
-    }
-
-    @Override
-    public int getThicknessPx() {
-        return round(mPaint.getFontMetrics().descent - mPaint.getFontMetrics().ascent);
-    }
-
-    /**
-     * @throws IllegalArgumentException if the anchorType and/or anchorAngleDegrees attributes were
-     *     set for a widget in WearArcLayout
-     */
-    @Override
-    public void checkInvalidAttributeAsChild() {
-        if (mAnchorType != UNSET_ANCHOR_TYPE) {
-            throw new IllegalArgumentException(
-                    "WearCurvedTextView shall not set anchorType value when added into"
-                            + "WearArcLayout");
-        }
-
-        if (mAnchorAngleDegrees != UNSET_ANCHOR_DEGREE) {
-            throw new IllegalArgumentException(
-                    "WearCurvedTextView shall not set anchorAngleDegrees value when added into "
-                            + "WearArcLayout");
-        }
-    }
-
-    @Override
-    public boolean insideClickArea(float x, float y) {
-        float radius2 =
-                min(getWidth(), getHeight()) / 2f
-                        - (mClockwise ? getPaddingTop() : getPaddingBottom());
-        float radius1 = radius2 - mPaint.getFontMetrics().descent + mPaint.getFontMetrics().ascent;
-
-        float dx = x - getWidth() / 2;
-        float dy = y - getHeight() / 2;
-
-        float r2 = dx * dx + dy * dy;
-        if (r2 < radius1 * radius1 || r2 > radius2 * radius2) {
-            return false;
-        }
-
-        // Since we are symmetrical on the Y-axis, we can constrain the angle to the x>=0 quadrants.
-        float angle = (float) Math.toDegrees(Math.atan2(Math.abs(dx), -dy));
-        return angle < mBackgroundSweepDegrees / 2;
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-        doUpdate();
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        super.onLayout(changed, l, t, r, b);
-
-        mPaint.getTextBounds(mText, 0, mText.length(), mBounds);
-
-        // Note that ascent is negative.
-        mPathRadius =
-                min(getWidth(), getHeight()) / 2f
-                        + (mClockwise
-                                ? mPaint.getFontMetrics().ascent - getPaddingTop()
-                                : -mPaint.getFontMetrics().descent - getPaddingBottom());
-        mTextSweepDegrees =
-                min(getWidthSelf() / mPathRadius / (float) Math.PI * 180f, MAX_SWEEP_DEGREE);
-        mBackgroundSweepDegrees = max(min(mMaxSweepDegrees, mTextSweepDegrees), mMinSweepDegrees);
-    }
-
-    private float getWidthSelf() {
-        return (float) mBounds.width() + getPaddingLeft() + getPaddingRight();
-    }
-
-    private String ellipsize(int ellipsizedWidth) {
-        StaticLayout.Builder layoutBuilder =
-                StaticLayout.Builder.obtain(mText, 0, mText.length(), mPaint, ellipsizedWidth);
-        layoutBuilder.setEllipsize(mEllipsize);
-        layoutBuilder.setMaxLines(1);
-        StaticLayout layout = layoutBuilder.build();
-
-        // Cut text that it's too big even if no ellipsize mode is provided.
-        if (mEllipsize == null) {
-            return mText.substring(0, layout.getLineEnd(0));
-        }
-
-        int ellipsisCount = layout.getEllipsisCount(0);
-        if (ellipsisCount == 0) {
-            return mText;
-        }
-
-        int ellipsisStart = layout.getEllipsisStart(0);
-        char[] textToDrawArray = mText.toCharArray();
-        textToDrawArray[ellipsisStart] = '\u2026'; // ellipsis "..."
-        for (int i = ellipsisStart + 1; i < ellipsisStart + ellipsisCount; i++) {
-            if (i >= 0 && i < mText.length()) {
-                textToDrawArray[i] = '\uFEFF'; // 0-width space
-            }
-        }
-        return new String(textToDrawArray);
-    }
-
-    private void updatePathsIfNeeded(boolean withBackground) {
-        // The dirty flag is not set when properties we inherit from View are modified
-        if (!mDirty && ((int) getTextAlignment() == mLastUsedTextAlignment)) {
-            return;
-        }
-
-        mDirty = false;
-        mLastUsedTextAlignment = (int) getTextAlignment();
-
-        if (mTextSweepDegrees <= mMaxSweepDegrees) {
-            mTextToDraw = mText;
-        } else {
-            mTextToDraw =
-                    ellipsize(
-                            (int) (Math.toRadians(mMaxSweepDegrees) * mPathRadius)
-                                    - getPaddingLeft()
-                                    - getPaddingRight());
-            mTextSweepDegrees = mMaxSweepDegrees;
-        }
-
-        float clockwiseFactor = mClockwise ? 1f : -1f;
-
-        float alignmentFactor = 0.5f;
-        switch (getTextAlignment()) {
-            case TEXT_ALIGNMENT_TEXT_START:
-            case TEXT_ALIGNMENT_VIEW_START:
-                alignmentFactor = 0f;
-                break;
-            case TEXT_ALIGNMENT_TEXT_END:
-            case TEXT_ALIGNMENT_VIEW_END:
-                alignmentFactor = 1f;
-                break;
-            default:
-                alignmentFactor = 0.5f; // TEXT_ALIGNMENT_CENTER
-        }
-
-        float anchorTypeFactor;
-        switch (mAnchorType) {
-            case WearArcLayout.ANCHOR_START:
-                anchorTypeFactor = 0.5f;
-                break;
-            case WearArcLayout.ANCHOR_END:
-                anchorTypeFactor = -0.5f;
-                break;
-            case WearArcLayout.ANCHOR_CENTER: // Center is the default.
-            default:
-                anchorTypeFactor = 0f;
-        }
-
-        mLocalRotateAngle =
-                (mAnchorAngleDegrees == UNSET_ANCHOR_DEGREE ? 0f : mAnchorAngleDegrees)
-                        + clockwiseFactor * anchorTypeFactor * mBackgroundSweepDegrees;
-
-        // Always draw the curved text on top center, then rotate the canvas to the right position
-        float backgroundStartAngle =
-                -clockwiseFactor * 0.5f * mBackgroundSweepDegrees + ANCHOR_DEGREE_OFFSET;
-
-        float textStartAngle =
-                backgroundStartAngle
-                        + clockwiseFactor
-                                * (float)
-                                        (alignmentFactor
-                                                        * (mBackgroundSweepDegrees
-                                                                - mTextSweepDegrees)
-                                                + Math.toDegrees(getPaddingLeft() / mPathRadius));
-
-        float centerX = getWidth() / 2f;
-        float centerY = getHeight() / 2f;
-        mPath.reset();
-        mPath.addArc(
-                centerX - mPathRadius,
-                centerY - mPathRadius,
-                centerX + mPathRadius,
-                centerY + mPathRadius,
-                textStartAngle,
-                clockwiseFactor * mTextSweepDegrees);
-
-        if (withBackground) {
-            mBgPath.reset();
-            // NOTE: Ensure that if the code to compute these radius* change, containsPoint() is
-            // also updated.
-            float radius1 = mPathRadius - clockwiseFactor * mPaint.getFontMetrics().descent;
-            float radius2 = mPathRadius - clockwiseFactor * mPaint.getFontMetrics().ascent;
-            mBgPath.arcTo(
-                    centerX - radius2,
-                    centerY - radius2,
-                    centerX + radius2,
-                    centerY + radius2,
-                    backgroundStartAngle,
-                    clockwiseFactor * mBackgroundSweepDegrees,
-                    false);
-            mBgPath.arcTo(
-                    centerX - radius1,
-                    centerY - radius1,
-                    centerX + radius1,
-                    centerY + radius1,
-                    backgroundStartAngle + clockwiseFactor * mBackgroundSweepDegrees,
-                    -clockwiseFactor * mBackgroundSweepDegrees,
-                    false);
-            mBgPath.close();
-
-            float angle = backgroundStartAngle;
-            float x0 = (float) (centerX + radius2 * cos(Math.toRadians(angle)));
-            float x1 = (float) (centerX + radius1 * cos(Math.toRadians(angle)));
-            float y0 = (float) (centerX + radius2 * sin(Math.toRadians(angle)));
-            float y1 = (float) (centerX + radius1 * sin(Math.toRadians(angle)));
-            angle = backgroundStartAngle + clockwiseFactor * mBackgroundSweepDegrees;
-            float x2 = (float) (centerX + radius2 * cos(Math.toRadians(angle)));
-            float x3 = (float) (centerX + radius1 * cos(Math.toRadians(angle)));
-            // Background axis-aligned bounding box calculation. Note that, we always center the
-            // text on the top-center of the view.
-            // top: always will be centerY - outerRadius
-            // bottom: the max y of end points of the outer and inner arc contains the text
-            // left: if over -90 degrees, centerX - outerRadius, otherwise the min x of start,
-            // end points of the outer and inner arc contains the text
-            // right: if over 90 degrees, centerX + outerRadius, otherwise the max x of start,
-            // end points of the outer and inner arc contains the text
-            float outerRadius = max(radius1, radius2);
-            mBgBounds.top = (int) (centerY - outerRadius);
-            mBgBounds.bottom = (int) max(y0, y1);
-            mBgBounds.left =
-                    mBackgroundSweepDegrees >= 180.0f
-                            ? (int) (centerX - outerRadius)
-                            : (int) min(x0, min(x1, min(x2, x3)));
-            mBgBounds.right =
-                    mBackgroundSweepDegrees >= 180.0f
-                            ? (int) (centerX + outerRadius)
-                            : (int) max(x0, max(x1, max(x2, x3)));
-        }
-    }
-
-    @Override
-    // We only filter events and defer to super.onTouchEvent()
-    @SuppressLint("ClickableViewAccessibility")
-    public boolean onTouchEvent(@NonNull MotionEvent event) {
-        if (!mHandlingTouch && event.getAction() != MotionEvent.ACTION_DOWN) {
-            return false;
-        }
-
-        float x0 = event.getX() - getWidth() / 2;
-        float y0 = event.getY() - getHeight() / 2;
-
-        double rotAngle = -Math.toRadians(mLocalRotateAngle);
-
-        float tempX = (float) ((x0 * cos(rotAngle) - y0 * sin(rotAngle)) + getWidth() / 2);
-        y0 = (float) ((x0 * sin(rotAngle) + y0 * cos(rotAngle)) + getHeight() / 2);
-        x0 = tempX;
-
-        // Should we start handling the touch events?
-        if (!mHandlingTouch && insideClickArea(x0, y0)) {
-            mHandlingTouch = true;
-        }
-
-        // We just started or are in the middle of handling events, forward to View to handle.
-        if (mHandlingTouch) {
-            if (event.getAction() == MotionEvent.ACTION_UP
-                    || event.getAction() == MotionEvent.ACTION_CANCEL) {
-                // We should end handling events now
-                mHandlingTouch = false;
-            }
-            event.offsetLocation(x0 - event.getX(), y0 - event.getY());
-            return super.onTouchEvent(event);
-        }
-
-        return false;
-    }
-
-    @Override
-    public void draw(@NonNull Canvas canvas) {
-        canvas.save();
-
-        boolean withBackground = getBackground() != null;
-        updatePathsIfNeeded(withBackground);
-        canvas.rotate(mLocalRotateAngle, getWidth() / 2f, getHeight() / 2f);
-
-        if (withBackground) {
-            canvas.clipPath(mBgPath);
-            getBackground().setBounds(mBgBounds);
-        }
-        super.draw(canvas);
-
-        canvas.restore();
-    }
-
-    @Override
-    protected void onDraw(@NonNull Canvas canvas) {
-        mPaint.setColor(mTextColor);
-        mPaint.setStyle(Paint.Style.FILL);
-        canvas.drawTextOnPath(mTextToDraw, mPath, 0f, 0f, mPaint);
-    }
-
-    /**
-     * Sets the Typeface taking into account the given attributes.
-     *
-     * @param familyName family name string, e.g. "serif"
-     * @param typefaceIndex an index of the typeface enum, e.g. SANS, SERIF.
-     * @param style a typeface style
-     * @param weight a weight value for the Typeface or -1 if not specified.
-     */
-    private void setTypefaceFromAttrs(
-            @Nullable String familyName, int typefaceIndex, int style, int weight) {
-        // typeface is ignored when font family is set
-        if (mTypeface == null && familyName != null) {
-            // Lookup normal Typeface from system font map.
-            Typeface normalTypeface = Typeface.create(familyName, Typeface.NORMAL);
-            resolveStyleAndSetTypeface(normalTypeface, style, weight);
-        } else if (mTypeface != null) {
-            resolveStyleAndSetTypeface(mTypeface, style, weight);
-        } else { // both typeface and familyName is null.
-            switch (typefaceIndex) {
-                case 1:
-                    resolveStyleAndSetTypeface(Typeface.SANS_SERIF, style, weight);
-                    break;
-                case 2:
-                    resolveStyleAndSetTypeface(Typeface.SERIF, style, weight);
-                    break;
-                case 3:
-                    resolveStyleAndSetTypeface(Typeface.MONOSPACE, style, weight);
-                    break;
-                default:
-                    resolveStyleAndSetTypeface(null, style, weight);
-            }
-        }
-    }
-
-    private void resolveStyleAndSetTypeface(@Nullable Typeface tf, int style, int weight) {
-        if (weight >= 0 && Build.VERSION.SDK_INT >= 28) {
-            int clampedWeight = min(FONT_WEIGHT_MAX, weight);
-            boolean italic = (style & Typeface.ITALIC) != 0;
-            mTypeface = Api28Impl.createTypeface(tf, clampedWeight, italic);
-            mPaint.setTypeface(mTypeface);
-        } else {
-            setTypeface(tf, style);
-        }
-    }
-
-    /** Set of attribute that can be defined in a Text Appearance. */
-    private static class TextAppearanceAttributes {
-        @Nullable ColorStateList mTextColor = null;
-        float mTextSize = DEFAULT_TEXT_SIZE;
-        @Nullable String mFontFamily = null;
-        boolean mFontFamilyExplicit = false;
-        int mTypefaceIndex = -1;
-        int mTextStyle = DEFAULT_TEXT_STYLE;
-        int mFontWeight = -1;
-        float mLetterSpacing = 0f;
-        @Nullable String mFontFeatureSettings = null;
-        @Nullable String mFontVariationSettings = null;
-
-        TextAppearanceAttributes() {}
-    }
-
-    /** Sets the textColor, size, style, font etc from the specified TextAppearanceAttributes */
-    private void applyTextAppearance(WearCurvedTextView this, TextAppearanceAttributes attributes) {
-        if (attributes.mTextColor != null) {
-            mTextColor = attributes.mTextColor.getDefaultColor();
-        }
-
-        if (attributes.mTextSize != -1f) {
-            mTextSize = attributes.mTextSize;
-        }
-
-        setTypefaceFromAttrs(
-                attributes.mFontFamily,
-                attributes.mTypefaceIndex,
-                attributes.mTextStyle,
-                attributes.mFontWeight);
-
-        mPaint.setLetterSpacing(attributes.mLetterSpacing);
-        mLetterSpacing = attributes.mLetterSpacing;
-
-        // setFontFeatureSettings does accept null, but is not annotated as such. Empty string does
-        // the
-        // same thing though.
-        mPaint.setFontFeatureSettings(nullToEmpty(attributes.mFontFeatureSettings));
-        mFontFeatureSettings = attributes.mFontFeatureSettings;
-        if (Build.VERSION.SDK_INT >= 26 && attributes.mFontVariationSettings != null) {
-            Api26Impl.paintSetFontVariationSettings(mPaint, attributes.mFontVariationSettings);
-        }
-        mFontVariationSettings = attributes.mFontVariationSettings;
-    }
-
-    /**
-     * Read the Text Appearance attributes from a given TypedArray and set its values to the given
-     * set. If the TypedArray contains a value that already set in the given attributes, that will
-     * be overridden.
-     */
-    private static void readTextAppearance(
-            TypedArray appearance, TextAppearanceAttributes attributes, boolean isTextAppearance) {
-        int attrIndex =
-                isTextAppearance
-                        ? R.styleable.TextAppearance_android_textColor
-                        : R.styleable.WearCurvedTextView_android_textColor;
-        if (appearance.hasValue(attrIndex)) {
-            attributes.mTextColor = appearance.getColorStateList(attrIndex);
-        }
-
-        attributes.mTextSize =
-                appearance.getDimensionPixelSize(
-                        isTextAppearance
-                                ? R.styleable.TextAppearance_android_textSize
-                                : R.styleable.WearCurvedTextView_android_textSize,
-                        (int) attributes.mTextSize);
-
-        attributes.mTextStyle =
-                appearance.getInt(
-                        isTextAppearance
-                                ? R.styleable.TextAppearance_android_textStyle
-                                : R.styleable.WearCurvedTextView_android_textStyle,
-                        attributes.mTextStyle);
-
-        // make sure that the typeface attribute is read before fontFamily attribute
-        attributes.mTypefaceIndex =
-                appearance.getInt(
-                        isTextAppearance
-                                ? R.styleable.TextAppearance_android_typeface
-                                : R.styleable.WearCurvedTextView_android_typeface,
-                        attributes.mTypefaceIndex);
-        if (attributes.mTypefaceIndex != -1 && !attributes.mFontFamilyExplicit) {
-            attributes.mFontFamily = null;
-        }
-
-        attrIndex =
-                isTextAppearance
-                        ? R.styleable.TextAppearance_android_fontFamily
-                        : R.styleable.WearCurvedTextView_android_fontFamily;
-        if (appearance.hasValue(attrIndex)) {
-            attributes.mFontFamily = appearance.getString(attrIndex);
-            attributes.mFontFamilyExplicit = !isTextAppearance;
-        }
-
-        attributes.mFontWeight =
-                appearance.getInt(
-                        isTextAppearance
-                                ? R.styleable.TextAppearance_android_textFontWeight
-                                : R.styleable.WearCurvedTextView_android_textFontWeight,
-                        attributes.mFontWeight);
-
-        attributes.mLetterSpacing =
-                appearance.getFloat(
-                        isTextAppearance
-                                ? R.styleable.TextAppearance_android_letterSpacing
-                                : R.styleable.WearCurvedTextView_android_letterSpacing,
-                        attributes.mLetterSpacing);
-
-        attrIndex =
-                isTextAppearance
-                        ? R.styleable.TextAppearance_android_fontFeatureSettings
-                        : R.styleable.WearCurvedTextView_android_fontFeatureSettings;
-        if (appearance.hasValue(attrIndex)) {
-            attributes.mFontFeatureSettings = appearance.getString(attrIndex);
-        }
-
-        attrIndex =
-                isTextAppearance
-                        ? R.styleable.TextAppearance_android_fontVariationSettings
-                        : R.styleable.WearCurvedTextView_android_fontVariationSettings;
-        if (appearance.hasValue(attrIndex)) {
-            attributes.mFontVariationSettings = appearance.getString(attrIndex);
-        }
-    }
-
-    private void doUpdate() {
-        mDirty = true;
-        requestLayout();
-        postInvalidate();
-    }
-
-    private void doRedraw() {
-        mDirty = true;
-        postInvalidate();
-    }
-
-    /** returns the anchor type for positioning the curved text */
-    public int getAnchorType() {
-        return mAnchorType;
-    }
-
-    /**
-     * Sets the anchor type for positioning the curved text.
-     *
-     * @param value the anchor type, one of {ANCHOR_START, ANCHOR_CENTER, ANCHOR_END}
-     */
-    public void setAnchorType(@WearArcLayout.AnchorType int value) {
-        mAnchorType = value;
-        doUpdate();
-    }
-
-    /** Returns the anchor angle used for positioning the text, in degrees. */
-    public float getAnchorAngleDegrees() {
-        return mAnchorAngleDegrees;
-    }
-
-    /** Sets the anchor angle used for positioning the text, in degrees. */
-    public void setAnchorAngleDegrees(float value) {
-        mAnchorAngleDegrees = value;
-        doRedraw();
-    }
-
-    /** returns the maximum sweep angle in degrees for rendering the text */
-    public float getMaxSweepDegrees() {
-        return mMaxSweepDegrees;
-    }
-
-    /** sets the maximum sweep angle in degrees for rendering the text */
-    public void setMaxSweepDegrees(float value) {
-        if (value < mMinSweepDegrees) {
-            throw new IllegalArgumentException(
-                    "MaxSweepDegrees cannot be smaller than MinSweepDegrees");
-        }
-        mMaxSweepDegrees = min(value, MAX_SWEEP_DEGREE);
-        doUpdate();
-    }
-    /** returns the sweep angle in degrees for rendering the text */
-    public float getMinSweepDegrees() {
-        return mMinSweepDegrees;
-    }
-
-    /** sets the sweep angle in degrees for rendering the text */
-    public void setMinSweepDegrees(float value) {
-        if (value > mMaxSweepDegrees) {
-            throw new IllegalArgumentException(
-                    "MinSweepDegrees cannot be bigger than MaxSweepDegrees");
-        }
-        mMinSweepDegrees = value;
-        doUpdate();
-    }
-
-    /** returns the text to be rendered */
-    @Nullable
-    public String getText() {
-        return mText;
-    }
-
-    /** sets the text to be rendered */
-    public void setText(@Nullable String value) {
-        mText = nullToEmpty(value);
-        doUpdate();
-    }
-
-    /** returns the text size for rendering the text */
-    public float getTextSize() {
-        return mTextSize;
-    }
-
-    /** sets the text size for rendering the text */
-    public void setTextSize(float value) {
-        mTextSize = value;
-        mPaint.setTextSize(mTextSize);
-        doUpdate();
-    }
-
-    /** Gets the current Typeface that is used to style the text. */
-    @Nullable
-    public Typeface getTypeface() {
-        return mTypeface;
-    }
-
-    /**
-     * Sets the typeface and style in which the text should be displayed. Note that not all Typeface
-     * families actually have bold and italic variants
-     */
-    public void setTypeface(@Nullable Typeface value) {
-        mTypeface = value;
-        doUpdate();
-    }
-
-    /**
-     * Sets the typeface and style in which the text should be displayed, and turns on the fake bold
-     * and italic bits in the Paint if the Typeface that you provided does not have all the bits in
-     * the style that you specified.
-     */
-    public void setTypeface(@Nullable Typeface tf, int style) {
-        if (style > 0) {
-            if (tf == null) {
-                tf = Typeface.defaultFromStyle(style);
-            } else {
-                tf = Typeface.create(tf, style);
-            }
-            if (!tf.equals(mPaint.getTypeface())) {
-                mPaint.setTypeface(tf);
-                mTypeface = tf;
-            }
-            // now compute what (if any) algorithmic styling is needed
-            int typefaceStyle = tf != null ? tf.getStyle() : 0;
-            int need = style & ~typefaceStyle;
-            mPaint.setFakeBoldText((need & Typeface.BOLD) != 0);
-            mPaint.setTextSkewX(((need & Typeface.ITALIC) != 0) ? ITALIC_SKEW_X : 0f);
-        } else {
-            mPaint.setFakeBoldText(false);
-            mPaint.setTextSkewX(0f);
-            if ((tf != null && !tf.equals(mPaint.getTypeface()))
-                    || (tf == null && mPaint.getTypeface() != null)) {
-                mPaint.setTypeface(tf);
-                mTypeface = tf;
-            }
-        }
-
-        doUpdate();
-    }
-
-    /** returns the curved text layout direction */
-    public boolean getClockwise() {
-        return mClockwise;
-    }
-
-    /** sets the curved text layout direction */
-    public void setClockwise(boolean value) {
-        mClockwise = value;
-        doUpdate();
-    }
-
-    /** returns the color for rendering the text */
-    @ColorInt
-    public int getTextColor() {
-        return mTextColor;
-    }
-
-    /** sets the color for rendering the text */
-    public void setTextColor(@ColorInt int value) {
-        mTextColor = value;
-        doRedraw();
-    }
-
-    /**
-     * Returns where, if anywhere, words that are longer than the view is wide should be ellipsized.
-     */
-    @Nullable
-    public TextUtils.TruncateAt getEllipsize() {
-        return mEllipsize;
-    }
-
-    /**
-     * Causes words in the text that are longer than the view's width to be ellipsized. Use null to
-     * turn off ellipsizing.
-     */
-    public void setEllipsize(@Nullable TextUtils.TruncateAt value) {
-        mEllipsize = value;
-        doRedraw();
-    }
-
-    /**
-     * Gets the text letter-space value, which determines the spacing between characters. The value
-     * returned is in ems. Normally, this value is 0.0.
-     *
-     * @return The text letter-space value in ems.
-     */
-    public float getLetterSpacing() {
-        return mLetterSpacing;
-    }
-
-    /**
-     * Sets text letter-spacing in ems. Typical values for slight expansion will be around 0.05.
-     * Negative values tighten text.
-     *
-     * @param value A text letter-space value in ems.
-     */
-    public void setLetterSpacing(float value) {
-        mLetterSpacing = value;
-        doUpdate();
-    }
-
-    /**
-     * Returns the font feature settings. The format is the same as the CSS font-feature-settings
-     * attribute: https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
-     *
-     * @return the currently set font feature settings. Default is null.
-     */
-    @Nullable
-    public String getFontFeatureSettings() {
-        return mFontFeatureSettings;
-    }
-
-    /**
-     * Sets font feature settings. The format is the same as the CSS font-feature-settings
-     * attribute: https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
-     *
-     * @param value font feature settings represented as CSS compatible string. This value may be
-     *     null.
-     */
-    public void setFontFeatureSettings(@Nullable String value) {
-        mFontFeatureSettings = value;
-        doUpdate();
-    }
-
-    /** Returns TrueType or OpenType font variation settings. */
-    @Nullable
-    public String getFontVariationSettings() {
-        return mFontVariationSettings;
-    }
-
-    /**
-     * Sets TrueType or OpenType font variation settings.
-     *
-     * @param value font variation settings. You can pass null or empty string as no variation
-     *     settings. This value may be null
-     */
-    public void setFontVariationSettings(@Nullable String value) {
-        mFontVariationSettings = value;
-        doUpdate();
-    }
-
-    /**
-     * Gets the flags on the Paint being used to display the text.
-     *
-     * @return The flags on the Paint being used to display the text.
-     * @see Paint#getFlags
-     */
-    public int getPaintFlags() {
-        return mPaint.getFlags();
-    }
-
-    /**
-     * Sets flags on the Paint being used to display the text and reflows the text if they are
-     * different from the old flags.
-     *
-     * @see Paint#setFlags
-     */
-    public void setPaintFlags(int flags) {
-        if (mPaint.getFlags() != flags) {
-            mPaint.setFlags(flags);
-            doUpdate();
-        }
-    }
-
-    @NonNull
-    private String nullToEmpty(@Nullable String str) {
-        if (str == null) {
-            return "";
-        } else {
-            return str;
-        }
-    }
-
-    /** Nested class to avoid verification errors for methods induces in API level 26 */
-    @RequiresApi(26)
-    private static class Api26Impl {
-        private Api26Impl() {}
-
-        static void paintSetFontVariationSettings(Paint paint, String fontVariationSettings) {
-            paint.setFontVariationSettings(fontVariationSettings);
-        }
-    }
-
-    /** Nested class to avoid verification errors for methods induces in API level 28 */
-    @RequiresApi(28)
-    private static class Api28Impl {
-        private Api28Impl() {}
-
-        static Typeface createTypeface(@Nullable Typeface family, int weight, boolean italic) {
-            return Typeface.create(family, weight, italic);
-        }
-    }
-}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java
index f1cbf3b..91dc111 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java
@@ -56,8 +56,7 @@
                 // Only override a default if there's no more specific entry found.
                 if (currentEntryLength == Long.MAX_VALUE) {
                     // Let's treat an entry with no validity as being a "default", as long as we
-                    // haven't found
-                    // any other valid entries
+                    // haven't found any other valid entries
                     currentEntry = entry;
                 }
             } else {
@@ -190,31 +189,25 @@
             }
 
             // Discard if its start time is greater than the current smallest one we've found. In
-            // that
-            // case, the entry that gave us currentSmallestExpiry would be shown next.
+            // that case, the entry that gave us currentSmallestExpiry would be shown next.
             if (nextEntryValidity.getStartMillis() > currentSmallestExpiry) {
                 continue;
             }
 
             // Discard if it's less than "fromTime". This prevents accidentally returning valid
-            // times in
-            // the past.
+            // times in the past.
             if (nextEntryValidity.getStartMillis() < fromTimeMillis) {
                 continue;
             }
 
             // Finally, consider whether the length of the validity period is shorter than the
-            // current
-            // one. If this doesn't hold, the current entry would be shown instead (the timeline
-            // entry
-            // with the shortest validity period is always shown if overlapping).
+            // current one. If this doesn't hold, the current entry would be shown instead (the
+            // timeline entry with the shortest validity period is always shown if overlapping).
             //
             // We don't need to deal with the case of shortest validity between this entry, and an
-            // already
-            // chosen candidate time, as if we've got here, the start time of nextEntry is lower
-            // than
-            // the entry that is driving currentSmallestExpiry, so nextEntry would be shown
-            // regardless.
+            // already chosen candidate time, as if we've got here, the start time of nextEntry is
+            // lower than the entry that is driving currentSmallestExpiry, so nextEntry would be
+            // shown regardless.
             long nextEntryValidityLength =
                     nextEntryValidity.getEndMillis() - nextEntryValidity.getStartMillis();
 
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java
index 31fb68f..ccf786d 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java
@@ -137,8 +137,7 @@
 
         if (expiryTime != Long.MAX_VALUE) {
             // This **has** to be an instantiation like this, in order for AlarmManager#cancel to
-            // work
-            // correctly (it doesn't work on method references).
+            // work correctly (it doesn't work on method references).
             mAlarmListener =
                     new OnAlarmListener() {
                         @Override
@@ -148,8 +147,7 @@
                     };
 
             // Run on the main thread (targetHandler = null). The update has to be on the main
-            // thread so
-            // it can mutate the layout, so we might as well just do everything there.
+            // thread so it can mutate the layout, so we might as well just do everything there.
             mAlarmManager.set(
                     AlarmManager.RTC, expiryTime, TAG, mAlarmListener, /* targetHandler= */ null);
         }
diff --git a/wear/tiles/tiles-renderer/src/main/res/values/attrs.xml b/wear/tiles/tiles-renderer/src/main/res/values/attrs.xml
index 81f80a1..9ec117e 100644
--- a/wear/tiles/tiles-renderer/src/main/res/values/attrs.xml
+++ b/wear/tiles/tiles-renderer/src/main/res/values/attrs.xml
@@ -12,28 +12,6 @@
   <attr name="sweepAngleDegrees" format="float" />
   <attr name="thickness" format="dimension" />
 
-  <declare-styleable name="WearCurvedTextView">
-    <!-- supported TextView attributes -->
-    <attr name="android:text" />
-    <attr name="android:textSize" />
-    <attr name="android:textColor" />
-    <attr name="android:typeface" />
-    <attr name="android:fontFamily" />
-    <attr name="android:textStyle" />
-    <attr name="android:textFontWeight" />
-    <attr name="android:letterSpacing" />
-    <attr name="android:fontFeatureSettings" />
-    <attr name="android:fontVariationSettings" />
-    <attr name="android:textAppearance" />
-    <attr name="android:ellipsize" />
-    <!-- custom WearCurvedTextView Attributes -->
-    <attr name="anchorAngleDegrees" />
-    <attr name="anchorPosition" />
-    <attr name="minSweepDegrees" format="float" />
-    <attr name="maxSweepDegrees" format="float" />
-    <attr name="clockwise" />
-  </declare-styleable>
-
   <declare-styleable name="TextAppearance">
     <!-- Text color. -->
     <attr name="android:textColor" />
@@ -60,21 +38,6 @@
     <attr name="android:textAppearance" />
   </declare-styleable>
 
-  <declare-styleable name="WearArcLayout_Layout">
-    <attr name="layout_rotate" format="boolean" />
-    <attr name="layout_valign" format="enum">
-      <enum name="outer" value="0" />
-      <enum name="center" value="1" />
-      <enum name="inner" value="2" />
-    </attr>
-  </declare-styleable>
-
-  <declare-styleable name="WearArcLayout">
-    <attr name="anchorAngleDegrees"/>
-    <attr name="anchorPosition"/>
-    <attr name="clockwise" />
-  </declare-styleable>
-
   <declare-styleable name="WearCurvedLineView">
     <attr name="sweepAngleDegrees" />
     <attr name="thickness" />
diff --git a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/manager/UpdateSchedulerTest.java b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/manager/UpdateSchedulerTest.java
index 95c752c..c96a0bc 100644
--- a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/manager/UpdateSchedulerTest.java
+++ b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/manager/UpdateSchedulerTest.java
@@ -54,9 +54,9 @@
     public void setUp() {
         mFired = new ArrayList<>();
 
-        // Set the current time to the min interval. This is because the "last update time" inits
-        // to zero, so we can get some weird results if the starting time is lower than the min
-        // update interval (i.e. alarms being postponed where they shouldn't be)
+        // Set the current time to the min interval. This is because the "last update time" inits to
+        // zero, so we can get some weird results if the starting time is lower than the min update
+        // interval (i.e. alarms being postponed where they shouldn't be)
         mCurrentTime = MIN_INTER_UPDATE_INTERVAL_MILLIS;
 
         AlarmManager alarmManager = getApplicationContext().getSystemService(AlarmManager.class);
diff --git a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java
index 1f1d66e..7d73149 100644
--- a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java
+++ b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java
@@ -113,8 +113,7 @@
     @Test
     public void timelineCache_overlappingEntryWithDefault() {
         // Test that with a default, and an entry "on top", the entry is shown for its validity
-        // period,
-        // and the default for all other times. As an example
+        // period, and the default for all other times. As an example
         //              +---------------------+
         //              |         E1          |
         //  ...---------+---------------------+----------------...
@@ -484,8 +483,7 @@
         TilesTimelineCache timelineCache = new TilesTimelineCache(timeline);
 
         // This is really undefined behaviour at the moment, but, well, let's keep this as the
-        // assumed behaviour for now.
-        // Should just pick entry1 in this case.
+        // assumed behaviour for now. Should just pick entry1 in this case.
         expectTimelineEntryEqual(timelineCache.findTimelineEntryForTime(0L), null);
         expectTimelineEntryEqual(timelineCache.findClosestTimelineEntry(0L), entry1);
         expect.that(timelineCache.findCurrentTimelineEntryExpiry(entry1, 0L))
diff --git a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineManagerTest.java b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineManagerTest.java
index 7ee2185..f6c490f 100644
--- a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineManagerTest.java
+++ b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineManagerTest.java
@@ -71,8 +71,8 @@
                 (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
 
         // Sync the clock with the current time. This is really just to ensure that the test times
-        // we're going to use are in the future, which prevents AlarmManager (which always uses
-        // the system time :( ) from immediately firing all our alarms.
+        // we're going to use are in the future, which prevents AlarmManager (which always uses the
+        // system time :( ) from immediately firing all our alarms.
         mCurrentTime = System.currentTimeMillis();
 
         mTimelineManager = null;
@@ -280,8 +280,7 @@
     public void timelineManager_minDelayUsesCorrectEntry() {
         // This has three entries, one initial one, one that happens after MIN_DELAY/2, and one that
         // happens after MIN_DELAY. This should totally skip the middle entry, and only show the
-        // first
-        // and last entries.
+        // first and last entries.
         List<Layout> returnedLayouts = new ArrayList<>();
 
         final long cutover1Millis =
diff --git a/wear/tiles/tiles/api/current.txt b/wear/tiles/tiles/api/current.txt
index 15dda56..4209662 100644
--- a/wear/tiles/tiles/api/current.txt
+++ b/wear/tiles/tiles/api/current.txt
@@ -237,15 +237,15 @@
     field public static final int FONT_WEIGHT_BOLD = 700; // 0x2bc
     field public static final int FONT_WEIGHT_NORMAL = 400; // 0x190
     field public static final int FONT_WEIGHT_UNDEFINED = 0; // 0x0
-    field public static final int HALIGN_CENTER = 2; // 0x2
-    field public static final int HALIGN_END = 5; // 0x5
-    field public static final int HALIGN_LEFT = 1; // 0x1
-    field public static final int HALIGN_RIGHT = 3; // 0x3
-    field public static final int HALIGN_START = 4; // 0x4
-    field public static final int HALIGN_UNDEFINED = 0; // 0x0
-    field public static final int SPAN_VALIGN_BOTTOM = 1; // 0x1
-    field public static final int SPAN_VALIGN_TEXT_BASELINE = 2; // 0x2
-    field public static final int SPAN_VALIGN_UNDEFINED = 0; // 0x0
+    field public static final int HORIZONTAL_ALIGN_CENTER = 2; // 0x2
+    field public static final int HORIZONTAL_ALIGN_END = 5; // 0x5
+    field public static final int HORIZONTAL_ALIGN_LEFT = 1; // 0x1
+    field public static final int HORIZONTAL_ALIGN_RIGHT = 3; // 0x3
+    field public static final int HORIZONTAL_ALIGN_START = 4; // 0x4
+    field public static final int HORIZONTAL_ALIGN_UNDEFINED = 0; // 0x0
+    field public static final int SPAN_VERTICAL_ALIGN_BOTTOM = 1; // 0x1
+    field public static final int SPAN_VERTICAL_ALIGN_TEXT_BASELINE = 2; // 0x2
+    field public static final int SPAN_VERTICAL_ALIGN_UNDEFINED = 0; // 0x0
     field public static final int TEXT_ALIGN_CENTER = 2; // 0x2
     field public static final int TEXT_ALIGN_END = 3; // 0x3
     field public static final int TEXT_ALIGN_START = 1; // 0x1
@@ -253,10 +253,10 @@
     field public static final int TEXT_OVERFLOW_ELLIPSIZE_END = 2; // 0x2
     field public static final int TEXT_OVERFLOW_TRUNCATE = 1; // 0x1
     field public static final int TEXT_OVERFLOW_UNDEFINED = 0; // 0x0
-    field public static final int VALIGN_BOTTOM = 3; // 0x3
-    field public static final int VALIGN_CENTER = 2; // 0x2
-    field public static final int VALIGN_TOP = 1; // 0x1
-    field public static final int VALIGN_UNDEFINED = 0; // 0x0
+    field public static final int VERTICAL_ALIGN_BOTTOM = 3; // 0x3
+    field public static final int VERTICAL_ALIGN_CENTER = 2; // 0x2
+    field public static final int VERTICAL_ALIGN_TOP = 1; // 0x1
+    field public static final int VERTICAL_ALIGN_UNDEFINED = 0; // 0x0
   }
 
   public static final class LayoutElementBuilders.Arc implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
diff --git a/wear/tiles/tiles/api/public_plus_experimental_current.txt b/wear/tiles/tiles/api/public_plus_experimental_current.txt
index 9b918f5..5688279 100644
--- a/wear/tiles/tiles/api/public_plus_experimental_current.txt
+++ b/wear/tiles/tiles/api/public_plus_experimental_current.txt
@@ -238,15 +238,15 @@
     field @androidx.wear.tiles.TilesExperimental public static final int FONT_WEIGHT_MEDIUM = 500; // 0x1f4
     field public static final int FONT_WEIGHT_NORMAL = 400; // 0x190
     field public static final int FONT_WEIGHT_UNDEFINED = 0; // 0x0
-    field public static final int HALIGN_CENTER = 2; // 0x2
-    field public static final int HALIGN_END = 5; // 0x5
-    field public static final int HALIGN_LEFT = 1; // 0x1
-    field public static final int HALIGN_RIGHT = 3; // 0x3
-    field public static final int HALIGN_START = 4; // 0x4
-    field public static final int HALIGN_UNDEFINED = 0; // 0x0
-    field public static final int SPAN_VALIGN_BOTTOM = 1; // 0x1
-    field public static final int SPAN_VALIGN_TEXT_BASELINE = 2; // 0x2
-    field public static final int SPAN_VALIGN_UNDEFINED = 0; // 0x0
+    field public static final int HORIZONTAL_ALIGN_CENTER = 2; // 0x2
+    field public static final int HORIZONTAL_ALIGN_END = 5; // 0x5
+    field public static final int HORIZONTAL_ALIGN_LEFT = 1; // 0x1
+    field public static final int HORIZONTAL_ALIGN_RIGHT = 3; // 0x3
+    field public static final int HORIZONTAL_ALIGN_START = 4; // 0x4
+    field public static final int HORIZONTAL_ALIGN_UNDEFINED = 0; // 0x0
+    field public static final int SPAN_VERTICAL_ALIGN_BOTTOM = 1; // 0x1
+    field public static final int SPAN_VERTICAL_ALIGN_TEXT_BASELINE = 2; // 0x2
+    field public static final int SPAN_VERTICAL_ALIGN_UNDEFINED = 0; // 0x0
     field public static final int TEXT_ALIGN_CENTER = 2; // 0x2
     field public static final int TEXT_ALIGN_END = 3; // 0x3
     field public static final int TEXT_ALIGN_START = 1; // 0x1
@@ -254,10 +254,10 @@
     field public static final int TEXT_OVERFLOW_ELLIPSIZE_END = 2; // 0x2
     field public static final int TEXT_OVERFLOW_TRUNCATE = 1; // 0x1
     field public static final int TEXT_OVERFLOW_UNDEFINED = 0; // 0x0
-    field public static final int VALIGN_BOTTOM = 3; // 0x3
-    field public static final int VALIGN_CENTER = 2; // 0x2
-    field public static final int VALIGN_TOP = 1; // 0x1
-    field public static final int VALIGN_UNDEFINED = 0; // 0x0
+    field public static final int VERTICAL_ALIGN_BOTTOM = 3; // 0x3
+    field public static final int VERTICAL_ALIGN_CENTER = 2; // 0x2
+    field public static final int VERTICAL_ALIGN_TOP = 1; // 0x1
+    field public static final int VERTICAL_ALIGN_UNDEFINED = 0; // 0x0
   }
 
   public static final class LayoutElementBuilders.Arc implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
diff --git a/wear/tiles/tiles/api/restricted_current.txt b/wear/tiles/tiles/api/restricted_current.txt
index 15dda56..4209662 100644
--- a/wear/tiles/tiles/api/restricted_current.txt
+++ b/wear/tiles/tiles/api/restricted_current.txt
@@ -237,15 +237,15 @@
     field public static final int FONT_WEIGHT_BOLD = 700; // 0x2bc
     field public static final int FONT_WEIGHT_NORMAL = 400; // 0x190
     field public static final int FONT_WEIGHT_UNDEFINED = 0; // 0x0
-    field public static final int HALIGN_CENTER = 2; // 0x2
-    field public static final int HALIGN_END = 5; // 0x5
-    field public static final int HALIGN_LEFT = 1; // 0x1
-    field public static final int HALIGN_RIGHT = 3; // 0x3
-    field public static final int HALIGN_START = 4; // 0x4
-    field public static final int HALIGN_UNDEFINED = 0; // 0x0
-    field public static final int SPAN_VALIGN_BOTTOM = 1; // 0x1
-    field public static final int SPAN_VALIGN_TEXT_BASELINE = 2; // 0x2
-    field public static final int SPAN_VALIGN_UNDEFINED = 0; // 0x0
+    field public static final int HORIZONTAL_ALIGN_CENTER = 2; // 0x2
+    field public static final int HORIZONTAL_ALIGN_END = 5; // 0x5
+    field public static final int HORIZONTAL_ALIGN_LEFT = 1; // 0x1
+    field public static final int HORIZONTAL_ALIGN_RIGHT = 3; // 0x3
+    field public static final int HORIZONTAL_ALIGN_START = 4; // 0x4
+    field public static final int HORIZONTAL_ALIGN_UNDEFINED = 0; // 0x0
+    field public static final int SPAN_VERTICAL_ALIGN_BOTTOM = 1; // 0x1
+    field public static final int SPAN_VERTICAL_ALIGN_TEXT_BASELINE = 2; // 0x2
+    field public static final int SPAN_VERTICAL_ALIGN_UNDEFINED = 0; // 0x0
     field public static final int TEXT_ALIGN_CENTER = 2; // 0x2
     field public static final int TEXT_ALIGN_END = 3; // 0x3
     field public static final int TEXT_ALIGN_START = 1; // 0x1
@@ -253,10 +253,10 @@
     field public static final int TEXT_OVERFLOW_ELLIPSIZE_END = 2; // 0x2
     field public static final int TEXT_OVERFLOW_TRUNCATE = 1; // 0x1
     field public static final int TEXT_OVERFLOW_UNDEFINED = 0; // 0x0
-    field public static final int VALIGN_BOTTOM = 3; // 0x3
-    field public static final int VALIGN_CENTER = 2; // 0x2
-    field public static final int VALIGN_TOP = 1; // 0x1
-    field public static final int VALIGN_UNDEFINED = 0; // 0x0
+    field public static final int VERTICAL_ALIGN_BOTTOM = 3; // 0x3
+    field public static final int VERTICAL_ALIGN_CENTER = 2; // 0x2
+    field public static final int VERTICAL_ALIGN_TOP = 1; // 0x1
+    field public static final int VERTICAL_ALIGN_UNDEFINED = 0; // 0x0
   }
 
   public static final class LayoutElementBuilders.Arc implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement {
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/LayoutElementBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/LayoutElementBuilders.java
index 2feb99c..a07f141 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/LayoutElementBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/LayoutElementBuilders.java
@@ -63,27 +63,34 @@
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
-    @IntDef({HALIGN_UNDEFINED, HALIGN_LEFT, HALIGN_CENTER, HALIGN_RIGHT, HALIGN_START, HALIGN_END})
+    @IntDef({
+        HORIZONTAL_ALIGN_UNDEFINED,
+        HORIZONTAL_ALIGN_LEFT,
+        HORIZONTAL_ALIGN_CENTER,
+        HORIZONTAL_ALIGN_RIGHT,
+        HORIZONTAL_ALIGN_START,
+        HORIZONTAL_ALIGN_END
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface HorizontalAlignment {}
 
     /** Horizontal alignment is undefined. */
-    public static final int HALIGN_UNDEFINED = 0;
+    public static final int HORIZONTAL_ALIGN_UNDEFINED = 0;
 
     /** Horizontally align to the left. */
-    public static final int HALIGN_LEFT = 1;
+    public static final int HORIZONTAL_ALIGN_LEFT = 1;
 
     /** Horizontally align to center. */
-    public static final int HALIGN_CENTER = 2;
+    public static final int HORIZONTAL_ALIGN_CENTER = 2;
 
     /** Horizontally align to the right. */
-    public static final int HALIGN_RIGHT = 3;
+    public static final int HORIZONTAL_ALIGN_RIGHT = 3;
 
     /** Horizontally align to the content start (left in LTR layouts, right in RTL layouts). */
-    public static final int HALIGN_START = 4;
+    public static final int HORIZONTAL_ALIGN_START = 4;
 
     /** Horizontally align to the content end (right in LTR layouts, left in RTL layouts). */
-    public static final int HALIGN_END = 5;
+    public static final int HORIZONTAL_ALIGN_END = 5;
 
     /**
      * The vertical alignment of an element within its container.
@@ -91,21 +98,26 @@
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
-    @IntDef({VALIGN_UNDEFINED, VALIGN_TOP, VALIGN_CENTER, VALIGN_BOTTOM})
+    @IntDef({
+        VERTICAL_ALIGN_UNDEFINED,
+        VERTICAL_ALIGN_TOP,
+        VERTICAL_ALIGN_CENTER,
+        VERTICAL_ALIGN_BOTTOM
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface VerticalAlignment {}
 
     /** Vertical alignment is undefined. */
-    public static final int VALIGN_UNDEFINED = 0;
+    public static final int VERTICAL_ALIGN_UNDEFINED = 0;
 
     /** Vertically align to the top. */
-    public static final int VALIGN_TOP = 1;
+    public static final int VERTICAL_ALIGN_TOP = 1;
 
     /** Vertically align to center. */
-    public static final int VALIGN_CENTER = 2;
+    public static final int VERTICAL_ALIGN_CENTER = 2;
 
     /** Vertically align to the bottom. */
-    public static final int VALIGN_BOTTOM = 3;
+    public static final int VERTICAL_ALIGN_BOTTOM = 3;
 
     /**
      * The weight to be applied to the font.
@@ -157,26 +169,30 @@
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
-    @IntDef({SPAN_VALIGN_UNDEFINED, SPAN_VALIGN_BOTTOM, SPAN_VALIGN_TEXT_BASELINE})
+    @IntDef({
+        SPAN_VERTICAL_ALIGN_UNDEFINED,
+        SPAN_VERTICAL_ALIGN_BOTTOM,
+        SPAN_VERTICAL_ALIGN_TEXT_BASELINE
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface SpanVerticalAlignment {}
 
     /** Alignment is undefined. */
-    public static final int SPAN_VALIGN_UNDEFINED = 0;
+    public static final int SPAN_VERTICAL_ALIGN_UNDEFINED = 0;
 
     /**
      * Align to the bottom of the line (descent of the largest text in this line). If there is no
      * text in the line containing this image, this will align to the bottom of the line, where the
      * line height is defined as the height of the largest image in the line.
      */
-    public static final int SPAN_VALIGN_BOTTOM = 1;
+    public static final int SPAN_VERTICAL_ALIGN_BOTTOM = 1;
 
     /**
      * Align to the baseline of the text. Note that if the line in the {@link Spannable} which
      * contains this image does not contain any text, the effects of using this alignment are
      * undefined.
      */
-    public static final int SPAN_VALIGN_TEXT_BASELINE = 2;
+    public static final int SPAN_VERTICAL_ALIGN_TEXT_BASELINE = 2;
 
     /**
      * Alignment of a text element.
@@ -1921,7 +1937,7 @@
 
         /**
          * Gets the horizontal alignment of the element inside this {@link Box}. If not defined,
-         * defaults to HALIGN_CENTER. Intended for testing purposes only.
+         * defaults to HORIZONTAL_ALIGN_CENTER. Intended for testing purposes only.
          */
         @Nullable
         public HorizontalAlignmentProp getHorizontalAlignment() {
@@ -1934,7 +1950,7 @@
 
         /**
          * Gets the vertical alignment of the element inside this {@link Box}. If not defined,
-         * defaults to VALIGN_CENTER. Intended for testing purposes only.
+         * defaults to VERTICAL_ALIGN_CENTER. Intended for testing purposes only.
          */
         @Nullable
         public VerticalAlignmentProp getVerticalAlignment() {
@@ -2049,7 +2065,7 @@
 
             /**
              * Sets the horizontal alignment of the element inside this {@link Box}. If not defined,
-             * defaults to HALIGN_CENTER.
+             * defaults to HORIZONTAL_ALIGN_CENTER.
              */
             @NonNull
             public Builder setHorizontalAlignment(
@@ -2059,7 +2075,7 @@
             }
             /**
              * Sets the horizontal alignment of the element inside this {@link Box}. If not defined,
-             * defaults to HALIGN_CENTER.
+             * defaults to HORIZONTAL_ALIGN_CENTER.
              */
             @NonNull
             public Builder setHorizontalAlignment(@HorizontalAlignment int horizontalAlignment) {
@@ -2073,7 +2089,7 @@
 
             /**
              * Sets the vertical alignment of the element inside this {@link Box}. If not defined,
-             * defaults to VALIGN_CENTER.
+             * defaults to VERTICAL_ALIGN_CENTER.
              */
             @NonNull
             public Builder setVerticalAlignment(@NonNull VerticalAlignmentProp verticalAlignment) {
@@ -2082,7 +2098,7 @@
             }
             /**
              * Sets the vertical alignment of the element inside this {@link Box}. If not defined,
-             * defaults to VALIGN_CENTER.
+             * defaults to VERTICAL_ALIGN_CENTER.
              */
             @NonNull
             public Builder setVerticalAlignment(@VerticalAlignment int verticalAlignment) {
@@ -2316,7 +2332,7 @@
 
         /**
          * Gets alignment of this image within the line height of the surrounding {@link Spannable}.
-         * If undefined, defaults to SPAN_VALIGN_BOTTOM. Intended for testing purposes only.
+         * If undefined, defaults to SPAN_VERTICAL_ALIGN_BOTTOM. Intended for testing purposes only.
          */
         @Nullable
         public SpanVerticalAlignmentProp getAlignment() {
@@ -2425,7 +2441,7 @@
 
             /**
              * Sets alignment of this image within the line height of the surrounding {@link
-             * Spannable}. If undefined, defaults to SPAN_VALIGN_BOTTOM.
+             * Spannable}. If undefined, defaults to SPAN_VERTICAL_ALIGN_BOTTOM.
              */
             @NonNull
             public Builder setAlignment(@NonNull SpanVerticalAlignmentProp alignment) {
@@ -2434,7 +2450,7 @@
             }
             /**
              * Sets alignment of this image within the line height of the surrounding {@link
-             * Spannable}. If undefined, defaults to SPAN_VALIGN_BOTTOM.
+             * Spannable}. If undefined, defaults to SPAN_VERTICAL_ALIGN_BOTTOM.
              */
             @NonNull
             public Builder setAlignment(@SpanVerticalAlignment int alignment) {
@@ -2800,8 +2816,8 @@
 
         /**
          * Gets the horizontal alignment of elements inside this column, if they are narrower than
-         * the resulting width of the column. If not defined, defaults to HALIGN_CENTER. Intended
-         * for testing purposes only.
+         * the resulting width of the column. If not defined, defaults to HORIZONTAL_ALIGN_CENTER.
+         * Intended for testing purposes only.
          */
         @Nullable
         public HorizontalAlignmentProp getHorizontalAlignment() {
@@ -2902,7 +2918,8 @@
 
             /**
              * Sets the horizontal alignment of elements inside this column, if they are narrower
-             * than the resulting width of the column. If not defined, defaults to HALIGN_CENTER.
+             * than the resulting width of the column. If not defined, defaults to
+             * HORIZONTAL_ALIGN_CENTER.
              */
             @NonNull
             public Builder setHorizontalAlignment(
@@ -2912,7 +2929,8 @@
             }
             /**
              * Sets the horizontal alignment of elements inside this column, if they are narrower
-             * than the resulting width of the column. If not defined, defaults to HALIGN_CENTER.
+             * than the resulting width of the column. If not defined, defaults to
+             * HORIZONTAL_ALIGN_CENTER.
              */
             @NonNull
             public Builder setHorizontalAlignment(@HorizontalAlignment int horizontalAlignment) {
@@ -3017,8 +3035,8 @@
 
         /**
          * Gets the vertical alignment of elements inside this row, if they are narrower than the
-         * resulting height of the row. If not defined, defaults to VALIGN_CENTER. Intended for
-         * testing purposes only.
+         * resulting height of the row. If not defined, defaults to VERTICAL_ALIGN_CENTER. Intended
+         * for testing purposes only.
          */
         @Nullable
         public VerticalAlignmentProp getVerticalAlignment() {
@@ -3119,7 +3137,7 @@
 
             /**
              * Sets the vertical alignment of elements inside this row, if they are narrower than
-             * the resulting height of the row. If not defined, defaults to VALIGN_CENTER.
+             * the resulting height of the row. If not defined, defaults to VERTICAL_ALIGN_CENTER.
              */
             @NonNull
             public Builder setVerticalAlignment(@NonNull VerticalAlignmentProp verticalAlignment) {
@@ -3128,7 +3146,7 @@
             }
             /**
              * Sets the vertical alignment of elements inside this row, if they are narrower than
-             * the resulting height of the row. If not defined, defaults to VALIGN_CENTER.
+             * the resulting height of the row. If not defined, defaults to VERTICAL_ALIGN_CENTER.
              */
             @NonNull
             public Builder setVerticalAlignment(@VerticalAlignment int verticalAlignment) {
@@ -3258,7 +3276,7 @@
          * Gets vertical alignment of elements within the arc. If the {@link Arc}'s thickness is
          * larger than the thickness of the element being drawn, this controls whether the element
          * should be drawn towards the inner or outer edge of the arc, or drawn in the center. If
-         * not defined, defaults to VALIGN_CENTER. Intended for testing purposes only.
+         * not defined, defaults to VERTICAL_ALIGN_CENTER. Intended for testing purposes only.
          */
         @Nullable
         public VerticalAlignmentProp getVerticalAlign() {
@@ -3386,7 +3404,7 @@
              * Sets vertical alignment of elements within the arc. If the {@link Arc}'s thickness is
              * larger than the thickness of the element being drawn, this controls whether the
              * element should be drawn towards the inner or outer edge of the arc, or drawn in the
-             * center. If not defined, defaults to VALIGN_CENTER.
+             * center. If not defined, defaults to VERTICAL_ALIGN_CENTER.
              */
             @NonNull
             public Builder setVerticalAlign(@NonNull VerticalAlignmentProp verticalAlign) {
@@ -3397,7 +3415,7 @@
              * Sets vertical alignment of elements within the arc. If the {@link Arc}'s thickness is
              * larger than the thickness of the element being drawn, this controls whether the
              * element should be drawn towards the inner or outer edge of the arc, or drawn in the
-             * center. If not defined, defaults to VALIGN_CENTER.
+             * center. If not defined, defaults to VERTICAL_ALIGN_CENTER.
              */
             @NonNull
             public Builder setVerticalAlign(@VerticalAlignment int verticalAlign) {
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ModifiersBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ModifiersBuilders.java
index a70797a..ba77d87 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ModifiersBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ModifiersBuilders.java
@@ -370,8 +370,8 @@
              * side of the container if the device is using an RTL locale). If false, start/end will
              * always map to left/right, accordingly.
              */
-            @NonNull
             @SuppressLint("MissingGetterMatchingBuilder")
+            @NonNull
             public Builder setRtlAware(boolean rtlAware) {
                 mImpl.setRtlAware(TypesProto.BoolProp.newBuilder().setValue(rtlAware));
                 return this;
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
index 3965e0e7..c1d54c8 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
@@ -140,9 +140,8 @@
                         }
 
                         // This is a little suboptimal, as if an update is requested in this lock,
-                        // we'll
-                        // unbind, then immediately rebind. That said, this class should be used
-                        // pretty rarely
+                        // we'll unbind, then immediately rebind. That said, this class should be
+                        // used pretty rarely
                         // (and it'll be rare to have two in-flight update requests at once
                         // regardless), so
                         // it's probably fine.
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileProviderService.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileProviderService.java
index 5b682ae..6029f15 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileProviderService.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileProviderService.java
@@ -277,7 +277,7 @@
                                             Log.e(
                                                     TAG,
                                                     "RemoteException while returning resources"
-                                                        + " payload",
+                                                            + " payload",
                                                     ex);
                                         }
                                     },
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/EventReaders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/EventReaders.java
index f015db7..8300687 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/EventReaders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/EventReaders.java
@@ -33,7 +33,7 @@
 
     /** Reader for Tile add event parameters. */
     public static class TileAddEvent {
-        @SuppressWarnings("UnusedVariable")
+        @SuppressWarnings("unused")
         private final EventProto.TileAddEvent mProto;
 
         private TileAddEvent(@NonNull EventProto.TileAddEvent proto) {
@@ -62,7 +62,7 @@
 
     /** Reader for Tile remove event parameters. */
     public static class TileRemoveEvent {
-        @SuppressWarnings("UnusedVariable")
+        @SuppressWarnings("unused")
         private final EventProto.TileRemoveEvent mProto;
 
         private TileRemoveEvent(@NonNull EventProto.TileRemoveEvent proto) {
@@ -91,7 +91,7 @@
 
     /** Reader for Tile enter event parameters. */
     public static class TileEnterEvent {
-        @SuppressWarnings("UnusedVariable")
+        @SuppressWarnings("unused")
         private final EventProto.TileEnterEvent mProto;
 
         private TileEnterEvent(@NonNull EventProto.TileEnterEvent proto) {
@@ -120,7 +120,7 @@
 
     /** Reader for a Tile leave event parameters. */
     public static class TileLeaveEvent {
-        @SuppressWarnings("UnusedVariable")
+        @SuppressWarnings("unused")
         private final EventProto.TileLeaveEvent mProto;
 
         private TileLeaveEvent(@NonNull EventProto.TileLeaveEvent proto) {
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/RequestReaders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/RequestReaders.java
index e2f6080..4462123 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/RequestReaders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/RequestReaders.java
@@ -36,7 +36,8 @@
     /** Reader for Tile request parameters. */
     public static class TileRequest {
         private final RequestProto.TileRequest mProto;
-        @SuppressWarnings("UnusedVariable")
+
+        @SuppressWarnings("unused")
         private final int mTileId;
 
         private TileRequest(RequestProto.TileRequest proto, int tileId) {
@@ -75,7 +76,8 @@
     /** Reader for resource request parameters. */
     public static class ResourcesRequest {
         private final RequestProto.ResourcesRequest mProto;
-        @SuppressWarnings("UnusedVariable")
+
+        @SuppressWarnings("unused")
         private final int mTileId;
 
         private ResourcesRequest(@NonNull RequestProto.ResourcesRequest proto, int tileId) {
diff --git a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileProviderServiceTest.java b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileProviderServiceTest.java
index 7922dfe..0a3e8f7 100644
--- a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileProviderServiceTest.java
+++ b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileProviderServiceTest.java
@@ -136,8 +136,7 @@
 
     @Test
     public void tileProvider_onTileAdd() throws Exception {
-        EventProto.TileAddEvent addRequest =
-                EventProto.TileAddEvent.getDefaultInstance();
+        EventProto.TileAddEvent addRequest = EventProto.TileAddEvent.getDefaultInstance();
         mTileProviderServiceStub.onTileAddEvent(
                 new TileAddEventData(addRequest.toByteArray(), TileAddEventData.VERSION_PROTOBUF));
         shadowOf(Looper.getMainLooper()).idle();
@@ -147,8 +146,7 @@
 
     @Test
     public void tileProvider_onTileRemove() throws Exception {
-        EventProto.TileRemoveEvent removeRequest =
-                EventProto.TileRemoveEvent.getDefaultInstance();
+        EventProto.TileRemoveEvent removeRequest = EventProto.TileRemoveEvent.getDefaultInstance();
         mTileProviderServiceStub.onTileRemoveEvent(
                 new TileRemoveEventData(
                         removeRequest.toByteArray(), TileRemoveEventData.VERSION_PROTOBUF));
@@ -159,8 +157,7 @@
 
     @Test
     public void tileProvider_onTileEnter() throws Exception {
-        EventProto.TileEnterEvent enterRequest =
-                EventProto.TileEnterEvent.getDefaultInstance();
+        EventProto.TileEnterEvent enterRequest = EventProto.TileEnterEvent.getDefaultInstance();
         mTileProviderServiceStub.onTileEnterEvent(
                 new TileEnterEventData(
                         enterRequest.toByteArray(), TileEnterEventData.VERSION_PROTOBUF));
@@ -171,8 +168,7 @@
 
     @Test
     public void tileProvider_onTileLeave() throws Exception {
-        EventProto.TileLeaveEvent leaveRequest =
-                EventProto.TileLeaveEvent.getDefaultInstance();
+        EventProto.TileLeaveEvent leaveRequest = EventProto.TileLeaveEvent.getDefaultInstance();
         mTileProviderServiceStub.onTileLeaveEvent(
                 new TileLeaveEventData(
                         leaveRequest.toByteArray(), TileLeaveEventData.VERSION_PROTOBUF));
diff --git a/wear/wear-complications-data/api/restricted_current.txt b/wear/wear-complications-data/api/restricted_current.txt
index 4b1188f..77a59ce 100644
--- a/wear/wear-complications-data/api/restricted_current.txt
+++ b/wear/wear-complications-data/api/restricted_current.txt
@@ -1,5 +1,5 @@
 // Signature format: 4.0
-package android.support.wearable.complications {
+package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) android.support.wearable.complications {
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ComplicationData implements android.os.Parcelable {
     method public int describeContents();
diff --git a/wear/wear-complications-data/lint-baseline.xml b/wear/wear-complications-data/lint-baseline.xml
index f8bdf29..026027f 100644
--- a/wear/wear-complications-data/lint-baseline.xml
+++ b/wear/wear-complications-data/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanTargetApiAnnotation"
@@ -8,7 +8,7 @@
         errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/wear/complications/ComplicationHelperActivity.java"
-            line="59"
+            line="60"
             column="1"/>
     </issue>
 
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java b/wear/wear-complications-data/src/main/java/android/support/wearable/complications/package-info.java
similarity index 62%
copy from camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
copy to wear/wear-complications-data/src/main/java/android/support/wearable/complications/package-info.java
index bfc1884..7aa7905 100644
--- a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
+++ b/wear/wear-complications-data/src/main/java/android/support/wearable/complications/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY_GROUP)
+package android.support.wearable.complications;
 
-import static org.junit.Assert.assertNotNull;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
-import org.junit.Test;
-
-public class VersionNameTest {
-    @Test
-    public void testCurrentVersion_shouldNotEmpty() {
-        assertNotNull(VersionName.getCurrentVersion().getVersion());
-    }
-}
+import androidx.annotation.RestrictTo;
diff --git a/wear/wear-input/src/main/res/values-ar/strings.xml b/wear/wear-input/src/main/res/values-ar/strings.xml
index 4db3150..d038e78 100644
--- a/wear/wear-input/src/main/res/values-ar/strings.xml
+++ b/wear/wear-input/src/main/res/values-ar/strings.xml
@@ -3,7 +3,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="buttons_round_top_center" msgid="5559087816427379703">"الأعلى"</string>
     <string name="buttons_round_top_right" msgid="4871780374047139328">"أعلى اليمين"</string>
-    <string name="buttons_round_center_right" msgid="1509579668330531551">"توسيط لليمين"</string>
+    <string name="buttons_round_center_right" msgid="1509579668330531551">"أوسط اليمين"</string>
     <string name="buttons_round_bottom_right" msgid="2377403938095293895">"أسفل اليمين"</string>
     <string name="buttons_round_bottom_center" msgid="7330585893633364324">"الأسفل"</string>
     <string name="buttons_round_bottom_left" msgid="2128239325315047486">"أسفل اليسار"</string>
@@ -21,7 +21,7 @@
     <string name="buttons_rect_left_center" msgid="2090348335774325845">"توسيط لليسار"</string>
     <string name="buttons_rect_left_bottom" msgid="2890382227404669440">"الأسفل، جهة اليسار"</string>
     <string name="buttons_rect_right_top" msgid="8781047384037217975">"الأعلى، جهة اليمين"</string>
-    <string name="buttons_rect_right_center" msgid="9046922334870476704">"توسيط لليمين"</string>
+    <string name="buttons_rect_right_center" msgid="9046922334870476704">"أوسط اليمين"</string>
     <string name="buttons_rect_right_bottom" msgid="231110280868923853">"الأسفل، جهة اليمين"</string>
     <string name="buttons_rect_top_left" msgid="7572206729575579647">"أعلى اليسار"</string>
     <string name="buttons_rect_top_center" msgid="79705740801041383">"الأعلى"</string>
diff --git a/wear/wear-ongoing/api/current.txt b/wear/wear-ongoing/api/current.txt
index edd5ae4..9eb1123 100644
--- a/wear/wear-ongoing/api/current.txt
+++ b/wear/wear-ongoing/api/current.txt
@@ -12,6 +12,7 @@
     method public androidx.wear.ongoing.Status? getStatus();
     method public String? getTag();
     method public long getTimestamp();
+    method public String? getTitle();
     method public android.app.PendingIntent getTouchIntent();
     method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context, java.util.function.Predicate<androidx.wear.ongoing.OngoingActivity!>);
     method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context);
@@ -31,6 +32,7 @@
     method public androidx.wear.ongoing.OngoingActivity.Builder setStaticIcon(android.graphics.drawable.Icon);
     method public androidx.wear.ongoing.OngoingActivity.Builder setStaticIcon(@DrawableRes int);
     method public androidx.wear.ongoing.OngoingActivity.Builder setStatus(androidx.wear.ongoing.Status);
+    method public androidx.wear.ongoing.OngoingActivity.Builder setTitle(String);
     method public androidx.wear.ongoing.OngoingActivity.Builder setTouchIntent(android.app.PendingIntent);
   }
 
diff --git a/wear/wear-ongoing/api/public_plus_experimental_current.txt b/wear/wear-ongoing/api/public_plus_experimental_current.txt
index edd5ae4..9eb1123 100644
--- a/wear/wear-ongoing/api/public_plus_experimental_current.txt
+++ b/wear/wear-ongoing/api/public_plus_experimental_current.txt
@@ -12,6 +12,7 @@
     method public androidx.wear.ongoing.Status? getStatus();
     method public String? getTag();
     method public long getTimestamp();
+    method public String? getTitle();
     method public android.app.PendingIntent getTouchIntent();
     method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context, java.util.function.Predicate<androidx.wear.ongoing.OngoingActivity!>);
     method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context);
@@ -31,6 +32,7 @@
     method public androidx.wear.ongoing.OngoingActivity.Builder setStaticIcon(android.graphics.drawable.Icon);
     method public androidx.wear.ongoing.OngoingActivity.Builder setStaticIcon(@DrawableRes int);
     method public androidx.wear.ongoing.OngoingActivity.Builder setStatus(androidx.wear.ongoing.Status);
+    method public androidx.wear.ongoing.OngoingActivity.Builder setTitle(String);
     method public androidx.wear.ongoing.OngoingActivity.Builder setTouchIntent(android.app.PendingIntent);
   }
 
diff --git a/wear/wear-ongoing/api/restricted_current.txt b/wear/wear-ongoing/api/restricted_current.txt
index edd5ae4..9eb1123 100644
--- a/wear/wear-ongoing/api/restricted_current.txt
+++ b/wear/wear-ongoing/api/restricted_current.txt
@@ -12,6 +12,7 @@
     method public androidx.wear.ongoing.Status? getStatus();
     method public String? getTag();
     method public long getTimestamp();
+    method public String? getTitle();
     method public android.app.PendingIntent getTouchIntent();
     method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context, java.util.function.Predicate<androidx.wear.ongoing.OngoingActivity!>);
     method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context);
@@ -31,6 +32,7 @@
     method public androidx.wear.ongoing.OngoingActivity.Builder setStaticIcon(android.graphics.drawable.Icon);
     method public androidx.wear.ongoing.OngoingActivity.Builder setStaticIcon(@DrawableRes int);
     method public androidx.wear.ongoing.OngoingActivity.Builder setStatus(androidx.wear.ongoing.Status);
+    method public androidx.wear.ongoing.OngoingActivity.Builder setTitle(String);
     method public androidx.wear.ongoing.OngoingActivity.Builder setTouchIntent(android.app.PendingIntent);
   }
 
diff --git a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivity.java b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivity.java
index c51d447..dd65d05 100644
--- a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivity.java
+++ b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivity.java
@@ -106,6 +106,7 @@
         private LocusIdCompat mLocusId;
         private int mOngoingActivityId = DEFAULT_ID;
         private String mCategory;
+        private String mTitle;
 
         static final int DEFAULT_ID = -1;
 
@@ -242,6 +243,16 @@
         }
 
         /**
+         * Sets the Title of this {@link OngoingActivity}, this could be used by the launcher to
+         * override the app's title.
+         */
+        @NonNull
+        public Builder setTitle(@NonNull String title) {
+            mTitle = title;
+            return this;
+        }
+
+        /**
          * Combine all options provided and the information in the notification if needed,
          * return a new {@link OngoingActivity} object.
          *
@@ -288,7 +299,8 @@
                         locusId == null ? null : locusId.getId(),
                         mOngoingActivityId,
                         category,
-                        SystemClock.elapsedRealtime()
+                        SystemClock.elapsedRealtime(),
+                        mTitle
                     ));
         }
     }
@@ -384,6 +396,14 @@
     }
 
     /**
+     * Get the title of this {@link OngoingActivity} if set.
+     */
+    @Nullable
+    public String getTitle() {
+        return mData.getTitle();
+    }
+
+    /**
      * Notify the system that this activity should be shown as an Ongoing Activity.
      *
      * This will modify the notification builder associated with this Ongoing Activity, so needs
diff --git a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivityData.java b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivityData.java
index 9e06859..75bc162 100644
--- a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivityData.java
+++ b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivityData.java
@@ -17,7 +17,6 @@
 
 import android.app.PendingIntent;
 import android.graphics.drawable.Icon;
-import android.os.SystemClock;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -65,6 +64,10 @@
     @ParcelField(value = 8)
     long mTimestamp;
 
+    @Nullable
+    @ParcelField(value = 9, defaultValue = "null")
+    String mTitle;
+
     // Required by VersionedParcelable
     OngoingActivityData() {
     }
@@ -77,7 +80,8 @@
             @Nullable String locusId,
             int ongoingActivityId,
             @Nullable String category,
-            long timestamp
+            long timestamp,
+            @Nullable String title
     ) {
         mAnimatedIcon = animatedIcon;
         mStaticIcon = staticIcon;
@@ -87,81 +91,52 @@
         mOngoingActivityId = ongoingActivityId;
         mCategory = category;
         mTimestamp = timestamp;
+        mTitle = title;
     }
 
-    /**
-     * Get the animated icon that can be used on some surfaces to represent this
-     * {@link OngoingActivity}. For example, in the WatchFace.
-     */
     @Nullable
-    public Icon getAnimatedIcon() {
+    Icon getAnimatedIcon() {
         return mAnimatedIcon;
     }
 
-    /**
-     * Get the static icon that can be used on some surfaces to represent this
-     * {@link OngoingActivity}. For example in the WatchFace in ambient mode. If not set, returns
-     *  the small icon of the corresponding Notification.
-     */
     @NonNull
-    public Icon getStaticIcon() {
+    Icon getStaticIcon() {
         return mStaticIcon;
     }
 
-    /**
-     * Get the status of this ongoing activity, the status may be displayed on the UI to
-     * show progress of the Ongoing Activity. If not set, returns the content text of the
-     * corresponding Notification.
-     */
     @Nullable
-    public OngoingActivityStatus getStatus() {
+    OngoingActivityStatus getStatus() {
         return mStatus;
     }
 
-    /**
-     * Get the intent to be used to go back to the activity when the user interacts with the
-     * Ongoing Activity in other surfaces (for example, taps the Icon on the WatchFace). If not
-     * set, returns the touch intent of the corresponding Notification.
-     */
     @NonNull
-    public PendingIntent getTouchIntent() {
+    PendingIntent getTouchIntent() {
         return mTouchIntent;
     }
 
-    /**
-     * Get the LocusId of this {@link OngoingActivity}, this can be used by the launcher to
-     * identify the corresponding launcher item and display it accordingly. If not set, returns
-     * the one in the corresponding Notification.
-     */
     @Nullable
-    public LocusIdCompat getLocusId() {
+    LocusIdCompat getLocusId() {
         return mLocusId == null ? null : new LocusIdCompat(mLocusId);
     }
 
-    /**
-     * Give the id to this {@link OngoingActivity}, as a way to reference it in
-     * [fromExistingOngoingActivity]
-     */
-    public int getOngoingActivityId() {
+    int getOngoingActivityId() {
         return mOngoingActivityId;
     }
 
-    /**
-     * Get the Category of this {@link OngoingActivity} if set, otherwise the category of the
-     * corresponding notification.
-     */
     @Nullable
-    public String getCategory() {
+    String getCategory() {
         return mCategory;
     }
 
-    /**
-     * Get the time (in {@link SystemClock#elapsedRealtime()} time) the OngoingActivity was built.
-     */
-    public long getTimestamp() {
+    long getTimestamp() {
         return mTimestamp;
     }
 
+    @Nullable
+    String getTitle() {
+        return mTitle;
+    }
+
     // Status is mutable, by the library.
     void setStatus(@NonNull OngoingActivityStatus status) {
         mStatus = status;
diff --git a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/SerializationHelper.java b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/SerializationHelper.java
index 5e6d10b..65ade31 100644
--- a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/SerializationHelper.java
+++ b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/SerializationHelper.java
@@ -66,15 +66,14 @@
 
     /**
      * Copies an Ongoing Activity information from a bundle to another, without deserializing
-     * and serializing (Note that Bundle instance is shared, not copied and deserializing the
-     * Ongoing activity information somewhere else negates the advantages of using this)
+     * and serializing (this needs to be done before accessing the source Bundle)
      *
      * @param sourceBundle The bundle to get the Ongoing Activity data from
      * @param destinationBundle The bundle to put the Ongoing Activity data into.
      */
     public static void copy(@NonNull Bundle sourceBundle, @NonNull Bundle destinationBundle) {
         destinationBundle.putBundle(EXTRA_ONGOING_ACTIVITY,
-                sourceBundle.getBundle(EXTRA_ONGOING_ACTIVITY));
+                new Bundle(sourceBundle.getBundle(EXTRA_ONGOING_ACTIVITY)));
     }
 
     /**
diff --git a/wear/wear-ongoing/src/test/java/androidx/wear/ongoing/OngoingActivityTest.kt b/wear/wear-ongoing/src/test/java/androidx/wear/ongoing/OngoingActivityTest.kt
index 1519bf6..93290b7 100644
--- a/wear/wear-ongoing/src/test/java/androidx/wear/ongoing/OngoingActivityTest.kt
+++ b/wear/wear-ongoing/src/test/java/androidx/wear/ongoing/OngoingActivityTest.kt
@@ -34,6 +34,7 @@
     )
     private val NotificationId = 4321
     private val ChannelId = "ChannelId"
+    private val Title = "AppTitle"
 
     private lateinit var context: Context
     private lateinit var notificationManager: NotificationManager
@@ -78,6 +79,7 @@
             .setOngoingActivityId(OaId)
             .setStatus(BasicStatus)
             .setTouchIntent(PendingIntentValue)
+            .setTitle(Title)
             .build()
         oa.apply(context)
 
@@ -91,6 +93,7 @@
         assertEquals(OaId, received.ongoingActivityId)
         // TODO(ssancho): check status
         assertEquals(PendingIntentValue, received.touchIntent)
+        assertEquals(Title, received.title)
     }
 
     @Test
@@ -103,6 +106,7 @@
             .setOngoingActivityId(OaId)
             .setStatus(BasicStatus)
             .setTouchIntent(PendingIntentValue)
+            .setTitle(Title)
             .build()
         oa.apply(context)
         notificationManager.notify(NotificationId, builder.build())
@@ -126,6 +130,7 @@
         assertEquals(OaId, received.ongoingActivityId)
         // TODO(ssancho): check status
         assertEquals(PendingIntentValue, received.touchIntent)
+        assertEquals(Title, received.title)
 
         notificationManager.cancel(NotificationId)
     }
@@ -193,6 +198,7 @@
             .setOngoingActivityId(OaId)
             .setStatus(BasicStatus)
             .setTouchIntent(PendingIntentValue)
+            .setTitle(Title)
             .build()
         oa.apply(context)
         val notification = builder.build()
@@ -209,6 +215,7 @@
         assertEquals(OaId, received.ongoingActivityId)
         // TODO(ssancho): check status
         assertEquals(PendingIntentValue, received.touchIntent)
+        assertEquals(Title, received.title)
     }
 
     @Test
diff --git a/wear/wear-remote-interactions/build.gradle b/wear/wear-remote-interactions/build.gradle
index c1a1071..3eb34f4 100644
--- a/wear/wear-remote-interactions/build.gradle
+++ b/wear/wear-remote-interactions/build.gradle
@@ -40,7 +40,7 @@
     testImplementation(libs.mockitoCore)
     testImplementation(libs.mockitoKotlin)
 
-    implementation(libs.playServicesBase)
+    implementation(libs.playServicesBasement)
 }
 
 android {
diff --git a/wear/wear-remote-interactions/src/main/java/androidx/wear/remote/interactions/PlayStoreAvailability.kt b/wear/wear-remote-interactions/src/main/java/androidx/wear/remote/interactions/PlayStoreAvailability.kt
index 70765b7..9fb132f 100644
--- a/wear/wear-remote-interactions/src/main/java/androidx/wear/remote/interactions/PlayStoreAvailability.kt
+++ b/wear/wear-remote-interactions/src/main/java/androidx/wear/remote/interactions/PlayStoreAvailability.kt
@@ -22,7 +22,7 @@
 import androidx.annotation.IntDef
 import androidx.annotation.RequiresApi
 import com.google.android.gms.common.ConnectionResult
-import com.google.android.gms.common.GoogleApiAvailability
+import com.google.android.gms.common.GoogleApiAvailabilityLight
 
 /**
  * Helper class for checking whether the phone paired to a given Wear OS device has the Play Store.
@@ -77,7 +77,7 @@
 
             if (!isCurrentDeviceAWatch) {
                 val isPlayServiceAvailable =
-                    GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)
+                    GoogleApiAvailabilityLight.getInstance().isGooglePlayServicesAvailable(context)
                 return if (isPlayServiceAvailable == ConnectionResult.SUCCESS) PLAY_STORE_AVAILABLE
                 else PLAY_STORE_UNAVAILABLE
             }
diff --git a/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt b/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
index 3332a2c..92050d7 100644
--- a/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
+++ b/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
@@ -24,7 +24,6 @@
 import android.graphics.RectF
 import android.os.Handler
 import android.os.Looper
-import android.service.wallpaper.WallpaperService
 import android.view.Surface
 import android.view.SurfaceHolder
 import androidx.test.core.app.ApplicationProvider
@@ -71,9 +70,12 @@
 import androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption
 import androidx.wear.watchface.style.WatchFaceLayer
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.android.asCoroutineDispatcher
 import kotlinx.coroutines.async
+import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.withTimeout
 import org.junit.After
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertNull
@@ -88,6 +90,7 @@
 import org.mockito.MockitoAnnotations
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeoutException
 
 private const val CONNECT_TIMEOUT_MILLIS = 500L
 private const val DESTROY_TIMEOUT_MILLIS = 500L
@@ -110,9 +113,10 @@
 
     @Mock
     private lateinit var surface: Surface
-    private lateinit var engine: WallpaperService.Engine
+    private lateinit var engine: WatchFaceService.EngineWrapper
     private val handler = Handler(Looper.getMainLooper())
-    private val engineLatch = CountDownLatch(1)
+    private val handlerCoroutineScope =
+        CoroutineScope(Handler(handler.looper).asCoroutineDispatcher())
     private lateinit var wallpaperService: TestExampleCanvasAnalogWatchFaceService
 
     @Before
@@ -128,6 +132,8 @@
 
     @After
     public fun tearDown() {
+        // Interactive instances are not currently shut down when all instances go away. E.g. WCS
+        // crashing does not cause the watch face to stop. So we need to shut down explicitly.
         if (this::engine.isInitialized) {
             val latch = CountDownLatch(1)
             handler.post {
@@ -173,17 +179,24 @@
     )
 
     private fun createEngine() {
+        // onCreateEngine must run after getOrCreateInteractiveWatchFaceClient. To ensure the
+        // ordering relationship both calls should run on the same handler.
         handler.post {
-            engine = wallpaperService.onCreateEngine()
-            engine.onSurfaceChanged(
-                surfaceHolder,
-                0,
-                surfaceHolder.surfaceFrame.width(),
-                surfaceHolder.surfaceFrame.height()
-            )
-            engineLatch.countDown()
+            engine = wallpaperService.onCreateEngine() as WatchFaceService.EngineWrapper
         }
-        engineLatch.await(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+    }
+
+    private fun <X> awaitWithTimeout(thing: Deferred<X>): X {
+        var value: X? = null
+        val latch = CountDownLatch(1)
+        handlerCoroutineScope.launch {
+            value = thing.await()
+            latch.countDown()
+        }
+        if (!latch.await(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)) {
+            throw TimeoutException("Timeout waiting for thing!")
+        }
+        return value!!
     }
 
     @Test
@@ -376,8 +389,8 @@
     }
 
     @Test
-    public fun getOrCreateInteractiveWatchFaceClient(): Unit = runBlocking {
-        val deferredInteractiveInstance = async {
+    public fun getOrCreateInteractiveWatchFaceClient() {
+        val deferredInteractiveInstance = handlerCoroutineScope.async {
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -388,11 +401,9 @@
         }
 
         // Create the engine which triggers creation of InteractiveWatchFaceClient.
-        async { createEngine() }
+        createEngine()
 
-        val interactiveInstance = withTimeout(CONNECT_TIMEOUT_MILLIS) {
-            deferredInteractiveInstance.await()
-        }
+        val interactiveInstance = awaitWithTimeout(deferredInteractiveInstance)
 
         val bitmap = interactiveInstance.renderWatchFaceToBitmap(
             RenderParameters(
@@ -413,8 +424,8 @@
     }
 
     @Test
-    public fun getOrCreateInteractiveWatchFaceClient_initialStyle(): Unit = runBlocking {
-        val deferredInteractiveInstance = async {
+    public fun getOrCreateInteractiveWatchFaceClient_initialStyle() {
+        val deferredInteractiveInstance = handlerCoroutineScope.async {
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -432,11 +443,9 @@
         }
 
         // Create the engine which triggers creation of InteractiveWatchFaceClient.
-        async { createEngine() }
+        createEngine()
 
-        val interactiveInstance = withTimeout(CONNECT_TIMEOUT_MILLIS) {
-            deferredInteractiveInstance.await()
-        }
+        val interactiveInstance = awaitWithTimeout(deferredInteractiveInstance)
 
         val bitmap = interactiveInstance.renderWatchFaceToBitmap(
             RenderParameters(
@@ -457,8 +466,8 @@
     }
 
     @Test
-    public fun interactiveWatchFaceClient_ComplicationDetails(): Unit = runBlocking {
-        val deferredInteractiveInstance = async {
+    public fun interactiveWatchFaceClient_ComplicationDetails() {
+        val deferredInteractiveInstance = handlerCoroutineScope.async {
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -469,11 +478,9 @@
         }
 
         // Create the engine which triggers creation of InteractiveWatchFaceClient.
-        async { createEngine() }
+        createEngine()
 
-        val interactiveInstance = withTimeout(CONNECT_TIMEOUT_MILLIS) {
-            deferredInteractiveInstance.await()
-        }
+        val interactiveInstance = awaitWithTimeout(deferredInteractiveInstance)
 
         interactiveInstance.updateComplicationData(
             mapOf(
@@ -542,8 +549,8 @@
     }
 
     @Test
-    public fun getOrCreateInteractiveWatchFaceClient_existingOpenInstance(): Unit = runBlocking {
-        val deferredInteractiveInstance = async {
+    public fun getOrCreateInteractiveWatchFaceClient_existingOpenInstance() {
+        val deferredInteractiveInstance = handlerCoroutineScope.async {
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -554,13 +561,11 @@
         }
 
         // Create the engine which triggers creation of InteractiveWatchFaceClient.
-        async { createEngine() }
+        createEngine()
 
-        withTimeout(CONNECT_TIMEOUT_MILLIS) {
-            deferredInteractiveInstance.await()
-        }
+        awaitWithTimeout(deferredInteractiveInstance)
 
-        withTimeout(CONNECT_TIMEOUT_MILLIS) {
+        val deferredInteractiveInstance2 = handlerCoroutineScope.async {
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -569,11 +574,13 @@
                 complications
             )
         }
+
+        assertThat(awaitWithTimeout(deferredInteractiveInstance2).instanceId).isEqualTo("testId")
     }
 
     @Test
-    public fun getOrCreateInteractiveWatchFaceClient_existingClosedInstance(): Unit = runBlocking {
-        val deferredInteractiveInstance = async {
+    public fun getOrCreateInteractiveWatchFaceClient_existingClosedInstance() {
+        val deferredInteractiveInstance = handlerCoroutineScope.async {
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -584,18 +591,17 @@
         }
 
         // Create the engine which triggers creation of InteractiveWatchFaceClient.
-        async { createEngine() }
+        createEngine()
 
         // Wait for the instance to be created.
-        val interactiveInstance = withTimeout(CONNECT_TIMEOUT_MILLIS) {
-            deferredInteractiveInstance.await()
-        }
+        val interactiveInstance = awaitWithTimeout(deferredInteractiveInstance)
+
         // Closing this interface means the subsequent
         // getOrCreateInteractiveWatchFaceClient won't immediately return
         // a resolved future.
         interactiveInstance.close()
 
-        val deferredExistingInstance = async {
+        val deferredExistingInstance = handlerCoroutineScope.async {
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -609,23 +615,15 @@
 
         // We don't want to leave a pending request or it'll mess up subsequent tests.
         handler.post {
-            engine = wallpaperService.onCreateEngine()
-            engine.onSurfaceChanged(
-                surfaceHolder,
-                0,
-                surfaceHolder.surfaceFrame.width(),
-                surfaceHolder.surfaceFrame.height()
-            )
+            wallpaperService.onCreateEngine() as WatchFaceService.EngineWrapper
         }
 
-        withTimeout(CONNECT_TIMEOUT_MILLIS) {
-            deferredExistingInstance.await()
-        }
+        awaitWithTimeout(deferredExistingInstance)
     }
 
     @Test
-    public fun getInteractiveWatchFaceInstance(): Unit = runBlocking {
-        val deferredInteractiveInstance = async {
+    public fun getInteractiveWatchFaceInstance() {
+        val deferredInteractiveInstance = handlerCoroutineScope.async {
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -636,12 +634,10 @@
         }
 
         // Create the engine which triggers creation of InteractiveWatchFaceClient.
-        async { createEngine() }
+        createEngine()
 
         // Wait for the instance to be created.
-        withTimeout(CONNECT_TIMEOUT_MILLIS) {
-            deferredInteractiveInstance.await()
-        }
+        awaitWithTimeout(deferredInteractiveInstance)
 
         val sysUiInterface =
             service.getInteractiveWatchFaceClientInstance("testId")!!
@@ -667,8 +663,8 @@
     }
 
     @Test
-    public fun additionalContentDescriptionLabels(): Unit = runBlocking {
-        val deferredInteractiveInstance = async {
+    public fun additionalContentDescriptionLabels() {
+        val deferredInteractiveInstance = handlerCoroutineScope.async {
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -679,12 +675,15 @@
         }
 
         // Create the engine which triggers creation of InteractiveWatchFaceClient.
-        async { createEngine() }
+        createEngine()
 
         // Wait for the instance to be created.
-        withTimeout(CONNECT_TIMEOUT_MILLIS) {
-            deferredInteractiveInstance.await()
-        }
+        val interactiveInstance = awaitWithTimeout(deferredInteractiveInstance)
+
+        // We need to wait for watch face init to have completed before lateinit
+        // wallpaperService.watchFace will be assigned. To do this we issue an arbitrary API
+        // call which by necessity awaits full initialization.
+        interactiveInstance.complicationsState
 
         // Add some additional ContentDescriptionLabels
         wallpaperService.watchFace.renderer.additionalContentDescriptionLabels = listOf(
@@ -739,8 +738,8 @@
     }
 
     @Test
-    public fun updateInstance(): Unit = runBlocking {
-        val deferredInteractiveInstance = async {
+    public fun updateInstance() {
+        val deferredInteractiveInstance = handlerCoroutineScope.async {
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -758,14 +757,10 @@
         }
 
         // Create the engine which triggers creation of InteractiveWatchFaceClient.
-        async { createEngine() }
+        createEngine()
 
         // Wait for the instance to be created.
-        val interactiveInstance = runBlocking {
-            withTimeout(CONNECT_TIMEOUT_MILLIS) {
-                deferredInteractiveInstance.await()
-            }
-        }
+        val interactiveInstance = awaitWithTimeout(deferredInteractiveInstance)
 
         assertThat(interactiveInstance.instanceId).isEqualTo("testId")
 
@@ -818,8 +813,8 @@
     }
 
     @Test
-    public fun getComplicationIdAt(): Unit = runBlocking {
-        val deferredInteractiveInstance = async {
+    public fun getComplicationIdAt() {
+        val deferredInteractiveInstance = handlerCoroutineScope.async {
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -830,11 +825,9 @@
         }
 
         // Create the engine which triggers creation of InteractiveWatchFaceClient.
-        async { createEngine() }
+        createEngine()
 
-        val interactiveInstance = withTimeout(CONNECT_TIMEOUT_MILLIS) {
-            deferredInteractiveInstance.await()
-        }
+        val interactiveInstance = awaitWithTimeout(deferredInteractiveInstance)
 
         assertNull(interactiveInstance.getComplicationIdAt(0, 0))
         assertThat(interactiveInstance.getComplicationIdAt(85, 165)).isEqualTo(
@@ -847,23 +840,9 @@
     }
 
     @Test
-    public fun crashingWatchFace(): Unit = runBlocking {
+    public fun crashingWatchFace() {
         val wallpaperService = TestCrashingWatchFaceServiceWithBaseContext()
-
-        // Create the engine which triggers the crashing watchface
-        async {
-            handler.post {
-                engine = wallpaperService.onCreateEngine()
-                engine.onSurfaceChanged(
-                    surfaceHolder,
-                    0,
-                    surfaceHolder.surfaceFrame.width(),
-                    surfaceHolder.surfaceFrame.height()
-                )
-            }
-        }
-
-        try {
+        val client = handlerCoroutineScope.async {
             service.getOrCreateInteractiveWatchFaceClient(
                 "testId",
                 deviceConfig,
@@ -871,13 +850,19 @@
                 null,
                 complications
             )
+        }
+
+        // Create the engine which triggers the crashing watchface.
+        handler.post {
+            engine = wallpaperService.onCreateEngine() as WatchFaceService.EngineWrapper
+        }
+
+        try {
+            // The first call on the interface should report the crash.
+            awaitWithTimeout(client).complicationsState
             fail("Expected an exception to be thrown because the watchface crashed on init")
         } catch (e: Exception) {
-            assertThat(e).isInstanceOf(
-                WatchFaceControlClient.ServiceStartFailureException::class.java
-            )
-            assertThat(e).hasMessageThat().contains("Watchface crashed during init")
-            assertThat(e).hasMessageThat().contains("exceptionMessage: Deliberately crashing")
+            assertThat(e.toString()).contains("Deliberately crashing")
         }
     }
 
@@ -1011,4 +996,4 @@
     init {
         attachBaseContext(ApplicationProvider.getApplicationContext<Context>())
     }
-}
\ No newline at end of file
+}
diff --git a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
index 7c8eb54..513e655 100644
--- a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
+++ b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
@@ -81,14 +81,17 @@
             intent: Intent
         ): WatchFaceControlClient {
             val deferredService = CompletableDeferred<IWatchFaceControlService>()
+            val traceEvent = AsyncTraceEvent("WatchFaceControlClientImpl.bindService")
             val serviceConnection = object : ServiceConnection {
                 override fun onServiceConnected(name: ComponentName, binder: IBinder) {
+                    traceEvent.close()
                     deferredService.complete(IWatchFaceControlService.Stub.asInterface(binder))
                 }
 
                 override fun onServiceDisconnected(name: ComponentName?) {
                     // Note if onServiceConnected is called first completeExceptionally will do
                     // nothing because the CompletableDeferred is already completed.
+                    traceEvent.close()
                     deferredService.completeExceptionally(ServiceStartFailureException())
                 }
             }
@@ -98,6 +101,7 @@
                     Context.BIND_AUTO_CREATE or Context.BIND_IMPORTANT
                 )
             ) {
+                traceEvent.close()
                 throw ServiceNotBoundException()
             }
             return WatchFaceControlClientImpl(
diff --git a/wear/wear-watchface-data/api/restricted_current.txt b/wear/wear-watchface-data/api/restricted_current.txt
index dc55cb7..12e7670 100644
--- a/wear/wear-watchface-data/api/restricted_current.txt
+++ b/wear/wear-watchface-data/api/restricted_current.txt
@@ -1,5 +1,5 @@
 // Signature format: 4.0
-package android.support.wearable.watchface {
+package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) android.support.wearable.watchface {
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Constants {
     field public static final String ACTION_REQUEST_STATE = "com.google.android.wearable.watchfaces.action.REQUEST_STATE";
@@ -24,7 +24,6 @@
     field public static final String EXTRA_INTERRUPTION_FILTER = "interruption_filter";
     field public static final String EXTRA_NOTIFICATION_COUNT = "notification_count";
     field public static final String EXTRA_UNREAD_COUNT = "unread_count";
-    field public static final String EXTRA_WATCH_FACE_COMMAND_BINDER = "watch_face_command_binder";
     field public static final String EXTRA_WATCH_FACE_COMPONENT = "android.support.wearable.watchface.extra.WATCH_FACE_COMPONENT";
     field public static final String EXTRA_WATCH_FACE_VISIBLE = "watch_face_visible";
     field public static final String KEY_ACCENT_COLOR = "accentColor";
@@ -46,12 +45,7 @@
     field public static final String PERMISSION_BIND_WATCH_FACE_CONTROL = "com.google.android.wearable.permission.BIND_WATCH_FACE_CONTROL";
     field public static final String PROPERTY_BURN_IN_PROTECTION = "burn_in_protection";
     field public static final String PROPERTY_LOW_BIT_AMBIENT = "low_bit_ambient";
-    field public static final String STATUS_AIRPLANE_MODE = "airplane_mode";
-    field public static final String STATUS_CHARGING = "charging";
-    field public static final String STATUS_CONNECTED = "connected";
-    field public static final String STATUS_GPS_ACTIVE = "gps_active";
     field public static final String STATUS_KEYGUARD_LOCKED = "keyguard_locked";
-    field public static final String STATUS_THEATER_MODE = "theater_mode";
   }
 
   public static final class Constants.Companion {
@@ -99,7 +93,7 @@
 
 }
 
-package android.support.wearable.watchface.accessibility {
+package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) android.support.wearable.watchface.accessibility {
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class AccessibilityUtils {
     method public static android.support.wearable.complications.TimeDependentText generateContentDescription(android.content.Context, android.support.wearable.complications.ComplicationData);
diff --git a/wear/wear-watchface-data/lint-baseline.xml b/wear/wear-watchface-data/lint-baseline.xml
index 8fa8545..70aa352 100644
--- a/wear/wear-watchface-data/lint-baseline.xml
+++ b/wear/wear-watchface-data/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanTargetApiAnnotation"
diff --git a/wear/wear-watchface-data/proguard-rules.pro b/wear/wear-watchface-data/proguard-rules.pro
index 1de112f7f..ecdad1c 100644
--- a/wear/wear-watchface-data/proguard-rules.pro
+++ b/wear/wear-watchface-data/proguard-rules.pro
@@ -14,4 +14,7 @@
 
 # Prevent Parcelizer objects from being removed or renamed.
 -keep public class androidx.wear.watchface.**Parcelizer { *; }
--keep public class androidx.wear.watchface.style.data.ComplicationOverlayWireFormat { *; }
\ No newline at end of file
+-keep public class androidx.wear.watchface.style.data.ComplicationOverlayWireFormat { *; }
+-keep public class android.support.wearable.complications.ComplicationData { *; }
+-keep public class android.support.wearable.complications.ComplicationProviderInfo  { *; }
+-keep public class android.support.wearable.complications.ComplicationText { *; }
diff --git a/wear/wear-watchface-data/src/main/java/android/support/wearable/watchface/Constants.kt b/wear/wear-watchface-data/src/main/java/android/support/wearable/watchface/Constants.kt
index 9c0e809..582f7c5 100644
--- a/wear/wear-watchface-data/src/main/java/android/support/wearable/watchface/Constants.kt
+++ b/wear/wear-watchface-data/src/main/java/android/support/wearable/watchface/Constants.kt
@@ -135,9 +135,6 @@
         @SuppressWarnings("ActionValue")
         public const val EXTRA_WATCH_FACE_VISIBLE: String = "watch_face_visible"
 
-        @SuppressWarnings("ActionValue")
-        public const val EXTRA_WATCH_FACE_COMMAND_BINDER: String = "watch_face_command_binder"
-
         /**
          * Property in bundle passed to [Engine.onPropertiesChanged] to indicate whether burn-in
          * protection is required. When this property is set to true, views are shifted around
@@ -158,38 +155,6 @@
 
         /**
          * Key for a boolean value in the bundle passed to [Engine.onStatusChanged(Bundle)] that
-         * indicates whether or not the device is charging. This will be true if the current battery
-         * status is either [BatteryManager.BATTERY_STATUS_CHARGING] or
-         * [BatteryManager.BATTERY_STATUS_FULL].
-         */
-        public const val STATUS_CHARGING: String = "charging"
-
-        /**
-         * Key for a boolean value in the bundle passed to [Engine.onStatusChanged(Bundle)] that
-         * indicates whether or not the device is in airplane mode.
-         */
-        public const val STATUS_AIRPLANE_MODE: String = "airplane_mode"
-
-        /**
-         * Key for a boolean value in the bundle passed to [Engine.onStatusChanged(Bundle)] that
-         * indicates whether or not the device is connected to the phone.
-         */
-        public const val STATUS_CONNECTED: String = "connected"
-
-        /**
-         * Key for a boolean value in the bundle passed to [Engine.onStatusChanged(Bundle)] that
-         * indicates whether or not the device is in theater mode.
-         */
-        public const val STATUS_THEATER_MODE: String = "theater_mode"
-
-        /**
-         * Key for a boolean value in the bundle passed to [Engine.onStatusChanged(Bundle)] that
-         * indicates whether or not GPS is enabled.
-         */
-        public const val STATUS_GPS_ACTIVE: String = "gps_active"
-
-        /**
-         * Key for a boolean value in the bundle passed to [Engine.onStatusChanged(Bundle)] that
          * indicates whether or not the keyguard is locked.
          */
         public const val STATUS_KEYGUARD_LOCKED: String = "keyguard_locked"
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java b/wear/wear-watchface-data/src/main/java/android/support/wearable/watchface/accessibility/package-info.java
similarity index 62%
copy from camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
copy to wear/wear-watchface-data/src/main/java/android/support/wearable/watchface/accessibility/package-info.java
index bfc1884..45c6efc 100644
--- a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
+++ b/wear/wear-watchface-data/src/main/java/android/support/wearable/watchface/accessibility/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY_GROUP)
+package android.support.wearable.watchface.accessibility;
 
-import static org.junit.Assert.assertNotNull;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
-import org.junit.Test;
-
-public class VersionNameTest {
-    @Test
-    public void testCurrentVersion_shouldNotEmpty() {
-        assertNotNull(VersionName.getCurrentVersion().getVersion());
-    }
-}
+import androidx.annotation.RestrictTo;
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java b/wear/wear-watchface-data/src/main/java/android/support/wearable/watchface/package-info.java
similarity index 62%
copy from camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
copy to wear/wear-watchface-data/src/main/java/android/support/wearable/watchface/package-info.java
index bfc1884..4b57c76 100644
--- a/camera/camera-extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
+++ b/wear/wear-watchface-data/src/main/java/android/support/wearable/watchface/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.camera.extensions;
+/**
+ * @hide
+ */
+@RestrictTo(LIBRARY_GROUP)
+package android.support.wearable.watchface;
 
-import static org.junit.Assert.assertNotNull;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 
-import org.junit.Test;
-
-public class VersionNameTest {
-    @Test
-    public void testCurrentVersion_shouldNotEmpty() {
-        assertNotNull(VersionName.getCurrentVersion().getVersion());
-    }
-}
+import androidx.annotation.RestrictTo;
diff --git a/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditingSessionTest.kt b/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditingSessionTest.kt
index 4b6abfb..fe73ba9 100644
--- a/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditingSessionTest.kt
+++ b/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditingSessionTest.kt
@@ -1110,6 +1110,9 @@
         val editorObserver = TestEditorObserver()
         val observerId = EditorService.globalEditorService.registerObserver(editorObserver)
 
+        val oldWFColorStyleSetting = editorDelegate.userStyle[colorStyleSetting]!!.id.value
+        val oldWFWatchHandStyleSetting = editorDelegate.userStyle[watchHandStyleSetting]!!.id.value
+
         scenario.onActivity { activity ->
             runBlocking {
                 // Select [blueStyleOption] and [gothicStyleOption].
@@ -1135,11 +1138,12 @@
         assertThat(result.watchFaceId.id).isEqualTo(testInstanceId.id)
         assertTrue(result.shouldCommitChanges)
 
-        // The style change should also have been applied to the watchface
+        // The style change shouldn't be applied to the watchface as it gets reverted to the old
+        // one when editor closes.
         assertThat(editorDelegate.userStyle[colorStyleSetting]!!.id.value)
-            .isEqualTo(blueStyleOption.id.value)
+            .isEqualTo(oldWFColorStyleSetting)
         assertThat(editorDelegate.userStyle[watchHandStyleSetting]!!.id.value)
-            .isEqualTo(gothicStyleOption.id.value)
+            .isEqualTo(oldWFWatchHandStyleSetting)
 
         assertThat(result.previewComplicationsData.size).isEqualTo(2)
         val leftComplicationData = result.previewComplicationsData[LEFT_COMPLICATION_ID] as
@@ -1477,7 +1481,7 @@
         scenario.onActivity { activity ->
             val mockWatchFaceHostApi = mock(WatchFaceHostApi::class.java)
             val mockHandler = mock(Handler::class.java)
-            `when`(mockWatchFaceHostApi.getHandler()).thenReturn(mockHandler)
+            `when`(mockWatchFaceHostApi.getUiThreadHandler()).thenReturn(mockHandler)
             `when`(mockWatchFaceHostApi.getContext()).thenReturn(
                 ApplicationProvider.getApplicationContext<Context>()
             )
@@ -1514,7 +1518,8 @@
                 mockWatchFaceHostApi,
                 watchState,
                 currentUserStyleRepository,
-                ComplicationsManager(emptyList(), currentUserStyleRepository)
+                ComplicationsManager(emptyList(), currentUserStyleRepository),
+                Calendar.getInstance()
             )
 
             assertThat(activity.onCreateException).isInstanceOf(IllegalStateException::class.java)
diff --git a/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt b/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
index c974e38..eef4f27 100644
--- a/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
+++ b/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
@@ -77,7 +77,10 @@
  * Interface for manipulating watch face state during an editing session for a watch face editing
  * session. The editor should adjust [userStyle] and call [openComplicationProviderChooser] to
  * configure the watch face and call [close] when done. This reports the updated [EditorState] to
- * the [EditorListener]s registered via [EditorServiceClient.addListener].
+ * the [EditorListener]s registered via [EditorServiceClient.addListener]. Style changes applied
+ * during the editor session are temporary and will be reverted when the editor session completes.
+ * In the event that the editor sessions results in a new watch face configuration that will be
+ * subsequently reapplied when the new configuration is provided by the system.
  */
 public abstract class EditorSession : AutoCloseable {
     /** The [ComponentName] of the watch face being edited. */
@@ -91,7 +94,8 @@
     @get:RequiresApi(Build.VERSION_CODES.R)
     public abstract val watchFaceId: WatchFaceId
 
-    /** The current [UserStyle]. Assigning to this will cause the style to update. */
+    /** The current [UserStyle]. Assigning to this will cause the style to update. However, styling
+     * changes to the watch face will be reverted upon exit. */
     public abstract var userStyle: UserStyle
 
     /** The UTC reference preview time for this watch face in milliseconds since the epoch. */
@@ -113,10 +117,10 @@
      * because there are circumstances where [ComponentActivity.onStop] doesn't get called but the
      * UX requires us to commit changes.
      *
-     * If false upon exit for an on watch face editor, the original UserStyle is restored. Note we
-     * need SysUI's help to revert any complication provider changes. Caveat some providers have
-     * their own config (e.g. the world clock has a timezone setting) and that config currently
-     * can't be reverted.
+     * Regardless of the value, on completion of the editor session, the original UserStyle is
+     * restored. Note we need SysUI's help to revert any complication provider changes. Caveat
+     * some providers have their own config (e.g. the world clock has a timezone setting) and
+     * that config currently can't be reverted.
      */
     @get:UiThread
     @get:JvmName("isCommitChangesOnClose")
@@ -665,8 +669,11 @@
         if (this::editorDelegate.isInitialized) {
             editorDelegate.onDestroy()
         }
-        // Revert any changes to the UserStyle if needed.
-        if (!commitChangesOnClose && this::previousWatchFaceUserStyle.isInitialized) {
+        // Revert any changes to the user style that was set during the editing session. The
+        // system will update the user style and communicate it to the active watch face if
+        // needed. This guarantees that the system is always the source of truth for the current
+        // style.
+        if (this::previousWatchFaceUserStyle.isInitialized) {
             userStyle = previousWatchFaceUserStyle
         }
     }
diff --git a/wear/wear-watchface/api/current.txt b/wear/wear-watchface/api/current.txt
index e44bc13..3e4c282 100644
--- a/wear/wear-watchface/api/current.txt
+++ b/wear/wear-watchface/api/current.txt
@@ -21,7 +21,7 @@
   }
 
   public interface CanvasComplicationFactory {
-    method @UiThread public androidx.wear.watchface.CanvasComplication create(androidx.wear.watchface.WatchState, androidx.wear.watchface.CanvasComplication.InvalidateCallback);
+    method @WorkerThread public androidx.wear.watchface.CanvasComplication create(androidx.wear.watchface.WatchState, androidx.wear.watchface.CanvasComplication.InvalidateCallback);
   }
 
   public final class Complication {
@@ -121,14 +121,7 @@
     enum_constant public static final androidx.wear.watchface.DrawMode MUTE;
   }
 
-  public final class MutableObservableWatchData<T> extends androidx.wear.watchface.ObservableWatchData<T> {
-    ctor public MutableObservableWatchData(T? initialValue);
-    ctor public MutableObservableWatchData();
-    method @UiThread public void setValue(T v);
-    property @UiThread public T value;
-  }
-
-  public class ObservableWatchData<T> {
+  public abstract sealed class ObservableWatchData<T> {
     method @UiThread public final void addObserver(androidx.wear.watchface.Observer<T> observer);
     method @UiThread public T getValue();
     method @UiThread public final T getValueOr(T p);
@@ -138,6 +131,13 @@
     property @UiThread public T value;
   }
 
+  public static final class ObservableWatchData.MutableObservableWatchData<T> extends androidx.wear.watchface.ObservableWatchData<T> {
+    ctor public ObservableWatchData.MutableObservableWatchData(T? initialValue);
+    ctor public ObservableWatchData.MutableObservableWatchData();
+    method @UiThread public void setValue(T v);
+    property @UiThread public T value;
+  }
+
   public interface Observer<T> {
     method public void onChanged(T);
   }
@@ -216,30 +216,31 @@
   }
 
   public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
-    ctor public Renderer.CanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
+    ctor @WorkerThread public Renderer.CanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
     method @UiThread public abstract void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar);
     method @UiThread public abstract void renderHighlightLayer(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar);
   }
 
   public abstract static class Renderer.GlesRenderer extends androidx.wear.watchface.Renderer {
-    ctor @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList, optional int[] eglSurfaceAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
-    ctor @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
-    ctor @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList, optional int[] eglSurfaceAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    method public final android.opengl.EGLContext getEglBackgroundThreadContext();
     method public final android.opengl.EGLConfig getEglConfig();
-    method public final android.opengl.EGLContext getEglContext();
     method public final android.opengl.EGLDisplay getEglDisplay();
-    method @UiThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public final void initOpenGlContext() throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
-    method public final void makeContextCurrent();
-    method @UiThread public void onGlContextCreated();
+    method public final android.opengl.EGLContext getEglUiThreadContext();
+    method @WorkerThread public final void makeBackgroundThreadContextCurrent();
+    method @UiThread public final void makeUiThreadContextCurrent();
+    method @WorkerThread public void onGlContextCreated();
     method @UiThread public void onGlSurfaceCreated(@Px int width, @Px int height);
     method @UiThread public abstract void render(android.icu.util.Calendar calendar);
     method @UiThread public abstract void renderHighlightLayer(android.icu.util.Calendar calendar);
     method public final void setEglConfig(android.opengl.EGLConfig p);
-    method public final void setEglContext(android.opengl.EGLContext p);
     method public final void setEglDisplay(android.opengl.EGLDisplay p);
+    property public final android.opengl.EGLContext eglBackgroundThreadContext;
     property public final android.opengl.EGLConfig eglConfig;
-    property public final android.opengl.EGLContext eglContext;
     property public final android.opengl.EGLDisplay eglDisplay;
+    property public final android.opengl.EGLContext eglUiThreadContext;
   }
 
   public static final class Renderer.GlesRenderer.GlesException extends java.lang.Exception {
@@ -298,10 +299,17 @@
 
   public abstract class WatchFaceService extends android.service.wallpaper.WallpaperService {
     ctor public WatchFaceService();
-    method @UiThread protected androidx.wear.watchface.ComplicationsManager createComplicationsManager(androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
-    method @UiThread protected androidx.wear.watchface.style.UserStyleSchema createUserStyleSchema();
-    method @UiThread protected abstract suspend Object? createWatchFace(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationsManager complicationsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace> p);
+    method @WorkerThread protected androidx.wear.watchface.ComplicationsManager createComplicationsManager(androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
+    method @WorkerThread protected androidx.wear.watchface.style.UserStyleSchema createUserStyleSchema();
+    method @WorkerThread protected abstract suspend Object? createWatchFace(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationsManager complicationsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace> p);
+    method public final android.os.Handler getBackgroundThreadHandler();
+    method public final android.os.Handler getUiThreadHandler();
     method public final android.service.wallpaper.WallpaperService.Engine onCreateEngine();
+    field public static final androidx.wear.watchface.WatchFaceService.Companion Companion;
+    field public static final int MAX_CREATE_WATCHFACE_TIME_MILLIS = 5000; // 0x1388
+  }
+
+  public static final class WatchFaceService.Companion {
   }
 
   public final class WatchFaceServiceKt {
diff --git a/wear/wear-watchface/api/public_plus_experimental_current.txt b/wear/wear-watchface/api/public_plus_experimental_current.txt
index e9da0dc..b12e928 100644
--- a/wear/wear-watchface/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface/api/public_plus_experimental_current.txt
@@ -21,7 +21,7 @@
   }
 
   public interface CanvasComplicationFactory {
-    method @UiThread public androidx.wear.watchface.CanvasComplication create(androidx.wear.watchface.WatchState, androidx.wear.watchface.CanvasComplication.InvalidateCallback);
+    method @WorkerThread public androidx.wear.watchface.CanvasComplication create(androidx.wear.watchface.WatchState, androidx.wear.watchface.CanvasComplication.InvalidateCallback);
   }
 
   public final class Complication {
@@ -121,14 +121,7 @@
     enum_constant public static final androidx.wear.watchface.DrawMode MUTE;
   }
 
-  public final class MutableObservableWatchData<T> extends androidx.wear.watchface.ObservableWatchData<T> {
-    ctor public MutableObservableWatchData(T? initialValue);
-    ctor public MutableObservableWatchData();
-    method @UiThread public void setValue(T v);
-    property @UiThread public T value;
-  }
-
-  public class ObservableWatchData<T> {
+  public abstract sealed class ObservableWatchData<T> {
     method @UiThread public final void addObserver(androidx.wear.watchface.Observer<T> observer);
     method @UiThread public T getValue();
     method @UiThread public final T getValueOr(T p);
@@ -138,6 +131,13 @@
     property @UiThread public T value;
   }
 
+  public static final class ObservableWatchData.MutableObservableWatchData<T> extends androidx.wear.watchface.ObservableWatchData<T> {
+    ctor public ObservableWatchData.MutableObservableWatchData(T? initialValue);
+    ctor public ObservableWatchData.MutableObservableWatchData();
+    method @UiThread public void setValue(T v);
+    property @UiThread public T value;
+  }
+
   public interface Observer<T> {
     method public void onChanged(T);
   }
@@ -216,30 +216,31 @@
   }
 
   public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
-    ctor public Renderer.CanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
+    ctor @WorkerThread public Renderer.CanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
     method @UiThread public abstract void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar);
     method @UiThread public abstract void renderHighlightLayer(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar);
   }
 
   public abstract static class Renderer.GlesRenderer extends androidx.wear.watchface.Renderer {
-    ctor @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList, optional int[] eglSurfaceAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
-    ctor @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
-    ctor @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList, optional int[] eglSurfaceAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    method public final android.opengl.EGLContext getEglBackgroundThreadContext();
     method public final android.opengl.EGLConfig getEglConfig();
-    method public final android.opengl.EGLContext getEglContext();
     method public final android.opengl.EGLDisplay getEglDisplay();
-    method @UiThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public final void initOpenGlContext() throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
-    method public final void makeContextCurrent();
-    method @UiThread public void onGlContextCreated();
+    method public final android.opengl.EGLContext getEglUiThreadContext();
+    method @WorkerThread public final void makeBackgroundThreadContextCurrent();
+    method @UiThread public final void makeUiThreadContextCurrent();
+    method @WorkerThread public void onGlContextCreated();
     method @UiThread public void onGlSurfaceCreated(@Px int width, @Px int height);
     method @UiThread public abstract void render(android.icu.util.Calendar calendar);
     method @UiThread public abstract void renderHighlightLayer(android.icu.util.Calendar calendar);
     method public final void setEglConfig(android.opengl.EGLConfig p);
-    method public final void setEglContext(android.opengl.EGLContext p);
     method public final void setEglDisplay(android.opengl.EGLDisplay p);
+    property public final android.opengl.EGLContext eglBackgroundThreadContext;
     property public final android.opengl.EGLConfig eglConfig;
-    property public final android.opengl.EGLContext eglContext;
     property public final android.opengl.EGLDisplay eglDisplay;
+    property public final android.opengl.EGLContext eglUiThreadContext;
   }
 
   public static final class Renderer.GlesRenderer.GlesException extends java.lang.Exception {
@@ -298,10 +299,17 @@
 
   public abstract class WatchFaceService extends android.service.wallpaper.WallpaperService {
     ctor public WatchFaceService();
-    method @UiThread protected androidx.wear.watchface.ComplicationsManager createComplicationsManager(androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
-    method @UiThread protected androidx.wear.watchface.style.UserStyleSchema createUserStyleSchema();
-    method @UiThread protected abstract suspend Object? createWatchFace(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationsManager complicationsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace> p);
+    method @WorkerThread protected androidx.wear.watchface.ComplicationsManager createComplicationsManager(androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
+    method @WorkerThread protected androidx.wear.watchface.style.UserStyleSchema createUserStyleSchema();
+    method @WorkerThread protected abstract suspend Object? createWatchFace(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationsManager complicationsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace> p);
+    method public final android.os.Handler getBackgroundThreadHandler();
+    method public final android.os.Handler getUiThreadHandler();
     method public final android.service.wallpaper.WallpaperService.Engine onCreateEngine();
+    field public static final androidx.wear.watchface.WatchFaceService.Companion Companion;
+    field public static final int MAX_CREATE_WATCHFACE_TIME_MILLIS = 5000; // 0x1388
+  }
+
+  public static final class WatchFaceService.Companion {
   }
 
   public final class WatchFaceServiceKt {
diff --git a/wear/wear-watchface/api/restricted_current.txt b/wear/wear-watchface/api/restricted_current.txt
index 1664db4..23a2893 100644
--- a/wear/wear-watchface/api/restricted_current.txt
+++ b/wear/wear-watchface/api/restricted_current.txt
@@ -21,7 +21,7 @@
   }
 
   public interface CanvasComplicationFactory {
-    method @UiThread public androidx.wear.watchface.CanvasComplication create(androidx.wear.watchface.WatchState, androidx.wear.watchface.CanvasComplication.InvalidateCallback);
+    method @WorkerThread public androidx.wear.watchface.CanvasComplication create(androidx.wear.watchface.WatchState, androidx.wear.watchface.CanvasComplication.InvalidateCallback);
   }
 
   public final class Complication {
@@ -122,13 +122,6 @@
     enum_constant public static final androidx.wear.watchface.DrawMode MUTE;
   }
 
-  public final class MutableObservableWatchData<T> extends androidx.wear.watchface.ObservableWatchData<T> {
-    ctor public MutableObservableWatchData(T? initialValue);
-    ctor public MutableObservableWatchData();
-    method @UiThread public void setValue(T v);
-    property @UiThread public T value;
-  }
-
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class MutableWatchState {
     method public androidx.wear.watchface.WatchState asWatchState();
     method public long getAnalogPreviewReferenceTimeMillis();
@@ -136,31 +129,31 @@
     method public long getDigitalPreviewReferenceTimeMillis();
     method public boolean getHasBurnInProtection();
     method public boolean getHasLowBitAmbient();
-    method public androidx.wear.watchface.MutableObservableWatchData<java.lang.Integer> getInterruptionFilter();
-    method public androidx.wear.watchface.MutableObservableWatchData<java.lang.Boolean> isAmbient();
-    method public androidx.wear.watchface.MutableObservableWatchData<java.lang.Boolean> isBatteryLowAndNotCharging();
+    method public androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Integer> getInterruptionFilter();
+    method public androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Boolean> isAmbient();
+    method public androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Boolean> isBatteryLowAndNotCharging();
     method public boolean isHeadless();
-    method public androidx.wear.watchface.MutableObservableWatchData<java.lang.Boolean> isVisible();
+    method public androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Boolean> isVisible();
     method public void setAnalogPreviewReferenceTimeMillis(long p);
     method public void setChinHeight(@Px int value);
     method public void setDigitalPreviewReferenceTimeMillis(long p);
     method public void setHasBurnInProtection(boolean p);
     method public void setHasLowBitAmbient(boolean p);
     method public void setHeadless(boolean p);
-    method public void setInterruptionFilter(androidx.wear.watchface.MutableObservableWatchData<java.lang.Integer> p);
+    method public void setInterruptionFilter(androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Integer> p);
     property public final long analogPreviewReferenceTimeMillis;
     property @Px public final int chinHeight;
     property public final long digitalPreviewReferenceTimeMillis;
     property public final boolean hasBurnInProtection;
     property public final boolean hasLowBitAmbient;
-    property public final androidx.wear.watchface.MutableObservableWatchData<java.lang.Integer> interruptionFilter;
-    property public final androidx.wear.watchface.MutableObservableWatchData<java.lang.Boolean> isAmbient;
-    property public final androidx.wear.watchface.MutableObservableWatchData<java.lang.Boolean> isBatteryLowAndNotCharging;
+    property public final androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Integer> interruptionFilter;
+    property public final androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Boolean> isAmbient;
+    property public final androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Boolean> isBatteryLowAndNotCharging;
     property public final boolean isHeadless;
-    property public final androidx.wear.watchface.MutableObservableWatchData<java.lang.Boolean> isVisible;
+    property public final androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData<java.lang.Boolean> isVisible;
   }
 
-  public class ObservableWatchData<T> {
+  public abstract sealed class ObservableWatchData<T> {
     method @UiThread public final void addObserver(androidx.wear.watchface.Observer<T> observer);
     method @UiThread public T getValue();
     method @UiThread public final T getValueOr(T p);
@@ -170,6 +163,13 @@
     property @UiThread public T value;
   }
 
+  public static final class ObservableWatchData.MutableObservableWatchData<T> extends androidx.wear.watchface.ObservableWatchData<T> {
+    ctor public ObservableWatchData.MutableObservableWatchData(T? initialValue);
+    ctor public ObservableWatchData.MutableObservableWatchData();
+    method @UiThread public void setValue(T v);
+    property @UiThread public T value;
+  }
+
   public interface Observer<T> {
     method public void onChanged(T);
   }
@@ -250,30 +250,31 @@
   }
 
   public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
-    ctor public Renderer.CanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
+    ctor @WorkerThread public Renderer.CanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
     method @UiThread public abstract void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar);
     method @UiThread public abstract void renderHighlightLayer(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar);
   }
 
   public abstract static class Renderer.GlesRenderer extends androidx.wear.watchface.Renderer {
-    ctor @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList, optional int[] eglSurfaceAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
-    ctor @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
-    ctor @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList, optional int[] eglSurfaceAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    method public final android.opengl.EGLContext getEglBackgroundThreadContext();
     method public final android.opengl.EGLConfig getEglConfig();
-    method public final android.opengl.EGLContext getEglContext();
     method public final android.opengl.EGLDisplay getEglDisplay();
-    method @UiThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public final void initOpenGlContext() throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
-    method public final void makeContextCurrent();
-    method @UiThread public void onGlContextCreated();
+    method public final android.opengl.EGLContext getEglUiThreadContext();
+    method @WorkerThread public final void makeBackgroundThreadContextCurrent();
+    method @UiThread public final void makeUiThreadContextCurrent();
+    method @WorkerThread public void onGlContextCreated();
     method @UiThread public void onGlSurfaceCreated(@Px int width, @Px int height);
     method @UiThread public abstract void render(android.icu.util.Calendar calendar);
     method @UiThread public abstract void renderHighlightLayer(android.icu.util.Calendar calendar);
     method public final void setEglConfig(android.opengl.EGLConfig p);
-    method public final void setEglContext(android.opengl.EGLContext p);
     method public final void setEglDisplay(android.opengl.EGLDisplay p);
+    property public final android.opengl.EGLContext eglBackgroundThreadContext;
     property public final android.opengl.EGLConfig eglConfig;
-    property public final android.opengl.EGLContext eglContext;
     property public final android.opengl.EGLDisplay eglDisplay;
+    property public final android.opengl.EGLContext eglUiThreadContext;
   }
 
   public static final class Renderer.GlesRenderer.GlesException extends java.lang.Exception {
@@ -355,9 +356,10 @@
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface WatchFaceHostApi {
+    method public android.os.Handler getBackgroundThreadHandler();
     method public android.content.Context getContext();
-    method public android.os.Handler getHandler();
     method public androidx.wear.watchface.style.data.UserStyleWireFormat? getInitialUserStyle();
+    method public android.os.Handler getUiThreadHandler();
     method @UiThread public void invalidate();
     method public void onUserStyleChanged();
     method public void setActiveComplications(int[] watchFaceComplicationIds);
@@ -366,7 +368,7 @@
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class WatchFaceImpl {
-    ctor public WatchFaceImpl(androidx.wear.watchface.WatchFace watchface, androidx.wear.watchface.WatchFaceHostApi watchFaceHostApi, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.ComplicationsManager complicationsManager);
+    ctor @UiThread public WatchFaceImpl(androidx.wear.watchface.WatchFace watchface, androidx.wear.watchface.WatchFaceHostApi watchFaceHostApi, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.ComplicationsManager complicationsManager, android.icu.util.Calendar calendar);
     method public long getPreviewReferenceTimeMillis();
     property public final long previewReferenceTimeMillis;
   }
@@ -376,11 +378,31 @@
 
   public abstract class WatchFaceService extends android.service.wallpaper.WallpaperService {
     ctor public WatchFaceService();
-    method @UiThread protected androidx.wear.watchface.ComplicationsManager createComplicationsManager(androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
-    method @UiThread protected androidx.wear.watchface.style.UserStyleSchema createUserStyleSchema();
-    method @UiThread protected abstract suspend Object? createWatchFace(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationsManager complicationsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace> p);
+    method @WorkerThread protected androidx.wear.watchface.ComplicationsManager createComplicationsManager(androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
+    method @WorkerThread protected androidx.wear.watchface.style.UserStyleSchema createUserStyleSchema();
+    method @WorkerThread protected abstract suspend Object? createWatchFace(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationsManager complicationsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, kotlin.coroutines.Continuation<? super androidx.wear.watchface.WatchFace> p);
+    method public final android.os.Handler getBackgroundThreadHandler();
+    method public final android.os.Handler getUiThreadHandler();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.view.SurfaceHolder? getWallpaperSurfaceHolderOverride();
     method public final android.service.wallpaper.WallpaperService.Engine onCreateEngine();
+    field public static final androidx.wear.watchface.WatchFaceService.Companion Companion;
+    field public static final int MAX_CREATE_WATCHFACE_TIME_MILLIS = 5000; // 0x1388
+  }
+
+  public static final class WatchFaceService.Companion {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class WatchFaceService.EngineWrapper extends android.service.wallpaper.WallpaperService.Engine implements androidx.wear.watchface.WatchFaceHostApi {
+    ctor public WatchFaceService.EngineWrapper(android.os.Handler uiThreadHandler, android.os.Handler backgroundThreadHandler, boolean headless);
+    method public android.os.Handler getBackgroundThreadHandler();
+    method public android.content.Context getContext();
+    method public androidx.wear.watchface.style.data.UserStyleWireFormat? getInitialUserStyle();
+    method public android.os.Handler getUiThreadHandler();
+    method public void invalidate();
+    method @UiThread public void onUserStyleChanged();
+    method public void setActiveComplications(int[] watchFaceComplicationIds);
+    method public void setDefaultComplicationProviderWithFallbacks(int watchFaceComplicationId, java.util.List<android.content.ComponentName>? providers, @androidx.wear.complications.SystemProviders.ProviderId int fallbackSystemProvider, int type);
+    method @UiThread public void updateContentDescriptionLabels();
   }
 
   public final class WatchFaceServiceKt {
diff --git a/wear/wear-watchface/guava/src/androidTest/java/AsyncListenableWatchFaceServiceTest.kt b/wear/wear-watchface/guava/src/androidTest/java/AsyncListenableWatchFaceServiceTest.kt
index ad354fa..fefcf3e 100644
--- a/wear/wear-watchface/guava/src/androidTest/java/AsyncListenableWatchFaceServiceTest.kt
+++ b/wear/wear-watchface/guava/src/androidTest/java/AsyncListenableWatchFaceServiceTest.kt
@@ -17,8 +17,6 @@
 import android.graphics.Canvas
 import android.graphics.Rect
 import android.icu.util.Calendar
-import android.os.Handler
-import android.os.Looper
 import android.view.SurfaceHolder
 import androidx.wear.watchface.CanvasType
 import androidx.wear.watchface.ComplicationsManager
@@ -55,7 +53,7 @@
     override fun renderHighlightLayer(canvas: Canvas, bounds: Rect, calendar: Calendar) {}
 }
 
-private class TestAsyncListenableWatchFaceService(private val handler: Handler) :
+private class TestAsyncListenableWatchFaceService :
     ListenableWatchFaceService() {
     override fun createWatchFaceFuture(
         surfaceHolder: SurfaceHolder,
@@ -65,7 +63,7 @@
     ): ListenableFuture<WatchFace> {
         val future = SettableFuture.create<WatchFace>()
         // Post a task to resolve the future.
-        handler.post {
+        getUiThreadHandler().post {
             future.set(
                 WatchFace(
                     WatchFaceType.DIGITAL,
@@ -93,8 +91,7 @@
 
     @Test
     public fun asyncTest() {
-        val handler = Handler(Looper.getMainLooper())
-        val service = TestAsyncListenableWatchFaceService(handler)
+        val service = TestAsyncListenableWatchFaceService()
         val mockSurfaceHolder = Mockito.mock(SurfaceHolder::class.java)
         Mockito.`when`(mockSurfaceHolder.surfaceFrame).thenReturn(Rect(0, 0, 100, 100))
 
diff --git a/wear/wear-watchface/samples/app/build.gradle b/wear/wear-watchface/samples/app/build.gradle
index 318233d..6ac4a42 100644
--- a/wear/wear-watchface/samples/app/build.gradle
+++ b/wear/wear-watchface/samples/app/build.gradle
@@ -40,6 +40,15 @@
     defaultConfig {
         minSdkVersion 25
     }
+
+    buildTypes {
+	release {
+	    minifyEnabled true
+	    shrinkResources true
+	    proguardFiles getDefaultProguardFile('proguard-android.txt')
+	}
+    }
+
     compileOptions {
         sourceCompatibility 1.8
         targetCompatibility 1.8
diff --git a/wear/wear-watchface/samples/minimal/build.gradle b/wear/wear-watchface/samples/minimal/build.gradle
index f4f7ce0..93d94e7 100644
--- a/wear/wear-watchface/samples/minimal/build.gradle
+++ b/wear/wear-watchface/samples/minimal/build.gradle
@@ -42,6 +42,15 @@
     defaultConfig {
         minSdkVersion 25
     }
+
+    buildTypes {
+	release {
+	    minifyEnabled true
+	    shrinkResources true
+	    proguardFiles getDefaultProguardFile('proguard-android.txt')
+	}
+    }
+
     compileOptions {
         sourceCompatibility 1.8
         targetCompatibility 1.8
diff --git a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt
index 9dd9004..0395226 100644
--- a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt
+++ b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt
@@ -469,36 +469,36 @@
     // Lazy because the context isn't initialized til later.
     private val watchFaceStyle by lazy { WatchFaceColorStyle.create(this, RED_STYLE) }
 
-    private val colorStyleSetting = UserStyleSetting.ListUserStyleSetting(
-        UserStyleSetting.Id(COLOR_STYLE_SETTING),
-        getString(R.string.colors_style_setting),
-        getString(R.string.colors_style_setting_description),
-        icon = null,
-        options = listOf(
-            UserStyleSetting.ListUserStyleSetting.ListOption(
-                Option.Id(RED_STYLE),
-                getString(R.string.colors_style_red),
-                Icon.createWithResource(this, R.drawable.red_style)
+    private val colorStyleSetting by lazy {
+        UserStyleSetting.ListUserStyleSetting(
+            UserStyleSetting.Id(COLOR_STYLE_SETTING),
+            getString(R.string.colors_style_setting),
+            getString(R.string.colors_style_setting_description),
+            icon = null,
+            options = listOf(
+                UserStyleSetting.ListUserStyleSetting.ListOption(
+                    Option.Id(RED_STYLE),
+                    getString(R.string.colors_style_red),
+                    Icon.createWithResource(this, R.drawable.red_style)
+                ),
+                UserStyleSetting.ListUserStyleSetting.ListOption(
+                    Option.Id(GREEN_STYLE),
+                    getString(R.string.colors_style_green),
+                    Icon.createWithResource(this, R.drawable.green_style)
+                ),
+                UserStyleSetting.ListUserStyleSetting.ListOption(
+                    Option.Id(BLUE_STYLE),
+                    getString(R.string.colors_style_blue),
+                    Icon.createWithResource(this, R.drawable.blue_style)
+                )
             ),
-            UserStyleSetting.ListUserStyleSetting.ListOption(
-                Option.Id(GREEN_STYLE),
-                getString(R.string.colors_style_green),
-                Icon.createWithResource(this, R.drawable.green_style)
-            ),
-            UserStyleSetting.ListUserStyleSetting.ListOption(
-                Option.Id(BLUE_STYLE),
-                getString(R.string.colors_style_blue),
-                Icon.createWithResource(this, R.drawable.blue_style)
+            listOf(
+                WatchFaceLayer.BASE,
+                WatchFaceLayer.COMPLICATIONS,
+                WatchFaceLayer.COMPLICATIONS_OVERLAY
             )
-        ),
-        listOf(
-            WatchFaceLayer.BASE,
-            WatchFaceLayer.COMPLICATIONS,
-            WatchFaceLayer.COMPLICATIONS_OVERLAY
         )
-    )
-
-    private val userStyleSchema = UserStyleSchema(listOf(colorStyleSetting))
+    }
 
     private val canvasComplicationFactory =
         CanvasComplicationFactory { watchState, listener ->
@@ -608,7 +608,7 @@
         DefaultComplicationProviderPolicy()
     ).build()
 
-    override fun createUserStyleSchema() = userStyleSchema
+    override fun createUserStyleSchema() = UserStyleSchema(listOf(colorStyleSetting))
 
     override fun createComplicationsManager(
         currentUserStyleRepository: CurrentUserStyleRepository
@@ -638,15 +638,20 @@
             colorStyleSetting,
             complicationsManager
         )
-        upperComplication.complicationData.addObserver {
-            // Force bounds recalculation, because this can affect the size of the central time
-            // display.
-            renderer.oldBounds.set(0, 0, 0, 0)
-        }
-        lowerComplication.complicationData.addObserver {
-            // Force bounds recalculation, because this can affect the size of the central time
-            // display.
-            renderer.oldBounds.set(0, 0, 0, 0)
+
+        // createWatchFace is called on a worker thread but the observers should be called from the
+        // UiThread.
+        getUiThreadHandler().post {
+            upperComplication.complicationData.addObserver {
+                // Force bounds recalculation, because this can affect the size of the central time
+                // display.
+                renderer.oldBounds.set(0, 0, 0, 0)
+            }
+            lowerComplication.complicationData.addObserver {
+                // Force bounds recalculation, because this can affect the size of the central time
+                // display.
+                renderer.oldBounds.set(0, 0, 0, 0)
+            }
         }
         return WatchFace(WatchFaceType.DIGITAL, renderer)
     }
diff --git a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt
index e6647f9..a5f31c1 100644
--- a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt
+++ b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt
@@ -16,15 +16,13 @@
 
 package androidx.wear.watchface.samples
 
+import android.content.res.Resources
 import android.graphics.BitmapFactory
 import android.graphics.Color
 import android.icu.util.Calendar
-import android.opengl.EGL14
 import android.opengl.GLES20
 import android.opengl.GLUtils
 import android.opengl.Matrix
-import android.os.Handler
-import android.os.HandlerThread
 import android.view.SurfaceHolder
 import androidx.wear.watchface.ComplicationsManager
 import androidx.wear.watchface.Renderer
@@ -33,9 +31,6 @@
 import androidx.wear.watchface.WatchFaceType
 import androidx.wear.watchface.WatchState
 import androidx.wear.watchface.style.CurrentUserStyleRepository
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.android.asCoroutineDispatcher
-import kotlinx.coroutines.withContext
 
 /** Expected frame rate in interactive mode.  */
 private const val FPS: Long = 60
@@ -48,112 +43,25 @@
  * which are used for rendering on the main thread.
  */
 class ExampleOpenGLBackgroundInitWatchFaceService() : WatchFaceService() {
-    // The CoroutineScope upon which we want to load our textures.
-    private val backgroundThreadCoroutineScope = CoroutineScope(
-        Handler(HandlerThread("BackgroundInit").apply { start() }.looper).asCoroutineDispatcher()
-    )
-
     override suspend fun createWatchFace(
         surfaceHolder: SurfaceHolder,
         watchState: WatchState,
         complicationsManager: ComplicationsManager,
         currentUserStyleRepository: CurrentUserStyleRepository
     ): WatchFace {
-
-        // Create the renderer on the main thread. It's EGLContext is bound to this thread.
-        val renderer = MainThreadRenderer(surfaceHolder, currentUserStyleRepository, watchState)
-        renderer.initOpenGlContext()
-
-        // Load the textures on a background thread.
-        return withContext(backgroundThreadCoroutineScope.coroutineContext) {
-            // Create a context for the background thread.
-            val backgroundThreadContext = EGL14.eglCreateContext(
-                renderer.eglDisplay,
-                renderer.eglConfig,
-                renderer.eglContext,
-                intArrayOf(
-                    EGL14.EGL_CONTEXT_CLIENT_VERSION,
-                    2,
-                    EGL14.EGL_NONE
-                ),
-                0
-            )
-
-            // Create a 1x1 surface which is needed by EGL14.eglMakeCurrent.
-            val backgroundSurface = EGL14.eglCreatePbufferSurface(
-                renderer.eglDisplay,
-                renderer.eglConfig,
-                intArrayOf(
-                    EGL14.EGL_WIDTH,
-                    1,
-                    EGL14.EGL_HEIGHT,
-                    1,
-                    EGL14.EGL_TEXTURE_TARGET,
-                    EGL14.EGL_NO_TEXTURE,
-                    EGL14.EGL_TEXTURE_FORMAT,
-                    EGL14.EGL_NO_TEXTURE,
-                    EGL14.EGL_NONE
-                ),
-                0
-            )
-
-            EGL14.eglMakeCurrent(
-                renderer.eglDisplay,
-                backgroundSurface,
-                backgroundSurface,
-                backgroundThreadContext
-            )
-
-            // Load our textures.
-            renderer.watchBodyTexture = loadTextureFromResource(R.drawable.wf_background)
-            checkGLError("Load watchBodyTexture")
-            renderer.watchHandTexture = loadTextureFromResource(R.drawable.hand)
-            checkGLError("Load watchHandTexture")
-
-            WatchFace(WatchFaceType.ANALOG, renderer)
-        }
-    }
-
-    fun checkGLError(op: String) {
-        var error: Int
-        while (GLES20.glGetError().also { error = it } != GLES20.GL_NO_ERROR) {
-            System.err.println("OpenGL Error $op: glError $error")
-        }
-    }
-
-    private fun loadTextureFromResource(resourceId: Int): Int {
-        val textureHandle = IntArray(1)
-        GLES20.glGenTextures(1, textureHandle, 0)
-        if (textureHandle[0] != 0) {
-            val bitmap = BitmapFactory.decodeResource(
-                resources,
-                resourceId,
-                BitmapFactory.Options().apply {
-                    inScaled = false // No pre-scaling
-                }
-            )
-            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0])
-            GLES20.glTexParameteri(
-                GLES20.GL_TEXTURE_2D,
-                GLES20.GL_TEXTURE_MIN_FILTER,
-                GLES20.GL_NEAREST
-            )
-            GLES20.glTexParameteri(
-                GLES20.GL_TEXTURE_2D,
-                GLES20.GL_TEXTURE_MAG_FILTER,
-                GLES20.GL_NEAREST
-            )
-            GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0)
-            bitmap.recycle()
-        }
-        return textureHandle[0]
+        // Init is performed on a worker thread, however all rendering is done on the UiThread so
+        // it's expected to construct the MainThreadRenderer here.
+        val renderer =
+            MainThreadRenderer(surfaceHolder, currentUserStyleRepository, watchState, resources)
+        return WatchFace(WatchFaceType.ANALOG, renderer)
     }
 }
 
 internal class MainThreadRenderer(
     surfaceHolder: SurfaceHolder,
     currentUserStyleRepository: CurrentUserStyleRepository,
-    watchState: WatchState
+    watchState: WatchState,
+    private val resources: Resources
 ) : Renderer.GlesRenderer(surfaceHolder, currentUserStyleRepository, watchState, FRAME_PERIOD_MS) {
 
     internal var watchBodyTexture: Int = -1
@@ -199,6 +107,45 @@
         hourHandQuad = createTexturedQuad(
             triangleTextureProgram, -0.25f, -3f, 0.5f, 4f
         )
+        watchBodyTexture = loadTextureFromResource(R.drawable.wf_background)
+        checkGLError("Load watchBodyTexture")
+        watchHandTexture = loadTextureFromResource(R.drawable.hand)
+        checkGLError("Load watchHandTexture")
+    }
+
+    private fun loadTextureFromResource(resourceId: Int): Int {
+        val textureHandle = IntArray(1)
+        GLES20.glGenTextures(1, textureHandle, 0)
+        if (textureHandle[0] != 0) {
+            val bitmap = BitmapFactory.decodeResource(
+                resources,
+                resourceId,
+                BitmapFactory.Options().apply {
+                    inScaled = false // No pre-scaling
+                }
+            )
+            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0])
+            GLES20.glTexParameteri(
+                GLES20.GL_TEXTURE_2D,
+                GLES20.GL_TEXTURE_MIN_FILTER,
+                GLES20.GL_NEAREST
+            )
+            GLES20.glTexParameteri(
+                GLES20.GL_TEXTURE_2D,
+                GLES20.GL_TEXTURE_MAG_FILTER,
+                GLES20.GL_NEAREST
+            )
+            GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0)
+            bitmap.recycle()
+        }
+        return textureHandle[0]
+    }
+
+    fun checkGLError(op: String) {
+        var error: Int
+        while (GLES20.glGetError().also { error = it } != GLES20.GL_NO_ERROR) {
+            System.err.println("OpenGL Error $op: glError $error")
+        }
     }
 
     override fun onGlSurfaceCreated(width: Int, height: Int) {
@@ -273,6 +220,7 @@
     )
 
     override fun render(calendar: Calendar) {
+        checkGLError("renders")
         GLES20.glClearColor(0f, 1f, 0f, 1f)
         GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
 
diff --git a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt
index 6adb700..b424d60 100644
--- a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt
+++ b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt
@@ -145,9 +145,7 @@
             watchState,
             colorStyleSetting,
             complication
-        ).apply {
-            initOpenGlContext()
-        }
+        )
     ).setLegacyWatchFaceStyle(
         WatchFace.LegacyWatchFaceOverlayStyle(
             0,
diff --git a/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/TestCanvasAnalogWatchFaceService.kt b/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/TestCanvasAnalogWatchFaceService.kt
index ad5a958..e78cbd8 100644
--- a/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/TestCanvasAnalogWatchFaceService.kt
+++ b/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/TestCanvasAnalogWatchFaceService.kt
@@ -80,7 +80,7 @@
 
     override fun getMutableWatchState() = mutableWatchState
 
-    override fun getHandler() = handler
+    override fun getUiThreadHandlerImpl() = handler
 
     // We want full control over when frames are produced.
     override fun allowWatchFaceToAnimate() = false
diff --git a/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/TestGlesWatchFaceService.kt b/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/TestGlesWatchFaceService.kt
index ffd79332..7edc583 100644
--- a/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/TestGlesWatchFaceService.kt
+++ b/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/TestGlesWatchFaceService.kt
@@ -79,7 +79,7 @@
 
     override fun getMutableWatchState() = mutableWatchState
 
-    override fun getHandler() = handler
+    override fun getUiThreadHandlerImpl() = handler
 
     // We want full control over when frames are produced.
     override fun allowWatchFaceToAnimate() = false
diff --git a/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt b/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
index bca8d09..81c1c35 100644
--- a/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
+++ b/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
@@ -61,6 +61,8 @@
 import androidx.wear.watchface.style.WatchFaceLayer
 import androidx.wear.watchface.style.data.UserStyleWireFormat
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
 import org.junit.After
 import org.junit.Assert.fail
 import org.junit.Before
@@ -182,7 +184,7 @@
             }
             latch.countDown()
         }
-        latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
     }
 
     private fun initCanvasWatchFace() {
@@ -208,12 +210,11 @@
 
         engineWrapper =
             canvasAnalogWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
-        engineWrapper.onSurfaceChanged(
-            surfaceHolder,
-            0,
-            surfaceHolder.surfaceFrame.width(),
-            surfaceHolder.surfaceFrame.height()
-        )
+        engineWrapper.uiThreadCoroutineScope.launch {
+            // Set the timezone so it doesn't matter where the bots are running.
+            engineWrapper.deferredWatchFaceImpl.await().calendar.timeZone =
+                TimeZone.getTimeZone("UTC")
+        }
     }
 
     private fun initGles2WatchFace() {
@@ -234,12 +235,11 @@
         setPendingWallpaperInteractiveWatchFaceInstance()
 
         engineWrapper = glesWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
-        engineWrapper.onSurfaceChanged(
-            surfaceHolder,
-            0,
-            surfaceHolder.surfaceFrame.width(),
-            surfaceHolder.surfaceFrame.height()
-        )
+        engineWrapper.uiThreadCoroutineScope.launch {
+            // Set the timezone so it doesn't matter where the bots are running.
+            engineWrapper.deferredWatchFaceImpl.await().calendar.timeZone =
+                TimeZone.getTimeZone("UTC")
+        }
     }
 
     private fun setPendingWallpaperInteractiveWatchFaceInstance() {
@@ -266,14 +266,7 @@
                             iInteractiveWatchFace: IInteractiveWatchFace
                         ) {
                             interactiveWatchFaceInstance = iInteractiveWatchFace
-                            sendComplications()
-                            // engineWrapper won't be initialized yet, so defer execution.
-                            handler.post {
-                                // Set the timezone so it doesn't matter where the bots are running.
-                                engineWrapper.watchFaceImpl.calendar.timeZone =
-                                    TimeZone.getTimeZone("UTC")
-                                initLatch.countDown()
-                            }
+                            initLatch.countDown()
                         }
 
                         override fun onInteractiveWatchFaceCrashed(exception: CrashInfoParcel?) {
@@ -310,36 +303,32 @@
         interactiveWatchFaceInstance.release()
     }
 
-    private fun waitForPendingTaskToRunOnHandler() {
-        val latch = CountDownLatch(1)
-        handler.post {
-            latch.countDown()
-        }
-        latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
-    }
-
     @Test
     public fun testActiveScreenshot() {
         handler.post(this::initCanvasWatchFace)
-        initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
+        sendComplications()
+
         handler.post {
             engineWrapper.draw()
         }
 
-        renderDoneLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(renderDoneLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
         bitmap.assertAgainstGolden(screenshotRule, "active_screenshot")
     }
 
     @Test
     public fun testAmbientScreenshot() {
         handler.post(this::initCanvasWatchFace)
-        initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
+        sendComplications()
+
         handler.post {
             setAmbient(true)
             engineWrapper.draw()
         }
 
-        renderDoneLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(renderDoneLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
         bitmap.assertAgainstGolden(screenshotRule, "ambient_screenshot2")
     }
 
@@ -347,7 +336,9 @@
     public fun testCommandTakeScreenShot() {
         val latch = CountDownLatch(1)
         handler.post(this::initCanvasWatchFace)
-        initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
+        sendComplications()
+
         var bitmap: Bitmap? = null
         handler.post {
             bitmap = SharedMemoryImage.ashmemReadImageBundle(
@@ -367,7 +358,7 @@
             latch.countDown()
         }
 
-        latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
         bitmap!!.assertAgainstGolden(
             screenshotRule,
             "ambient_screenshot"
@@ -379,7 +370,9 @@
         val latch = CountDownLatch(1)
 
         handler.post(this::initGles2WatchFace)
-        initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
+        sendComplications()
+
         var bitmap: Bitmap? = null
         handler.post {
             bitmap = SharedMemoryImage.ashmemReadImageBundle(
@@ -399,7 +392,7 @@
             latch.countDown()
         }
 
-        latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
         bitmap!!.assertAgainstGolden(
             screenshotRule,
             "ambient_gl_screenshot"
@@ -409,17 +402,19 @@
     @Test
     public fun testSetGreenStyle() {
         handler.post(this::initCanvasWatchFace)
-        initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
+        // Note this will clear complications.
+        interactiveWatchFaceInstance.updateWatchfaceInstance(
+            "newId",
+            UserStyleWireFormat(mapOf(COLOR_STYLE_SETTING to GREEN_STYLE.encodeToByteArray()))
+        )
+        sendComplications()
+
         handler.post {
-            interactiveWatchFaceInstance.updateWatchfaceInstance(
-                "newId",
-                UserStyleWireFormat(mapOf(COLOR_STYLE_SETTING to GREEN_STYLE.encodeToByteArray()))
-            )
-            sendComplications()
             engineWrapper.draw()
         }
 
-        renderDoneLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(renderDoneLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
         bitmap.assertAgainstGolden(screenshotRule, "green_screenshot")
     }
 
@@ -428,7 +423,9 @@
         val latch = CountDownLatch(1)
 
         handler.post(this::initCanvasWatchFace)
-        initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
+        sendComplications()
+
         var bitmap: Bitmap? = null
         handler.post {
             bitmap = SharedMemoryImage.ashmemReadImageBundle(
@@ -452,7 +449,7 @@
             latch.countDown()
         }
 
-        latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
         bitmap!!.assertAgainstGolden(
             screenshotRule,
             "highlight_complications"
@@ -464,7 +461,9 @@
         val latch = CountDownLatch(1)
 
         handler.post(this::initCanvasWatchFace)
-        initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
+        sendComplications()
+
         var bitmap: Bitmap? = null
         handler.post {
             bitmap = SharedMemoryImage.ashmemReadImageBundle(
@@ -490,7 +489,7 @@
             latch.countDown()
         }
 
-        latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
         bitmap!!.assertAgainstGolden(
             screenshotRule,
             "highlight_right_complication"
@@ -524,9 +523,9 @@
         )
 
         handler.post(this::initCanvasWatchFace)
-        // Preview complication data results in additional tasks posted which we need to complete
-        // before interactiveWatchFaceInstanceWCS is initialized.
-        waitForPendingTaskToRunOnHandler()
+        assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
+        sendComplications()
+
         var bitmap: Bitmap? = null
         handler.post {
             bitmap = SharedMemoryImage.ashmemReadImageBundle(
@@ -546,7 +545,7 @@
             latch.countDown()
         }
 
-        latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
         bitmap!!.assertAgainstGolden(
             screenshotRule,
             "preview_complications"
@@ -564,46 +563,42 @@
         Mockito.`when`(surfaceHolder.surface).thenReturn(surface)
         Mockito.`when`(surface.isValid).thenReturn(false)
 
-        lateinit var engineWrapper: WatchFaceService.EngineWrapper
-
-        handler.post {
-            // Simulate a R style direct boot scenario where a new service is created but there's no
-            // pending PendingWallpaperInteractiveWatchFaceInstance and no wallpaper command. It
-            // instead uses the WallpaperInteractiveWatchFaceInstanceParams which normally would be
-            // read from disk, but provided directly in this test.
-            val service = TestCanvasAnalogWatchFaceService(
-                ApplicationProvider.getApplicationContext<Context>(),
-                handler,
-                100000,
-                surfaceHolder,
-                false, // Direct boot.
-                WallpaperInteractiveWatchFaceInstanceParams(
-                    INTERACTIVE_INSTANCE_ID,
-                    DeviceConfig(
-                        false,
-                        false,
-                        0,
-                        0
-                    ),
-                    WatchUiState(false, 0),
-                    UserStyleWireFormat(
-                        mapOf(COLOR_STYLE_SETTING to GREEN_STYLE.encodeToByteArray())
-                    ),
-                    null
-                )
+        // Simulate a R style direct boot scenario where a new service is created but there's no
+        // pending PendingWallpaperInteractiveWatchFaceInstance and no wallpaper command. It
+        // instead uses the WallpaperInteractiveWatchFaceInstanceParams which normally would be
+        // read from disk, but provided directly in this test.
+        val service = TestCanvasAnalogWatchFaceService(
+            ApplicationProvider.getApplicationContext<Context>(),
+            handler,
+            100000,
+            surfaceHolder,
+            false, // Direct boot.
+            WallpaperInteractiveWatchFaceInstanceParams(
+                INTERACTIVE_INSTANCE_ID,
+                DeviceConfig(
+                    false,
+                    false,
+                    0,
+                    0
+                ),
+                WatchUiState(false, 0),
+                UserStyleWireFormat(
+                    mapOf(COLOR_STYLE_SETTING to GREEN_STYLE.encodeToByteArray())
+                ),
+                null
             )
+        )
 
-            engineWrapper = service.onCreateEngine() as WatchFaceService.EngineWrapper
-            engineWrapper.onSurfaceChanged(
-                surfaceHolder,
-                0,
-                surfaceHolder.surfaceFrame.width(),
-                surfaceHolder.surfaceFrame.height()
-            )
-            handler.post { engineWrapper.draw() }
+        val engineWrapper = service.onCreateEngine() as WatchFaceService.EngineWrapper
+
+        // Make sure init has completed before trying to draw.
+        runBlocking {
+            engineWrapper.deferredWatchFaceImpl.await()
         }
 
-        renderDoneLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        handler.post { engineWrapper.draw() }
+
+        assertThat(renderDoneLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
         try {
             bitmap.assertAgainstGolden(screenshotRule, "direct_boot")
         } finally {
@@ -612,7 +607,7 @@
                 engineWrapper.onDestroy()
                 latch.countDown()
             }
-            latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+            assertThat(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
         }
     }
 
@@ -620,20 +615,22 @@
     public fun complicationTapLaunchesActivity() {
         handler.post(this::initCanvasWatchFace)
 
+        assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
+        sendComplications()
+
         ComplicationTapActivity.newCountDown()
-        handler.post {
-            val interactiveWatchFaceInstance =
-                InteractiveInstanceManager.getAndRetainInstance(
-                    interactiveWatchFaceInstance.instanceId
-                )!!
-            interactiveWatchFaceInstance.sendTouchEvent(
-                85,
-                165,
-                TapType.UP
-            )
-            interactiveWatchFaceInstance.release()
-        }
+
+        val interactiveWatchFaceInstance =
+            InteractiveInstanceManager.getAndRetainInstance(
+                interactiveWatchFaceInstance.instanceId
+            )!!
+        interactiveWatchFaceInstance.sendTouchEvent(
+            85,
+            165,
+            TapType.UP
+        )
 
         assertThat(ComplicationTapActivity.awaitIntent()).isNotNull()
+        interactiveWatchFaceInstance.release()
     }
 }
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/CanvasComplicationFactory.java b/wear/wear-watchface/src/main/java/androidx/wear/watchface/CanvasComplicationFactory.java
index 133b6d0..6d46712 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/CanvasComplicationFactory.java
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/CanvasComplicationFactory.java
@@ -17,7 +17,7 @@
 package androidx.wear.watchface;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.UiThread;
+import androidx.annotation.WorkerThread;
 
 /**
  * Factory for creating a CanvasComplication. This decouples construction of Complications and
@@ -26,7 +26,9 @@
 // TODO(b/188035300): Put links into the comments.
 public interface CanvasComplicationFactory {
     /**
-     * Creates a CanvasComplication.
+     * Creates a CanvasComplication. This will be called on a background thread, however all
+     * CanvasComplication rendering will be done on the UI thread and there's a memory barrier
+     * between construction and usage so no special threading primitives are required.
      *
      * @param watchState The current WatchState
      * @param invalidateCallback The CanvasComplication.InvalidateCallback the constructed
@@ -36,7 +38,7 @@
      * @return The constructed CanvasComplication.
      */
     @NonNull
-    @UiThread
+    @WorkerThread
     @SuppressWarnings("ExecutorRegistration") // This is UI thread only.
     CanvasComplication create(
             @NonNull WatchState watchState,
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/Complication.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/Complication.kt
index 6b9fc0a..062cdca 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/Complication.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/Complication.kt
@@ -29,6 +29,7 @@
 import androidx.wear.complications.DefaultComplicationProviderPolicy
 import androidx.wear.complications.data.ComplicationData
 import androidx.wear.complications.data.ComplicationType
+import androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData
 import androidx.wear.watchface.data.ComplicationBoundsType
 import androidx.wear.watchface.style.UserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting
@@ -206,7 +207,9 @@
             complicationsManager.watchState,
             object : CanvasComplication.InvalidateCallback {
                 override fun onInvalidate() {
-                    invalidateListener.onInvalidate()
+                    if (this@Complication::invalidateListener.isInitialized) {
+                        invalidateListener.onInvalidate()
+                    }
                 }
             }
         )
@@ -460,12 +463,6 @@
             }
             field = value
             complicationBoundsDirty = true
-
-            // The caller might modify a number of complications. For efficiency we need to coalesce
-            // these into one update task.
-            if (this::complicationsManager.isInitialized) {
-                complicationsManager.scheduleUpdate()
-            }
         }
 
     internal var enabledDirty = true
@@ -482,12 +479,6 @@
             }
             field = value
             enabledDirty = true
-
-            // The caller might enable/disable a number of complications. For efficiency we need
-            // to coalesce these into one update task.
-            if (this::complicationsManager.isInitialized) {
-                complicationsManager.scheduleUpdate()
-            }
         }
 
     internal var supportedTypesDirty = true
@@ -504,12 +495,6 @@
             require(value.isNotEmpty())
             field = value
             supportedTypesDirty = true
-
-            // The caller might modify a number of complications. For efficiency we need to
-            // coalesce these into one update task.
-            if (this::complicationsManager.isInitialized) {
-                complicationsManager.scheduleUpdate()
-            }
         }
 
     internal var defaultProviderPolicyDirty = true
@@ -528,12 +513,6 @@
             }
             field = value
             defaultProviderPolicyDirty = true
-
-            // The caller might modify a number of complications. For efficiency we need to
-            // coalesce these into one update task.
-            if (this::complicationsManager.isInitialized) {
-                complicationsManager.scheduleUpdate()
-            }
         }
 
     internal var defaultProviderTypeDirty = true
@@ -551,12 +530,6 @@
             }
             field = value
             defaultProviderTypeDirty = true
-
-            // The caller might modify a number of complications. For efficiency we need to
-            // coalesce these into one update task.
-            if (this::complicationsManager.isInitialized) {
-                complicationsManager.scheduleUpdate()
-            }
         }
 
     internal var accessibilityTraversalIndexDirty = true
@@ -579,12 +552,6 @@
             }
             field = value
             accessibilityTraversalIndexDirty = true
-
-            // The caller might enable/disable a number of complications. For efficiency we need
-            // to coalesce these into one update task.
-            if (this::complicationsManager.isInitialized) {
-                complicationsManager.scheduleUpdate()
-            }
         }
 
     internal var dataDirty = true
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationsManager.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationsManager.kt
index 4265451..a89c976 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationsManager.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationsManager.kt
@@ -26,11 +26,14 @@
 import androidx.annotation.RestrictTo
 import androidx.annotation.UiThread
 import androidx.annotation.VisibleForTesting
+import androidx.annotation.WorkerThread
 import androidx.wear.complications.ComplicationBounds
 import androidx.wear.complications.ComplicationHelperActivity
 import androidx.wear.complications.data.ComplicationData
 import androidx.wear.complications.data.ComplicationType
 import androidx.wear.complications.data.EmptyComplicationData
+import androidx.wear.utility.TraceEvent
+import androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData
 import androidx.wear.watchface.control.data.IdTypeAndDefaultProviderPolicyWireFormat
 import androidx.wear.watchface.data.ComplicationBoundsType
 import androidx.wear.watchface.style.CurrentUserStyleRepository
@@ -82,7 +85,6 @@
     private lateinit var watchFaceHostApi: WatchFaceHostApi
     private lateinit var calendar: Calendar
     internal lateinit var renderer: Renderer
-    private lateinit var pendingUpdate: CancellableUniqueTask
 
     /** A map of complication IDs to complications. */
     public val complications: Map<Int, Complication> =
@@ -151,23 +153,26 @@
     }
 
     /** Finish initialization. */
+    @WorkerThread
     internal fun init(
         watchFaceHostApi: WatchFaceHostApi,
         calendar: Calendar,
         renderer: Renderer,
         complicationInvalidateListener: Complication.InvalidateListener
-    ) {
+    ) = TraceEvent("ComplicationsManager.init").use {
         this.watchFaceHostApi = watchFaceHostApi
         this.calendar = calendar
         this.renderer = renderer
-        pendingUpdate = CancellableUniqueTask(watchFaceHostApi.getHandler())
 
         for ((_, complication) in complications) {
             complication.init(complicationInvalidateListener)
+
+            // Force lazy construction of renderers.
+            complication.renderer
         }
 
         // Activate complications.
-        scheduleUpdate()
+        updateComplications()
     }
 
     internal fun applyComplicationsStyleCategoryOption(styleOption: ComplicationsOption) {
@@ -182,18 +187,19 @@
             complication.accessibilityTraversalIndex =
                 override?.accessibilityTraversalIndex ?: initialConfig.accessibilityTraversalIndex
         }
+        updateComplications()
     }
 
     /** Returns the [Complication] corresponding to [id], if there is one, or `null`. */
     public operator fun get(id: Int): Complication? = complications[id]
 
-    internal fun scheduleUpdate() {
-        if (this::pendingUpdate.isInitialized && !pendingUpdate.isPending()) {
-            pendingUpdate.postUnique(this::updateComplications)
+    @UiThread
+    internal fun updateComplications() = TraceEvent(
+        "ComplicationsManager.updateComplications"
+    ).use {
+        if (!this::watchFaceHostApi.isInitialized) {
+            return
         }
-    }
-
-    private fun updateComplications() {
         val activeKeys = mutableListOf<Int>()
 
         // Work out what's changed using the dirty flags and issue appropriate watchFaceHostApi
@@ -282,7 +288,7 @@
         complication.setIsHighlighted(true)
 
         val weakRef = WeakReference(this)
-        watchFaceHostApi.getHandler().postDelayed(
+        watchFaceHostApi.getUiThreadHandler().postDelayed(
             {
                 // The watch face might go away before this can run.
                 if (weakRef.get() != null) {
@@ -379,6 +385,12 @@
         writer.decreaseIndent()
     }
 
+    /**
+     * This will be called from a binder thread. That's OK because we don't expect this
+     * ComplicationsManager to be accessed at all from the UiThread in that scenario. See
+     * [androidx.wear.watchface.control.IWatchFaceInstanceServiceStub.getDefaultProviderPolicies].
+     */
+    @WorkerThread
     internal fun getDefaultProviderPolicies(): Array<IdTypeAndDefaultProviderPolicyWireFormat> =
         complications.map {
             IdTypeAndDefaultProviderPolicyWireFormat(
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ObservableWatchData.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/ObservableWatchData.kt
index ba4ac3f..12b1443 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ObservableWatchData.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/ObservableWatchData.kt
@@ -24,7 +24,7 @@
  * @param T The type of data held by this instance.
  * @param _value The initial value or `null` if there isn't an initial value.
  */
-public open class ObservableWatchData<T : Any> internal constructor(internal var _value: T?) {
+public sealed class ObservableWatchData<T : Any> constructor(internal var _value: T?) {
 
     private var iterating = false
     private val observers = ArrayList<Observer<T>>()
@@ -104,26 +104,26 @@
             "<unset>"
         }
     }
-}
-
-/**
- * [ObservableWatchData] which publicly exposes [setValue(T)] method.
- *
- * @param T The type of data held by this instance
- */
-public class MutableObservableWatchData<T : Any>(initialValue: T?) :
-    ObservableWatchData<T>(initialValue) {
-    public constructor() : this(null)
 
     /**
-     * Mutable observable value. Assigning a different value will trigger [Observer.onChanged]
-     * callbacks.
+     * [ObservableWatchData] which publicly exposes [setValue(T)] method.
+     *
+     * @param T The type of data held by this instance
      */
-    override var value: T
-        @UiThread
-        get() = _value!!
-        @UiThread
-        public set(v) {
-            super.value = v
-        }
+    public class MutableObservableWatchData<T : Any>(initialValue: T?) :
+        ObservableWatchData<T>(initialValue) {
+        public constructor() : this(null)
+
+        /**
+         * Mutable observable value. Assigning a different value will trigger [Observer.onChanged]
+         * callbacks.
+         */
+        override var value: T
+            @UiThread
+            get() = _value!!
+            @UiThread
+            public set(v) {
+                super.value = v
+            }
+    }
 }
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/RenderBufferTexture.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/RenderBufferTexture.kt
index d83fa20..fbc24f5 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/RenderBufferTexture.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/RenderBufferTexture.kt
@@ -73,10 +73,6 @@
     @Px
     private val height: Int
 ) {
-    private companion object {
-        private const val RENDER_TEXTURE_UNIT = 1
-    }
-
     val framebuffer = IntArray(1)
     val textureId = IntArray(1)
 
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/Renderer.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/Renderer.kt
index da73b8c..6dfc3f8 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/Renderer.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/Renderer.kt
@@ -42,9 +42,11 @@
 import androidx.annotation.Px
 import androidx.annotation.RequiresApi
 import androidx.annotation.UiThread
+import androidx.annotation.WorkerThread
 import androidx.wear.utility.TraceEvent
 import androidx.wear.watchface.Renderer.CanvasRenderer
 import androidx.wear.watchface.Renderer.GlesRenderer
+import androidx.wear.watchface.Renderer.GlesRenderer.GlesException
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import java.nio.ByteBuffer
 
@@ -99,7 +101,9 @@
 }
 
 /**
- * The base class for [CanvasRenderer] and [GlesRenderer].
+ * The base class for [CanvasRenderer] and [GlesRenderer]. Renderers are constructed on a background
+ * thread but all rendering is done on the UiThread. There is a memory barrier between construction
+ * and rendering so no special threading primitives are required.
  *
  * @param surfaceHolder The [SurfaceHolder] that [renderInternal] will draw into.
  * @param currentUserStyleRepository The associated [CurrentUserStyleRepository].
@@ -111,7 +115,7 @@
  * face has a short animation once per second it can adjust the frame rate inorder to sleep when
  * not animating.
  */
-public sealed class Renderer(
+public sealed class Renderer @WorkerThread constructor(
     public val surfaceHolder: SurfaceHolder,
     private val currentUserStyleRepository: CurrentUserStyleRepository,
     internal val watchState: WatchState,
@@ -284,7 +288,7 @@
      */
     public fun postInvalidate() {
         if (this::watchFaceHostApi.isInitialized) {
-            watchFaceHostApi.getHandler().post { watchFaceHostApi.invalidate() }
+            watchFaceHostApi.getUiThreadHandler().post { watchFaceHostApi.invalidate() }
         }
     }
 
@@ -292,8 +296,21 @@
     internal abstract fun dump(writer: IndentingPrintWriter)
 
     /**
+     * Perform UiThread specific initialization.  Will be called once during initialization before
+     * any subsequent calls to [renderInternal] or [takeScreenshot].
+     */
+    @UiThread
+    internal open fun uiThreadInit() {}
+
+    /**
      * Watch faces that require [Canvas] rendering should extend their [Renderer] from this class.
      *
+     * A CanvasRenderer is expected to be constructed on the background thread associated with
+     * [WatchFaceService.getBackgroundThreadHandler] inside a call to
+     * [WatchFaceService.createWatchFace]. All rendering is be done on the UiThread. There is a
+     * memory barrier between construction and rendering so no special threading primitives are
+     * required.
+     *
      * @param surfaceHolder The [SurfaceHolder] from which a [Canvas] to will be obtained and passed
      * into [render].
      * @param currentUserStyleRepository The watch face's associated [CurrentUserStyleRepository].
@@ -306,7 +323,7 @@
      * life, e.g. if a watch face has a short animation once per second it can adjust the frame
      * rate inorder to sleep when not animating.
      */
-    public abstract class CanvasRenderer(
+    public abstract class CanvasRenderer @WorkerThread constructor(
         surfaceHolder: SurfaceHolder,
         currentUserStyleRepository: CurrentUserStyleRepository,
         watchState: WatchState,
@@ -446,7 +463,21 @@
 
     /**
      * Watch faces that require [GLES20] rendering should extend their [Renderer] from this class.
-     * Before passing to the [WatchFace] constructor [initOpenGlContext] must be called.
+     *
+     * A GlesRenderer is expected to be constructed on the background thread associated with
+     * [WatchFaceService.getBackgroundThreadHandler] inside a call to
+     * [WatchFaceService.createWatchFace]. All rendering is be done on the UiThread. There is a
+     * memory barrier between construction and rendering so no special threading primitives are
+     * required.
+     *
+     * Two linked [EGLContext]s are created [eglBackgroundThreadContext] and [eglUiThreadContext]
+     * which are associated with background and UiThread respectively. OpenGL objects created on
+     * (e.g. shaders and textures) can be used on the other. Caution must be exercised with
+     * multi-threaded OpenGl API use, concurrent usage may not be supported.
+     *
+     * If you need to make any OpenGl calls outside of [render], [onGlContextCreated] or
+     * [onGlSurfaceCreated] then you must first call either [makeUiThreadContextCurrent] or
+     * [makeBackgroundThreadContextCurrent] depending on which thread you're on.
      *
      * @param surfaceHolder The [SurfaceHolder] whose [android.view.Surface] [render] will draw
      * into.
@@ -464,7 +495,11 @@
      * default this is empty.
      * @throws [GlesException] If any GL calls fail during initialization.
      */
-    public abstract class GlesRenderer @Throws(GlesException::class) @JvmOverloads constructor(
+    public abstract class GlesRenderer
+    @Throws(GlesException::class)
+    @JvmOverloads
+    @WorkerThread
+    constructor(
         surfaceHolder: SurfaceHolder,
         currentUserStyleRepository: CurrentUserStyleRepository,
         watchState: WatchState,
@@ -501,22 +536,35 @@
         /** The GlesRenderer's [EGLConfig]. */
         public var eglConfig: EGLConfig = chooseEglConfig(eglDisplay)
 
-        /** The GlesRenderer's [EGLContext]. */
+        /** The GlesRenderer's background Thread [EGLContext]. */
         @SuppressWarnings("SyntheticAccessor")
-        public var eglContext: EGLContext = EGL14.eglCreateContext(
+        public lateinit var eglBackgroundThreadContext: EGLContext
+            private set
+
+        /**
+         * The GlesRenderer's UiThread [EGLContext]. Note this not available until after
+         * [WatchFaceService.createWatchFace] has completed.
+         */
+        public lateinit var eglUiThreadContext: EGLContext
+            private set
+
+        // A 1x1 surface which is needed by EGL14.eglMakeCurrent.
+        private val fakeBackgroundThreadSurface = EGL14.eglCreatePbufferSurface(
             eglDisplay,
             eglConfig,
-            EGL14.EGL_NO_CONTEXT,
-            EGL_CONTEXT_ATTRIB_LIST,
+            intArrayOf(
+                EGL14.EGL_WIDTH,
+                1,
+                EGL14.EGL_HEIGHT,
+                1,
+                EGL14.EGL_TEXTURE_TARGET,
+                EGL14.EGL_NO_TEXTURE,
+                EGL14.EGL_TEXTURE_FORMAT,
+                EGL14.EGL_NO_TEXTURE,
+                EGL14.EGL_NONE
+            ),
             0
         )
-
-        init {
-            if (eglContext == EGL14.EGL_NO_CONTEXT) {
-                throw RuntimeException("eglCreateContext failed")
-            }
-        }
-
         private lateinit var eglSurface: EGLSurface
         private var calledOnGlContextCreated = false
         private val renderBufferTexture by lazy {
@@ -525,7 +573,6 @@
                 surfaceHolder.surfaceFrame.height()
             )
         }
-        internal var initDone = false
 
         /**
          * Chooses the EGLConfig to use.
@@ -555,7 +602,9 @@
         }
 
         @Throws(GlesException::class)
-        private fun createWindowSurface(width: Int, height: Int) {
+        private fun createWindowSurface(width: Int, height: Int) = TraceEvent(
+            "GlesRenderer.createWindowSurface"
+        ).use {
             if (this::eglSurface.isInitialized) {
                 if (!EGL14.eglDestroySurface(eglDisplay, eglSurface)) {
                     Log.w(TAG, "eglDestroySurface failed")
@@ -582,13 +631,14 @@
                 throw GlesException("eglCreateWindowSurface failed")
             }
 
-            makeContextCurrent()
+            makeUiThreadContextCurrent()
             GLES20.glViewport(0, 0, width, height)
             if (!calledOnGlContextCreated) {
                 calledOnGlContextCreated = true
-                onGlContextCreated()
             }
-            onGlSurfaceCreated(width, height)
+            TraceEvent("GlesRenderer.onGlSurfaceCreated").use {
+                onGlSurfaceCreated(width, height)
+            }
         }
 
         @CallSuper
@@ -598,7 +648,10 @@
                     Log.w(TAG, "eglDestroySurface failed")
                 }
             }
-            if (!EGL14.eglDestroyContext(eglDisplay, eglContext)) {
+            if (!EGL14.eglDestroyContext(eglDisplay, eglUiThreadContext)) {
+                Log.w(TAG, "eglDestroyContext failed")
+            }
+            if (!EGL14.eglDestroyContext(eglDisplay, eglBackgroundThreadContext)) {
                 Log.w(TAG, "eglDestroyContext failed")
             }
             if (!EGL14.eglTerminate(eglDisplay)) {
@@ -607,15 +660,32 @@
         }
 
         /**
-         * Sets our GL context to be the current one. The library does this on your behalf before
-         * calling [onGlContextCreated] or [render]. If you need to make any OpenGL calls outside
-         * those functions, this method *must* be called first.
+         * Sets the GL context associated with the [WatchFaceService.getBackgroundThreadHandler]'s
+         * looper thread as the current one. The library does this on your behalf before calling
+         * [onGlContextCreated]. If you need to make any OpenGL calls on
+         * [WatchFaceService.getBackgroundThreadHandler] outside that function, this method
+         * *must* be called first.
          *
          * @throws [IllegalStateException] if the calls to [EGL14.eglMakeCurrent] fails
          */
-        public fun makeContextCurrent() {
-            if (!EGL14.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) {
-                throw IllegalStateException("eglMakeCurrent failed")
+        @WorkerThread
+        public fun makeBackgroundThreadContextCurrent() {
+            require(
+                !this::watchFaceHostApi.isInitialized ||
+                    watchFaceHostApi.getBackgroundThreadHandler().looper.isCurrentThread
+            ) {
+                "makeBackgroundThreadContextCurrent must be called from the Background Thread"
+            }
+            if (!EGL14.eglMakeCurrent(
+                    eglDisplay,
+                    fakeBackgroundThreadSurface,
+                    fakeBackgroundThreadSurface,
+                    eglBackgroundThreadContext
+                )
+            ) {
+                throw IllegalStateException(
+                    "eglMakeCurrent failed, glGetError() = " + GLES20.glGetError()
+                )
             }
         }
 
@@ -627,51 +697,119 @@
          */
         @UiThread
         @Throws(GlesException::class)
-        public fun initOpenGlContext() {
-            surfaceHolder.addCallback(object : SurfaceHolder.Callback {
-                @SuppressLint("SyntheticAccessor")
-                override fun surfaceChanged(
-                    holder: SurfaceHolder,
-                    format: Int,
-                    width: Int,
-                    height: Int
-                ) {
-                    createWindowSurface(width, height)
+        internal fun initBackgroundThreadOpenGlContext() =
+            TraceEvent("GlesRenderer.initBackgroundThreadOpenGlContext").use {
+
+                eglBackgroundThreadContext = EGL14.eglCreateContext(
+                    eglDisplay,
+                    eglConfig,
+                    EGL14.EGL_NO_CONTEXT,
+                    EGL_CONTEXT_ATTRIB_LIST,
+                    0
+                )
+                if (eglBackgroundThreadContext == EGL14.EGL_NO_CONTEXT) {
+                    throw RuntimeException("eglCreateContext failed")
                 }
 
-                @SuppressLint("SyntheticAccessor")
-                override fun surfaceDestroyed(holder: SurfaceHolder) {
-                    if (this@GlesRenderer::eglSurface.isInitialized) {
-                        if (!EGL14.eglDestroySurface(eglDisplay, eglSurface)) {
-                            Log.w(TAG, "eglDestroySurface failed")
-                        }
-                    }
+                makeBackgroundThreadContextCurrent()
+
+                TraceEvent("GlesRenderer.onGlContextCreated").use {
+                    onGlContextCreated()
                 }
+            }
 
-                override fun surfaceCreated(holder: SurfaceHolder) {
-                }
-            })
-
-            // Note we have to call this after the derived class's init() method has run or it's
-            // typically going to fail because members have not been initialized.
-            createWindowSurface(
-                surfaceHolder.surfaceFrame.width(),
-                surfaceHolder.surfaceFrame.height()
-            )
-
-            initDone = true
+        /**
+         * Sets our UiThread GL context as the current one. The library does this on your behalf
+         * before calling [render]. If you need to make any UiThread OpenGL calls outside that
+         * function, this method *must* be called first.
+         *
+         * @throws [IllegalStateException] if the calls to [EGL14.eglMakeCurrent] fails
+         */
+        @UiThread
+        public fun makeUiThreadContextCurrent() {
+            require(watchFaceHostApi.getUiThreadHandler().looper.isCurrentThread) {
+                "makeUiThreadContextCurrent must be called from the UiThread"
+            }
+            if (!EGL14.eglMakeCurrent(
+                    eglDisplay,
+                    eglSurface,
+                    eglSurface,
+                    eglUiThreadContext
+                )
+            ) {
+                throw IllegalStateException(
+                    "eglMakeCurrent failed, glGetError() = " + GLES20.glGetError()
+                )
+            }
         }
 
         /**
-         * Called when a new GL context is created. It's safe to use GL APIs in this method. Note
-         * [makeContextCurrent] is called by the library before this method.
+         * Initializes the GlesRenderer, and calls [onGlSurfaceCreated]. It is an error to construct
+         * a [WatchFace] before this method has been called.
+         *
+         * @throws [GlesException] If any GL calls fail.
          */
         @UiThread
+        @Throws(GlesException::class)
+        internal override fun uiThreadInit() =
+            TraceEvent("GlesRenderer.initUiThreadOpenGlContext").use {
+                eglUiThreadContext = EGL14.eglCreateContext(
+                    eglDisplay,
+                    eglConfig,
+                    eglBackgroundThreadContext,
+                    intArrayOf(
+                        EGL14.EGL_CONTEXT_CLIENT_VERSION,
+                        2,
+                        EGL14.EGL_NONE
+                    ),
+                    0
+                )
+
+                surfaceHolder.addCallback(object : SurfaceHolder.Callback {
+                    @SuppressLint("SyntheticAccessor")
+                    override fun surfaceChanged(
+                        holder: SurfaceHolder,
+                        format: Int,
+                        width: Int,
+                        height: Int
+                    ) {
+                        createWindowSurface(width, height)
+                    }
+
+                    @SuppressLint("SyntheticAccessor")
+                    override fun surfaceDestroyed(holder: SurfaceHolder) {
+                        if (this@GlesRenderer::eglSurface.isInitialized) {
+                            if (!EGL14.eglDestroySurface(eglDisplay, eglSurface)) {
+                                Log.w(TAG, "eglDestroySurface failed")
+                            }
+                        }
+                    }
+
+                    override fun surfaceCreated(holder: SurfaceHolder) {
+                    }
+                })
+
+                // Note we have to call this after the derived class's init() method has run or it's
+                // typically going to fail because members have not been initialized.
+                createWindowSurface(
+                    surfaceHolder.surfaceFrame.width(),
+                    surfaceHolder.surfaceFrame.height()
+                )
+            }
+
+        /**
+         * Called when a new GL context is created on the background thread. It's safe to use GL
+         * APIs in this method. Note [makeBackgroundThreadContextCurrent] is called by the library
+         * before this method.
+         */
+        @WorkerThread
         public open fun onGlContextCreated() {
         }
 
         /**
-         * Called when a new GL surface is created. It's safe to use GL APIs in this method.
+         * Called when a new GL surface is created on the UiThread. It's safe to use GL APIs in
+         * this method. Note [makeUiThreadContextCurrent] is called by the library before this
+         * method.
          *
          * @param width width of surface in pixels
          * @param height height of surface in pixels
@@ -683,7 +821,7 @@
         internal override fun renderInternal(
             calendar: Calendar
         ) {
-            makeContextCurrent()
+            makeUiThreadContextCurrent()
             renderAndComposite(calendar)
             if (!EGL14.eglSwapBuffers(eglDisplay, eglSurface)) {
                 Log.w(TAG, "eglSwapBuffers failed")
@@ -698,7 +836,7 @@
             val width = screenBounds.width()
             val height = screenBounds.height()
             val pixelBuf = ByteBuffer.allocateDirect(width * height * 4)
-            makeContextCurrent()
+            makeUiThreadContextCurrent()
             val prevRenderParameters = this.renderParameters
             this.renderParameters = renderParameters
             renderAndComposite(calendar)
@@ -779,7 +917,7 @@
          * should respect the current [renderParameters]. Any highlights due to
          * [RenderParameters.highlightLayer] should be rendered by [renderHighlightLayer] instead
          * where possible. For correct behavior this function must use the supplied [Calendar]
-         * in favor of any other ways of getting the time. Note [makeContextCurrent] and
+         * in favor of any other ways of getting the time. Note [makeUiThreadContextCurrent] and
          * `GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ZERO)` are called by the library before this
          * method.
          *
@@ -796,8 +934,8 @@
          * or a solid outline around the [RenderParameters.HighlightLayer.highlightedElement]. This
          * will be composited as needed on top of the results of [render]. For correct behavior this
          * function must use the supplied [Calendar] in favor of any other ways of getting the time.
-         * Note [makeContextCurrent] and `GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ZERO)` are
-         * called by the library before this method.
+         * Note [makeUiThreadContextCurrent] and `GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ZERO)`
+         * are called by the library before this method.
          *
          * @param calendar The current [Calendar]
          */
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
index 356c623..ff3c3a2 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
@@ -19,39 +19,44 @@
 import android.annotation.SuppressLint
 import android.app.NotificationManager
 import android.content.ComponentName
-import android.content.Context
 import android.content.Intent
 import android.content.IntentFilter
 import android.graphics.Bitmap
+import android.graphics.Canvas
 import android.graphics.Rect
 import android.icu.util.Calendar
 import android.icu.util.TimeZone
 import android.os.BatteryManager
 import android.os.Build
+import android.os.Bundle
+import android.support.wearable.watchface.SharedMemoryImage
 import android.support.wearable.watchface.WatchFaceStyle
-import android.util.Base64
 import android.view.Gravity
 import android.view.Surface.FRAME_RATE_COMPATIBILITY_DEFAULT
 import androidx.annotation.ColorInt
 import androidx.annotation.IntDef
 import androidx.annotation.IntRange
 import androidx.annotation.Px
+import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
-import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP
 import androidx.annotation.UiThread
 import androidx.annotation.VisibleForTesting
 import androidx.wear.complications.SystemProviders
 import androidx.wear.complications.data.ComplicationData
+import androidx.wear.complications.data.ComplicationType
+import androidx.wear.complications.data.toApiComplicationData
 import androidx.wear.utility.TraceEvent
+import androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData
+import androidx.wear.watchface.control.data.ComplicationRenderParams
+import androidx.wear.watchface.control.data.WatchFaceRenderParams
+import androidx.wear.watchface.data.ComplicationStateWireFormat
+import androidx.wear.watchface.data.IdAndComplicationStateWireFormat
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.UserStyleData
 import androidx.wear.watchface.style.UserStyleSchema
 import androidx.wear.watchface.style.WatchFaceLayer
-import androidx.wear.watchface.style.data.UserStyleWireFormat
 import kotlinx.coroutines.CompletableDeferred
-import java.io.FileNotFoundException
-import java.io.InputStreamReader
 import java.security.InvalidParameterException
 import kotlin.math.max
 
@@ -84,35 +89,6 @@
     }
 }
 
-private fun readPrefs(context: Context, fileName: String): UserStyleWireFormat {
-    val hashMap = HashMap<String, ByteArray>()
-    try {
-        val reader = InputStreamReader(context.openFileInput(fileName)).buffered()
-        reader.use {
-            while (true) {
-                val key = reader.readLine() ?: break
-                val value = reader.readLine() ?: break
-                hashMap[key] = Base64.decode(value, Base64.NO_WRAP)
-            }
-        }
-    } catch (e: FileNotFoundException) {
-        // We don't need to do anything special here.
-    }
-    return UserStyleWireFormat(hashMap)
-}
-
-private fun writePrefs(context: Context, fileName: String, style: UserStyle) {
-    val writer = context.openFileOutput(fileName, Context.MODE_PRIVATE).bufferedWriter()
-    writer.use {
-        for ((key, value) in style.selectedOptions) {
-            writer.write(key.id.value)
-            writer.newLine()
-            writer.write(Base64.encodeToString(value.id.value, Base64.NO_WRAP))
-            writer.newLine()
-        }
-    }
-}
-
 /**
  * The return value of [WatchFaceService.createWatchFace] which brings together rendering, styling,
  * complications and state observers.
@@ -127,14 +103,6 @@
 ) {
     internal var tapListener: TapListener? = null
 
-    init {
-        if (renderer is Renderer.GlesRenderer) {
-            require(renderer.initDone) {
-                "Did you forget to call GlesRenderer.initOpenGLContext?"
-            }
-        }
-    }
-
     public companion object {
         /** Returns whether [LegacyWatchFaceOverlayStyle] is supported on this device. */
         @JvmStatic
@@ -239,7 +207,7 @@
      * Interface for getting the current system time.
      * @hide
      */
-    @RestrictTo(LIBRARY_GROUP)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public interface SystemTimeProvider {
         /** Returns the current system time in milliseconds. */
         public fun getSystemTimeMillis(): Long
@@ -368,7 +336,7 @@
     }
 
     /** @hide */
-    @RestrictTo(LIBRARY_GROUP)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun setSystemTimeProvider(systemTimeProvider: SystemTimeProvider): WatchFace = apply {
         this.systemTimeProvider = systemTimeProvider
     }
@@ -377,12 +345,17 @@
 /** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @SuppressLint("SyntheticAccessor")
-public class WatchFaceImpl(
+public class WatchFaceImpl @UiThread constructor(
     watchface: WatchFace,
     private val watchFaceHostApi: WatchFaceHostApi,
     private val watchState: WatchState,
     internal val currentUserStyleRepository: CurrentUserStyleRepository,
-    internal var complicationsManager: ComplicationsManager
+    internal var complicationsManager: ComplicationsManager,
+
+    /** @hide */
+    @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @get:VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    public val calendar: Calendar
 ) {
     internal companion object {
         internal const val NO_DEFAULT_PROVIDER = SystemProviders.NO_PROVIDER
@@ -457,13 +430,8 @@
     private var muteMode = false
     private var nextDrawTimeMillis: Long = 0
 
-    /** @hide */
-    @RestrictTo(LIBRARY_GROUP)
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-    public val calendar: Calendar = Calendar.getInstance()
-
     private val pendingUpdateTime: CancellableUniqueTask =
-        CancellableUniqueTask(watchFaceHostApi.getHandler())
+        CancellableUniqueTask(watchFaceHostApi.getUiThreadHandler())
 
     internal val componentName =
         ComponentName(
@@ -567,17 +535,19 @@
         }
     }
 
-    private val visibilityObserver = Observer<Boolean> {
-        if (it) {
-            registerReceivers()
-            // Update time zone in case it changed while we weren't visible.
-            calendar.timeZone = TimeZone.getDefault()
-            watchFaceHostApi.invalidate()
-        } else {
-            unregisterReceivers()
-        }
+    private val visibilityObserver = Observer<Boolean> { isVisible ->
+        TraceEvent("WatchFaceImpl.visibilityObserver").use {
+            if (isVisible) {
+                registerReceivers()
+                // Update time zone in case it changed while we weren't visible.
+                calendar.timeZone = TimeZone.getDefault()
+                watchFaceHostApi.invalidate()
+            } else {
+                unregisterReceivers()
+            }
 
-        scheduleDraw()
+            scheduleDraw()
+        }
     }
 
     // Only installed if Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
@@ -598,32 +568,8 @@
     }
 
     init {
-        // If the system has a stored user style then Home/SysUI is in charge of style
-        // persistence, otherwise we need to do our own.
-        val storedUserStyle = watchFaceHostApi.getInitialUserStyle()
-        if (storedUserStyle != null) {
-            currentUserStyleRepository.userStyle =
-                UserStyle(UserStyleData(storedUserStyle), currentUserStyleRepository.schema)
-        } else {
-            // The system doesn't support preference persistence we need to do it ourselves.
-            val preferencesFile =
-                "watchface_prefs_${watchFaceHostApi.getContext().javaClass.name}.txt"
-
-            currentUserStyleRepository.userStyle = UserStyle(
-                UserStyleData(readPrefs(watchFaceHostApi.getContext(), preferencesFile)),
-                currentUserStyleRepository.schema
-            )
-
-            currentUserStyleRepository.addUserStyleChangeListener(
-                object : CurrentUserStyleRepository.UserStyleChangeListener {
-                    @SuppressLint("SyntheticAccessor")
-                    override fun onUserStyleChanged(userStyle: UserStyle) {
-                        writePrefs(watchFaceHostApi.getContext(), preferencesFile, userStyle)
-                    }
-                })
-        }
-
         renderer.watchFaceHostApi = watchFaceHostApi
+        renderer.uiThreadInit()
 
         setIsBatteryLowAndNotChargingFromBatteryStatus(
             IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { iFilter ->
@@ -631,34 +577,6 @@
             }
         )
 
-        // We need to inhibit an immediate callback during initialization because members are not
-        // fully constructed and it will fail. It's also superfluous because we're going to render
-        // anyway.
-        var initFinished = false
-        complicationsManager.init(
-            watchFaceHostApi, calendar, renderer,
-            object : Complication.InvalidateListener {
-                @SuppressWarnings("SyntheticAccessor")
-                override fun onInvalidate() {
-                    // This could be called on any thread.
-                    watchFaceHostApi.getHandler().runOnHandlerWithTracing("onInvalidate") {
-                        // Ensure we render a frame if the Complication needs rendering, e.g.
-                        // because it loaded an image. However if we're animating there's no need
-                        // to trigger an extra invalidation.
-                        if (initFinished && (
-                            !renderer.shouldAnimate() || computeDelayTillNextFrame(
-                                    nextDrawTimeMillis,
-                                    systemTimeProvider.getSystemTimeMillis()
-                                ) > MIN_PERCEPTABLE_DELAY_MILLIS
-                            )
-                        ) {
-                            watchFaceHostApi.invalidate()
-                        }
-                    }
-                }
-            }
-        )
-
         if (!watchState.isHeadless) {
             WatchFace.registerEditorDelegate(componentName, WFEditorDelegate())
         }
@@ -669,8 +587,19 @@
         }
         watchState.interruptionFilter.addObserver(interruptionFilterObserver)
         watchState.isVisible.addObserver(visibilityObserver)
+    }
 
-        initFinished = true
+    internal fun invalidateIfNotAnimating() {
+        // Ensure we render a frame if the Complication needs rendering, e.g.
+        // because it loaded an image. However if we're animating there's no need
+        // to trigger an extra invalidation.
+        if (!renderer.shouldAnimate() || computeDelayTillNextFrame(
+                nextDrawTimeMillis,
+                systemTimeProvider.getSystemTimeMillis()
+            ) > MIN_PERCEPTABLE_DELAY_MILLIS
+        ) {
+            watchFaceHostApi.invalidate()
+        }
     }
 
     internal fun createWFEditorDelegate() = WFEditorDelegate() as WatchFace.EditorDelegate
@@ -774,7 +703,7 @@
 
     @UiThread
     private fun registerReceivers() {
-        require(watchFaceHostApi.getHandler().looper.isCurrentThread) {
+        require(watchFaceHostApi.getUiThreadHandler().looper.isCurrentThread) {
             "registerReceivers must be called the UiThread"
         }
 
@@ -787,7 +716,7 @@
 
     @UiThread
     private fun unregisterReceivers() {
-        require(watchFaceHostApi.getHandler().looper.isCurrentThread) {
+        require(watchFaceHostApi.getUiThreadHandler().looper.isCurrentThread) {
             "unregisterReceivers must be called the UiThread"
         }
         broadcastsReceiver?.onDestroy()
@@ -964,6 +893,122 @@
     }
 
     @UiThread
+    internal fun getComplicationState() = complicationsManager.complications.map {
+        IdAndComplicationStateWireFormat(
+            it.key,
+            ComplicationStateWireFormat(
+                it.value.computeBounds(renderer.screenBounds),
+                it.value.boundsType,
+                ComplicationType.toWireTypes(it.value.supportedTypes),
+                it.value.defaultProviderPolicy.providersAsList(),
+                it.value.defaultProviderPolicy.systemProviderFallback,
+                it.value.defaultProviderType.toWireComplicationType(),
+                it.value.enabled,
+                it.value.initiallyEnabled,
+                it.value.renderer.getData()?.type?.toWireComplicationType()
+                    ?: ComplicationType.NO_DATA.toWireComplicationType(),
+                it.value.fixedComplicationProvider,
+                it.value.configExtras
+            )
+        )
+    }
+
+    @UiThread
+    @RequiresApi(27)
+    internal fun renderWatchFaceToBitmap(
+        params: WatchFaceRenderParams
+    ): Bundle = TraceEvent("WatchFaceImpl.renderWatchFaceToBitmap").use {
+        val oldStyle = HashMap(currentUserStyleRepository.userStyle.selectedOptions)
+        params.userStyle?.let {
+            onSetStyleInternal(UserStyle(UserStyleData(it), currentUserStyleRepository.schema))
+        }
+
+        val oldComplicationData =
+            complicationsManager.complications.values.associateBy(
+                { it.id },
+                { it.renderer.getData() }
+            )
+
+        params.idAndComplicationDatumWireFormats?.let {
+            for (idAndData in it) {
+                complicationsManager[idAndData.id]!!.renderer
+                    .loadData(idAndData.complicationData.toApiComplicationData(), false)
+            }
+        }
+
+        val bitmap = renderer.takeScreenshot(
+            Calendar.getInstance(TimeZone.getTimeZone("UTC")).apply {
+                timeInMillis = params.calendarTimeMillis
+            },
+            RenderParameters(params.renderParametersWireFormat)
+        )
+
+        // Restore previous style & complications if required.
+        if (params.userStyle != null) {
+            onSetStyleInternal(UserStyle(oldStyle))
+        }
+
+        if (params.idAndComplicationDatumWireFormats != null) {
+            for ((id, data) in oldComplicationData) {
+                complicationsManager[id]!!.renderer.loadData(data, false)
+            }
+        }
+
+        return SharedMemoryImage.ashmemWriteImageBundle(bitmap)
+    }
+
+    @UiThread
+    @RequiresApi(27)
+    internal fun renderComplicationToBitmap(
+        params: ComplicationRenderParams
+    ): Bundle? = TraceEvent("WatchFaceImpl.renderComplicationToBitmap").use {
+        val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")).apply {
+            timeInMillis = params.calendarTimeMillis
+        }
+        return complicationsManager[params.complicationId]?.let {
+            val oldStyle = HashMap(currentUserStyleRepository.userStyle.selectedOptions)
+            val newStyle = params.userStyle
+            if (newStyle != null) {
+                onSetStyleInternal(
+                    UserStyle(UserStyleData(newStyle), currentUserStyleRepository.schema)
+                )
+            }
+
+            val bounds = it.computeBounds(renderer.screenBounds)
+            val complicationBitmap =
+                Bitmap.createBitmap(bounds.width(), bounds.height(), Bitmap.Config.ARGB_8888)
+
+            var prevData: ComplicationData? = null
+            val screenshotComplicationData = params.complicationData
+            if (screenshotComplicationData != null) {
+                prevData = it.renderer.getData()
+                it.renderer.loadData(
+                    screenshotComplicationData.toApiComplicationData(),
+                    false
+                )
+            }
+
+            it.renderer.render(
+                Canvas(complicationBitmap),
+                Rect(0, 0, bounds.width(), bounds.height()),
+                calendar,
+                RenderParameters(params.renderParametersWireFormat)
+            )
+
+            // Restore previous ComplicationData & style if required.
+            if (params.complicationData != null) {
+                it.renderer.loadData(prevData, false)
+            }
+
+            if (newStyle != null) {
+                onSetStyleInternal(UserStyle(oldStyle))
+            }
+
+            SharedMemoryImage.ashmemWriteImageBundle(complicationBitmap)
+        }
+    }
+
+    @UiThread
     internal fun dump(writer: IndentingPrintWriter) {
         writer.println("WatchFaceImpl ($componentName): ")
         writer.increaseIndent()
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceHostApi.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceHostApi.kt
index 55f0263..1f8f8c4 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceHostApi.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceHostApi.kt
@@ -34,8 +34,11 @@
     /** Returns the watch face's [Context]. */
     public fun getContext(): Context
 
-    /** Returns the main thread [Handler]. */
-    public fun getHandler(): Handler
+    /** Returns the UI thread [Handler]. */
+    public fun getUiThreadHandler(): Handler
+
+    /** Returns the Worker thread [Handler]. */
+    public fun getBackgroundThreadHandler(): Handler
 
     /** Returns the initial user style stored by the system if there is one or null otherwise. */
     public fun getInitialUserStyle(): UserStyleWireFormat?
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
index e11d97c..567c93a 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
@@ -20,14 +20,13 @@
 import android.content.ComponentName
 import android.content.Context
 import android.content.Intent
-import android.graphics.Bitmap
 import android.graphics.Canvas
 import android.graphics.Rect
 import android.icu.util.Calendar
-import android.icu.util.TimeZone
 import android.os.Build
 import android.os.Bundle
 import android.os.Handler
+import android.os.HandlerThread
 import android.os.Looper
 import android.os.PowerManager
 import android.os.RemoteException
@@ -35,9 +34,9 @@
 import android.service.wallpaper.WallpaperService
 import android.support.wearable.watchface.Constants
 import android.support.wearable.watchface.IWatchFaceService
-import android.support.wearable.watchface.SharedMemoryImage
 import android.support.wearable.watchface.accessibility.AccessibilityUtils
 import android.support.wearable.watchface.accessibility.ContentDescriptionLabel
+import android.util.Base64
 import android.util.Log
 import android.view.Choreographer
 import android.view.Surface
@@ -49,10 +48,10 @@
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
 import androidx.annotation.UiThread
+import androidx.annotation.WorkerThread
 import androidx.versionedparcelable.ParcelUtils
 import androidx.wear.complications.SystemProviders.ProviderId
 import androidx.wear.complications.data.ComplicationData
-import androidx.wear.complications.data.ComplicationType
 import androidx.wear.complications.data.toApiComplicationData
 import androidx.wear.utility.AsyncTraceEvent
 import androidx.wear.utility.TraceEvent
@@ -60,17 +59,13 @@
 import androidx.wear.watchface.control.IInteractiveWatchFace
 import androidx.wear.watchface.control.InteractiveInstanceManager
 import androidx.wear.watchface.control.InteractiveWatchFaceImpl
-import androidx.wear.watchface.control.data.ComplicationRenderParams
 import androidx.wear.watchface.control.data.CrashInfoParcel
 import androidx.wear.watchface.control.data.HeadlessWatchFaceInstanceParams
 import androidx.wear.watchface.control.data.IdTypeAndDefaultProviderPolicyWireFormat
 import androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams
-import androidx.wear.watchface.control.data.WatchFaceRenderParams
 import androidx.wear.watchface.data.ComplicationBoundsType
-import androidx.wear.watchface.data.ComplicationStateWireFormat
 import androidx.wear.watchface.data.DeviceConfig
 import androidx.wear.watchface.data.IdAndComplicationDataWireFormat
-import androidx.wear.watchface.data.IdAndComplicationStateWireFormat
 import androidx.wear.watchface.data.WatchUiState
 import androidx.wear.watchface.editor.EditorService
 import androidx.wear.watchface.style.CurrentUserStyleRepository
@@ -79,11 +74,16 @@
 import androidx.wear.watchface.style.UserStyleSchema
 import androidx.wear.watchface.style.UserStyleSetting
 import androidx.wear.watchface.style.data.UserStyleWireFormat
+import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Runnable
 import kotlinx.coroutines.android.asCoroutineDispatcher
 import kotlinx.coroutines.cancel
 import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
 import java.io.FileDescriptor
+import java.io.FileNotFoundException
+import java.io.InputStreamReader
 import java.io.PrintWriter
 import java.util.concurrent.CountDownLatch
 
@@ -148,14 +148,18 @@
  * @sample androidx.wear.watchface.samples.kDocCreateExampleWatchFaceService
  *
  * Sub classes of WatchFaceService are expected to implement [createWatchFace] which is the
- * factory for making [WatchFace]s. All [Complication]s are assumed to be enumerated up upfront and
- * passed as a collection into [ComplicationsManager]'s constructor which is in turn passed to
- * [WatchFace]'s constructor. Complications can be enabled and disabled via [UserStyleSetting
- * .ComplicationsUserStyleSetting].
+ * factory for making [WatchFace]s. If the watch faces uses complications then
+ * [createComplicationsManager] should be overridden. All [Complication]s are assumed to be
+ * enumerated up upfront and passed as a collection into [ComplicationsManager]'s constructor which
+ * is returned by [createComplicationsManager].
  *
  * Watch face styling (color and visual look of watch face elements such as numeric fonts, watch
- * hands and ticks, etc...) is directly supported via [UserStyleSetting] and
- * [CurrentUserStyleRepository].
+ * hands and ticks, etc...) and companion editing is directly supported via [UserStyleSchema] and
+ * [UserStyleSetting]. To enable support for styling override [createUserStyleSchema].
+ *
+ * WatchFaces are initially constructed on a background thread before being used exclusively on
+ * the ui thread afterwards. There is a memory barrier between construction and rendering so no
+ * special threading primitives are required.
  *
  * To aid debugging watch face animations, WatchFaceService allows you to speed up or slow down
  * time, and to loop between two instants.  This is controlled by MOCK_TIME_INTENT intents
@@ -220,8 +224,7 @@
  */
 public abstract class WatchFaceService : WallpaperService() {
 
-    /** @hide */
-    private companion object {
+    public companion object {
         private const val TAG = "WatchFaceService"
 
         /** Whether to log every frame. */
@@ -231,7 +234,7 @@
          * Whether to enable tracing for each call to [WatchFaceImpl.onDraw()] and
          * [WatchFaceImpl.onSurfaceRedrawNeeded()]
          */
-        private const val TRACE_DRAW = false
+        private const val TRACE_DRAW = true
 
         // Reference time for editor screenshots for analog watch faces.
         // 2020/10/10 at 09:30 Note the date doesn't matter, only the hour.
@@ -248,30 +251,31 @@
         // first.
         private const val WATCH_ELEMENT_ACCESSIBILITY_TRAVERSAL_INDEX = -1
 
-        // The maximum permitted duration of [WatchFaceService.MAX_CREATE_WATCHFACE_TIME_MILLIS].
-        private const val MAX_CREATE_WATCHFACE_TIME_MILLIS = 5000
+        /** The maximum permitted duration of [WatchFaceService.createWatchFace]. */
+        public const val MAX_CREATE_WATCHFACE_TIME_MILLIS: Int = 5000
     }
 
     /**
      * Override this factory method to create a non-empty [UserStyleSchema]. A
      * [CurrentUserStyleRepository] constructed with this schema will be passed to
-     * [createComplicationsManager] and [createWatchFace].
+     * [createComplicationsManager] and [createWatchFace]. This is called on a background thread.
      *
      * @return The [UserStyleSchema] to create a [CurrentUserStyleRepository] with, which is passed
      * to [createComplicationsManager] and [createWatchFace].
      */
-    @UiThread
+    @WorkerThread
     protected open fun createUserStyleSchema(): UserStyleSchema = UserStyleSchema(emptyList())
 
     /**
      * Override this factory method to create a non-empty [ComplicationsManager]. This manager
-     * will be passed to [createWatchFace].
+     * will be passed to [createWatchFace]. This will be called from a background thread but the
+     * ComplicationsManager should be accessed exclusively from the UiThread afterwards.
      *
      * @param currentUserStyleRepository The [CurrentUserStyleRepository] constructed using the
      * [UserStyleSchema] returned by [createUserStyleSchema].
      * @return The [ComplicationsManager] to pass into [createWatchFace].
      */
-    @UiThread
+    @WorkerThread
     protected open fun createComplicationsManager(
         currentUserStyleRepository: CurrentUserStyleRepository
     ): ComplicationsManager = ComplicationsManager(emptyList(), currentUserStyleRepository)
@@ -279,9 +283,13 @@
     /**
      * Override this factory method to create your [WatchFace]. This method will be called by the
      * library on the UiThread. If possible any expensive initialization should be done on a
-     * background thread to avoid blocking the UiThread.
+     * background thread to avoid blocking the UiThread. This will be called from a background
+     * thread but the [WatchFace] and its [Renderer] should be accessed exclusively from the
+     * UiThread afterwards. There is a memory barrier between construction and rendering so no
+     * special threading primitives are required.
      *
-     * Warning watch face initialization will fail if createWatchFace takes longer than 5 seconds.
+     * Warning watch face initialization will fail if createWatchFace takes longer than
+     * [MAX_CREATE_WATCHFACE_TIME_MILLIS] milliseconds.
      *
      * @param surfaceHolder The [SurfaceHolder] to pass to the [Renderer]'s constructor.
      * @param watchState The [WatchState] for the watch face.
@@ -291,7 +299,7 @@
      * [UserStyleSchema] returned by [createUserStyleSchema].
      * @return A [WatchFace] whose [Renderer] uses the provided [surfaceHolder].
      */
-    @UiThread
+    @WorkerThread
     protected abstract suspend fun createWatchFace(
         surfaceHolder: SurfaceHolder,
         watchState: WatchState,
@@ -300,13 +308,34 @@
     ): WatchFace
 
     /** Creates an interactive engine for WallpaperService. */
-    final override fun onCreateEngine(): Engine = EngineWrapper(getHandler(), false)
+    final override fun onCreateEngine(): Engine =
+        EngineWrapper(getUiThreadHandler(), getBackgroundThreadHandler(), false)
 
     /** Creates a headless engine. */
-    internal fun createHeadlessEngine(): Engine = EngineWrapper(getHandler(), true)
+    internal fun createHeadlessEngine(): Engine =
+        EngineWrapper(getUiThreadHandler(), getBackgroundThreadHandler(), true)
 
-    /** This is open to allow mocking. */
-    internal open fun getHandler() = Handler(Looper.getMainLooper())
+    /** Returns the ui thread [Handler]. */
+    public fun getUiThreadHandler(): Handler = getUiThreadHandlerImpl()
+
+    /** This is open for testing. */
+    internal open fun getUiThreadHandlerImpl(): Handler = Handler(Looper.getMainLooper())
+
+    /**
+     * Returns the lazily constructed background thread [Handler]. During initialization
+     * [createUserStyleSchema], [createComplicationsManager] and [createWatchFace] are posted on
+     * this handler.
+     */
+    public fun getBackgroundThreadHandler(): Handler = getBackgroundThreadHandlerImpl()
+
+    internal val backgroundThread = lazy {
+        HandlerThread("WatchFaceBackground").apply { start() }
+    }
+
+    private val _backgroundThreadHandler by lazy { Handler(backgroundThread.value.looper) }
+
+    /** This is open for testing. */
+    internal open fun getBackgroundThreadHandlerImpl() = _backgroundThreadHandler
 
     /** This is open to allow mocking. */
     internal open fun getMutableWatchState() = MutableWatchState()
@@ -331,6 +360,10 @@
         attachBaseContext(context)
     }
 
+    /**
+     * Reads WallpaperInteractiveWatchFaceInstanceParams from a file. This is only used in the
+     * android R flow.
+     */
     internal open fun readDirectBootPrefs(
         context: Context,
         fileName: String
@@ -348,6 +381,10 @@
         }
     }
 
+    /**
+     * Writes WallpaperInteractiveWatchFaceInstanceParams to a file. This is only used in the
+     * android R flow.
+     */
     internal open fun writeDirectBootPrefs(
         context: Context,
         fileName: String,
@@ -360,6 +397,37 @@
         }
     }
 
+    /** Reads user style from a file. This is only used in the pre-android R flow. */
+    internal fun readPrefs(context: Context, fileName: String): UserStyleWireFormat {
+        val hashMap = HashMap<String, ByteArray>()
+        try {
+            val reader = InputStreamReader(context.openFileInput(fileName)).buffered()
+            reader.use {
+                while (true) {
+                    val key = reader.readLine() ?: break
+                    val value = reader.readLine() ?: break
+                    hashMap[key] = Base64.decode(value, Base64.NO_WRAP)
+                }
+            }
+        } catch (e: FileNotFoundException) {
+            // We don't need to do anything special here.
+        }
+        return UserStyleWireFormat(hashMap)
+    }
+
+    /** Reads the user style to a file. This is only used in the pre-android R flow. */
+    internal fun writePrefs(context: Context, fileName: String, style: UserStyle) {
+        val writer = context.openFileOutput(fileName, Context.MODE_PRIVATE).bufferedWriter()
+        writer.use {
+            for ((key, value) in style.selectedOptions) {
+                writer.write(key.id.value)
+                writer.newLine()
+                writer.write(Base64.encodeToString(value.id.value, Base64.NO_WRAP))
+                writer.newLine()
+            }
+        }
+    }
+
     /** This is the old pre Android R flow that's needed for backwards compatibility. */
     internal class WslFlow(private val engineWrapper: EngineWrapper) {
         class PendingComplicationData(val complicationId: Int, val data: ComplicationData)
@@ -381,19 +449,26 @@
         fun iWatchFaceServiceInitialized() = this::iWatchFaceService.isInitialized
 
         fun requestWatchFaceStyle() {
-            try {
-                iWatchFaceService.setStyle(engineWrapper.watchFaceImpl.getWatchFaceStyle())
-            } catch (e: RemoteException) {
-                Log.e(TAG, "Failed to set WatchFaceStyle: ", e)
-            }
+            engineWrapper.uiThreadCoroutineScope.launch {
+                TraceEvent("requestWatchFaceStyle").use {
+                    try {
+                        iWatchFaceService.setStyle(
+                            engineWrapper.deferredWatchFaceImpl.await().getWatchFaceStyle()
+                        )
+                    } catch (e: RemoteException) {
+                        Log.e(TAG, "Failed to set WatchFaceStyle: ", e)
+                    }
 
-            val activeComplications = lastActiveComplications
-            if (activeComplications != null) {
-                engineWrapper.setActiveComplications(activeComplications)
-            }
+                    val activeComplications = lastActiveComplications
+                    if (activeComplications != null) {
+                        engineWrapper.setActiveComplications(activeComplications)
+                    }
 
-            if (engineWrapper.contentDescriptionLabels.isNotEmpty()) {
-                engineWrapper.setContentDescriptionLabels(engineWrapper.contentDescriptionLabels)
+                    if (engineWrapper.contentDescriptionLabels.isNotEmpty()) {
+                        engineWrapper.contentDescriptionLabels =
+                            engineWrapper.contentDescriptionLabels
+                    }
+                }
             }
         }
 
@@ -521,14 +596,14 @@
                 Log.w(TAG, "Failed to getVersion: ", e)
             }
 
-            engineWrapper.coroutineScope.launch { maybeCreateWatchFace() }
+            engineWrapper.uiThreadCoroutineScope.launch { maybeCreateWatchFace() }
         }
 
         @UiThread
         fun onPropertiesChanged(properties: Bundle) {
             if (!watchFaceInitStarted) {
                 pendingProperties = properties
-                engineWrapper.coroutineScope.launch { maybeCreateWatchFace() }
+                engineWrapper.uiThreadCoroutineScope.launch { maybeCreateWatchFace() }
                 return
             }
 
@@ -561,6 +636,9 @@
                     watchState, engineWrapper.surfaceHolder, "maybeCreateWatchFace"
                 )
 
+                // Wait for watchface init to complete.
+                val watchFaceImpl = engineWrapper.deferredWatchFaceImpl.await()
+
                 val backgroundAction = pendingBackgroundAction
                 if (backgroundAction != null) {
                     onBackgroundAction(backgroundAction)
@@ -575,26 +653,49 @@
                     pendingVisibilityChanged = null
                 }
                 for (complicationDataUpdate in pendingComplicationDataUpdates) {
-                    engineWrapper.setComplicationData(
+                    watchFaceImpl.onComplicationDataUpdate(
                         complicationDataUpdate.complicationId,
                         complicationDataUpdate.data
                     )
                 }
+                watchFaceImpl.complicationsManager.updateComplications()
             }
         }
     }
 
-    internal inner class EngineWrapper(
+    private class RendererAndComplicationManager(
+        val renderer: Renderer,
+        val complicationsManager: ComplicationsManager
+    )
+
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public inner class EngineWrapper(
         private val uiThreadHandler: Handler,
+        private val backgroundThreadHandler: Handler,
         headless: Boolean
     ) : WallpaperService.Engine(), WatchFaceHostApi {
-        internal val coroutineScope = CoroutineScope(getHandler().asCoroutineDispatcher().immediate)
+        internal val backgroundThreadCoroutineScope =
+            CoroutineScope(backgroundThreadHandler.asCoroutineDispatcher().immediate)
+
+        internal val uiThreadCoroutineScope =
+            CoroutineScope(uiThreadHandler.asCoroutineDispatcher().immediate)
+
         private val _context = this@WatchFaceService as Context
 
         // State to support the old WSL style interface
         internal val wslFlow = WslFlow(this)
 
-        internal lateinit var watchFaceImpl: WatchFaceImpl
+        /**
+         * [deferredRendererAndComplicationManager] will complete before [deferredWatchFaceImpl].
+         */
+        private var deferredRendererAndComplicationManager =
+            CompletableDeferred<RendererAndComplicationManager>()
+
+        /**
+         * [deferredWatchFaceImpl] will complete after [deferredRendererAndComplicationManager].
+         */
+        internal var deferredWatchFaceImpl = CompletableDeferred<WatchFaceImpl>()
 
         internal val mutableWatchState = getMutableWatchState().apply {
             isVisible.value = [email protected]
@@ -644,23 +745,62 @@
         private var directBootParams: WallpaperInteractiveWatchFaceInstanceParams? = null
 
         internal var contentDescriptionLabels: Array<ContentDescriptionLabel> = emptyArray()
+            set(value) {
+                field = value
+
+                // For the old pre-android R flow.
+                if (wslFlow.iWatchFaceServiceInitialized()) {
+                    try {
+                        wslFlow.iWatchFaceService.setContentDescriptionLabels(value)
+                    } catch (e: RemoteException) {
+                        Log.e(TAG, "Failed to set accessibility labels: ", e)
+                    }
+                }
+            }
 
         internal var firstSetWatchUiState = true
         internal var immutableSystemStateDone = false
         internal var immutableChinHeightDone = false
-        private var ignoreNextOnVisibilityChanged = false
 
-        private var firstOnSurfaceChangedReceived = false
         private var asyncWatchFaceConstructionPending = false
 
+        // Stores the initial complications which could get updated before they're applied.
+        private var pendingInitialComplications: List<IdAndComplicationDataWireFormat>? = null
+
         private var initialUserStyle: UserStyleWireFormat? = null
         private lateinit var interactiveInstanceId: String
 
         private var createdBy = "?"
 
+        /**
+         * Returns the [WatchFaceImpl] if [deferredWatchFaceImpl] has completed successfully or
+         * `null` otherwise.
+         */
+        internal fun getWatchFaceImplOrNull(): WatchFaceImpl? =
+            if (deferredWatchFaceImpl.isCompleted) {
+                runBlocking {
+                    try {
+                        deferredWatchFaceImpl.await()
+                    } catch (e: Exception) {
+                        // The watch face crashed during init. This has already been logged so we
+                        // silently ignore.
+                        null
+                    }
+                }
+            } else {
+                null
+            }
+
+        init {
+            maybeCreateWCSApi()
+        }
+
         /** Note this function should only be called once. */
         @SuppressWarnings("NewApi")
-        private fun maybeCreateWCSApi(): Unit = TraceEvent("EngineWrapper.maybeCreateWCSApi").use {
+        @UiThread
+        private fun maybeCreateWCSApi(): Unit = TraceEvent(
+            "EngineWrapper.maybeCreateWCSApi"
+        ).use {
             // If this is a headless instance then we don't want to create a WCS instance.
             if (mutableWatchState.isHeadless) {
                 return
@@ -676,30 +816,28 @@
                 // In tests a watchface may already have been created.
                 if (params != null && !watchFaceCreatedOrPending()) {
                     val asyncTraceEvent = AsyncTraceEvent("DirectBoot")
-                    coroutineScope.launch {
-                        try {
-                            val instance = createInteractiveInstance(params, "DirectBoot")
-                            // WatchFace init is async so its possible we now have a pending
-                            // WallpaperInteractiveWatchFaceInstance request.
-                            InteractiveInstanceManager
-                                .takePendingWallpaperInteractiveWatchFaceInstance()?.let {
-                                    require(it.params.instanceId == params.instanceId) {
-                                        "Mismatch between pendingWallpaperInstance id " +
-                                            "${it.params.instanceId} and constructed instance id " +
-                                            "${params.instanceId}"
-                                    }
-                                    it.callback.onInteractiveWatchFaceCreated(instance)
+                    try {
+                        val instance = createInteractiveInstance(params, "DirectBoot")
+                        // WatchFace init is async so its possible we now have a pending
+                        // WallpaperInteractiveWatchFaceInstance request.
+                        InteractiveInstanceManager
+                            .takePendingWallpaperInteractiveWatchFaceInstance()?.let {
+                                require(it.params.instanceId == params.instanceId) {
+                                    "Mismatch between pendingWallpaperInstance id " +
+                                        "${it.params.instanceId} and constructed instance id " +
+                                        params.instanceId
                                 }
-                        } catch (e: Exception) {
-                            InteractiveInstanceManager
-                                .takePendingWallpaperInteractiveWatchFaceInstance()?.let {
-                                    it.callback.onInteractiveWatchFaceCrashed(
-                                        CrashInfoParcel(e)
-                                    )
-                                }
-                        } finally {
-                            asyncTraceEvent.close()
-                        }
+                                it.callback.onInteractiveWatchFaceCreated(instance)
+                            }
+                    } catch (e: Exception) {
+                        InteractiveInstanceManager
+                            .takePendingWallpaperInteractiveWatchFaceInstance()?.let {
+                                it.callback.onInteractiveWatchFaceCrashed(
+                                    CrashInfoParcel(e)
+                                )
+                            }
+                    } finally {
+                        asyncTraceEvent.close()
                     }
                 }
             }
@@ -708,48 +846,45 @@
             if (pendingWallpaperInstance != null) {
                 val asyncTraceEvent =
                     AsyncTraceEvent("Create PendingWallpaperInteractiveWatchFaceInstance")
-                // The WallpaperService works around bugs in wallpapers (see b/5233826 and
-                // b/5209847) by sending onVisibilityChanged(true), onVisibilityChanged(false)
-                // after onSurfaceChanged during creation. This is unfortunate for us since we
-                // perform work in response (see WatchFace.visibilityObserver). So here we
-                // workaround the workaround...
-                ignoreNextOnVisibilityChanged = true
-                coroutineScope.launch {
-                    try {
-                        pendingWallpaperInstance.callback.onInteractiveWatchFaceCreated(
-                            createInteractiveInstance(
-                                pendingWallpaperInstance.params,
-                                "Boot with pendingWallpaperInstance"
-                            )
+                try {
+                    pendingWallpaperInstance.callback.onInteractiveWatchFaceCreated(
+                        createInteractiveInstance(
+                            pendingWallpaperInstance.params,
+                            "Boot with pendingWallpaperInstance"
                         )
-                    } catch (e: Exception) {
-                        pendingWallpaperInstance.callback.onInteractiveWatchFaceCrashed(
-                            CrashInfoParcel(e)
-                        )
-                    }
-                    asyncTraceEvent.close()
-                    val params = pendingWallpaperInstance.params
-                    directBootParams = params
-                    // We don't want to display complications in direct boot mode so replace with an
-                    // empty list. NB we can't actually serialise complications anyway so that's
-                    // just as well...
-                    params.idAndComplicationDataWireFormats = emptyList()
+                    )
+                } catch (e: Exception) {
+                    pendingWallpaperInstance.callback.onInteractiveWatchFaceCrashed(
+                        CrashInfoParcel(e)
+                    )
+                }
+                asyncTraceEvent.close()
+                val params = pendingWallpaperInstance.params
+                directBootParams = params
+                // We don't want to display complications in direct boot mode so replace with an
+                // empty list. NB we can't actually serialise complications anyway so that's
+                // just as well...
+                params.idAndComplicationDataWireFormats = emptyList()
 
-                    // Writing even small amounts of data to storage is quite slow and if we did
-                    // that immediately, we'd delay the first frame which is rendered via
-                    // onSurfaceRedrawNeeded. By posting this task we expedite first frame
-                    // rendering. There is a small window where the direct boot could be stale if
-                    // the watchface crashed but this seems unlikely in practice.
-                    uiThreadHandler.post {
-                        writeDirectBootPrefs(_context, DIRECT_BOOT_PREFS, params)
-                    }
+                // Writing even small amounts of data to storage is quite slow and if we did
+                // that immediately, we'd delay the first frame which is rendered via
+                // onSurfaceRedrawNeeded. By posting this task we expedite first frame
+                // rendering. There is a small window where the direct boot could be stale if
+                // the watchface crashed but this seems unlikely in practice.
+                backgroundThreadHandler.post {
+                    writeDirectBootPrefs(_context, DIRECT_BOOT_PREFS, params)
                 }
             }
         }
 
+        @UiThread
         override fun onUserStyleChanged() {
             val params = directBootParams
-            if (!this::watchFaceImpl.isInitialized || params == null) {
+            val watchFaceImpl = getWatchFaceImplOrNull()
+            // The only caller is [WatchFaceImpl.WFEditorDelegate] so we don't expect watchFaceImpl
+            // to ever be null in practice. If it was null then any changes would be picked up when
+            // the watch face init has completed.
+            if (watchFaceImpl == null || params == null) {
                 return
             }
 
@@ -762,20 +897,26 @@
             // empty list. NB we can't actually serialise complications anyway so that's just as
             // well...
             params.idAndComplicationDataWireFormats = emptyList()
-            writeDirectBootPrefs(_context, DIRECT_BOOT_PREFS, params)
+
+            backgroundThreadHandler.post {
+                writeDirectBootPrefs(_context, DIRECT_BOOT_PREFS, params)
+            }
         }
 
         @UiThread
-        fun ambientTickUpdate(): Unit = TraceEvent("EngineWrapper.ambientTickUpdate").use {
+        internal fun ambientTickUpdate(): Unit = TraceEvent("EngineWrapper.ambientTickUpdate").use {
             if (mutableWatchState.isAmbient.value) {
                 ambientUpdateWakelock.acquire()
-                watchFaceImpl.renderer.invalidate()
+                // It's unlikely an ambient tick would be sent to a watch face that hasn't loaded
+                // yet. The watch face will render at least once upon loading so we don't need to do
+                // anyhting special here.
+                getWatchFaceImplOrNull()?.renderer?.invalidate()
                 ambientUpdateWakelock.acquire(SURFACE_DRAW_TIMEOUT_MS)
             }
         }
 
         @UiThread
-        fun setWatchUiState(watchUiState: WatchUiState) {
+        internal fun setWatchUiState(watchUiState: WatchUiState) {
             if (firstSetWatchUiState ||
                 watchUiState.inAmbientMode != mutableWatchState.isAmbient.value
             ) {
@@ -792,9 +933,10 @@
         }
 
         @UiThread
-        fun setUserStyle(
+        internal suspend fun setUserStyle(
             userStyle: UserStyleWireFormat
         ): Unit = TraceEvent("EngineWrapper.setUserStyle").use {
+            val watchFaceImpl = deferredWatchFaceImpl.await()
             watchFaceImpl.onSetStyleInternal(
                 UserStyle(UserStyleData(userStyle), watchFaceImpl.currentUserStyleRepository.schema)
             )
@@ -802,7 +944,7 @@
         }
 
         @UiThread
-        fun setImmutableSystemState(deviceConfig: DeviceConfig) {
+        internal fun setImmutableSystemState(deviceConfig: DeviceConfig) {
             // These properties never change so set them once only.
             if (!immutableSystemStateDone) {
                 mutableWatchState.hasLowBitAmbient = deviceConfig.hasLowBitAmbient
@@ -818,188 +960,55 @@
         }
 
         @SuppressLint("SyntheticAccessor")
-        fun setComplicationData(
+        internal fun setComplicationData(
             complicationId: Int,
             data: ComplicationData
         ): Unit = TraceEvent("EngineWrapper.setComplicationData").use {
-            if (watchFaceCreated()) {
+            val watchFaceImpl = getWatchFaceImplOrNull()
+            if (watchFaceImpl != null) {
                 watchFaceImpl.onComplicationDataUpdate(complicationId, data)
+                watchFaceImpl.complicationsManager.updateComplications()
             } else {
+                // If the watch face hasn't loaded yet then we append
+                // pendingComplicationDataUpdates so it can be applied later.
                 wslFlow.pendingComplicationDataUpdates.add(
                     WslFlow.PendingComplicationData(complicationId, data)
                 )
             }
         }
 
-        fun clearComplicationData() {
-            require(watchFaceCreated()) {
+        internal fun clearComplicationData() {
+            val watchFaceImpl = getWatchFaceImplOrNull()
+            require(watchFaceImpl != null) {
                 "WatchFace must have been created first"
             }
             watchFaceImpl.clearComplicationData()
         }
 
         @UiThread
-        fun getComplicationState(): List<IdAndComplicationStateWireFormat> =
-            uiThreadHandler.runBlockingOnHandlerWithTracing("EngineWrapper.getComplicationState") {
-                watchFaceImpl.complicationsManager.complications.map {
-                    IdAndComplicationStateWireFormat(
-                        it.key,
-                        ComplicationStateWireFormat(
-                            it.value.computeBounds(watchFaceImpl.renderer.screenBounds),
-                            it.value.boundsType,
-                            ComplicationType.toWireTypes(it.value.supportedTypes),
-                            it.value.defaultProviderPolicy.providersAsList(),
-                            it.value.defaultProviderPolicy.systemProviderFallback,
-                            it.value.defaultProviderType.toWireComplicationType(),
-                            it.value.enabled,
-                            it.value.initiallyEnabled,
-                            it.value.renderer.getData()?.type?.toWireComplicationType()
-                                ?: ComplicationType.NO_DATA.toWireComplicationType(),
-                            it.value.fixedComplicationProvider,
-                            it.value.configExtras
-                        )
-                    )
-                }
-            }
-
-        @UiThread
-        fun setComplicationDataList(
-            complicationDatumWireFormats: MutableList<IdAndComplicationDataWireFormat>
+        internal fun setComplicationDataList(
+            complicationDataWireFormats: MutableList<IdAndComplicationDataWireFormat>
         ): Unit = TraceEvent("EngineWrapper.setComplicationDataList").use {
-            if (watchFaceCreated()) {
-                for (idAndComplicationData in complicationDatumWireFormats) {
+            val watchFaceImpl = getWatchFaceImplOrNull()
+            if (watchFaceImpl != null) {
+                for (idAndComplicationData in complicationDataWireFormats) {
                     watchFaceImpl.onComplicationDataUpdate(
                         idAndComplicationData.id,
                         idAndComplicationData.complicationData.toApiComplicationData()
                     )
                 }
             } else {
-                for (idAndComplicationData in complicationDatumWireFormats) {
-                    wslFlow.pendingComplicationDataUpdates.add(
-                        WslFlow.PendingComplicationData(
-                            idAndComplicationData.id,
-                            idAndComplicationData.complicationData.toApiComplicationData()
-                        )
-                    )
-                }
+                // If the watchface hasn't been created yet, update pendingInitialComplications so
+                // it can be applied later.
+                pendingInitialComplications = complicationDataWireFormats
             }
         }
 
-        @UiThread
-        @RequiresApi(27)
-        fun renderWatchFaceToBitmap(
-            params: WatchFaceRenderParams
-        ): Bundle = TraceEvent("EngineWrapper.renderWatchFaceToBitmap").use {
-            val oldStyle =
-                HashMap(watchFaceImpl.currentUserStyleRepository.userStyle.selectedOptions)
-            params.userStyle?.let {
-                watchFaceImpl.onSetStyleInternal(
-                    UserStyle(UserStyleData(it), watchFaceImpl.currentUserStyleRepository.schema)
-                )
-            }
+        override fun getContext(): Context = _context
 
-            val oldComplicationData =
-                watchFaceImpl.complicationsManager.complications.values.associateBy(
-                    { it.id },
-                    { it.renderer.getData() }
-                )
+        override fun getUiThreadHandler(): Handler = uiThreadHandler
 
-            params.idAndComplicationDatumWireFormats?.let {
-                for (idAndData in it) {
-                    watchFaceImpl.complicationsManager[idAndData.id]!!.renderer
-                        .loadData(idAndData.complicationData.toApiComplicationData(), false)
-                }
-            }
-
-            val bitmap = watchFaceImpl.renderer.takeScreenshot(
-                Calendar.getInstance(TimeZone.getTimeZone("UTC")).apply {
-                    timeInMillis = params.calendarTimeMillis
-                },
-                RenderParameters(params.renderParametersWireFormat)
-            )
-
-            // Restore previous style & complications if required.
-            if (params.userStyle != null) {
-                watchFaceImpl.onSetStyleInternal(UserStyle(oldStyle))
-            }
-
-            if (params.idAndComplicationDatumWireFormats != null) {
-                for ((id, data) in oldComplicationData) {
-                    watchFaceImpl.complicationsManager[id]!!.renderer.loadData(data, false)
-                }
-            }
-
-            return SharedMemoryImage.ashmemWriteImageBundle(bitmap)
-        }
-
-        @UiThread
-        @RequiresApi(27)
-        fun renderComplicationToBitmap(
-            params: ComplicationRenderParams
-        ): Bundle? = TraceEvent("EngineWrapper.renderComplicationToBitmap").use {
-            val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")).apply {
-                timeInMillis = params.calendarTimeMillis
-            }
-            return watchFaceImpl.complicationsManager[params.complicationId]?.let {
-                val oldStyle =
-                    HashMap(watchFaceImpl.currentUserStyleRepository.userStyle.selectedOptions)
-                val newStyle = params.userStyle
-                if (newStyle != null) {
-                    watchFaceImpl.onSetStyleInternal(
-                        UserStyle(
-                            UserStyleData(newStyle),
-                            watchFaceImpl.currentUserStyleRepository.schema
-                        )
-                    )
-                }
-
-                val bounds = it.computeBounds(watchFaceImpl.renderer.screenBounds)
-                val complicationBitmap =
-                    Bitmap.createBitmap(
-                        bounds.width(), bounds.height(),
-                        Bitmap.Config.ARGB_8888
-                    )
-
-                var prevData: ComplicationData? = null
-                val screenshotComplicationData = params.complicationData
-                if (screenshotComplicationData != null) {
-                    prevData = it.renderer.getData()
-                    it.renderer.loadData(
-                        screenshotComplicationData.toApiComplicationData(),
-                        false
-                    )
-                }
-
-                it.renderer.render(
-                    Canvas(complicationBitmap),
-                    Rect(0, 0, bounds.width(), bounds.height()),
-                    calendar,
-                    RenderParameters(params.renderParametersWireFormat)
-                )
-
-                // Restore previous ComplicationData & style if required.
-                if (params.complicationData != null) {
-                    it.renderer.loadData(prevData, false)
-                }
-
-                if (newStyle != null) {
-                    watchFaceImpl.onSetStyleInternal(UserStyle(oldStyle))
-                }
-
-                SharedMemoryImage.ashmemWriteImageBundle(complicationBitmap)
-            }
-        }
-
-        @UiThread
-        fun sendTouchEvent(xPos: Int, yPos: Int, tapType: Int) {
-            if (watchFaceCreated()) {
-                watchFaceImpl.onTapCommand(tapType, xPos, yPos)
-            }
-        }
-
-        override fun getContext() = _context
-
-        override fun getHandler() = uiThreadHandler
+        override fun getBackgroundThreadHandler(): Handler = backgroundThreadHandler
 
         override fun onCreate(
             holder: SurfaceHolder
@@ -1024,7 +1033,7 @@
                     ) {
                         // We can sometimes get this callback before the watchface has been created
                         // in which case it's safe to drop it.
-                        if (this@EngineWrapper::watchFaceImpl.isInitialized) {
+                        if (deferredWatchFaceImpl.isCompleted) {
                             invalidate()
                         }
                     }
@@ -1038,24 +1047,9 @@
             )
         }
 
-        override fun onSurfaceChanged(
-            holder: SurfaceHolder?,
-            format: Int,
-            width: Int,
-            height: Int
-        ): Unit = TraceEvent("EngineWrapper.onSurfaceChanged").use {
-            super.onSurfaceChanged(holder, format, width, height)
-
-            // We can only call maybeCreateWCSApi once. For OpenGL watch faces we need to wait for
-            // onSurfaceChanged before bootstrapping because the surface isn't valid for creating
-            // an EGL context until then.
-            if (!firstOnSurfaceChangedReceived) {
-                maybeCreateWCSApi()
-                firstOnSurfaceChangedReceived = true
-            }
-        }
-
-        override fun onApplyWindowInsets(insets: WindowInsets?) {
+        override fun onApplyWindowInsets(
+            insets: WindowInsets?
+        ): Unit = TraceEvent("EngineWrapper.onApplyWindowInsets").use {
             super.onApplyWindowInsets(insets)
             @Px val chinHeight =
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
@@ -1078,18 +1072,24 @@
             immutableChinHeightDone = true
         }
 
+        internal fun quitBackgroundThreadIfCreated() {
+            if (backgroundThread.isInitialized()) {
+                backgroundThread.value.quitSafely()
+            }
+        }
+
+        @UiThread
         override fun onDestroy(): Unit = TraceEvent("EngineWrapper.onDestroy").use {
             destroyed = true
-            coroutineScope.cancel()
+            backgroundThreadCoroutineScope.cancel()
+            quitBackgroundThreadIfCreated()
             uiThreadHandler.removeCallbacks(invalidateRunnable)
             if (this::choreographer.isInitialized) {
                 choreographer.removeFrameCallback(frameCallback)
             }
-
-            if (this::watchFaceImpl.isInitialized) {
-                watchFaceImpl.onDestroy()
-            }
-
+            // The WatchFaceImpl is created on the UiThread so if we get here and it's not crated we
+            // can be sure it'll never be created hence we don't need to destroy.
+            getWatchFaceImplOrNull()?.onDestroy()
             if (this::interactiveInstanceId.isInitialized) {
                 InteractiveInstanceManager.deleteInstance(interactiveInstanceId)
             }
@@ -1108,6 +1108,7 @@
             // From android R onwards the integration changes and no wallpaper commands are allowed
             // or expected and can/should be ignored.
             if (!expectPreRInitFlow()) {
+                TraceEvent("onCommand Ignored").close()
                 return null
             }
             when (action) {
@@ -1136,16 +1137,18 @@
                         wslFlow.onPropertiesChanged(extras!!)
                     }
                 Constants.COMMAND_TAP ->
-                    uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_TAP") {
-                        sendTouchEvent(x, y, TapType.UP)
+                    uiThreadCoroutineScope.runBlockingWithTracing("onCommand COMMAND_TAP") {
+                        deferredWatchFaceImpl.await().onTapCommand(x, y, TapType.UP)
                     }
                 Constants.COMMAND_TOUCH ->
-                    uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_TOUCH") {
-                        sendTouchEvent(x, y, TapType.DOWN)
+                    uiThreadCoroutineScope.runBlockingWithTracing("onCommand COMMAND_TOUCH") {
+                        deferredWatchFaceImpl.await().onTapCommand(x, y, TapType.DOWN)
                     }
                 Constants.COMMAND_TOUCH_CANCEL ->
-                    uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_TOUCH_CANCEL") {
-                        sendTouchEvent(x, y, TapType.CANCEL)
+                    uiThreadCoroutineScope.runBlockingWithTracing(
+                        "onCommand COMMAND_TOUCH_CANCEL"
+                    ) {
+                        deferredWatchFaceImpl.await().onTapCommand(x, y, TapType.CANCEL)
                     }
                 else -> {
                 }
@@ -1155,18 +1158,15 @@
 
         override fun getInitialUserStyle(): UserStyleWireFormat? = initialUserStyle
 
-        @UiThread
-        fun getDefaultProviderPolicies(): Array<IdTypeAndDefaultProviderPolicyWireFormat> =
-            if (watchFaceCreated()) {
-                watchFaceImpl.complicationsManager.getDefaultProviderPolicies()
-            } else {
-                // TODO(alexclarke): Consider caching these as a followup.
-                val currentUserStyleRepository = CurrentUserStyleRepository(createUserStyleSchema())
-                createComplicationsManager(currentUserStyleRepository).getDefaultProviderPolicies()
-            }
+        /** This will be called from a binder thread. */
+        @WorkerThread
+        internal fun getDefaultProviderPolicies(): Array<IdTypeAndDefaultProviderPolicyWireFormat> {
+            return createComplicationsManager(CurrentUserStyleRepository(createUserStyleSchema()))
+                .getDefaultProviderPolicies()
+        }
 
         @RequiresApi(27)
-        suspend fun createHeadlessInstance(
+        internal fun createHeadlessInstance(
             params: HeadlessWatchFaceInstanceParams
         ): HeadlessWatchFaceImpl = TraceEvent("EngineWrapper.createHeadlessInstance").use {
             require(!watchFaceCreatedOrPending()) {
@@ -1241,12 +1241,12 @@
 
             mutableWatchState.isVisible.value = true
             mutableWatchState.isAmbient.value = false
-            return HeadlessWatchFaceImpl(this, uiThreadHandler)
+            return HeadlessWatchFaceImpl(this)
         }
 
         @UiThread
         @RequiresApi(27)
-        suspend fun createInteractiveInstance(
+        internal fun createInteractiveInstance(
             params: WallpaperInteractiveWatchFaceInstanceParams,
             _createdBy: String
         ): InteractiveWatchFaceImpl = TraceEvent(
@@ -1263,17 +1263,17 @@
 
             val watchState = mutableWatchState.asWatchState()
 
+            // Store the initial complications, this could be modified by new data
+            // before being applied.
+            pendingInitialComplications = params.idAndComplicationDataWireFormats
+
             createWatchFaceInternal(
                 watchState,
                 getWallpaperSurfaceHolderOverride() ?: surfaceHolder,
                 _createdBy
             )
 
-            asyncWatchFaceConstructionPending = false
-
-            params.idAndComplicationDataWireFormats?.let { setComplicationDataList(it) }
-
-            val instance = InteractiveWatchFaceImpl(this, params.instanceId, uiThreadHandler)
+            val instance = InteractiveWatchFaceImpl(this, params.instanceId)
             InteractiveInstanceManager.addInstance(instance)
             interactiveInstanceId = params.instanceId
             return instance
@@ -1283,52 +1283,170 @@
             if (TRACE_DRAW) {
                 Trace.beginSection("onSurfaceRedrawNeeded")
             }
-            if (watchFaceCreated()) {
-                watchFaceImpl.onSurfaceRedrawNeeded()
-            }
+            // The watch face will draw at least once upon creation so it doesn't matter if it's
+            // not been created yet.
+            getWatchFaceImplOrNull()?.onSurfaceRedrawNeeded()
             if (TRACE_DRAW) {
                 Trace.endSection()
             }
         }
 
-        internal suspend fun createWatchFaceInternal(
+        internal fun createWatchFaceInternal(
             watchState: WatchState,
             surfaceHolder: SurfaceHolder,
             _createdBy: String
         ) {
             asyncWatchFaceConstructionPending = true
             createdBy = _createdBy
-            val timeBefore = System.currentTimeMillis()
-            val currentUserStyleRepository =
-                TraceEvent("WatchFaceService.createUserStyleSchema").use {
-                    CurrentUserStyleRepository(createUserStyleSchema())
+
+            backgroundThreadCoroutineScope.launch {
+                val timeBefore = System.currentTimeMillis()
+                val currentUserStyleRepository =
+                    TraceEvent("WatchFaceService.createUserStyleSchema").use {
+                        CurrentUserStyleRepository(createUserStyleSchema())
+                    }
+                val complicationsManager =
+                    TraceEvent("WatchFaceService.createComplicationsManager").use {
+                        createComplicationsManager(currentUserStyleRepository)
+                    }
+
+                try {
+                    val watchFace = TraceEvent("WatchFaceService.createWatchFace").use {
+                        complicationsManager.watchState = watchState
+                        createWatchFace(
+                            surfaceHolder,
+                            watchState,
+                            complicationsManager,
+                            currentUserStyleRepository
+                        )
+                    }
+                    deferredRendererAndComplicationManager.complete(
+                        RendererAndComplicationManager(watchFace.renderer, complicationsManager)
+                    )
+
+                    if (watchFace.renderer is Renderer.GlesRenderer) {
+                        watchFace.renderer.initBackgroundThreadOpenGlContext()
+                    }
+
+                    val timeAfter = System.currentTimeMillis()
+                    val timeTaken = timeAfter - timeBefore
+                    require(timeTaken < MAX_CREATE_WATCHFACE_TIME_MILLIS) {
+                        "createUserStyleSchema, createComplicationsManager and createWatchFace " +
+                            "should complete in less than $MAX_CREATE_WATCHFACE_TIME_MILLIS " +
+                            "milliseconds."
+                    }
+
+                    val calendar = Calendar.getInstance()
+                    val initStyleAndComplicationsDone = CompletableDeferred<Unit>()
+
+                    // WatchFaceImpl (which registers broadcast observers) needs to be constructed
+                    // on the UIThread.
+                    uiThreadCoroutineScope.launch {
+                        pendingInitialComplications?.let {
+                            for (idAndData in it) {
+                                complicationsManager.onComplicationDataUpdate(
+                                    idAndData.id,
+                                    idAndData.complicationData.toApiComplicationData()
+                                )
+                            }
+                        }
+
+                        TraceEvent("WatchFaceImpl.init").use {
+                            val watchFaceImpl = WatchFaceImpl(
+                                watchFace,
+                                this@EngineWrapper,
+                                watchState,
+                                currentUserStyleRepository,
+                                complicationsManager,
+                                calendar
+                            )
+
+                            // Make sure no UI thread rendering (a consequence of completing
+                            // deferredWatchFaceImpl) occurs before initStyleAndComplications has
+                            // executed. NB usually we won't have to wait at all.
+                            initStyleAndComplicationsDone.await()
+                            deferredWatchFaceImpl.complete(watchFaceImpl)
+                            asyncWatchFaceConstructionPending = false
+                        }
+                    }
+
+                    // Perform more initialization on the background thread.
+                    initStyleAndComplications(
+                        complicationsManager,
+                        currentUserStyleRepository,
+                        watchFace.renderer,
+                        calendar
+                    )
+
+                    // Now init has completed, it's OK to complete deferredWatchFaceImpl.
+                    initStyleAndComplicationsDone.complete(Unit)
+                } catch (e: Exception) {
+                    Log.e(TAG, "WatchFace crashed during init", e)
+                    deferredWatchFaceImpl.completeExceptionally(e)
                 }
-            val complicationsManager =
-                TraceEvent("WatchFaceService.createComplicationsManager").use {
-                    createComplicationsManager(currentUserStyleRepository)
+            }
+        }
+
+        /**
+         * It is OK to call this from a worker thread because we carefully ensure there's no
+         * concurrent writes to the ComplicationsManager. No UI thread rendering can be done until
+         * after this has completed.
+         */
+        @WorkerThread
+        internal fun initStyleAndComplications(
+            complicationsManager: ComplicationsManager,
+            currentUserStyleRepository: CurrentUserStyleRepository,
+            renderer: Renderer,
+            calendar: Calendar
+        ) = TraceEvent("initStyleAndComplications").use {
+            // If the system has a stored user style then Home/SysUI is in charge of style
+            // persistence, otherwise we need to do our own.
+            val storedUserStyle = getInitialUserStyle()
+            if (storedUserStyle != null) {
+                TraceEvent("WatchFaceImpl.init apply userStyle").use {
+                    currentUserStyleRepository.userStyle =
+                        UserStyle(UserStyleData(storedUserStyle), currentUserStyleRepository.schema)
                 }
-            val watchface = TraceEvent("WatchFaceService.createWatchFace").use {
-                complicationsManager.watchState = watchState
-                createWatchFace(
-                    surfaceHolder, watchState, complicationsManager, currentUserStyleRepository
-                )
+            } else {
+                TraceEvent("WatchFaceImpl.init apply userStyle from prefs").use {
+                    // The system doesn't support preference persistence we need to do it ourselves.
+                    val preferencesFile = "watchface_prefs_${_context.javaClass.name}.txt"
+
+                    currentUserStyleRepository.userStyle = UserStyle(
+                        UserStyleData(readPrefs(_context, preferencesFile)),
+                        currentUserStyleRepository.schema
+                    )
+
+                    currentUserStyleRepository.addUserStyleChangeListener(
+                        object : CurrentUserStyleRepository.UserStyleChangeListener {
+                            @SuppressLint("SyntheticAccessor")
+                            override fun onUserStyleChanged(userStyle: UserStyle) {
+                                writePrefs(_context, preferencesFile, userStyle)
+                            }
+                        }
+                    )
+                }
             }
-            val timeAfter = System.currentTimeMillis()
-            val timeTaken = timeAfter - timeBefore
-            require(timeTaken < MAX_CREATE_WATCHFACE_TIME_MILLIS) {
-                "createUserStyleSchema, createComplicationsManager and createWatchFace should " +
-                    "complete in less than $MAX_CREATE_WATCHFACE_TIME_MILLIS milliseconds."
-            }
-            watchFaceImpl = TraceEvent("WatchFaceImpl.init").use {
-                WatchFaceImpl(
-                    watchface,
-                    this,
-                    watchState,
-                    currentUserStyleRepository,
-                    complicationsManager
-                )
-            }
-            asyncWatchFaceConstructionPending = false
+
+            // We need to inhibit an immediate callback during initialization because members are
+            // not fully constructed and it will fail. It's also superfluous because we're going
+            // to render soon anyway.
+            var initFinished = false
+            complicationsManager.init(
+                this, calendar, renderer,
+                object : Complication.InvalidateListener {
+                    @SuppressWarnings("SyntheticAccessor")
+                    override fun onInvalidate() {
+                        // This could be called on any thread.
+                        uiThreadHandler.runOnHandlerWithTracing("onInvalidate") {
+                            if (initFinished) {
+                                getWatchFaceImplOrNull()?.invalidateIfNotAnimating()
+                            }
+                        }
+                    }
+                }
+            )
+            initFinished = true
         }
 
         override fun onVisibilityChanged(visible: Boolean): Unit = TraceEvent(
@@ -1336,11 +1454,6 @@
         ).use {
             super.onVisibilityChanged(visible)
 
-            if (ignoreNextOnVisibilityChanged) {
-                ignoreNextOnVisibilityChanged = false
-                return
-            }
-
             // In the WSL flow Home doesn't know when WallpaperService has actually launched a
             // watchface after requesting a change. It used [Constants.ACTION_REQUEST_STATE] as a
             // signal to trigger the old boot flow (sending the binder etc). This is no longer
@@ -1396,7 +1509,12 @@
                 if (LOG_VERBOSE) {
                     Log.v(WatchFaceService.TAG, "drawing frame")
                 }
-                watchFaceImpl.onDraw()
+
+                runBlocking {
+                    // TODO(b/188572638): We probably don't want to block here, consider drawing a
+                    // black frame instead if deferredWatchFaceImpl hasn't completed.
+                    deferredWatchFaceImpl.await().onDraw()
+                }
             } finally {
                 if (TRACE_DRAW) {
                     Trace.endSection()
@@ -1404,7 +1522,7 @@
             }
         }
 
-        internal fun watchFaceCreated() = this::watchFaceImpl.isInitialized
+        internal fun watchFaceCreated() = deferredWatchFaceImpl.isCompleted
 
         internal fun watchFaceCreatedOrPending() =
             watchFaceCreated() || asyncWatchFaceConstructionPending
@@ -1423,94 +1541,103 @@
             )
         }
 
-        override fun setActiveComplications(watchFaceComplicationIds: IntArray) {
+        override fun setActiveComplications(watchFaceComplicationIds: IntArray): Unit = TraceEvent(
+            "WatchFaceService.setActiveComplications"
+        ).use {
             wslFlow.setActiveComplications(watchFaceComplicationIds)
         }
 
+        @UiThread
         override fun updateContentDescriptionLabels() {
             val labels = mutableListOf<Pair<Int, ContentDescriptionLabel>>()
 
-            // Add a ContentDescriptionLabel for the main clock element.
-            labels.add(
-                Pair(
-                    WATCH_ELEMENT_ACCESSIBILITY_TRAVERSAL_INDEX,
-                    ContentDescriptionLabel(
-                        watchFaceImpl.renderer.getMainClockElementBounds(),
-                        AccessibilityUtils.makeTimeAsComplicationText(_context)
-                    )
-                )
-            )
+            uiThreadCoroutineScope.launch {
+                TraceEvent(
+                    "WatchFaceService.updateContentDescriptionLabels A"
+                ).close()
+                val rendererAndComplicationManager =
+                    deferredRendererAndComplicationManager.await()
 
-            // Add a ContentDescriptionLabel for each enabled complication.
-            val screenBounds = watchFaceImpl.renderer.screenBounds
-            for ((_, complication) in watchFaceImpl.complicationsManager.complications) {
-                if (complication.enabled) {
-                    if (complication.boundsType == ComplicationBoundsType.BACKGROUND) {
-                        ComplicationBoundsType.BACKGROUND
-                    } else {
-                        complication.renderer.getData()?.let {
-                            labels.add(
-                                Pair(
-                                    complication.accessibilityTraversalIndex,
-                                    ContentDescriptionLabel(
-                                        _context,
-                                        complication.computeBounds(screenBounds),
-                                        it.asWireComplicationData()
-                                    )
-                                )
+                TraceEvent(
+                    "WatchFaceService.updateContentDescriptionLabels"
+                ).use {
+                    // The side effects of this need to be applied before deferredWatchFaceImpl is
+                    // completed.
+                    val renderer = rendererAndComplicationManager.renderer
+                    val complicationsManager = rendererAndComplicationManager.complicationsManager
+
+                    // Add a ContentDescriptionLabel for the main clock element.
+                    labels.add(
+                        Pair(
+                            WATCH_ELEMENT_ACCESSIBILITY_TRAVERSAL_INDEX,
+                            ContentDescriptionLabel(
+                                renderer.getMainClockElementBounds(),
+                                AccessibilityUtils.makeTimeAsComplicationText(_context)
                             )
+                        )
+                    )
+
+                    // Add a ContentDescriptionLabel for each enabled complication.
+                    val screenBounds = renderer.screenBounds
+                    for ((_, complication) in complicationsManager.complications) {
+                        if (complication.enabled) {
+                            if (complication.boundsType == ComplicationBoundsType.BACKGROUND) {
+                                ComplicationBoundsType.BACKGROUND
+                            } else {
+                                if (complication.complicationData.hasValue()) {
+                                    labels.add(
+                                        Pair(
+                                            complication.accessibilityTraversalIndex,
+                                            ContentDescriptionLabel(
+                                                _context,
+                                                complication.computeBounds(screenBounds),
+                                                complication.complicationData.value
+                                                    .asWireComplicationData()
+                                            )
+                                        )
+                                    )
+                                }
+                            }
                         }
                     }
+
+                    // Add any additional labels defined by the watch face.
+                    for (labelPair in renderer.additionalContentDescriptionLabels) {
+                        labels.add(
+                            Pair(
+                                labelPair.first,
+                                ContentDescriptionLabel(
+                                    labelPair.second.bounds,
+                                    labelPair.second.text.toWireComplicationText()
+                                ).apply {
+                                    tapAction = labelPair.second.tapAction
+                                }
+                            )
+                        )
+                    }
+
+                    contentDescriptionLabels =
+                        labels.sortedBy { it.first }.map { it.second }.toTypedArray()
+
+                    // From Android R Let SysUI know the labels have changed if the accessibility
+                    // manager is enabled.
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
+                        getAccessibilityManager().isEnabled
+                    ) {
+                        // TODO(alexclarke): This should require a permission. See http://b/184717802
+                        _context.sendBroadcast(
+                            Intent(Constants.ACTION_WATCH_FACE_REFRESH_A11Y_LABELS)
+                        )
+                    }
                 }
             }
-
-            // Add any additional labels defined by the watch face.
-            for (labelPair in watchFaceImpl.renderer.additionalContentDescriptionLabels) {
-                labels.add(
-                    Pair(
-                        labelPair.first,
-                        ContentDescriptionLabel(
-                            labelPair.second.bounds,
-                            labelPair.second.text.toWireComplicationText()
-                        ).apply {
-                            tapAction = labelPair.second.tapAction
-                        }
-                    )
-                )
-            }
-
-            setContentDescriptionLabels(
-                labels.sortedBy { it.first }.map { it.second }.toTypedArray()
-            )
-
-            // From Android R Let SysUI know the labels have changed if the accessibility manager
-            // is enabled.
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
-                getAccessibilityManager().isEnabled
-            ) {
-                // TODO(alexclarke): This should require a permission. See http://b/184717802
-                _context.sendBroadcast(Intent(Constants.ACTION_WATCH_FACE_REFRESH_A11Y_LABELS))
-            }
         }
 
         private fun getAccessibilityManager() =
             _context.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
 
-        fun setContentDescriptionLabels(labels: Array<ContentDescriptionLabel>) {
-            contentDescriptionLabels = labels
-
-            // For the old pre-android R flow.
-            if (wslFlow.iWatchFaceServiceInitialized()) {
-                try {
-                    wslFlow.iWatchFaceService.setContentDescriptionLabels(contentDescriptionLabels)
-                } catch (e: RemoteException) {
-                    Log.e(TAG, "Failed to set accessibility labels: ", e)
-                }
-            }
-        }
-
         @UiThread
-        fun dump(writer: IndentingPrintWriter) {
+        internal fun dump(writer: IndentingPrintWriter) {
             require(uiThreadHandler.looper.isCurrentThread) {
                 "dump must be called from the UIThread"
             }
@@ -1518,7 +1645,7 @@
             writer.increaseIndent()
             when {
                 wslFlow.iWatchFaceServiceInitialized() -> writer.println("WSL style init flow")
-                this::watchFaceImpl.isInitialized -> writer.println("Androidx style init flow")
+                this.watchFaceCreatedOrPending() -> writer.println("Androidx style init flow")
                 expectPreRInitFlow() -> writer.println("Expecting WSL style init")
                 else -> writer.println("Expecting androidx style style init")
             }
@@ -1536,10 +1663,8 @@
                 }
             }
             writer.println("createdBy=$createdBy")
-            writer.println("firstOnSurfaceChanged=$firstOnSurfaceChangedReceived")
             writer.println("watchFaceInitStarted=$wslFlow.watchFaceInitStarted")
             writer.println("asyncWatchFaceConstructionPending=$asyncWatchFaceConstructionPending")
-            writer.println("ignoreNextOnVisibilityChanged=$ignoreNextOnVisibilityChanged")
 
             if (this::interactiveInstanceId.isInitialized) {
                 writer.println("interactiveInstanceId=$interactiveInstanceId")
@@ -1548,8 +1673,8 @@
             writer.println("frameCallbackPending=$frameCallbackPending")
             writer.println("destroyed=$destroyed")
 
-            if (!destroyed && this::watchFaceImpl.isInitialized) {
-                watchFaceImpl.dump(writer)
+            if (!destroyed) {
+                getWatchFaceImplOrNull()?.dump(writer)
             }
             writer.decreaseIndent()
         }
@@ -1644,3 +1769,28 @@
         }
     }
 }
+
+/**
+ * Runs a task in the [CoroutineScope] and blocks until it has completed.
+ *
+ * @param traceEventName The name of the trace event to emit.
+ * @param task The task to run on the [CoroutineScope].
+ */
+internal fun <R> CoroutineScope.runBlockingWithTracing(
+    traceEventName: String,
+    task: suspend () -> R
+): R = TraceEvent(traceEventName).use {
+    val latch = CountDownLatch(1)
+    var r: R? = null
+    launch {
+        try {
+            r = task()
+        } catch (e: Exception) {
+            Log.e("CoroutineScope", "Exception in traceEventName", e)
+            throw e
+        }
+        latch.countDown()
+    }
+    latch.await()
+    return r!!
+}
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchState.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchState.kt
index a32f6ce..d67a288 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchState.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchState.kt
@@ -20,6 +20,7 @@
 import androidx.annotation.Px
 import androidx.annotation.RestrictTo
 import androidx.annotation.UiThread
+import androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData
 
 /**
  * Describes the current state of the wearable including some hardware details such as whether or
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/HeadlessWatchFaceImpl.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/HeadlessWatchFaceImpl.kt
index 87be1fe..aa0fff4 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/HeadlessWatchFaceImpl.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/HeadlessWatchFaceImpl.kt
@@ -16,15 +16,17 @@
 
 package androidx.wear.watchface.control
 
-import android.os.Handler
+import android.util.Log
 import androidx.annotation.RequiresApi
 import androidx.annotation.UiThread
+import androidx.wear.utility.TraceEvent
 import androidx.wear.watchface.IndentingPrintWriter
+import androidx.wear.watchface.WatchFaceImpl
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.control.data.ComplicationRenderParams
 import androidx.wear.watchface.control.data.WatchFaceRenderParams
-import androidx.wear.watchface.runBlockingOnHandlerWithTracing
-import androidx.wear.watchface.runOnHandlerWithTracing
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withContext
 
 /**
  * A headless watch face instance. This doesn't render asynchronously and the exposed API makes it
@@ -32,17 +34,18 @@
  */
 @RequiresApi(27)
 internal class HeadlessWatchFaceImpl(
-    internal var engine: WatchFaceService.EngineWrapper?,
-    private val uiThreadHandler: Handler
+    internal var engine: WatchFaceService.EngineWrapper?
 ) : IHeadlessWatchFace.Stub() {
 
     internal companion object {
+        const val TAG = "HeadlessWatchFaceImpl"
+
         @UiThread
         fun dump(indentingPrintWriter: IndentingPrintWriter) {
             indentingPrintWriter.println("HeadlessWatchFace instances:")
             indentingPrintWriter.increaseIndent()
             for (instance in headlessInstances) {
-                require(instance.uiThreadHandler.looper.isCurrentThread) {
+                require(instance.engine!!.getUiThreadHandler().looper.isCurrentThread) {
                     "dump must be called from the UIThread"
                 }
                 indentingPrintWriter.println("HeadlessWatchFaceImpl:")
@@ -57,44 +60,75 @@
     }
 
     init {
-        uiThreadHandler.runOnHandlerWithTracing("HeadlessWatchFaceImpl.init") {
-            headlessInstances.add(this)
+        TraceEvent("HeadlessWatchFaceImpl.init").use {
+            runBlocking {
+                val coroutineContext = synchronized(this) {
+                    engine!!.uiThreadCoroutineScope.coroutineContext
+                }
+                withContext(coroutineContext) {
+                    headlessInstances.add(this@HeadlessWatchFaceImpl)
+                }
+            }
         }
     }
 
     override fun getApiVersion() = IHeadlessWatchFace.API_VERSION
 
-    override fun renderWatchFaceToBitmap(params: WatchFaceRenderParams) =
-        uiThreadHandler.runBlockingOnHandlerWithTracing(
-            "HeadlessWatchFaceImpl.renderWatchFaceToBitmap"
-        ) {
-            engine!!.renderWatchFaceToBitmap(params)
+    private fun <R> awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
+        traceName: String,
+        task: (watchFaceImpl: WatchFaceImpl) -> R
+    ): R = TraceEvent(traceName).use {
+        runBlocking {
+            val engineCopy = synchronized(this) { engine!! }
+            val watchFaceImpl = engineCopy.deferredWatchFaceImpl.await()
+            withContext(engineCopy.uiThreadCoroutineScope.coroutineContext) {
+                try {
+                    task(watchFaceImpl)
+                } catch (e: Exception) {
+                    Log.e(TAG, "Operation failed", e)
+                    throw e
+                }
+            }
         }
+    }
 
-    override fun getPreviewReferenceTimeMillis() = engine!!.watchFaceImpl.previewReferenceTimeMillis
+    override fun renderWatchFaceToBitmap(params: WatchFaceRenderParams) =
+        awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
+            "HeadlessWatchFaceImpl.renderWatchFaceToBitmap"
+        ) { watchFaceImpl -> watchFaceImpl.renderWatchFaceToBitmap(params) }
+
+    override fun getPreviewReferenceTimeMillis() =
+        awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
+            "HeadlessWatchFaceImpl.getPreviewReferenceTimeMillis"
+        ) { watchFaceImpl -> watchFaceImpl.previewReferenceTimeMillis }
 
     override fun getComplicationState() =
-        uiThreadHandler.runBlockingOnHandlerWithTracing(
+        awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             "HeadlessWatchFaceImpl.getComplicationState"
-        ) {
-            engine!!.getComplicationState()
-        }
+        ) { watchFaceImpl -> watchFaceImpl.getComplicationState() }
 
     override fun renderComplicationToBitmap(params: ComplicationRenderParams) =
-        uiThreadHandler.runBlockingOnHandlerWithTracing(
+        awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             "HeadlessWatchFaceImpl.renderComplicationToBitmap"
-        ) {
-            engine!!.renderComplicationToBitmap(params)
-        }
+        ) { watchFaceImpl -> watchFaceImpl.renderComplicationToBitmap(params) }
 
     override fun getUserStyleSchema() =
-        engine!!.watchFaceImpl.currentUserStyleRepository.schema.toWireFormat()
+        awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
+            "HeadlessWatchFaceImpl.getUserStyleSchema"
+        ) { watchFaceImpl -> watchFaceImpl.currentUserStyleRepository.schema.toWireFormat() }
 
     override fun release() {
-        uiThreadHandler.runOnHandlerWithTracing("HeadlessWatchFaceImpl.release") {
-            headlessInstances.remove(this)
-            engine?.onDestroy()
-            engine = null
+        TraceEvent("HeadlessWatchFaceImpl.release").use {
+            runBlocking {
+                val engineCopy = synchronized(this) { engine!! }
+                withContext(engineCopy.uiThreadCoroutineScope.coroutineContext) {
+                    headlessInstances.remove(this@HeadlessWatchFaceImpl)
+                    synchronized(this@HeadlessWatchFaceImpl) {
+                        engine!!.onDestroy()
+                        engine = null
+                    }
+                }
+            }
         }
     }
 }
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt
index 0fe64b8..ea9da42 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt
@@ -19,6 +19,7 @@
 import android.annotation.SuppressLint
 import androidx.annotation.RequiresApi
 import androidx.annotation.UiThread
+import androidx.wear.utility.TraceEvent
 import androidx.wear.watchface.IndentingPrintWriter
 import androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams
 
@@ -114,7 +115,9 @@
                 return if (instance != null) {
                     instance.impl
                 } else {
-                    pendingWallpaperInteractiveWatchFaceInstance = value
+                    TraceEvent("Set pendingWallpaperInteractiveWatchFaceInstance").use {
+                        pendingWallpaperInteractiveWatchFaceInstance = value
+                    }
                     null
                 }
             }
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
index 6f00a78..e793a2e 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
@@ -16,76 +16,101 @@
 
 package androidx.wear.watchface.control
 
-import android.os.Handler
-import android.support.wearable.watchface.accessibility.ContentDescriptionLabel
+import android.util.Log
 import androidx.annotation.RequiresApi
+import androidx.wear.utility.TraceEvent
+import androidx.wear.watchface.WatchFaceImpl
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.control.data.WatchFaceRenderParams
 import androidx.wear.watchface.data.IdAndComplicationDataWireFormat
 import androidx.wear.watchface.data.WatchUiState
-import androidx.wear.watchface.runBlockingOnHandlerWithTracing
-import androidx.wear.watchface.runOnHandlerWithTracing
+import androidx.wear.watchface.runBlockingWithTracing
 import androidx.wear.watchface.style.data.UserStyleWireFormat
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withContext
 
 /** An interactive watch face instance with SysUI and WCS facing interfaces.*/
 @RequiresApi(27)
 internal class InteractiveWatchFaceImpl(
     internal val engine: WatchFaceService.EngineWrapper,
-    internal var instanceId: String,
-    private val uiThreadHandler: Handler
+    internal var instanceId: String
 ) : IInteractiveWatchFace.Stub() {
 
+    private companion object {
+        const val TAG = "InteractiveWatchFaceImpl"
+    }
+
     override fun getApiVersion() = IInteractiveWatchFace.API_VERSION
 
-    override fun sendTouchEvent(xPos: Int, yPos: Int, tapType: Int) {
-        uiThreadHandler.runOnHandlerWithTracing("InteractiveWatchFaceImpl.sendTouchEvent") {
-            engine.sendTouchEvent(xPos, yPos, tapType)
+    private fun <R> awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
+        traceName: String,
+        task: (watchFaceImpl: WatchFaceImpl) -> R
+    ): R = TraceEvent(traceName).use {
+        runBlocking {
+            val watchFaceImpl = engine.deferredWatchFaceImpl.await()
+            withContext(engine.uiThreadCoroutineScope.coroutineContext) {
+                try {
+                    task(watchFaceImpl)
+                } catch (e: Exception) {
+                    Log.e(TAG, "Operation failed", e)
+                    throw e
+                }
+            }
         }
     }
 
-    override fun getContentDescriptionLabels(): Array<ContentDescriptionLabel> =
-        uiThreadHandler.runBlockingOnHandlerWithTracing(
+    override fun sendTouchEvent(xPos: Int, yPos: Int, tapType: Int) =
+        awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
+            "InteractiveWatchFaceImpl.sendTouchEvent"
+        ) { watchFaceImpl -> watchFaceImpl.onTapCommand(tapType, xPos, yPos) }
+
+    override fun getContentDescriptionLabels() =
+        awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             "InteractiveWatchFaceImpl.getContentDescriptionLabels"
-        ) {
-            engine.contentDescriptionLabels
-        }
+        ) { engine.contentDescriptionLabels }
 
     override fun renderWatchFaceToBitmap(params: WatchFaceRenderParams) =
-        uiThreadHandler.runBlockingOnHandlerWithTracing(
+        awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             "InteractiveWatchFaceImpl.renderWatchFaceToBitmap"
-        ) {
-            engine.renderWatchFaceToBitmap(params)
-        }
+        ) { watchFaceImpl -> watchFaceImpl.renderWatchFaceToBitmap(params) }
 
-    override fun getPreviewReferenceTimeMillis() = engine.watchFaceImpl.previewReferenceTimeMillis
+    override fun getPreviewReferenceTimeMillis() =
+        awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
+            "InteractiveWatchFaceImpl.getPreviewReferenceTimeMillis"
+        ) { watchFaceImpl -> watchFaceImpl.previewReferenceTimeMillis }
 
-    override fun setWatchUiState(watchUiState: WatchUiState) {
-        uiThreadHandler.runOnHandlerWithTracing("InteractiveWatchFaceImpl.setSystemState") {
-            engine.setWatchUiState(watchUiState)
-        }
-    }
+    override fun setWatchUiState(watchUiState: WatchUiState) =
+        awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
+            "InteractiveWatchFaceImpl.setWatchUiState"
+        ) { engine.setWatchUiState(watchUiState) }
 
     override fun getInstanceId(): String = instanceId
 
     override fun ambientTickUpdate() {
-        uiThreadHandler.runOnHandlerWithTracing("InteractiveWatchFaceImpl.ambientTickUpdate") {
-            engine.ambientTickUpdate()
-        }
+        engine.uiThreadCoroutineScope.runBlockingWithTracing(
+            "InteractiveWatchFaceImpl.ambientTickUpdate"
+        ) { engine.ambientTickUpdate() }
     }
 
-    override fun release() {
-        uiThreadHandler.runOnHandlerWithTracing("InteractiveWatchFaceImpl.release") {
-            InteractiveInstanceManager.releaseInstance(instanceId)
+    override fun release() = TraceEvent("InteractiveWatchFaceImpl.release").use {
+        runBlocking {
+            try {
+                engine.deferredWatchFaceImpl.await()
+            } catch (e: Exception) {
+                // deferredWatchFaceImpl may have completed with an exception. This will have
+                // already been reported so we can ignore it.
+            }
+            withContext(engine.uiThreadCoroutineScope.coroutineContext) {
+                InteractiveInstanceManager.releaseInstance(instanceId)
+            }
         }
     }
 
     override fun updateComplicationData(
         complicationDatumWireFormats: MutableList<IdAndComplicationDataWireFormat>
-    ) {
-        uiThreadHandler.runOnHandlerWithTracing("InteractiveWatchFaceImpl.updateComplicationData") {
-            engine.setComplicationDataList(complicationDatumWireFormats)
-        }
-    }
+    ) = engine.uiThreadCoroutineScope.runBlockingWithTracing(
+        "InteractiveWatchFaceImpl.updateComplicationData"
+    ) { engine.setComplicationDataList(complicationDatumWireFormats) }
 
     override fun updateWatchfaceInstance(
         newInstanceId: String,
@@ -95,7 +120,9 @@
          * This is blocking to ensure ordering with respect to any subsequent [getInstanceId] and
          * [getPreviewReferenceTimeMillis] calls.
          */
-        uiThreadHandler.runBlockingOnHandlerWithTracing("InteractiveWatchFaceImpl.updateInstance") {
+        engine.uiThreadCoroutineScope.runBlockingWithTracing(
+            "InteractiveWatchFaceImpl.updateWatchfaceInstance"
+        ) {
             if (instanceId != newInstanceId) {
                 InteractiveInstanceManager.renameInstance(instanceId, newInstanceId)
                 instanceId = newInstanceId
@@ -106,24 +133,18 @@
     }
 
     override fun getComplicationDetails() =
-        uiThreadHandler.runBlockingOnHandlerWithTracing(
+        awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             "InteractiveWatchFaceImpl.getComplicationDetails"
-        ) {
-            engine.getComplicationState()
-        }
+        ) { watchFaceImpl -> watchFaceImpl.getComplicationState() }
 
     override fun getUserStyleSchema() =
-        uiThreadHandler.runBlockingOnHandlerWithTracing(
+        awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
             "InteractiveWatchFaceImpl.getUserStyleSchema"
-        ) {
-            engine.watchFaceImpl.currentUserStyleRepository.schema.toWireFormat()
-        }
+        ) { watchFaceImpl -> watchFaceImpl.currentUserStyleRepository.schema.toWireFormat() }
 
     override fun bringAttentionToComplication(id: Int) {
-        uiThreadHandler.runOnHandlerWithTracing(
-            "InteractiveWatchFaceImpl.bringAttentionToComplication"
-        ) {
-            engine.watchFaceImpl.complicationsManager.displayPressedAnimation(id)
-        }
+        awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
+            "InteractiveWatchFaceImpl.getUserStyleSchema"
+        ) { watchFaceImpl -> watchFaceImpl.complicationsManager.displayPressedAnimation(id) }
     }
-}
+}
\ No newline at end of file
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt
index 44feea4..b15c040 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt
@@ -38,9 +38,6 @@
 import androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams
 import androidx.wear.watchface.editor.EditorService
 import androidx.wear.watchface.runBlockingOnHandlerWithTracing
-import kotlinx.coroutines.android.asCoroutineDispatcher
-import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.withContext
 import java.io.FileDescriptor
 import java.io.PrintWriter
 
@@ -72,7 +69,9 @@
 
     @VisibleForTesting
     public open fun createServiceStub(): IWatchFaceInstanceServiceStub =
-        IWatchFaceInstanceServiceStub(this, Handler(Looper.getMainLooper()))
+        TraceEvent("WatchFaceControlService.createServiceStub").use {
+            IWatchFaceInstanceServiceStub(this, Handler(Looper.getMainLooper()))
+        }
 
     @VisibleForTesting
     public fun setContext(context: Context) {
@@ -129,12 +128,10 @@
         val engine = createHeadlessEngine(params.watchFaceName, context)
         engine?.let {
             // This is serviced on a background thread so it should be fine to block.
-            runBlocking {
+            uiThreadHandler.runBlockingOnHandlerWithTracing("createHeadlessInstance") {
                 // However the WatchFaceService.createWatchFace method needs to be run on the UI
                 // thread.
-                withContext(uiThreadHandler.asCoroutineDispatcher().immediate) {
-                    it.createHeadlessInstance(params)
-                }
+                it.createHeadlessInstance(params)
             }
         }
     }
@@ -197,16 +194,12 @@
     override fun getDefaultProviderPolicies(
         params: DefaultProviderPoliciesParams
     ): Array<IdTypeAndDefaultProviderPolicyWireFormat>? = TraceEvent(
-        "IWatchFaceInstanceServiceStub.getIdAndDefaultProviderPolicies"
+        "IWatchFaceInstanceServiceStub.getDefaultProviderPolicies"
     ).use {
-        val engine = createHeadlessEngine(params.watchFaceName, context)
-        engine?.let {
-            // This is serviced on a background thread so it should be fine to block.
-            uiThreadHandler.runBlockingOnHandlerWithTracing("getDefaultProviderPolicies") {
-                // However the WatchFaceService.getDefaultProviderPolicies method needs to be run on
-                // the UI thread.
-                it.getDefaultProviderPolicies()
-            }
+        createHeadlessEngine(params.watchFaceName, context)?.let { engine ->
+            val result = engine.getDefaultProviderPolicies()
+            engine.onDestroy()
+            result
         }
     }
-}
\ No newline at end of file
+}
diff --git a/wear/wear-watchface/src/test/java/androidx/wear/watchface/AsyncWatchFaceInitTest.kt b/wear/wear-watchface/src/test/java/androidx/wear/watchface/AsyncWatchFaceInitTest.kt
index 951e0c8..0b0a92c 100644
--- a/wear/wear-watchface/src/test/java/androidx/wear/watchface/AsyncWatchFaceInitTest.kt
+++ b/wear/wear-watchface/src/test/java/androidx/wear/watchface/AsyncWatchFaceInitTest.kt
@@ -91,7 +91,9 @@
         currentUserStyleRepository
     ).await()
 
-    override fun getHandler() = handler
+    override fun getUiThreadHandlerImpl() = handler
+
+    override fun getBackgroundThreadHandlerImpl() = handler
 
     override fun getMutableWatchState() = watchState
 
@@ -207,12 +209,11 @@
         )
 
         val engineWrapper = service.onCreateEngine() as WatchFaceService.EngineWrapper
-        engineWrapper.onSurfaceChanged(surfaceHolder, 0, 100, 100)
 
         runPostedTasksFor(0)
 
         lateinit var pendingException: Exception
-        engineWrapper.coroutineScope.launch {
+        engineWrapper.backgroundThreadCoroutineScope.launch {
             try {
                 // This should fail because the direct boot instance is being constructed.
                 engineWrapper.createInteractiveInstance(initParams, "test")
@@ -232,38 +233,9 @@
         lateinit var pendingCurrentUserStyleRepository: CurrentUserStyleRepository
         lateinit var pendingSurfaceHolder: SurfaceHolder
         lateinit var pendingWatchState: WatchState
-        val service = TestAsyncWatchFaceService(
-            handler,
-            object : TestAsyncWatchFaceService.AsyncWatchFaceFactory() {
-                override fun createUserStyleSchema() = UserStyleSchema(emptyList())
-
-                override fun createComplicationsManager(
-                    currentUserStyleRepository: CurrentUserStyleRepository
-                ) = ComplicationsManager(emptyList(), currentUserStyleRepository)
-
-                override fun createWatchFaceAsync(
-                    surfaceHolder: SurfaceHolder,
-                    watchState: WatchState,
-                    complicationsManager: ComplicationsManager,
-                    currentUserStyleRepository: CurrentUserStyleRepository
-                ): Deferred<WatchFace> {
-                    pendingSurfaceHolder = surfaceHolder
-                    pendingWatchState = watchState
-                    pendingCurrentUserStyleRepository = currentUserStyleRepository
-                    return completableDirectBootWatchFace
-                }
-            },
-            MutableWatchState(),
-            initParams
-        )
-
-        val engineWrapper = service.onCreateEngine() as WatchFaceService.EngineWrapper
-        engineWrapper.onSurfaceChanged(surfaceHolder, 0, 100, 100)
-        runPostedTasksFor(0)
-
-        var pendingInteractiveWatchFaceWcs: IInteractiveWatchFace? = null
 
         // There shouldn't be an existing instance, so we expect null.
+        var pendingInteractiveWatchFaceWcs: IInteractiveWatchFace? = null
         assertNull(
             InteractiveInstanceManager
                 .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
@@ -289,6 +261,32 @@
                 )
         )
 
+        val service = TestAsyncWatchFaceService(
+            handler,
+            object : TestAsyncWatchFaceService.AsyncWatchFaceFactory() {
+                override fun createUserStyleSchema() = UserStyleSchema(emptyList())
+
+                override fun createComplicationsManager(
+                    currentUserStyleRepository: CurrentUserStyleRepository
+                ) = ComplicationsManager(emptyList(), currentUserStyleRepository)
+
+                override fun createWatchFaceAsync(
+                    surfaceHolder: SurfaceHolder,
+                    watchState: WatchState,
+                    complicationsManager: ComplicationsManager,
+                    currentUserStyleRepository: CurrentUserStyleRepository
+                ): Deferred<WatchFace> {
+                    pendingSurfaceHolder = surfaceHolder
+                    pendingWatchState = watchState
+                    pendingCurrentUserStyleRepository = currentUserStyleRepository
+                    return completableDirectBootWatchFace
+                }
+            },
+            MutableWatchState(),
+            initParams
+        )
+
+        service.onCreateEngine() as WatchFaceService.EngineWrapper
         runPostedTasksFor(0)
 
         // Complete the direct boot watch face which should trigger the callback which sets
diff --git a/wear/wear-watchface/src/test/java/androidx/wear/watchface/ObservableWatchDataTest.kt b/wear/wear-watchface/src/test/java/androidx/wear/watchface/ObservableWatchDataTest.kt
index b29815d..8f796dd 100644
--- a/wear/wear-watchface/src/test/java/androidx/wear/watchface/ObservableWatchDataTest.kt
+++ b/wear/wear-watchface/src/test/java/androidx/wear/watchface/ObservableWatchDataTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.wear.watchface
 
+import androidx.wear.watchface.ObservableWatchData.MutableObservableWatchData
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Test
@@ -30,7 +31,7 @@
 
 @Config(manifest = Config.NONE)
 @RunWith(WatchFaceTestRunner::class)
-class ObservableWatchDataTest {
+public class ObservableWatchDataTest {
     @Mock
     private lateinit var observer: Observer<Int>
 
@@ -41,39 +42,39 @@
     private lateinit var observer3: Observer<Int>
 
     @Before
-    fun setUp() {
+    public fun setUp() {
         MockitoAnnotations.initMocks(this)
     }
 
     @Test
-    fun initialValue() {
+    public fun initialValue() {
         val data = MutableObservableWatchData(10)
         assertThat(data.value).isEqualTo(10)
     }
 
     @Test
-    fun mutatedValue() {
+    public fun mutatedValue() {
         val data = MutableObservableWatchData(10)
         data.value = 20
         assertThat(data.value).isEqualTo(20)
     }
 
     @Test
-    fun addObserverNoData() {
+    public fun addObserverNoData() {
         val data = MutableObservableWatchData<Int>()
         data.addObserver(observer)
         verify(observer, never()).onChanged(any())
     }
 
     @Test
-    fun addObserver() {
+    public fun addObserver() {
         val data = MutableObservableWatchData(10)
         data.addObserver(observer)
         verify(observer).onChanged(10)
     }
 
     @Test
-    fun addObserverAndAssign() {
+    public fun addObserverAndAssign() {
         val data = MutableObservableWatchData(10)
         data.addObserver(observer)
         verify(observer).onChanged(10)
@@ -83,7 +84,7 @@
     }
 
     @Test
-    fun addObserverNoDataThenAssign() {
+    public fun addObserverNoDataThenAssign() {
         val data = MutableObservableWatchData<Int>()
         data.addObserver(observer)
 
@@ -92,7 +93,7 @@
     }
 
     @Test
-    fun addAndRemoveObserver() {
+    public fun addAndRemoveObserver() {
         val data = MutableObservableWatchData(10)
         data.addObserver(observer)
         data.removeObserver(observer)
@@ -103,7 +104,7 @@
     }
 
     @Test
-    fun removeObserverDuringCallback() {
+    public fun removeObserverDuringCallback() {
         val data = MutableObservableWatchData(10)
         data.addObserver(observer)
         data.addObserver(observer2)
@@ -124,7 +125,7 @@
     }
 
     @Test
-    fun addObserverInObserver() {
+    public fun addObserverInObserver() {
         val data = MutableObservableWatchData(10)
         var observersAdded = 0
         var addedObserverObservations = 0
diff --git a/wear/wear-watchface/src/test/java/androidx/wear/watchface/TestCommon.kt b/wear/wear-watchface/src/test/java/androidx/wear/watchface/TestCommon.kt
index 9d8d621..9831caf 100644
--- a/wear/wear-watchface/src/test/java/androidx/wear/watchface/TestCommon.kt
+++ b/wear/wear-watchface/src/test/java/androidx/wear/watchface/TestCommon.kt
@@ -120,7 +120,11 @@
             }).setTapListener(tapListener)
     }
 
-    override fun getHandler() = handler
+    override fun getUiThreadHandlerImpl() = handler
+
+    // To make unit tests simpler and non-flaky we run background tasks and ui tasks on the same
+    // handler.
+    override fun getBackgroundThreadHandlerImpl() = handler
 
     override fun getMutableWatchState() = watchState
 
diff --git a/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt b/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
index 4e99e01..98bb9c7 100644
--- a/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
+++ b/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
@@ -23,6 +23,7 @@
 import android.graphics.Insets
 import android.graphics.Rect
 import android.graphics.RectF
+import android.graphics.drawable.Icon
 import android.os.BatteryManager
 import android.os.Bundle
 import android.os.Handler
@@ -174,9 +175,7 @@
                     complicationDrawableLeft,
                     watchState,
                     listener
-                ).apply {
-                    loadData(createComplicationData(), false)
-                }
+                )
             },
             listOf(
                 ComplicationType.RANGED_VALUE,
@@ -198,9 +197,7 @@
                     complicationDrawableRight,
                     watchState,
                     listener
-                ).apply {
-                    loadData(createComplicationData(), false)
-                }
+                )
             },
             listOf(
                 ComplicationType.RANGED_VALUE,
@@ -223,9 +220,7 @@
                     complicationDrawableEdge,
                     watchState,
                     listener
-                ).apply {
-                    loadData(createComplicationData(), false)
-                }
+                )
             },
             listOf(
                 ComplicationType.RANGED_VALUE,
@@ -248,9 +243,7 @@
                     complicationDrawableBackground,
                     watchState,
                     listener
-                ).apply {
-                    loadData(createComplicationData(), false)
-                }
+                )
             },
             listOf(
                 ComplicationType.PHOTO_IMAGE
@@ -332,19 +325,6 @@
     private var looperTimeMillis = 0L
     private val pendingTasks = PriorityQueue<Task>()
 
-    /**
-     * Runs any pending DispatchedContinuation tasks.  Care should be taken to ensure there's
-     * not other tasks in the queue ahead of these or they won't get run.
-     */
-    private fun runPendingPostedDispatchedContinuationTasks() {
-        while (pendingTasks.isNotEmpty() &&
-            pendingTasks.peek()!!.runTimeMillis <= looperTimeMillis &&
-            pendingTasks.peek()!!.runnable.toString().startsWith("DispatchedContinuation")
-        ) {
-            pendingTasks.remove().runnable.run()
-        }
-    }
-
     private fun runPostedTasksFor(durationMillis: Long) {
         looperTimeMillis += durationMillis
         while (pendingTasks.isNotEmpty() &&
@@ -385,13 +365,33 @@
         engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
         engineWrapper.onCreate(surfaceHolder)
 
-        // Trigger watch face creation by sending the SurfceHolder, setting the binder and the
-        // immutable properties.
-        engineWrapper.onSurfaceChanged(surfaceHolder, 0, 100, 100)
+        // Set some initial complication data.
+        for (complication in complications) {
+            setComplicationViaWallpaperCommand(
+                complication.id,
+                when (complication.defaultProviderType) {
+                    ComplicationType.SHORT_TEXT ->
+                        ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                            .setShortText(ComplicationText.plainText("Initial Short"))
+                            .build()
+
+                    ComplicationType.PHOTO_IMAGE ->
+                        ComplicationData.Builder(ComplicationData.TYPE_LARGE_IMAGE)
+                            .setLargeImage(Icon.createWithContentUri("someuri"))
+                            .build()
+
+                    else -> throw UnsupportedOperationException()
+                }
+            )
+        }
+
+        // Trigger watch face creation by setting the binder and the immutable properties.
         sendBinder(engineWrapper, apiVersion)
         sendImmutableProperties(engineWrapper, hasLowBitAmbient, hasBurnInProtection)
 
-        watchFaceImpl = engineWrapper.watchFaceImpl
+        // [WatchFaceService.createWatchFace] Will have run by now because we're using an immediate
+        // coroutine dispatcher.
+        watchFaceImpl = engineWrapper.getWatchFaceImplOrNull()!!
         currentUserStyleRepository = watchFaceImpl.currentUserStyleRepository
         complicationsManager = watchFaceImpl.complicationsManager
 
@@ -448,13 +448,10 @@
         engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
         engineWrapper.onCreate(surfaceHolder)
 
-        // [WatchFaceService.createWatchFace] is a suspend function backed by a handler coroutine
-        // dispatcher. We need to execute posted tasks inorder for the engine to get created.
-        runPendingPostedDispatchedContinuationTasks()
+        // [WatchFaceService.createWatchFace] Will have run by now because we're using an immediate
+        // coroutine dispatcher.
+        watchFaceImpl = engineWrapper.getWatchFaceImplOrNull()!!
 
-        // The [SurfaceHolder] must be sent before binding.
-        engineWrapper.onSurfaceChanged(surfaceHolder, 0, 100, 100)
-        watchFaceImpl = engineWrapper.watchFaceImpl
         currentUserStyleRepository = watchFaceImpl.currentUserStyleRepository
         complicationsManager = watchFaceImpl.complicationsManager
         testWatchFaceService.setIsVisible(true)
@@ -488,12 +485,6 @@
                 putBoolean(Constants.PROPERTY_BURN_IN_PROTECTION, hasBurnInProtection)
             }
         )
-
-        // [WatchFaceService.createWatchFace] is a suspend function backed by a handler coroutine
-        // dispatcher. We need to execute posted tasks for the engine to get created. We assume this
-        // is the last call made before the test needs to do something with the watch face, so we
-        // force execution here.
-        runPendingPostedDispatchedContinuationTasks()
     }
 
     private fun sendRequestStyle() {
@@ -1019,7 +1010,7 @@
             UserStyleSchema(emptyList())
         )
         // Flush pending tasks posted as a result of initEngine.
-        runPendingPostedDispatchedContinuationTasks()
+        runPostedTasksFor(0)
         assertThat(complicationsManager.getBackgroundComplication()).isNull()
         engineWrapper.onDestroy()
     }
@@ -1080,11 +1071,11 @@
 
         // Trigger watch face creation.
         val engine2 = service2.onCreateEngine() as WatchFaceService.EngineWrapper
-        engine2.onSurfaceChanged(surfaceHolder, 0, 100, 100)
         sendBinder(engine2, apiVersion = 2)
         sendImmutableProperties(engine2, false, false)
 
-        val userStyleRepository2 = engine2.watchFaceImpl.currentUserStyleRepository
+        val watchFaceImpl2 = engine2.getWatchFaceImplOrNull()!!
+        val userStyleRepository2 = watchFaceImpl2.currentUserStyleRepository
         assertThat(userStyleRepository2.userStyle.selectedOptions[colorStyleSetting]!!.id)
             .isEqualTo(
                 blueStyleOption.id
@@ -1272,8 +1263,6 @@
             UserStyleSchema(emptyList())
         )
 
-        runPostedTasksFor(0)
-
         verify(iWatchFaceService).setActiveComplications(
             intArrayOf(LEFT_COMPLICATION_ID, RIGHT_COMPLICATION_ID, BACKGROUND_COMPLICATION_ID),
             true
@@ -1290,57 +1279,16 @@
 
         runPostedTasksFor(0)
 
-        val argument = ArgumentCaptor.forClass(Array<ContentDescriptionLabel>::class.java)
-        verify(iWatchFaceService).setContentDescriptionLabels(argument.capture())
-        assertThat(argument.value.size).isEqualTo(3)
-        assertThat(argument.value[0].bounds).isEqualTo(Rect(25, 25, 75, 75)) // Clock element.
-        assertThat(argument.value[1].bounds).isEqualTo(Rect(20, 40, 40, 60)) // Left complicaiton.
-        assertThat(argument.value[2].bounds).isEqualTo(Rect(60, 40, 80, 60)) // Right complicaiton.
-    }
+        // setContentDescriptionLabels gets called twice in the legacy WSL flow, once initially and
+        // once in response to the complication data wallpaper commands.
+        val arguments = ArgumentCaptor.forClass(Array<ContentDescriptionLabel>::class.java)
+        verify(iWatchFaceService, times(2)).setContentDescriptionLabels(arguments.capture())
 
-    @Test
-    public fun setActiveComplications_afterDisablingSeveralComplications() {
-        initEngine(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication, rightComplication, backgroundComplication),
-            UserStyleSchema(emptyList())
-        )
-
-        // Disabling complications should post a task which updates the active complications.
-        leftComplication.enabled = false
-        backgroundComplication.enabled = false
-        runPostedTasksFor(0)
-        verify(iWatchFaceService).setActiveComplications(intArrayOf(RIGHT_COMPLICATION_ID), true)
-    }
-
-    @Test
-    public fun initial_setContentDescriptionLabels_afterDisablingSeveralComplications() {
-        initEngine(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication, rightComplication, backgroundComplication),
-            UserStyleSchema(emptyList())
-        )
-
-        // Ignore initial setContentDescriptionLabels call.
-        reset(iWatchFaceService)
-
-        // Disabling complications should post a task which updates the active complications.
-        leftComplication.enabled = false
-        backgroundComplication.enabled = false
-        runPostedTasksFor(0)
-
-        verify(iWatchFaceService).setActiveComplications(
-            intArrayOf(rightComplication.id),
-            true
-        )
-
-        // Despite disabling the background complication we should still get a
-        // ContentDescriptionLabel for the main clock element.
-        val argument = ArgumentCaptor.forClass(Array<ContentDescriptionLabel>::class.java)
-        verify(iWatchFaceService).setContentDescriptionLabels(argument.capture())
-        assertThat(argument.value.size).isEqualTo(2)
-        assertThat(argument.value[0].bounds).isEqualTo(Rect(25, 25, 75, 75)) // Clock element.
-        assertThat(argument.value[1].bounds).isEqualTo(Rect(60, 40, 80, 60)) // Right complication.
+        val argument = arguments.allValues[1]
+        assertThat(argument.size).isEqualTo(3)
+        assertThat(argument[0].bounds).isEqualTo(Rect(25, 25, 75, 75)) // Clock element.
+        assertThat(argument[1].bounds).isEqualTo(Rect(20, 40, 40, 60)) // Left complication.
+        assertThat(argument[2].bounds).isEqualTo(Rect(60, 40, 80, 60)) // Right complication.
     }
 
     @Test
@@ -1355,7 +1303,7 @@
         leftComplication.complicationBounds = ComplicationBounds(RectF(0.3f, 0.3f, 0.5f, 0.5f))
         rightComplication.complicationBounds = ComplicationBounds(RectF(0.7f, 0.75f, 0.9f, 0.95f))
 
-        val complicationDetails = engineWrapper.getComplicationState()
+        val complicationDetails = watchFaceImpl.getComplicationState()
         assertThat(complicationDetails[0].id).isEqualTo(LEFT_COMPLICATION_ID)
         assertThat(complicationDetails[0].complicationState.boundsType).isEqualTo(
             ComplicationBoundsType.ROUND_RECT
@@ -1467,7 +1415,7 @@
         ) // Right complication.
 
         // Change the style
-        engineWrapper.watchFaceImpl.currentUserStyleRepository.userStyle = UserStyle(
+        watchFaceImpl.currentUserStyleRepository.userStyle = UserStyle(
             hashMapOf(complicationsStyleSetting to leftAndRightComplicationsOptionIndexReversed)
         )
         runPostedTasksFor(0)
@@ -1567,10 +1515,9 @@
         sendRequestStyle()
 
         // Trigger watch face creation.
-        engineWrapper.onSurfaceChanged(surfaceHolder, 0, 100, 100)
         sendBinder(engineWrapper, apiVersion = 2)
         sendImmutableProperties(engineWrapper, false, false)
-        watchFaceImpl = engineWrapper.watchFaceImpl
+        watchFaceImpl = engineWrapper.getWatchFaceImplOrNull()!!
 
         val argument = ArgumentCaptor.forClass(WatchFaceStyle::class.java)
         verify(iWatchFaceService).setStyle(argument.capture())
@@ -1716,7 +1663,7 @@
             apiVersion = 4
         )
 
-        val complicationDetails = engineWrapper.getComplicationState()
+        val complicationDetails = watchFaceImpl.getComplicationState()
         assertThat(complicationDetails[0].id).isEqualTo(LEFT_COMPLICATION_ID)
         assertThat(complicationDetails[0].complicationState.boundsType).isEqualTo(
             ComplicationBoundsType.ROUND_RECT
@@ -1791,10 +1738,9 @@
         `when`(surfaceHolder.surfaceFrame).thenReturn(ONE_HUNDRED_BY_ONE_HUNDRED_RECT)
 
         // Trigger watch face creation.
-        engineWrapper.onSurfaceChanged(surfaceHolder, 0, 100, 100)
         sendBinder(engineWrapper, apiVersion = 2)
         sendImmutableProperties(engineWrapper, false, false)
-        watchFaceImpl = engineWrapper.watchFaceImpl
+        watchFaceImpl = engineWrapper.getWatchFaceImplOrNull()!!
 
         // Enter ambient mode.
         watchState.isAmbient.value = true
@@ -1816,16 +1762,16 @@
             apiVersion = 4
         )
 
+        reset(iWatchFaceService)
+
         // Select a new style which turns off both complications.
         val newStyleA = HashMap(currentUserStyleRepository.userStyle.selectedOptions)
         newStyleA[complicationsStyleSetting] = noComplicationsOption
         currentUserStyleRepository.userStyle = UserStyle(newStyleA)
 
-        runPostedTasksFor(0)
-
         assertFalse(leftComplication.enabled)
         assertFalse(rightComplication.enabled)
-        verify(iWatchFaceService).setActiveComplications(intArrayOf(), true)
+        verify(iWatchFaceService).setActiveComplications(intArrayOf(), false)
 
         val argumentA = ArgumentCaptor.forClass(Array<ContentDescriptionLabel>::class.java)
         verify(iWatchFaceService).setContentDescriptionLabels(argumentA.capture())
@@ -1839,8 +1785,6 @@
         newStyleB[complicationsStyleSetting] = leftComplicationsOption
         currentUserStyleRepository.userStyle = UserStyle(newStyleB)
 
-        runPostedTasksFor(0)
-
         assertTrue(leftComplication.enabled)
         assertFalse(rightComplication.enabled)
         verify(iWatchFaceService).setActiveComplications(intArrayOf(LEFT_COMPLICATION_ID), false)
@@ -2311,7 +2255,6 @@
         engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
         engineWrapper.onCreate(surfaceHolder)
 
-        engineWrapper.onSurfaceChanged(surfaceHolder, 0, 100, 100)
         sendBinder(engineWrapper, 1)
 
         // At this stage we haven't sent properties such as isAmbient, we expect it to be
@@ -2455,13 +2398,12 @@
             )
         )
 
-        testWatchFaceService.onCreateEngine().onSurfaceChanged(surfaceHolder, 0, 100, 100)
-
-        runPendingPostedDispatchedContinuationTasks()
+        engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
 
         val instance = InteractiveInstanceManager.getAndRetainInstance(instanceId)
         assertThat(instance).isNotNull()
-        val userStyle = instance!!.engine.watchFaceImpl.currentUserStyleRepository.userStyle
+        watchFaceImpl = engineWrapper.getWatchFaceImplOrNull()!!
+        val userStyle = watchFaceImpl.currentUserStyleRepository.userStyle
         assertThat(userStyle[colorStyleSetting]).isEqualTo(blueStyleOption)
         assertThat(userStyle[watchHandStyleSetting]).isEqualTo(gothicStyleOption)
 
@@ -2508,7 +2450,7 @@
 
         testWatchFaceService.createHeadlessEngine()
 
-        runPendingPostedDispatchedContinuationTasks()
+        runPostedTasksFor(0)
 
         val instance = InteractiveInstanceManager.getAndRetainInstance(instanceId)
         assertThat(instance).isNull()
diff --git a/wear/wear/lint-baseline.xml b/wear/wear/lint-baseline.xml
index 86495bb..e144009 100644
--- a/wear/wear/lint-baseline.xml
+++ b/wear/wear/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="KotlinPropertyAccess"
@@ -24,7 +24,8 @@
         <location
             file="src/main/java/androidx/wear/widget/CircularProgressLayout.java"
             line="339"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -39,7 +40,8 @@
         <location
             file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
             line="217"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -54,7 +56,8 @@
         <location
             file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
             line="238"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -69,7 +72,8 @@
         <location
             file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
             line="260"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -152,17 +156,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static &lt;T extends Activity> AmbientController attachAmbientSupport(T activity) {"
-        errorLine2="                                                                              ~">
-        <location
-            file="src/main/java/androidx/wear/ambient/AmbientMode.java"
-            line="250"
-            column="79"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {"
         errorLine2="                     ~~~~~~">
         <location
@@ -262,17 +255,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static &lt;T extends FragmentActivity> AmbientController attach(T activity) {"
-        errorLine2="                                                                        ~">
-        <location
-            file="src/main/java/androidx/wear/ambient/AmbientModeSupport.java"
-            line="280"
-            column="73"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {"
         errorLine2="                     ~~~~~~">
         <location
diff --git a/wear/wear/src/main/java/androidx/wear/widget/ArcLayout.java b/wear/wear/src/main/java/androidx/wear/widget/ArcLayout.java
index 1e5a8e4..bc2f3d1 100644
--- a/wear/wear/src/main/java/androidx/wear/widget/ArcLayout.java
+++ b/wear/wear/src/main/java/androidx/wear/widget/ArcLayout.java
@@ -146,6 +146,11 @@
         // Stores the angle of the child, used to handle touch events.
         float mMiddleAngle;
 
+        // Position of the center of the child, in the parent's coordinate space.
+        // Currently only used for normal (not ArcLayout.Widget) children.
+        float mCenterX;
+        float mCenterY;
+
         /**
          * Creates a new set of layout parameters. The values are extracted from the supplied
          * attributes set and context.
@@ -412,48 +417,7 @@
 
     @Override
     protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        for (int i = 0; i < getChildCount(); i++) {
-            View child = getChildAt(i);
-
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            // Curved container widgets have been measured so that the "arc" inside their widget
-            // will touch the outside of the box they have been measured in, taking into account
-            // the vertical alignment. Just grow them from the center.
-            if (child instanceof Widget) {
-                int leftPx =
-                        round((getMeasuredWidth() / 2f) - (child.getMeasuredWidth() / 2f));
-                int topPx =
-                        round((getMeasuredHeight() / 2f) - (child.getMeasuredHeight() / 2f));
-
-                child.layout(
-                        leftPx,
-                        topPx,
-                        leftPx + child.getMeasuredWidth(),
-                        topPx + child.getMeasuredHeight()
-                );
-            } else {
-                // Normal widgets need to be placed on their canvas, taking into account their
-                // vertical position.
-                // In terms of x axis, they are placed in the center of the screen, same as the
-                // center of the circle where all components lay.
-                // In terms of y axis, widget is placed on top of the circle (12 o'clock).
-                int leftPx =
-                        round((getMeasuredWidth() / 2f) - (child.getMeasuredWidth() / 2f));
-                int topPx = round(getChildTopInset(child));
-
-                child.layout(
-                        leftPx,
-                        topPx,
-                        leftPx + child.getMeasuredWidth(),
-                        topPx + child.getMeasuredHeight());
-            }
-        }
-
-        // Once dimensions are set, also layout the children in the arc, computing the
-        // center angle where they should be drawn.
+         // Layout the children in the arc, computing the center angle where they should be drawn.
         float currentCumulativeAngle = calculateInitialRotation();
         for (int i = 0; i < getChildCount(); i++) {
             View child = getChildAt(i);
@@ -471,7 +435,44 @@
             LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
             childLayoutParams.mMiddleAngle = middleAngle;
 
+            // Distance from the center of the ArcLayout to the center of the child widget
+            float centerToCenterDistance = (getMeasuredHeight() - child.getMeasuredHeight()) / 2
+                    - getChildTopInset(child);
+            // Move the center of the widget in the circle centered on this ArcLayout, and with
+            // radius centerToCenterDistance
+            childLayoutParams.mCenterX =
+                    (float) (getMeasuredWidth() / 2f
+                            + centerToCenterDistance * Math.sin(middleAngle * Math.PI / 180));
+            childLayoutParams.mCenterY =
+                    (float) (getMeasuredHeight() / 2f
+                            - centerToCenterDistance * Math.cos(middleAngle * Math.PI / 180));
+
             currentCumulativeAngle += mChildArcAngles.getTotalAngle();
+
+            // Curved container widgets have been measured so that the "arc" inside their widget
+            // will touch the outside of the box they have been measured in, taking into account
+            // the vertical alignment. Just grow them from the center.
+            if (child instanceof Widget) {
+                int leftPx =
+                        round((getMeasuredWidth() / 2f) - (child.getMeasuredWidth() / 2f));
+                int topPx =
+                        round((getMeasuredHeight() / 2f) - (child.getMeasuredHeight() / 2f));
+
+                child.layout(
+                        leftPx,
+                        topPx,
+                        leftPx + child.getMeasuredWidth(),
+                        topPx + child.getMeasuredHeight()
+                );
+            } else {
+                // Normal widget's centers need to be placed on their final position,
+                // the only thing left for drawing is to maybe rotate them.
+                int leftPx = round(childLayoutParams.mCenterX - child.getMeasuredWidth() / 2f);
+                int topPx = round(childLayoutParams.mCenterY - child.getMeasuredHeight() / 2f);
+
+                child.layout(leftPx, topPx, leftPx + child.getMeasuredWidth(),
+                        topPx + child.getMeasuredHeight());
+            }
         }
     }
 
@@ -520,17 +521,18 @@
 
     // Map a point to local child coordinates.
     private void mapPoint(View child, float angle, float[] point) {
-        float cx = getMeasuredWidth() / 2;
-        float cy = getMeasuredHeight() / 2;
-
         Matrix m = new Matrix();
-        m.postRotate(-angle, cx, cy);
-        m.postTranslate(-child.getX(), -child.getY());
-        if (!(child instanceof Widget)) {
-            LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-            if (!childLayoutParams.isRotated()) {
-                m.postRotate(angle, child.getWidth() / 2, child.getHeight() / 2);
+
+        LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
+        if (child instanceof Widget) {
+            m.postRotate(-angle, getMeasuredWidth() / 2, getMeasuredHeight() / 2);
+            m.postTranslate(-child.getX(), -child.getY());
+        } else {
+            m.postTranslate(-childLayoutParams.mCenterX, -childLayoutParams.mCenterY);
+            if (childLayoutParams.isRotated()) {
+                m.postRotate(-angle);
             }
+            m.postTranslate(child.getWidth() / 2, child.getHeight() / 2);
         }
         m.mapPoints(point);
     }
@@ -568,48 +570,25 @@
         LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
         float middleAngle = childLayoutParams.mMiddleAngle;
 
-        // Rotate the child widget. This rotation places child widget in its correct place in the
-        // circle. Rotation is done around the center of the circle that components make. Canvas
-        // does this at the end, when all (if any) rotations are done.
-        canvas.rotate(
-                middleAngle,
-                getMeasuredWidth() / 2f,
-                getMeasuredHeight() / 2f);
-
         if (child instanceof Widget) {
+            // Rotate the child widget. This rotation places child widget in its correct place in
+            // the circle. Rotation is done around the center of the circle that components make.
+            canvas.rotate(
+                    middleAngle,
+                    getMeasuredWidth() / 2f,
+                    getMeasuredHeight() / 2f);
+
             ((Widget) child).checkInvalidAttributeAsChild();
         } else {
-            // Do we need to do some counter rotation?
-            LayoutParams layoutParams = (LayoutParams) child.getLayoutParams();
-
-            float angleToRotate = 0f;
-
-            if (layoutParams.isRotated()) {
-                // For counterclockwise layout, especially when mixing standard Android widget with
-                // ArcLayoutWidget as children, we might need to rotate the standard widget to make
-                // them have the same upwards direction.
-                if (!mClockwise) {
-                    angleToRotate = 180f;
-                }
-            } else {
-                // Un-rotate about the top of the canvas, around the center of the actual child.
-                // This compounds with the initial rotation into a translation.
-                angleToRotate = -middleAngle;
-            }
-
-            // Do the actual rotation. This rotation is done in place around the center of the
+            // Normal components already have their center in the right position during layout,
+            // the only thing remaining is any needed rotation.
+            // This rotation is done in place around the center of the
             // child to adjust it based on rotation and clockwise attributes.
-            // Actual position of this component here is still at the
-            // top of the circle (12 o'clock), meaning that the strange rotation center is
-            // because the child view is x-centered but at the top of this container. Additional
-            // offset is added for vertical rectangular screens as for them the start of an arc
-            // is lower then usual.
-            float childInset = getChildTopInset(child);
-            canvas.rotate(
-                    angleToRotate,
-                    getMeasuredWidth() / 2f,
-                    child.getMeasuredHeight() / 2f + childInset
-            );
+            float angleToRotate = childLayoutParams.isRotated()
+                    ? middleAngle + (mClockwise ? 0f : 180f)
+                    : 0f;
+
+            canvas.rotate(angleToRotate, childLayoutParams.mCenterX, childLayoutParams.mCenterY);
         }
         boolean wasInvalidateIssued = super.drawChild(canvas, child, drawingTime);
 
diff --git a/wear/wear/src/main/java/androidx/wear/widget/CurvedTextView.java b/wear/wear/src/main/java/androidx/wear/widget/CurvedTextView.java
index 949098a..3843c1e 100644
--- a/wear/wear/src/main/java/androidx/wear/widget/CurvedTextView.java
+++ b/wear/wear/src/main/java/androidx/wear/widget/CurvedTextView.java
@@ -40,6 +40,8 @@
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.FloatRange;
@@ -262,13 +264,13 @@
     }
 
     @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        super.onLayout(changed, l, t, r, b);
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 
         mPaint.getTextBounds(mText, 0, mText.length(), mBounds);
 
         // Note that ascent is negative.
-        mPathRadius = min(getWidth(), getHeight()) / 2f
+        mPathRadius = min(getMeasuredWidth(), getMeasuredHeight()) / 2f
                 + (mClockwise ? mPaint.getFontMetrics().ascent - getPaddingTop() :
                 -mPaint.getFontMetrics().descent - getPaddingBottom());
         mTextSweepDegrees = min(
@@ -408,8 +410,8 @@
             float angle = backgroundStartAngle;
             float x0 = (float) (centerX + radius2 * cos(angle * Math.PI / 180));
             float x1 = (float) (centerX + radius1 * cos(angle * Math.PI / 180));
-            float y0 = (float) (centerX + radius2 * sin(angle * Math.PI / 180));
-            float y1 = (float) (centerX + radius1 * sin(angle * Math.PI / 180));
+            float y0 = (float) (centerY + radius2 * sin(angle * Math.PI / 180));
+            float y1 = (float) (centerY + radius1 * sin(angle * Math.PI / 180));
             angle = backgroundStartAngle + clockwiseFactor * mBackgroundSweepDegrees;
             float x2 = (float) (centerX + radius2 * cos(angle * Math.PI / 180));
             float x3 = (float) (centerX + radius1 * cos(angle * Math.PI / 180));
@@ -909,6 +911,18 @@
         doUpdate();
     }
 
+    @Override
+    public void onInitializeAccessibilityNodeInfo(@NonNull AccessibilityNodeInfo info) {
+        super.onInitializeAccessibilityNodeInfo(info);
+        info.setText(mText);
+    }
+
+    @Override
+    public void onPopulateAccessibilityEvent(@NonNull AccessibilityEvent event) {
+        super.onPopulateAccessibilityEvent(event);
+        event.getText().add(mText);
+    }
+
     /**
      * Nested class to avoid verification errors for methods induces in API level 26
      */
diff --git a/webkit/integration-tests/testapp/lint-baseline.xml b/webkit/integration-tests/testapp/lint-baseline.xml
index 62a1f07..765a6f1 100644
--- a/webkit/integration-tests/testapp/lint-baseline.xml
+++ b/webkit/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/webkit/webkit/lint-baseline.xml b/webkit/webkit/lint-baseline.xml
index bf080b6..42a176b 100644
--- a/webkit/webkit/lint-baseline.xml
+++ b/webkit/webkit/lint-baseline.xml
@@ -1,1148 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling Method.invoke without an SDK check"
-        errorLine1="        return (PackageInfo) webViewFactoryClass.getMethod("
-        errorLine2="                             ^">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="383"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling Method.invoke without an SDK check"
-        errorLine1="                webviewPackageName = (String) webviewUpdateServiceClass.getMethod("
-        errorLine2="                                              ^">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="404"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling Method.invoke without an SDK check"
-        errorLine1="        return (InvocationHandler) createProviderFactoryMethod.invoke(null);"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewGlueCommunicator.java"
-            line="69"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling Method.invoke without an SDK check"
-        errorLine1="            return getFactoryMethod.invoke(null);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewGlueCommunicator.java"
-            line="116"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.AssetHelper is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return context.getDataDir();"
-        errorLine2="                           ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/AssetHelper.java"
-            line="188"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 27; however, the containing class androidx.webkit.internal.SafeBrowsingResponseImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            getFrameworksImpl().showInterstitial(allowReporting);"
-        errorLine2="                                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/SafeBrowsingResponseImpl.java"
-            line="86"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 27; however, the containing class androidx.webkit.internal.SafeBrowsingResponseImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            getFrameworksImpl().proceed(report);"
-        errorLine2="                                ~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/SafeBrowsingResponseImpl.java"
-            line="100"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 27; however, the containing class androidx.webkit.internal.SafeBrowsingResponseImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            getFrameworksImpl().backToSafety(report);"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/SafeBrowsingResponseImpl.java"
-            line="114"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerControllerImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mFrameworksImpl = ServiceWorkerController.getInstance();"
-        errorLine2="                                                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/ServiceWorkerControllerImpl.java"
-            line="46"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerControllerImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    mFrameworksImpl.getServiceWorkerWebSettings());"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/ServiceWorkerControllerImpl.java"
-            line="51"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerControllerImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mFrameworksImpl = ServiceWorkerController.getInstance();"
-        errorLine2="                                                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/ServiceWorkerControllerImpl.java"
-            line="65"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerControllerImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            getFrameworksImpl().setServiceWorkerClient(new FrameworkServiceWorkerClient(client));"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/ServiceWorkerControllerImpl.java"
-            line="88"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            getFrameworksImpl().setCacheMode(mode);"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/ServiceWorkerWebSettingsImpl.java"
-            line="95"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return getFrameworksImpl().getCacheMode();"
-        errorLine2="                                       ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/ServiceWorkerWebSettingsImpl.java"
-            line="108"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            getFrameworksImpl().setAllowContentAccess(allow);"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/ServiceWorkerWebSettingsImpl.java"
-            line="121"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return getFrameworksImpl().getAllowContentAccess();"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/ServiceWorkerWebSettingsImpl.java"
-            line="134"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            getFrameworksImpl().setAllowFileAccess(allow);"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/ServiceWorkerWebSettingsImpl.java"
-            line="147"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return getFrameworksImpl().getAllowFileAccess();"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/ServiceWorkerWebSettingsImpl.java"
-            line="160"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            getFrameworksImpl().setBlockNetworkLoads(flag);"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/ServiceWorkerWebSettingsImpl.java"
-            line="174"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return getFrameworksImpl().getBlockNetworkLoads();"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/ServiceWorkerWebSettingsImpl.java"
-            line="188"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mFrameworksImpl = android.webkit.TracingController.getInstance();"
-        errorLine2="                                                               ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/TracingControllerImpl.java"
-            line="45"
-            column="64"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mFrameworksImpl = android.webkit.TracingController.getInstance();"
-        errorLine2="                                                               ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/TracingControllerImpl.java"
-            line="58"
-            column="64"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return getFrameworksImpl().isTracing();"
-        errorLine2="                                       ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/TracingControllerImpl.java"
-            line="76"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            android.webkit.TracingConfig config = new android.webkit.TracingConfig.Builder()"
-        errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/TracingControllerImpl.java"
-            line="94"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    .addCategories(tracingConfig.getPredefinedCategories())"
-        errorLine2="                     ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/TracingControllerImpl.java"
-            line="95"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    .addCategories(tracingConfig.getCustomIncludedCategories())"
-        errorLine2="                     ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/TracingControllerImpl.java"
-            line="96"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    .setTracingMode(tracingConfig.getTracingMode())"
-        errorLine2="                     ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/TracingControllerImpl.java"
-            line="97"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    .build();"
-        errorLine2="                     ~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/TracingControllerImpl.java"
-            line="98"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            getFrameworksImpl().start(config);"
-        errorLine2="                                ~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/TracingControllerImpl.java"
-            line="99"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return getFrameworksImpl().stop(outputStream, executor);"
-        errorLine2="                                       ~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/TracingControllerImpl.java"
-            line="114"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebMessagePortImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            getFrameworksImpl().postMessage(compatToFrameworkMessage(message));"
-        errorLine2="                                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="78"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebMessagePortImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            getFrameworksImpl().close();"
-        errorLine2="                                ~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="93"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebMessagePortImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            getFrameworksImpl().setWebMessageCallback(new WebMessagePort.WebMessageCallback() {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="107"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebMessagePortImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            getFrameworksImpl().setWebMessageCallback(new WebMessagePort.WebMessageCallback() {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="130"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebMessagePortImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        return new WebMessage("
-        errorLine2="               ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="193"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebMessagePortImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                message.getData(),"
-        errorLine2="                        ~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="206"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebMessagePortImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                portsToCompat(message.getPorts()));"
-        errorLine2="                                      ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="207"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebResourceErrorImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return getFrameworksImpl().getErrorCode();"
-        errorLine2="                                       ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebResourceErrorImpl.java"
-            line="84"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebResourceErrorImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return getFrameworksImpl().getDescription();"
-        errorLine2="                                       ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebResourceErrorImpl.java"
-            line="99"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.WebResourceRequestCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return request.isRedirect();"
-        errorLine2="                           ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebResourceRequestCompat.java"
-            line="52"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            settings.setOffscreenPreRaster(enabled);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebSettingsCompat.java"
-            line="67"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return settings.getOffscreenPreRaster();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebSettingsCompat.java"
-            line="93"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            settings.setSafeBrowsingEnabled(enabled);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebSettingsCompat.java"
-            line="126"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return settings.getSafeBrowsingEnabled();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebSettingsCompat.java"
-            line="151"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            settings.setDisabledActionModeMenuItems(menuItems);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebSettingsCompat.java"
-            line="191"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return settings.getDisabledActionModeMenuItems();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebSettingsCompat.java"
-            line="217"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            settings.setForceDark(forceDarkMode);"
-        errorLine2="                     ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebSettingsCompat.java"
-            line="354"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return settings.getForceDark();"
-        errorLine2="                            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebSettingsCompat.java"
-            line="382"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 21; however, the containing class androidx.webkit.WebViewClientCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        if (request.isForMainFrame()) {"
-        errorLine2="                    ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewClientCompat.java"
-            line="176"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 21; however, the containing class androidx.webkit.WebViewClientCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    request.getUrl().toString());"
-        errorLine2="                            ~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewClientCompat.java"
-            line="179"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 21; however, the containing class androidx.webkit.WebViewClientCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        return shouldOverrideUrlLoading(view, request.getUrl().toString());"
-        errorLine2="                                                      ~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewClientCompat.java"
-            line="296"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            webview.postVisualStateCallback(requestId,"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="166"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 27; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            WebView.startSafeBrowsing(context, callback);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="211"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 27; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            WebView.setSafeBrowsingWhitelist(hostsList, callback);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="262"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 27; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return WebView.getSafeBrowsingPrivacyPolicyUrl();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="327"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return WebView.getCurrentWebViewPackage();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="357"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return WebMessagePortImpl.portsToCompat(webview.createWebMessageChannel());"
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="452"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            webview.postWebMessage("
-        errorLine2="                    ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="492"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return webview.getWebViewClient();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="767"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return webview.getWebChromeClient();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="791"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            android.webkit.WebViewRenderProcess renderer = webview.getWebViewRenderProcess();"
-        errorLine2="                                                                   ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="826"
-            column="68"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            webview.setWebViewRenderProcessClient(executor, webViewRenderProcessClient != null"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="877"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            webview.setWebViewRenderProcessClient(webViewRenderProcessClient != null"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="916"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    webview.getWebViewRenderProcessClient();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="947"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            if (webview.getWebViewLooper() != Looper.myLooper()) {"
-        errorLine2="                        ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="992"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        + &quot;(Expected Looper &quot; + webview.getWebViewLooper() + &quot; called on &quot;"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="996"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.WebViewGlueCommunicator is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return WebView.getWebViewClassLoader();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewGlueCommunicator.java"
-            line="105"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.webkit.internal.WebViewRenderProcessImpl is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return renderer != null ? renderer.terminate() : false;"
-        errorLine2="                                               ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewRenderProcessImpl.java"
-            line="94"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="KotlinPropertyAccess"
-        message="This method should be called `getWillSuppressErrorPage` such that `willSuppressErrorPage` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
-        errorLine1="    public boolean willSuppressErrorPage() {"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebSettingsAdapter.java"
-            line="85"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public boolean stop(OutputStream outputStream, Executor executor) {"
-        errorLine2="                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/TracingControllerImpl.java"
-            line="110"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public boolean stop(OutputStream outputStream, Executor executor) {"
-        errorLine2="                                                   ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/TracingControllerImpl.java"
-            line="110"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public VisualStateCallbackAdapter(WebViewCompat.VisualStateCallback visualStateCallback) {"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/VisualStateCallbackAdapter.java"
-            line="30"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void onMessage(InvocationHandler port, InvocationHandler message) {"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessageCallbackAdapter.java"
-            line="40"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void onMessage(InvocationHandler port, InvocationHandler message) {"
-        errorLine2="                                                  ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessageCallbackAdapter.java"
-            line="40"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public WebMessagePortImpl(WebMessagePort frameworksImpl) {"
-        errorLine2="                              ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="45"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public WebMessagePortImpl(InvocationHandler invocationHandler) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="49"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void setWebMessageCallback(Handler handler,"
-        errorLine2="                                      ~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="126"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public WebMessagePort getFrameworkPort() {"
-        errorLine2="           ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="149"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public InvocationHandler getInvocationHandler() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="154"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static WebMessagePortCompat[] portsToCompat(WebMessagePort[] ports) {"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="163"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static WebMessagePort[] compatToPorts(WebMessagePortCompat[] compatPorts) {"
-        errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="178"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static WebMessage compatToFrameworkMessage(WebMessageCompat message) {"
-        errorLine2="                                                      ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="192"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static WebMessageCompat frameworkMessageToCompat(WebMessage message) {"
-        errorLine2="                                                            ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebMessagePortImpl.java"
-            line="204"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public WebResourceRequestAdapter(WebResourceRequestBoundaryInterface boundaryInterface) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebResourceRequestAdapter.java"
-            line="30"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public WebSettingsAdapter(WebSettingsBoundaryInterface boundaryInterface) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebSettingsAdapter.java"
-            line="29"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static ClassLoader getWebViewClassLoader() {"
-        errorLine2="                  ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewGlueCommunicator.java"
-            line="103"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    WebViewProviderBoundaryInterface createWebView(WebView webview);"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactory.java"
-            line="42"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    WebViewProviderBoundaryInterface createWebView(WebView webview);"
-        errorLine2="                                                   ~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactory.java"
-            line="42"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    WebkitToCompatConverterBoundaryInterface getWebkitToCompatConverter();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactory.java"
-            line="48"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    StaticsBoundaryInterface getStatics();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactory.java"
-            line="54"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    String[] getWebViewFeatures();"
-        errorLine2="    ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactory.java"
-            line="59"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    TracingControllerBoundaryInterface getTracingController();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactory.java"
-            line="70"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    ProxyControllerBoundaryInterface getProxyController();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactory.java"
-            line="75"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public WebViewProviderFactoryAdapter(WebViewProviderFactoryBoundaryInterface impl) {"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java"
-            line="40"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public WebViewProviderBoundaryInterface createWebView(WebView webview) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java"
-            line="50"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public WebViewProviderBoundaryInterface createWebView(WebView webview) {"
-        errorLine2="                                                          ~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java"
-            line="50"
-            column="59"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public WebkitToCompatConverterBoundaryInterface getWebkitToCompatConverter() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java"
-            line="61"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public StaticsBoundaryInterface getStatics() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java"
-            line="71"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public String[] getWebViewFeatures() {"
-        errorLine2="           ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java"
-            line="80"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public TracingControllerBoundaryInterface getTracingController() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java"
-            line="100"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public ProxyControllerBoundaryInterface getProxyController() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebViewProviderFactoryAdapter.java"
-            line="110"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public WebkitToCompatConverter(WebkitToCompatConverterBoundaryInterface impl) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebkitToCompatConverter.java"
-            line="46"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public WebSettingsAdapter convertSettings(WebSettings webSettings) {"
-        errorLine2="                                              ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebkitToCompatConverter.java"
-            line="56"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public WebResourceRequestAdapter convertWebResourceRequest(WebResourceRequest request) {"
-        errorLine2="                                                               ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/webkit/internal/WebkitToCompatConverter.java"
-            line="66"
-            column="64"/>
-    </issue>
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
 </issues>
diff --git a/window/window-java/api/current.txt b/window/window-java/api/current.txt
new file mode 100644
index 0000000..c041785
--- /dev/null
+++ b/window/window-java/api/current.txt
@@ -0,0 +1,14 @@
+// Signature format: 4.0
+package androidx.window.java {
+
+  public final class WindowInfoRepoJavaAdapter implements androidx.window.WindowInfoRepo {
+    ctor public WindowInfoRepoJavaAdapter(androidx.window.WindowInfoRepo repo);
+    method public void addWindowLayoutInfoListener(java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> consumer);
+    method public androidx.window.WindowMetrics currentWindowMetrics();
+    method public androidx.window.WindowMetrics maximumWindowMetrics();
+    method public void removeWindowLayoutInfoListener(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> consumer);
+    method public kotlinx.coroutines.flow.Flow<androidx.window.WindowLayoutInfo> windowLayoutInfo();
+  }
+
+}
+
diff --git a/window/window-java/api/public_plus_experimental_current.txt b/window/window-java/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..c041785
--- /dev/null
+++ b/window/window-java/api/public_plus_experimental_current.txt
@@ -0,0 +1,14 @@
+// Signature format: 4.0
+package androidx.window.java {
+
+  public final class WindowInfoRepoJavaAdapter implements androidx.window.WindowInfoRepo {
+    ctor public WindowInfoRepoJavaAdapter(androidx.window.WindowInfoRepo repo);
+    method public void addWindowLayoutInfoListener(java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> consumer);
+    method public androidx.window.WindowMetrics currentWindowMetrics();
+    method public androidx.window.WindowMetrics maximumWindowMetrics();
+    method public void removeWindowLayoutInfoListener(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> consumer);
+    method public kotlinx.coroutines.flow.Flow<androidx.window.WindowLayoutInfo> windowLayoutInfo();
+  }
+
+}
+
diff --git a/window/window-java/api/res-current.txt b/window/window-java/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/window/window-java/api/res-current.txt
diff --git a/window/window-java/api/restricted_current.txt b/window/window-java/api/restricted_current.txt
new file mode 100644
index 0000000..c041785
--- /dev/null
+++ b/window/window-java/api/restricted_current.txt
@@ -0,0 +1,14 @@
+// Signature format: 4.0
+package androidx.window.java {
+
+  public final class WindowInfoRepoJavaAdapter implements androidx.window.WindowInfoRepo {
+    ctor public WindowInfoRepoJavaAdapter(androidx.window.WindowInfoRepo repo);
+    method public void addWindowLayoutInfoListener(java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> consumer);
+    method public androidx.window.WindowMetrics currentWindowMetrics();
+    method public androidx.window.WindowMetrics maximumWindowMetrics();
+    method public void removeWindowLayoutInfoListener(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> consumer);
+    method public kotlinx.coroutines.flow.Flow<androidx.window.WindowLayoutInfo> windowLayoutInfo();
+  }
+
+}
+
diff --git a/window/window-java/build.gradle b/window/window-java/build.gradle
new file mode 100644
index 0000000..1de7f62
--- /dev/null
+++ b/window/window-java/build.gradle
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.LibraryType
+import androidx.build.LibraryVersions
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    api(KOTLIN_STDLIB)
+    api(KOTLIN_COROUTINES_CORE)
+    api(project(":window:window"))
+    implementation("androidx.core:core:1.3.2")
+
+    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
+    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(ANDROIDX_TEST_RULES)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(MOCKITO_KOTLIN, excludes.bytebuddy)
+}
+
+androidx {
+    name = "WindowManager Java Support"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenVersion = LibraryVersions.WINDOW
+    mavenGroup = LibraryGroups.WINDOW
+    inceptionYear = "2021"
+    description = "WindowManager Java Support"
+}
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
+    }
+}
diff --git a/window/window-java/src/androidTest/AndroidManifest.xml b/window/window-java/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..b0a8659
--- /dev/null
+++ b/window/window-java/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.window.java.test">
+    <!-- Empty manifest file for the library.-->
+</manifest>
diff --git a/window/window-java/src/androidTest/java/androidx/window/java/TestConsumer.kt b/window/window-java/src/androidTest/java/androidx/window/java/TestConsumer.kt
new file mode 100644
index 0000000..e96e396
--- /dev/null
+++ b/window/window-java/src/androidTest/java/androidx/window/java/TestConsumer.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.window.java
+
+import androidx.core.util.Consumer
+import org.junit.Assert.assertEquals
+
+internal class TestConsumer<T> : Consumer<T> {
+    private val values = mutableListOf<T>()
+
+    override fun accept(t: T) {
+        values.add(t)
+    }
+
+    fun assertValueCount(count: Int) {
+        assertEquals(count, values.size)
+    }
+
+    fun assertEmpty() {
+        assertValueCount(0)
+    }
+
+    fun assertValue(t: T) {
+        assertValueCount(1)
+        assertEquals(t, values.first())
+    }
+}
\ No newline at end of file
diff --git a/window/window-java/src/androidTest/java/androidx/window/java/WindowInfoRepoJavaAdapterTest.kt b/window/window-java/src/androidTest/java/androidx/window/java/WindowInfoRepoJavaAdapterTest.kt
new file mode 100644
index 0000000..46041e5
--- /dev/null
+++ b/window/window-java/src/androidTest/java/androidx/window/java/WindowInfoRepoJavaAdapterTest.kt
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.window.java
+
+import android.graphics.Rect
+import androidx.window.FoldingFeature
+import androidx.window.WindowInfoRepo
+import androidx.window.WindowLayoutInfo
+import androidx.window.WindowMetrics
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.whenever
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.receiveAsFlow
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+/**
+ * Add a test for [WindowInfoRepoJavaAdapter] to verify adapted methods. Test converting from the
+ * kotlin coroutine API to listeners and callbacks.
+ * @see WindowInfoRepo
+ */
+public class WindowInfoRepoJavaAdapterTest {
+
+    @Test
+    public fun testCurrentWindowMetrics_delegatesToRepo() {
+        val expected = WindowMetrics(Rect(0, 1, 2, 3))
+        val mockRepo = mock<WindowInfoRepo>()
+        whenever(mockRepo.currentWindowMetrics()).thenReturn(expected)
+        val unitUnderTest = WindowInfoRepoJavaAdapter(mockRepo)
+
+        val acutal = unitUnderTest.currentWindowMetrics()
+
+        assertEquals(expected, acutal)
+    }
+
+    @Test
+    public fun testMaximumWindowMetrics_delegatesToRepo() {
+        val expected = WindowMetrics(Rect(0, 1, 2, 3))
+        val mockRepo = mock<WindowInfoRepo>()
+        whenever(mockRepo.maximumWindowMetrics()).thenReturn(expected)
+        val unitUnderTest = WindowInfoRepoJavaAdapter(mockRepo)
+
+        val acutal = unitUnderTest.maximumWindowMetrics()
+
+        assertEquals(expected, acutal)
+    }
+
+    @Test
+    public fun testRegisterListener() {
+        val feature = FoldingFeature(
+            Rect(0, 100, 100, 100),
+            FoldingFeature.TYPE_HINGE,
+            FoldingFeature.STATE_HALF_OPENED
+        )
+        val expected = WindowLayoutInfo.Builder().setDisplayFeatures(listOf(feature)).build()
+        val mockRepo = mock<WindowInfoRepo>()
+        whenever(mockRepo.windowLayoutInfo()).thenReturn(flowOf(expected))
+        val unitUnderTest = WindowInfoRepoJavaAdapter(mockRepo)
+        val testConsumer = TestConsumer<WindowLayoutInfo>()
+
+        unitUnderTest.addWindowLayoutInfoListener(Runnable::run, testConsumer)
+
+        testConsumer.assertValue(expected)
+    }
+
+    @Test
+    public fun testRegisterListener_multipleIsNoOp() {
+        val feature = FoldingFeature(
+            Rect(0, 100, 100, 100),
+            FoldingFeature.TYPE_HINGE,
+            FoldingFeature.STATE_HALF_OPENED
+        )
+        val expected = WindowLayoutInfo.Builder().setDisplayFeatures(listOf(feature)).build()
+        val mockRepo = mock<WindowInfoRepo>()
+        whenever(mockRepo.windowLayoutInfo()).thenReturn(flowOf(expected))
+        val unitUnderTest = WindowInfoRepoJavaAdapter(mockRepo)
+        val testConsumer = TestConsumer<WindowLayoutInfo>()
+
+        unitUnderTest.addWindowLayoutInfoListener(Runnable::run, testConsumer)
+        unitUnderTest.addWindowLayoutInfoListener(Runnable::run, testConsumer)
+
+        testConsumer.assertValue(expected)
+    }
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    public fun testUnregisterListener() {
+        val feature = FoldingFeature(
+            Rect(0, 100, 100, 100),
+            FoldingFeature.TYPE_HINGE,
+            FoldingFeature.STATE_HALF_OPENED
+        )
+        val info = WindowLayoutInfo.Builder().setDisplayFeatures(listOf(feature)).build()
+        val mockRepo = mock<WindowInfoRepo>()
+        val channel = Channel<WindowLayoutInfo>()
+        whenever(mockRepo.windowLayoutInfo()).thenReturn(channel.receiveAsFlow())
+        val unitUnderTest = WindowInfoRepoJavaAdapter(mockRepo)
+        val testConsumer = TestConsumer<WindowLayoutInfo>()
+
+        unitUnderTest.addWindowLayoutInfoListener(Runnable::run, testConsumer)
+        unitUnderTest.addWindowLayoutInfoListener(Runnable::run, mock())
+        unitUnderTest.removeWindowLayoutInfoListener(testConsumer)
+        val accepted = channel.offer(info)
+
+        assertTrue(accepted)
+        testConsumer.assertEmpty()
+    }
+}
\ No newline at end of file
diff --git a/window/window-java/src/main/AndroidManifest.xml b/window/window-java/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..6ff89d0
--- /dev/null
+++ b/window/window-java/src/main/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.window.java">
+    <!-- Empty manifest file for the library.-->
+</manifest>
\ No newline at end of file
diff --git a/window/window-java/src/main/java/androidx/window/java/WindowInfoRepoJavaAdapter.kt b/window/window-java/src/main/java/androidx/window/java/WindowInfoRepoJavaAdapter.kt
new file mode 100644
index 0000000..561d759
--- /dev/null
+++ b/window/window-java/src/main/java/androidx/window/java/WindowInfoRepoJavaAdapter.kt
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.window.java
+
+import androidx.core.util.Consumer
+import androidx.window.WindowInfoRepo
+import androidx.window.WindowLayoutInfo
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.asCoroutineDispatcher
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.launch
+import java.util.concurrent.Executor
+import java.util.concurrent.locks.ReentrantLock
+import kotlin.concurrent.withLock
+
+/**
+ * A Java compatible interface of [WindowInfoRepo].
+ */
+public class WindowInfoRepoJavaAdapter(private val repo: WindowInfoRepo) : WindowInfoRepo by repo {
+
+    /**
+     * A [ReentrantLock] to protect against concurrent access to [consumerToJobMap].
+     */
+    private val lock = ReentrantLock()
+    private val consumerToJobMap = mutableMapOf<Consumer<WindowLayoutInfo>, Job>()
+
+    /**
+     * Register a listener to consume [WindowLayoutInfo] values. If the same consumer is
+     * registered twice then this method is a no-op.
+     * @see WindowInfoRepo.windowLayoutInfo
+     */
+    public fun addWindowLayoutInfoListener(
+        executor: Executor,
+        consumer: Consumer<WindowLayoutInfo>
+    ) {
+        lock.withLock {
+            if (consumerToJobMap[consumer] == null) {
+                val scope = CoroutineScope(executor.asCoroutineDispatcher())
+                consumerToJobMap[consumer] = scope.launch {
+                    repo.windowLayoutInfo().collect(consumer::accept)
+                }
+            }
+        }
+    }
+
+    /**
+     * Remove a listener to stop consuming [WindowLayoutInfo] values. If the listener has already
+     * been removed then this is a no-op.
+     * @see WindowInfoRepo.windowLayoutInfo
+     */
+    public fun removeWindowLayoutInfoListener(consumer: Consumer<WindowLayoutInfo>) {
+        lock.withLock {
+            consumerToJobMap[consumer]?.cancel()
+            consumerToJobMap.remove(consumer)
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window-rxjava2/api/current.txt b/window/window-rxjava2/api/current.txt
new file mode 100644
index 0000000..1686678
--- /dev/null
+++ b/window/window-rxjava2/api/current.txt
@@ -0,0 +1,8 @@
+// Signature format: 4.0
+package androidx.window.rxjava2 {
+
+  public final class WindowInfoRepoRx {
+  }
+
+}
+
diff --git a/window/window-rxjava2/api/public_plus_experimental_current.txt b/window/window-rxjava2/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..92458ab
--- /dev/null
+++ b/window/window-rxjava2/api/public_plus_experimental_current.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.window.rxjava2 {
+
+  public final class WindowInfoRepoRx {
+    method @kotlinx.coroutines.ExperimentalCoroutinesApi public static io.reactivex.Flowable<androidx.window.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.WindowInfoRepo);
+    method @kotlinx.coroutines.ExperimentalCoroutinesApi public static io.reactivex.Observable<androidx.window.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.WindowInfoRepo);
+  }
+
+}
+
diff --git a/window/window-rxjava2/api/res-current.txt b/window/window-rxjava2/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/window/window-rxjava2/api/res-current.txt
diff --git a/window/window-rxjava2/api/restricted_current.txt b/window/window-rxjava2/api/restricted_current.txt
new file mode 100644
index 0000000..1686678
--- /dev/null
+++ b/window/window-rxjava2/api/restricted_current.txt
@@ -0,0 +1,8 @@
+// Signature format: 4.0
+package androidx.window.rxjava2 {
+
+  public final class WindowInfoRepoRx {
+  }
+
+}
+
diff --git a/window/window-rxjava2/build.gradle b/window/window-rxjava2/build.gradle
new file mode 100644
index 0000000..a3160c6
--- /dev/null
+++ b/window/window-rxjava2/build.gradle
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.LibraryType
+import androidx.build.LibraryVersions
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+}
+
+android {
+    defaultConfig {
+        multiDexEnabled = true
+    }
+}
+
+dependencies {
+    api(KOTLIN_STDLIB)
+    api(KOTLIN_COROUTINES_CORE)
+    api(KOTLIN_COROUTINES_RX2)
+    api(RX_JAVA)
+    api(project(":window:window"))
+
+    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
+    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(ANDROIDX_TEST_RULES)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(MOCKITO_KOTLIN, excludes.bytebuddy)
+    androidTestImplementation(KOTLIN_COROUTINES_TEST)
+    androidTestImplementation(MULTIDEX)
+}
+
+androidx {
+    name = "WindowManager RxJava 2"
+    publish = Publish.SNAPSHOT_AND_RELEASE
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenVersion = LibraryVersions.WINDOW
+    mavenGroup = LibraryGroups.WINDOW
+    inceptionYear = "2021"
+    description = "WindowManager RxJava 2"
+}
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
+    }
+}
diff --git a/window/window-rxjava2/src/androidTest/AndroidManifest.xml b/window/window-rxjava2/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..25af29c
--- /dev/null
+++ b/window/window-rxjava2/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.window.rxjava2.test">
+    <!-- Empty manifest file for the library.-->
+</manifest>
diff --git a/window/window-rxjava2/src/androidTest/java/androidx/window/rxjava2/WindowInfoRepoRxTest.kt b/window/window-rxjava2/src/androidTest/java/androidx/window/rxjava2/WindowInfoRepoRxTest.kt
new file mode 100644
index 0000000..5ca2325
--- /dev/null
+++ b/window/window-rxjava2/src/androidTest/java/androidx/window/rxjava2/WindowInfoRepoRxTest.kt
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.window.rxjava2
+
+import android.graphics.Rect
+import androidx.window.FoldingFeature
+import androidx.window.WindowInfoRepo
+import androidx.window.WindowLayoutInfo
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.whenever
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.flowOf
+import org.junit.Test
+
+/**
+ * Tests for the RxJava 2 adapters.
+ */
+public class WindowInfoRepoRxTest {
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    public fun testWindowLayoutInfoObservable() {
+        val feature = FoldingFeature(
+            Rect(0, 100, 100, 100),
+            FoldingFeature.TYPE_HINGE,
+            FoldingFeature.STATE_HALF_OPENED
+        )
+        val expected = WindowLayoutInfo.Builder().setDisplayFeatures(listOf(feature)).build()
+        val mockRepo = mock<WindowInfoRepo>()
+        whenever(mockRepo.windowLayoutInfo()).thenReturn(flowOf(expected))
+
+        val testSubscriber = mockRepo.windowLayoutInfoObservable().test()
+
+        testSubscriber.assertValue(expected)
+    }
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    public fun testWindowLayoutInfoFlowable() {
+        val feature = FoldingFeature(
+            Rect(0, 100, 100, 100),
+            FoldingFeature.TYPE_HINGE,
+            FoldingFeature.STATE_HALF_OPENED
+        )
+        val expected = WindowLayoutInfo.Builder().setDisplayFeatures(listOf(feature)).build()
+        val mockRepo = mock<WindowInfoRepo>()
+        whenever(mockRepo.windowLayoutInfo()).thenReturn(flowOf(expected))
+
+        val testSubscriber = mockRepo.windowLayoutInfoFlowable().test()
+
+        testSubscriber.assertValue(expected)
+    }
+}
\ No newline at end of file
diff --git a/window/window-rxjava2/src/main/AndroidManifest.xml b/window/window-rxjava2/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..5f2d863
--- /dev/null
+++ b/window/window-rxjava2/src/main/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.window.rxjava2">
+    <!-- Empty manifest file for the library.-->
+</manifest>
\ No newline at end of file
diff --git a/window/window-rxjava2/src/main/java/androidx/window/rxjava2/WindowInfoRepoRx.kt b/window/window-rxjava2/src/main/java/androidx/window/rxjava2/WindowInfoRepoRx.kt
new file mode 100644
index 0000000..5ee31b8
--- /dev/null
+++ b/window/window-rxjava2/src/main/java/androidx/window/rxjava2/WindowInfoRepoRx.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+@file:JvmName("WindowInfoRepoRx")
+
+package androidx.window.rxjava2
+
+import androidx.window.WindowInfoRepo
+import androidx.window.WindowLayoutInfo
+import io.reactivex.Flowable
+import io.reactivex.Observable
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.rx2.asFlowable
+import kotlinx.coroutines.rx2.asObservable
+
+/**
+ * Return an [Observable] stream of [WindowLayoutInfo].
+ * @see WindowInfoRepo.windowLayoutInfo
+ */
+@ExperimentalCoroutinesApi
+public fun WindowInfoRepo.windowLayoutInfoObservable(): Observable<WindowLayoutInfo> {
+    return windowLayoutInfo().asObservable()
+}
+
+/**
+ * Return a [Flowable] stream of [WindowLayoutInfo].
+ * @see WindowInfoRepo.windowLayoutInfo
+ */
+@ExperimentalCoroutinesApi
+public fun WindowInfoRepo.windowLayoutInfoFlowable(): Flowable<WindowLayoutInfo> {
+    return windowLayoutInfo().asFlowable()
+}
\ No newline at end of file
diff --git a/window/window-rxjava3/api/current.txt b/window/window-rxjava3/api/current.txt
new file mode 100644
index 0000000..0b103da
--- /dev/null
+++ b/window/window-rxjava3/api/current.txt
@@ -0,0 +1,8 @@
+// Signature format: 4.0
+package androidx.window.rxjava3 {
+
+  public final class WindowInfoRepoRx {
+  }
+
+}
+
diff --git a/window/window-rxjava3/api/public_plus_experimental_current.txt b/window/window-rxjava3/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..ac3049b
--- /dev/null
+++ b/window/window-rxjava3/api/public_plus_experimental_current.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.window.rxjava3 {
+
+  public final class WindowInfoRepoRx {
+    method @kotlinx.coroutines.ExperimentalCoroutinesApi public static io.reactivex.rxjava3.core.Flowable<androidx.window.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.WindowInfoRepo);
+    method @kotlinx.coroutines.ExperimentalCoroutinesApi public static io.reactivex.rxjava3.core.Observable<androidx.window.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.WindowInfoRepo);
+  }
+
+}
+
diff --git a/window/window-rxjava3/api/res-current.txt b/window/window-rxjava3/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/window/window-rxjava3/api/res-current.txt
diff --git a/window/window-rxjava3/api/restricted_current.txt b/window/window-rxjava3/api/restricted_current.txt
new file mode 100644
index 0000000..0b103da
--- /dev/null
+++ b/window/window-rxjava3/api/restricted_current.txt
@@ -0,0 +1,8 @@
+// Signature format: 4.0
+package androidx.window.rxjava3 {
+
+  public final class WindowInfoRepoRx {
+  }
+
+}
+
diff --git a/window/window-rxjava3/build.gradle b/window/window-rxjava3/build.gradle
new file mode 100644
index 0000000..7ef3933
--- /dev/null
+++ b/window/window-rxjava3/build.gradle
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 androidx.build.LibraryGroups
+import androidx.build.LibraryType
+import androidx.build.LibraryVersions
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+}
+
+android {
+    defaultConfig {
+        multiDexEnabled = true
+    }
+}
+
+dependencies {
+    api(KOTLIN_STDLIB)
+    api(KOTLIN_COROUTINES_CORE)
+    api(KOTLIN_COROUTINES_RX3)
+    api(RX_JAVA3)
+    api(project(":window:window"))
+
+    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
+    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(ANDROIDX_TEST_RULES)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(MOCKITO_KOTLIN, excludes.bytebuddy)
+    androidTestImplementation(KOTLIN_COROUTINES_TEST)
+    androidTestImplementation(MULTIDEX)
+}
+
+androidx {
+    name = "WindowManager RxJava 3 Support"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenVersion = LibraryVersions.WINDOW
+    mavenGroup = LibraryGroups.WINDOW
+    inceptionYear = "2021"
+    description = "WindowManager RxJava 3 Support"
+}
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
+    }
+}
diff --git a/window/window-rxjava3/src/androidTest/AndroidManifest.xml b/window/window-rxjava3/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..2f5f252
--- /dev/null
+++ b/window/window-rxjava3/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.window.rxjava3.test">
+    <!-- Empty manifest file for the library.-->
+</manifest>
diff --git a/window/window-rxjava3/src/androidTest/java/androidx/window/rxjava3/WindowInfoRepoRxTest.kt b/window/window-rxjava3/src/androidTest/java/androidx/window/rxjava3/WindowInfoRepoRxTest.kt
new file mode 100644
index 0000000..8ca7e0b
--- /dev/null
+++ b/window/window-rxjava3/src/androidTest/java/androidx/window/rxjava3/WindowInfoRepoRxTest.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.window.rxjava3
+
+import android.graphics.Rect
+import androidx.window.FoldingFeature
+import androidx.window.WindowInfoRepo
+import androidx.window.WindowLayoutInfo
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.whenever
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.flowOf
+import org.junit.Test
+
+/**
+ * Test for the adapter functions that convert to [io.reactivex.rxjava3.core.Observable] or
+ * [io.reactivex.rxjava3.core.Flowable] and ensure that data is forwarded appropriately.
+ * @see WindowInfoRepo
+ */
+public class WindowInfoRepoRxTest {
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    public fun testWindowLayoutInfoObservable() {
+        val feature = FoldingFeature(
+            Rect(0, 100, 100, 100),
+            FoldingFeature.TYPE_HINGE,
+            FoldingFeature.STATE_HALF_OPENED
+        )
+        val expected = WindowLayoutInfo.Builder().setDisplayFeatures(listOf(feature)).build()
+        val mockRepo = mock<WindowInfoRepo>()
+        whenever(mockRepo.windowLayoutInfo()).thenReturn(flowOf(expected))
+
+        val testSubscriber = mockRepo.windowLayoutInfoObservable().test()
+
+        testSubscriber.assertValue(expected)
+    }
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    public fun testWindowLayoutInfoFlowable() {
+        val feature = FoldingFeature(
+            Rect(0, 100, 100, 100),
+            FoldingFeature.TYPE_HINGE,
+            FoldingFeature.STATE_HALF_OPENED
+        )
+        val expected = WindowLayoutInfo.Builder().setDisplayFeatures(listOf(feature)).build()
+        val mockRepo = mock<WindowInfoRepo>()
+        whenever(mockRepo.windowLayoutInfo()).thenReturn(flowOf(expected))
+
+        val testSubscriber = mockRepo.windowLayoutInfoFlowable().test()
+
+        testSubscriber.assertValue(expected)
+    }
+}
\ No newline at end of file
diff --git a/window/window-rxjava3/src/main/AndroidManifest.xml b/window/window-rxjava3/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..e4a2332
--- /dev/null
+++ b/window/window-rxjava3/src/main/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.window.rxjava3">
+    <!-- Empty manifest file for the library.-->
+</manifest>
\ No newline at end of file
diff --git a/window/window-rxjava3/src/main/java/androidx/window/rxjava3/WindowInfoRepoRx.kt b/window/window-rxjava3/src/main/java/androidx/window/rxjava3/WindowInfoRepoRx.kt
new file mode 100644
index 0000000..26cacef
--- /dev/null
+++ b/window/window-rxjava3/src/main/java/androidx/window/rxjava3/WindowInfoRepoRx.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+@file:JvmName("WindowInfoRepoRx")
+
+package androidx.window.rxjava3
+
+import androidx.window.WindowInfoRepo
+import androidx.window.WindowLayoutInfo
+import io.reactivex.rxjava3.core.Flowable
+import io.reactivex.rxjava3.core.Observable
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.rx3.asFlowable
+import kotlinx.coroutines.rx3.asObservable
+
+/**
+ * Return an [Observable] stream of [WindowLayoutInfo].
+ * @see WindowInfoRepo.windowLayoutInfo
+ */
+@ExperimentalCoroutinesApi
+public fun WindowInfoRepo.windowLayoutInfoObservable(): Observable<WindowLayoutInfo> {
+    return windowLayoutInfo().asObservable()
+}
+
+/**
+ * Return a [Flowable] stream of [WindowLayoutInfo].
+ * @see WindowInfoRepo.windowLayoutInfo
+ */
+@ExperimentalCoroutinesApi
+public fun WindowInfoRepo.windowLayoutInfoFlowable(): Flowable<WindowLayoutInfo> {
+    return windowLayoutInfo().asFlowable()
+}
diff --git a/work/integration-tests/testapp/lint-baseline.xml b/work/integration-tests/testapp/lint-baseline.xml
index b8627cf..51f735c 100644
--- a/work/integration-tests/testapp/lint-baseline.xml
+++ b/work/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="ClassVerificationFailure"
@@ -134,39 +134,6 @@
     </issue>
 
     <issue
-        id="RestrictedApi"
-        message="Builder.put can only be called from within the same library group (groupId=androidx.work)"
-        errorLine1="                        .put(&quot;sleep_time&quot;, delay)"
-        errorLine2="                         ~~~">
-        <location
-            file="src/main/java/androidx/work/integration/testapp/MainActivity.java"
-            line="179"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.integer.channel_importance` appears to be unused"
-        errorLine1="    &lt;integer name=&quot;channel_importance&quot;>3&lt;/integer>"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="45"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.integer.notification_id` appears to be unused"
-        errorLine1="    &lt;integer name=&quot;notification_id&quot;>1&lt;/integer>"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/donottranslate-strings.xml"
-            line="48"
-            column="14"/>
-    </issue>
-
-    <issue
         id="SyntheticAccessor"
         message="Access to `private` field `mImageRecyclerViewAdapter` of class `ImageProcessingActivity` requires synthetic accessor"
         errorLine1="                        mImageRecyclerViewAdapter.updateList(images);"
diff --git a/work/workmanager-gcm/lint-baseline.xml b/work/workmanager-gcm/lint-baseline.xml
index 2f222a0..76b8bd0 100644
--- a/work/workmanager-gcm/lint-baseline.xml
+++ b/work/workmanager-gcm/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanKeepAnnotation"
diff --git a/work/workmanager-multiprocess/src/main/java/androidx/work/multiprocess/RemoteCoroutineWorker.kt b/work/workmanager-multiprocess/src/main/java/androidx/work/multiprocess/RemoteCoroutineWorker.kt
index 538d062..71ce651 100644
--- a/work/workmanager-multiprocess/src/main/java/androidx/work/multiprocess/RemoteCoroutineWorker.kt
+++ b/work/workmanager-multiprocess/src/main/java/androidx/work/multiprocess/RemoteCoroutineWorker.kt
@@ -61,9 +61,10 @@
      * Override this method to define the work that needs to run in the remote process.
      * [Dispatchers.Default] is the coroutine dispatcher being used when this method is called.
      *
-     * A [RemoteCoroutineWorker] is given a maximum of ten minutes to finish its execution and
-     * return a [androidx.work.ListenableWorker.Result]. Note that the 10 minute execution window
-     * also includes the cost of binding to the remote process.
+     * A [RemoteCoroutineWorker] has a well defined
+     * [execution window](https://d.android.com/reference/android/app/job/JobScheduler) to finish
+     * its execution and return a [androidx.work.ListenableWorker.Result]. Note that the
+     * execution window also includes the cost of binding to the remote process.
      */
     public abstract suspend fun doRemoteWork(): Result
 
diff --git a/work/workmanager-multiprocess/src/main/java/androidx/work/multiprocess/RemoteListenableWorker.java b/work/workmanager-multiprocess/src/main/java/androidx/work/multiprocess/RemoteListenableWorker.java
index c3db4f4..52f6e46 100644
--- a/work/workmanager-multiprocess/src/main/java/androidx/work/multiprocess/RemoteListenableWorker.java
+++ b/work/workmanager-multiprocess/src/main/java/androidx/work/multiprocess/RemoteListenableWorker.java
@@ -166,10 +166,12 @@
      * Override this method to define the work that needs to run in the remote process. This method
      * is called on the main thread.
      * <p>
-     * A ListenableWorker is given a maximum of ten minutes to finish its execution and return a
-     * {@code Result}.  After this time has expired, the worker will be signalled to stop and its
-     * {@link ListenableFuture} will be cancelled. Note that the ten minute execution window also
-     * includes the cost of binding to the remote process.
+     * A ListenableWorker has a well defined
+     * <a href="https://d.android.com/reference/android/app/job/JobScheduler">execution window</a>
+     * to to finish its execution and return a {@link androidx.work.ListenableWorker.Result}.
+     * After this time has expired, the worker will be signalled to stop and its
+     * {@link ListenableFuture} will be cancelled. Note that the execution window also includes
+     * the cost of binding to the remote process.
      * <p>
      * The {@link RemoteListenableWorker} will also be signalled to stop when its constraints are
      * no longer met.
diff --git a/work/workmanager-testing/lint-baseline.xml b/work/workmanager-testing/lint-baseline.xml
index cad2625..337ebad 100644
--- a/work/workmanager-testing/lint-baseline.xml
+++ b/work/workmanager-testing/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="KotlinPropertyAccess"
diff --git a/work/workmanager/lint-baseline.xml b/work/workmanager/lint-baseline.xml
index c4e74ad..416895c 100644
--- a/work/workmanager/lint-baseline.xml
+++ b/work/workmanager/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+<issues format="6" by="lint 7.0.0-alpha15" type="baseline" client="cli" name="Lint" variant="all" version="7.0.0-alpha15">
 
     <issue
         id="BanSynchronizedMethods"
@@ -497,7 +497,8 @@
         <location
             file="src/main/java/androidx/work/impl/OperationImpl.java"
             line="61"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -512,7 +513,8 @@
         <location
             file="src/main/java/androidx/work/impl/model/WorkSpec.java"
             line="191"
-            column="17"/>
+            column="17"
+            message="Setter here"/>
     </issue>
 
     <issue
@@ -530,17 +532,6 @@
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public final V get(long timeout, TimeUnit unit)"
-        errorLine2="                 ~">
-        <location
-            file="src/main/java/androidx/work/impl/utils/futures/AbstractFuture.java"
-            line="355"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public final V get(long timeout, TimeUnit unit)"
         errorLine2="                                     ~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/utils/futures/AbstractFuture.java"
@@ -551,17 +542,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public final V get() throws InterruptedException, ExecutionException {"
-        errorLine2="                 ~">
-        <location
-            file="src/main/java/androidx/work/impl/utils/futures/AbstractFuture.java"
-            line="469"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="    public final void addListener(Runnable listener, Executor executor) {"
         errorLine2="                                  ~~~~~~~~">
         <location
@@ -837,28 +817,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void setState(T newState) {"
-        errorLine2="                         ~">
-        <location
-            file="src/main/java/androidx/work/impl/constraints/trackers/ConstraintTracker.java"
-            line="97"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public abstract T getInitialState();"
-        errorLine2="                    ~">
-        <location
-            file="src/main/java/androidx/work/impl/constraints/trackers/ConstraintTracker.java"
-            line="124"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public Builder setTriggerContentUpdateDelay(Duration duration) {"
         errorLine2="                                                    ~~~~~~~~">
         <location
diff --git a/work/workmanager/src/main/java/androidx/work/ListenableWorker.java b/work/workmanager/src/main/java/androidx/work/ListenableWorker.java
index 71b38e0..f57c3e6 100644
--- a/work/workmanager/src/main/java/androidx/work/ListenableWorker.java
+++ b/work/workmanager/src/main/java/androidx/work/ListenableWorker.java
@@ -178,15 +178,16 @@
      * Override this method to start your actual background processing. This method is called on
      * the main thread.
      * <p>
-     * A ListenableWorker is given a maximum of ten minutes to finish its execution and return a
-     * {@link Result}.  After this time has expired, the worker will be signalled to stop and its
-     * {@link ListenableFuture} will be cancelled.
+     * A ListenableWorker has a well defined
+     * <a href="https://d.android.com/reference/android/app/job/JobScheduler">execution window</a>
+     * to to finish its execution and return a {@link Result}.  After this time has expired, the
+     * worker will be signalled to stop and its {@link ListenableFuture} will be cancelled.
      * <p>
      * The future will also be cancelled if this worker is stopped for any reason
      * (see {@link #onStopped()}).
      *
      * @return A {@link ListenableFuture} with the {@link Result} of the computation.  If you
-     *         cancel this Future, WorkManager will treat this unit of work as failed.
+     * cancel this Future, WorkManager will treat this unit of work as failed.
      */
     @MainThread
     public abstract @NonNull ListenableFuture<Result> startWork();
diff --git a/work/workmanager/src/main/java/androidx/work/Worker.java b/work/workmanager/src/main/java/androidx/work/Worker.java
index e414b35..29228b3 100644
--- a/work/workmanager/src/main/java/androidx/work/Worker.java
+++ b/work/workmanager/src/main/java/androidx/work/Worker.java
@@ -63,9 +63,10 @@
      * you need to do your work asynchronously on a thread of your own choice, see
      * {@link ListenableWorker}.
      * <p>
-     * A Worker is given a maximum of ten minutes to finish its execution and return a
-     * {@link androidx.work.ListenableWorker.Result}.  After this time has expired, the Worker will
-     * be signalled to stop.
+     * A Worker has a well defined
+     * <a href="https://d.android.com/reference/android/app/job/JobScheduler">execution window</a>
+     * to finish its execution and return a {@link androidx.work.ListenableWorker.Result}.  After
+     * this time has expired, the Worker will be signalled to stop.
      *
      * @return The {@link androidx.work.ListenableWorker.Result} of the computation; note that
      *         dependent work will not execute if you use